话说小白上次审计代码发现SQL注入后,甚是嘚瑟,于是想在小伙伴面前秀一波,炫耀炫耀。(表示真是无语了)
小白给仔仔发了一个表情:
仔仔:“啥事,你被女朋友甩啦?”
小白:“
去去去,哪凉快哪待去。”
仔仔:“
我现在就感觉好凉快啊!说吧,啥事这么嘚瑟?”
小白:“嘿嘿,最近学了源码审计,挖到了一个SQL注入。”
仔仔:“那不错啊,有文档吗?发来看看。”
于是小白把自己写的公众号文章发给仔仔看。
小白:“咋样?仔仔。”
小白一脸你快夸我啊的表情~
仔仔:“写的还不错,像我这样的新手可以学习学习。不过你这个更新速度有点慢啊”
小白瞬间就怂了—_—|||
小白:“这不是最近项目太多了,忙不过来嘛。你对后续有什么诉求?”
仔仔:“能不能发一些这套源码其他位置的注入点的挖掘方法?”
小白托着下巴想了一会,突然灵机一动,诶,有了,快速定位其他位置的注入点,于是小白和仔仔说了他的想法。
仔仔:“这个不错,渗透测试就是尽可能多的发现客户网站可能存在的潜在威胁。你教教我怎么挖吧。”
小白:“来来来,哥手把手的教你。”
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的值并输出:
http://www.yuesec.com/test.php?id=helloguys!
可以看到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[
发现有35个匹配,不出意外的话可以收获35枚SQL注入点。
接下来获取包含这些内容的完整行的内容:
.*?mysql_query.*?$_GET[.*
小白:“仔仔,这么多注入点爽不?”
仔仔:“这也太多了吧,不过还需要验证下是否真的存在SQL注入。”
第一个注入验证:
先进入该段代码对应的源文件:
从代码中可以看出$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进行注入:
小白通过sqlmap -rtest.txt --output test -p ID –dbs命令进行了第一次注入发现没注入成功。进行了第二次注入却注入了出来,今天网络貌似出了点问题。
可以看到能查出来的数据库有三个,第一个注入验证成功。
第二个注入认证:
好,就选择这段代码了,双击跳转到这段代码的文件:
这段代码也是获取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
Sqlmap跑出了盲注,小白感觉好尴尬,幸好仔仔没看到。
小白:“好了,仔仔。SQL注入的审计流程就是这样了,其他那些注入点你就慢慢验证了,太多了我就不一一验证了。”
小白有事先忙去了,让仔仔有问题可以留言给他,有空再解答。
PS:招聘邮箱:[email protected]
本文始发于微信公众号(WhiteCellClub):【转载】小白学源码审计-2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论