知识

sqlmap绕过waf注入

时间:2010-12-5 17:23:32  作者:娱乐   来源:百科  查看:  评论:0
内容摘要:sqlmap撞上WAF,十次有八次是死在指纹识别上。WAF不傻,它先看User-Agent,再看请求头里有没有sqlmap的默认特征,最后才轮到payload本身。我用sqlmap打一个政府站点时,对

sqlmap撞上WAF,绕过入十次有八次是绕过入死在指纹识别上。WAF不傻,绕过入它先看User-Agent,绕过入再看请求头里有没有sqlmap的绕过入默认特征,最后才轮到payload本身。绕过入我用sqlmap打一个政府站点时,绕过入对方装了某国产WAF,绕过入默认UA直接秒封IP。绕过入换掉UA没用,绕过入因为sqlmap的绕过入请求头里还有那个固定的Accept-Language顺序。改配置文件?绕过入太慢。直接--random-agent加--headers覆盖,绕过入第一关就过了。绕过入

真正麻烦的绕过入是参数污染。WAF对单个参数做正则匹配,但很多PHP站点会取最后一个参数值。我构造?id=1&id=1 union select 1,2,3,WAF扫第一个id是干净的,后端却用了第二个id。这招对某些开源WAF的默认规则集特别有效。不过要注意,有些WAF会把所有同名参数拼接起来再检查,那就得换思路——用HPP配合--level=3让sqlmap自己测,但手动改请求体往往更快。

最烦人的是云WAF的JS挑战。阿里云和腾讯云的WAF会在响应里塞一段JS,要求浏览器执行后生成动态cookie。sqlmap的--delay和--timeout根本处理不了这个。我试过用--cookie手动带上之前浏览器访问得到的合法cookie,但没过几分钟就失效。后来发现用--chunked把请求体分块传输,能绕过部分云WAF的完整包检查。这招对nginx+lua写的WAF尤其管用,因为它们常常在读取完整body后才开始过滤。

别忽略编码绕过。我遇过一个WAF,对union select的过滤写死了小写字母。我把payload里的关键字换成%55nion%20SeLeCt,URL解码后是大小写混合,但MySQL不区分关键字大小写。sqlmap的--tamper脚本里有个randomcase.py,但效果一般——它会把所有字母都随机大小写,反而容易触发WAF的统计特征。手工把关键位置的大小写固定住,比如UnIoN和SeLeCt,命中率更高。

还有个冷门技巧:利用WAF的解析差异。有些WAF用正则匹配--注释符,但MySQL支持#注释。sqlmap默认用--,你得用--comment参数改成#。更绝的是用/*!50000union*/这种MySQL版本注释,WAF如果只做简单字符串匹配,根本看不出这是union关键字。但别指望sqlmap自动生成这种payload,--tamper=versionedmorekeywords.py能做到,不过产生的请求体积膨胀得厉害,WAF对超长请求往往直接放行——这反而成了突破口。

最后说个反直觉的观察:很多WAF对HTTPS流量的检查深度远低于HTTP。因为解密开销大,云WAF经常只检查前几KB。我把sqlmap的POST请求体塞个2KB的垃圾前缀,真正的payload放最后,居然就绕过了某知名商业WAF。这不算漏洞,是性能取舍。但别指望每次都成功,WAF厂商也在进步。

绕过WAF的核心不是找万能payload,而是理解WAF的检测流程和web服务器的解析差异。sqlmap只是工具,真正的功夫在手动改包上。遇到拦路虎时,抓包看WAF返回的拦截页面特征——是拦截了关键字,还是拦截了特征指纹,对症下药比盲目跑tamper脚本有效得多。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap