0x01 前言
对于渗透测试人员来说掌握绕过各类WAF是一项重要的基本技能而WAF又分云WAF、硬件WAF、软件WAF、代码级WAF,本文针对基于规则类的WAF绕过技巧,这三篇文章希望可以帮助一些萌新学习到一些绕过WAF的姿势。
0x02 概述
绕过SQL注入规则主要利用WAF规则本身的问题、未考虑到SQL语法变形、及后端数据库SQL语句语法特性。不同的数据库虽然遵守SQL标准,但是通常会加入特有的语法。WAF的防御策略要兼顾各种数据库的特殊语法,容易遗漏,从而被利用绕过WAF。已下我们就介绍一些方法。
1关键字替换
2特殊符号
3注释符
4空白符绕过
5浮点数词法解析
6利用不常用报错函数绕过
0x03 关键字替换
原理:现在世面上大部分WAF是通过正则+黑名单来起到拦截的作用,这种情况就可以用一些平常用的很少关键字替换来实现绕过,用的多的针对他的正则肯定就多,而这时候用一些偏门的,往往可以出乎意料。例如在mysql中,很多的waf会将sleep()函数列入了黑名单,为他添加很多相对应的正则,那么可以考虑使用和他差不多相同功能的benchmark()函数来实现绕过。
例如MySql中:
●AND 等价于 && ( 运算符 )
●OR 等价于 || ( 运算符 )
●= 等价于 like ( 运算符 )
●sleep() 等价于 benchmark() ( 延时函数 )
●mid()substring() 等价于 substr() ( 字符串截取函数 )
0x04 特殊符号
原理:关于这个的话就比较少了,有的时候waf在判断规则的时候是根据我们输入的内容来过滤的,例如360网站卫士,select * from tdb_goods where goods_id ='-1'unionselect*fromadmin 你这样输入语句他是不拦截的,但是你这样带入到MySql中MySql也不会识别,这个时候我们就可以尝试使用 “+”。
例子:select+*+from+admin 这样来尝试绕过“+”号相当于空格 在过滤空格的时候可以考虑使用这个突破。
0x05 注释符
原理:/*xxx*/是注释的意思,也是空白符的意思。MySQL对sql语句(union/**/select)词法是可以正常解析的。事实上大部分WAF都考虑到/**/可以作为空白符,但是waf检测 “/\*.*\*/”是非常性能,工程师会去使用一些折中的方法,例如说:可能在检测中间引入一些特殊字符,例如:/*\w+*/。或者,WAF可能只中间检查n个字符“/\*.{,n}\*/”。
1注释符:
2/**/ (常用于绕过waf)
3/*!*/ (常用于绕过waf)
4-- (常用于注释后面的sql语句)
5# (常用于注释后面的sql语句)
例子:
这种情况我们就可以考虑使用
select/**/xx/**/from/**/xxxx
select/*数字+字母*/xx/*数字+字母*/from/*数字+字母*/xxxx
select/*特殊符号+数字+字母*/xxx/*特殊符号+数字+字母*/from/*特殊符号+数字+字母*/xxxxx
举例:
select/*@a?v|ddd--n*/xxxxx/*@a?v|ddd--n*/from/*@a?v|ddd--n*/xxxx
这里要特别说明,以前看到一篇waf绕过的文章那位前辈使用了 emoji表情 没错就是 emoji表情 绕过了国内大部分的WAF这故事告诉我们绕WAF就是在比脑洞想工程师没有想到的地方那么绕过WAF自然就水到渠成了。
0x06 空白符绕过
原理:现在大部分的WAF还是基于正则表达式来进行过滤的, SQL注入规则使用正则表达式的“\s”匹配空格,例如”select\s+union”。
那么利用正则表达式的空白符与MySQL空白符的不同说不定就可以绕过WAF的规则。
正则表达式空白符:%09,%0a,%0b,%0D,%20
MySql空白符:%09,%0A,%0b,%0D,%20,%0C,%A0,/**/
0x07 浮点数词法解析
原理: 利用MySql可以解析浮点数这个特点我们可以构造一些特殊的,带浮点数的语句来绕过WAF。
例子:
1select * from xxx where id=8E0union select 1,2,3,4,5,6,7E0from xxxx
2select * from xxx where id=8.0union select 1,2,3,4,5,6,7.0from xxxx
3select * from xxx where id=8\Nunion select 1,2,3,4,5,6,7 \Nfrom xxx
0x08 利用不常用报错函数绕过
原理:mysql的函数非常多,不同的函数有不同的功能,但是有一些对于我们渗透测试获取数据是很有用的但是又是用的很少的函数,WAF可能因为规则的不全木有录入进去导致绕过。
例子:
1select extractvalue(1, concat(1,user() ));
2select updatexml(1, concat(1,user() ),1);
3select exp(~(select * from(select user())a))
这里我就列举三种因为其他的大部分都需要 select * from xxx 我都可以这样操作了何必还那么麻烦呢?所以这里就列举了这3个比较实用的。
0x09 实例1-绕过网站安全狗(Apache版)4.0.18089进行注入
0x09 实例2-绕过云锁win_3.1.6版进行注入(针对GET请求)
针对POST请求的请看文章-web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过
0x10 实例3-绕过360网站卫士获取数据(一次很失败的绕过)
这个方法用于大家找到了网站的注入但是又证明不了时使用,只能出 user() 数据来证明这是一个漏洞。
最终user用户名称:cloud_checker@10.205.121.21