35

一次SQL注入与WAF绕过思路分享

 5 years ago
source link: https://www.freebuf.com/articles/web/201790.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、前言

这个注入是之前做测试时发现的,但是测试的时候发现有防护,但是想想这么个小网站都绕不过,实在不应该啊。开始补充学习各种场景、各种waf绕过姿势,勉勉强强的成功执行我构造的SQL的语句。趁着还有些印象,就写下过程当记录吧,本次全程打码,纯技术分享。

二、 注入发现

首先,网页打开是这样的,好熟悉的表单页面,常规测试一下,XSS、SQL注入,XSS我都玩腻了感觉没啥好研究的。随便碰碰运气测下SQL注入。

r2aeeyZ.jpg!web

三、 挖掘思路

当我在用户名处输入aaa’时,

YFJZBnm.jpg!web

直接返回错误,典型的IIS错误,目测可能存在注入,返回页面如下:

263eiqy.jpg!web

从上述返回结果,我大概知道了,

1、 网站是aspx
2、 中间件是IIS
3、“字符串 ‘aaa” 后的引号不完整。’aaa” 附近有语法错误。”说明单引号被执行

四、数据库判断

其实aspx+iis基本上都是MSSQL数据库,但是我为了确认一下,还是判断是否为MSSQL,否则数据库搞错了,那岂不是瞎忙了嘛。

用户名处输入 aaa’ and user>0 q2AJ7bI.jpg!web

此处用户名处是字符串,肯定需要闭合引号的,这里我先不闭合直接点击“确定提交”,返回如下:

36nQVfA.jpg!web 说明有waf过滤我的输入,此时我的内心: 6fqqaqm.gif

继续测试,构造为aaa’ and ’1′=’1,但是同样被waf过滤了。 2M7rEbr.jpg!web

qiI7f2e.jpg!web 到了这里我还是没法确定为MSSQL数据库,冷静了两分钟之后,经过测试,最后发现数据库常用关键字都被过滤了,但是某些特殊字符未被过滤。 ZfayIzR.jpg!web 继续构造,aaa’ /*and @@version>0 and ’1 ‘=’1′*/–,这里解释下,/**/是注释符,–是MSSQL、Oracle的注释符,如果能够成功注释,可能为两个之一,特别说明:Mysql也可以– 注释,但是后面还有个空格,即– ,而其它两个后面是没有空格的。

fYzmuii.jpg!web 终于成功执行了。“用户名不存在”,当然就是aaa用户名不存在的嘛,毕竟用户名“aaa“是我随便输入的,如果用户名存在,则会提示“所填厂家名称资料有误!”到这一步已经成功执行了我输入的SQL注释符,而“–“注释符目前有两个数据库可以使用,MSSQL与Oracle,基本上确定为这两个数据库之一,继续判断思路:用”;“即可判断,因为MSSQL支持”;“,它是MSSQL的语句分隔符,而Oracle不支持这个语句分隔符。 RJzeE3J.jpg!web7bMfInr.jpg!web

五、waf 绕过

绕过waf没啥好说的,就是不断的测试,构造语句打乱waf的防护,同时又能在后端成功执行即可,每个应用、数据库、中间件等,都对应不同的构造语法,需要结合实际环境来测试,比如HTTP参数污染绕过waf: http://www.test.com/test.asp?id=123&id=456

提交的参数为id=1&id=2&id=3,即/test.asp?id=1&id=2&id=3

Asp.net + iis:id=1,2,3  

Asp + iis :id=1,2,3 

Php + apache/nginx :id=3

这里用asp.net+iis做示例,经过asp.net+iis提取为id=1,2,3,因为三个参数都是id。

此时修改GET请求为:id=union+select+password/*&id=*/from+admin

经过asp.net+iis提取:

id=union+select+password/*,*/from+admin,当在数据库中查询id参数的时候,中间被注释掉,变为id=union+select+password from+admin,这是完整的SQL语句,这是HPP参数污染绕过的方法,这里举这个例子是为了说明每个应用都采用不同的处理方式。

1 、空格绕过

经过大量的烧脑测试之后,发现只要绕过空格即可,关键字函数之间的空格被过滤,比如union select之间的空格如果就这样写的话,是被过滤的,可以用tab、%0a代替空格,即union%0aselect,这里用tab键代替空格。

测试一下刚刚上面被过滤的语句,aaa’and ’1′=’1直接输入是被过滤的,这里在and与1之间用tab键代替,即aaa’ and   ’1′=’1, ayyInyU.jpg!web

这回终于没有被过滤了,这里测试发现用tab键代替空格也可绕过 yiUNbeA.jpg!web

此时的心情: eE3IJzu.gif

2 、爆当前数据库版本

aaa'and%0a@@version>0--

3 、爆用户名

aaa'and   user>--

六、sqlmap 使用

手工爆字段太慢,既然已经知道过滤规则,可以用sqlmap,调用tamper脚本space2mssqlblank.py,此脚本是把空格替换为其它空符号,如果已经知道过滤规则,没有合适的调用脚本,也可以自己编写一个,本次命令如下:

sqlmap.py -r 2.txt –risk 3 –dbms=mssql--random-agent -v 3 -p "txtUserNo" --tamper=space2mssqlblank.py

IJVjyeA.jpg!web

七、总结

手工测试剩下的就是常规爆表、字段、字段内容,比较简单,不在进行演示,关键还是绕过waf太耗脑力。本次是本人在某个渗透测试中的注入案例,不对的地方希望大家轻喷哦,感谢阅读。

参考文章: https://www.jianshu.com/p/6e83fa692b51

*本文作者:VoltCary,本文属FreeBuf原创奖励计划,未经许可禁止转载。 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK