代码审计入门教学(二)
代码审计入门教学(二)1、首先通过sublime编辑器打开上次的XXXcms文件夹:
2、搜索关键特征:
小白:“说道关键特征仔仔你理解吗?”
仔仔:“关键特征应该是数据库查询的语句吧~”
小白:“你这么说也勉强可以,不过仅仅是数据库查询语句还不够,还需要数据库查询语句能拼接我们可以控制的参数才可以。”
仔仔:“那怎么才能知道哪些参数我们可以控制呢?”
小白:“我这里给你简单的科普下吧。”
首先是php获取参数的内置全局服务器变量有:
$_GET、$_POST、$_SERVER、$_COOKIE等方法。
其中$_GET是最常见的GET请求,如:
http://www.yuesec.com/index.php?id=1
http://www.yuesec.com/index.php?classid=1
http://www.yuesec.com/news.php?id=1
GET请求类似于以上的3个URL,index.php中的index可能是其他字符串哦,仔仔你可不要以为只有index.php和news.php的脚本才可以注入哦。
我们访问这些请求,如下面这些代码就可以获取id的值并输出:
可以看到id参数的值和页面输出的值都是“hello guys! ”。
其实这段代码也是存在安全问题的,不信可以构造ID值如下:
id=1%3E%3Cscript%3Ealert(1)%3C/script%3E%3C
然后网页访问:
可以看到网页会弹出个窗口,不小心就弄出个XSS哈,论安全编码的重要性。
仔仔我只跟你说$_GET获取参数值的例子,其它的你自己去了解哈。
仔仔:“嗯嗯,我回去了解的,你继续。”
小白:“要构成SQL注入需要数据库查询语句能拼接我们可以控制的参数,$_GET可控参数我们了解了,接下来组合起来。”
$id = $_GET[‘id’];
$sql = “select *from userid=$id;”;
这段代码表示通过GET请求获取id的值,然后拼接到$sql变量里面,接下来进行数据库查询就构成了SQL注入。
说了那么说,其实就是通过搜索$_GET关键字确认注入点位置。
通过sublime在文件中搜索存在$_GET关键字的文件:
26个文件中存在247个匹配,我们需要在这么多的结果中筛选出能与数据库查询语句拼接的GET请求参数。
通过正则语法搜索既存在mysql_query又存在$_GET[的行:
mysql_query.*?\$_GET\[
第一个注入验证:
先进入该段代码对应的源文件:
从代码中可以看出$type变量的值等于edit条件成立就执行elseif块里面的内容。
$row = mysql_fetch_array(mysql_query("SELECT * FROM sc_bannerWHERE ID=".$_GET["ID"]));
这段代码表示先通过GET请求获取ID参数传过来的值,并且ID参数的值未做编码转换,然后拼接到数据库查询语句里面,最后执行数据库查询语句。可以看到$type的值并没有拼接到数据库查询语句里面,就算该变量过滤的再严格也是存在SQL注入的。
可以往上看$type确实是做了编码处理,不过不影响我们的注入:
从这段代码中可以看出脚本从GET请求获取type的值并进行编码,然后判断它的值是add还是edit,根据值的不同进入不同的条件块。得出以下注入链接:
?type=edit&ID=1
由于是后台登录后才能进行的访问,所以需要把上一篇文章提到的Cookie绕过也要利用到。
接下来验证下是否是注入:
构造的URL页面是存在的。
接下来通过burpsuite截包保存为test.txt文档再用Sqlmap进行注入:
第二个注入认证:
好,就选择这段代码了,双击跳转到这段代码的文件:
这段代码也是获取GET请求传过来的参数的值,然后带入数据库查询语句里执行。
构造好链接访问:
通过输入and 1=1、and 1=2、’ and ‘1’=’1和’ and ‘1’=’2判断是否存在注入:
and 1=1
and 1=2
‘ and ‘1’=’1
‘ and ‘1’=’2
可以看到只有and 1=1返回的页面和正常页面内容一致,可以得出该处注入点是数字型注入。
小白:“仔仔你会手工注入吗?貌似这不是盲注哦!”
仔仔:“手工注入不大会诶。”
小白:“不会就算咯。”
仔仔:“你会手工注入吗?会的话教我呗。”
小白:“看大家支不支持你学咯。”
仔仔:“大家赶紧在下面评论‘支持仔仔学习手工注入’吧,仔仔在此多谢了。”
小白给仔仔发了一张获取数据库版本的截图:
接下来重复下面的截包注入操作:
sqlmap -rlgid.txt –dbs
页:
[1]