五:常见的waf绕过方式以及实战
1:编码
采用url 十六进制等编码方式进行waf绕过
2:大小写绕过
在尝试的时候可以修改语句中字母的大小写,如果WAF使用是区分大小写的黑名单,那么就可以使用大小写进行绕过
3:过滤符号绕过
waf中可能会过滤掉一些特殊符号 我们可以利用他们过滤的特殊符号来进行绕过 比如 select被拦截了 <>被过滤了
那么我们可以把select写成sel<>ect来进行绕过waf 或者使用双写seselectlect 来进行绕过
4:使用注释符号
/*!*/与/*/*/
在poc中插入注释符号 比如 /*!*/内联注释符号: /*!20000select*/ 将select写入到内联注释符号中 waf会忽略掉这个字符 而感叹号后面的数字代表数据库的版本好 当数据库的版本大于其 则此语句同样会在mysql数据库中运行
5:等价函数,符号替换
当我们的函数被过滤 拦截的时候 我们可以使用等价函数或者符号进行替换,这里做一个小结
截取函数:mid(),substr(),substring(),right(),left(),decode()等
报错函数:floor(), updatexml(), extractvalue()等
判断函数:if(),case when,ifnull()
and函数:or,xor代替 或者使用符号&&,||
空格被过滤:括号绕过 /**/绕过 +号代替
等号被过滤:like函数 代替
具体情况具体分析 我们也不知道waf的类型以及他们的拦截规则 只有不断去尝试 才能找到绕过方式
某高校网站sql注入安全狗waf的绕过
哎,当初应该截burp的图的, 当我使用单引号时回显出错 两个单引号回显正常 一开始我是想使用联合查询的 但是被安全狗给拦住了 忘记截安全狗拦截的那张图了 失算失算
既然内联不行 我们就用盲注(yyds)首先既然有waf 那么我们就要去不断的尝试 去获取他的过滤规则 在这里空格以及database()不能使用 围绕这一点 我们去改善我们的poc 空格不能用 我们就使用过滤符号或者括号 database()可以尝试大小写以及过滤符号绕过
poc:?id=8'and/*/*/length(database(/*/*/))=5--+
等于5的时候网站回显出错,等于4的时候回显正常 所以我们得知了该数据库的字符长度为4
尝试进行爆出数据库名的信息 poc的构造也同样延续上面的思路
poc:?id=8'and/*/*/mid(database(/*/*/))!='a'--+
截取数据库第一个字母不等与a的时候回显正常 不等于x的时候网页回显就会出错 不难看出其第一位字母就是x 当然也可以丢进burp中进行爆破 不过线程不能太快 会被检测到