【转载】小白学源码审计-2

  • A+
所属分类:代码审计

话说小白上次审计代码发现SQL注入后,甚是嘚瑟,于是想在小伙伴面前秀一波,炫耀炫耀。(表示真是无语了)

小白给仔仔发了一个表情:

【转载】小白学源码审计-2

仔仔:“啥事,你被女朋友甩啦?”

小白:“

【转载】小白学源码审计-2去去去,哪凉快哪待去。”

仔仔:“

【转载】小白学源码审计-2我现在就感觉好凉快啊!说吧,啥事这么嘚瑟?”

小白:“嘿嘿,最近学了源码审计,挖到了一个SQL注入。”

仔仔:“那不错啊,有文档吗?发来看看。”

于是小白把自己写的公众号文章发给仔仔看。

小白:“咋样?仔仔。”

【转载】小白学源码审计-2小白一脸你快夸我啊的表情~

仔仔:“写的还不错,像我这样的新手可以学习学习。不过你这个更新速度有点慢啊”

小白瞬间就怂了—_|||

小白:“这不是最近项目太多了,忙不过来嘛。你对后续有什么诉求?”

仔仔:“能不能发一些这套源码其他位置的注入点的挖掘方法?”

小白托着下巴想了一会,突然灵机一动,诶,有了,快速定位其他位置的注入点,于是小白和仔仔说了他的想法。

仔仔:“这个不错,渗透测试就是尽可能多的发现客户网站可能存在的潜在威胁。你教教我怎么挖吧。”

【转载】小白学源码审计-2

小白:“来来来,哥手把手的教你。”

1、首先通过sublime编辑器打开上次的XXXcms文件夹

【转载】小白学源码审计-2
【转载】小白学源码审计-2

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请求类似于以上的3URLindex.php中的index可能是其他字符串哦,仔仔你可不要以为只有index.phpnews.php的脚本才可以注入哦。

我们访问这些请求,如下面这些代码就可以获取id的值并输出

【转载】小白学源码审计-2

http://www.yuesec.com/test.php?id=helloguys!

【转载】小白学源码审计-2

可以看到id参数的值和页面输出的值都是“hello guys! ”。

其实这段代码也是存在安全问题的,不信可以构造ID值如下:

id=1%3E%3Cscript%3Ealert(1)%3C/script%3E%3C

然后网页访问:

【转载】小白学源码审计-2

可以看到网页会弹出个窗口,不小心就弄出个XSS哈,论安全编码的重要性

仔仔我只跟你说$_GET获取参数值的例子,其它的你自己去了解哈。

仔仔:“嗯嗯,我回去了解的,你继续。”

小白:“要构成SQL注入需要数据库查询语句能拼接我们可以控制的参数$_GET可控参数我们了解了,接下来组合起来。”

$id = $_GET[‘id’];

$sql = “select *from userid=$id;”;

这段代码表示通过GET请求获取id的值,然后拼接到$sql变量里面,接下来进行数据库查询构成SQL注入

说了那么说,其实就是通过搜索$_GET关键字确认注入点位置

通过sublime在文件中搜索存在$_GET关键字的文件:

【转载】小白学源码审计-2

【转载】小白学源码审计-2

【转载】小白学源码审计-2


26个文件中存在247个匹配,我们需要在这么多的结果中筛选出能与数据库查询语句拼接的GET请求参数。

通过正则语法搜索既存在mysql_query又存在$_GET[的行:

mysql_query.*?$_GET[

【转载】小白学源码审计-2
发现有35个匹配,不出意外的话可以收获35SQL注入点。

接下来获取包含这些内容的完整行的内容:

.*?mysql_query.*?$_GET[.*

【转载】小白学源码审计-2

【转载】小白学源码审计-2

小白:“仔仔,这么多注入点爽不?”

仔仔:“这也太多了吧,不过还需要验证下是否真的存在SQL注入。”

第一个注入验证:

【转载】小白学源码审计-2

先进入该段代码对应的源文件:

【转载】小白学源码审计-2

从代码中可以看出$type变量的值等于edit条件成立就执行elseif里面的内容

$row = mysql_fetch_array(mysql_query("SELECT * FROM sc_bannerWHERE ID=".$_GET["ID"]));

这段代码表示先通过GET请求获取ID参数传过来的值,并且ID参数的值未做编码转换,然后拼接到数据库查询语句里面,最后执行数据库查询语句。可以看到$type的值并没有拼接到数据库查询语句里面,就算该变量过滤的再严格也是存在SQL注入的。

可以往上看$type确实是做了编码处理,不过不影响我们的注入:

【转载】小白学源码审计-2

从这段代码中可以看出脚本从GET请求获取type的值并进行编码,然后判断它的值是add还是edit,根据值的不同进入不同的条件块。得出以下注入链接:

?type=edit&ID=1

由于是后台登录才能进行的访问,所以需要把上一篇文章提到的Cookie绕过也要利用到。

接下来验证下是否是注入

【转载】小白学源码审计-2

构造的URL页面是存在的。

接下来通过burpsuite截包保存test.txt文档再用Sqlmap进行注入:

【转载】小白学源码审计-2

小白通过sqlmap -rtest.txt  --output test -p ID –dbs命令进行了第一次注入发现没注入成功。进行了第二次注入却注入了出来,今天网络貌似出了点问题。

【转载】小白学源码审计-2

可以看到能查出来的数据库有三个,第一个注入验证成功。

第二个注入认证:

【转载】小白学源码审计-2

好,就选择这段代码了,双击跳转到这段代码文件

【转载】小白学源码审计-2

这段代码也是获取GET请求传过来的参数的,然后带入数据库查询语句执行

构造好链接访问:

【转载】小白学源码审计-2

通过输入and 1=1and 1=2’ and ‘1’=’1’ and ‘1’=’2判断是否存在注入

and 1=1

【转载】小白学源码审计-2

and 1=2

【转载】小白学源码审计-2
 

‘ and ‘1’=’1

【转载】小白学源码审计-2

‘ and ‘1’=’2

【转载】小白学源码审计-2

可以看到只有and 1=1返回的页面和正常页面内容一致,可以得出该处注入点是数字型注入

小白:“仔仔你会手工注入吗?貌似这不是盲注哦!”

仔仔:“手工注入不大会诶。”

小白:“不会就算咯。”

仔仔:“你会手工注入吗?会的话教我呗。”

小白:“看大家支不支持你学咯。”

仔仔:“大家赶紧在下面评论‘支持仔仔学习手工注入’吧,仔仔在此多谢了。”

小白给仔仔发了一张获取数据库版本的截图:

【转载】小白学源码审计-2

接下来重复下面的截包注入操作:

【转载】小白学源码审计-2

sqlmap -rlgid.txt –dbs

【转载】小白学源码审计-2

Sqlmap跑出了盲注小白感觉好尴尬,幸好仔仔没看到。

【转载】小白学源码审计-2

小白:“好了,仔仔。SQL注入的审计流程就是这样了,其他那些注入点你就慢慢验证了,太多了我就不一一验证了。”

【转载】小白学源码审计-2

小白有事先忙去了,让仔仔有问题可以留言给他,有空再解答。

PS:招聘邮箱:[email protected]

【转载】小白学源码审计-2
【转载】小白学源码审计-2


本文始发于微信公众号(WhiteCellClub):【转载】小白学源码审计-2

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: