当前位置:首页 > 百科

sqlmap waf绕过

sqlmap跑不动目标站点的时候,十有八九是撞上了WAF。别急着换工具,先看看拦你的是什么货色。云锁、安全狗、D盾、ModSecurity,各家脾气不一样,绕过思路也天差地别。你拿对付安全狗的payload去打ModSecurity,人家直接给你丢个403,连个响儿都没有。

我去年碰上个政府站点,sqlmap注入点明确,就是过不了WAF。请求频率一高就封IP,UA特征明显就拦截。折腾一晚上,最后发现那WAF对大小写混写和注释符分割的容忍度极高——`UnIoN/**/SeLeCt`这种老掉牙的写法反而畅通无阻。你说气不气人,WAF厂商更新了几年,规则库对经典绕过的检测还是漏得像筛子。

真正讲究的做法是先手工探测。拿Burp抓个正常请求,往参数里塞个单引号,观察响应。WAF拦截和数据库报错是两码事——前者通常返回统一的错误页,后者会带出SQL语句片段。摸清这个边界,你才知道哪些字符能碰,哪些字符一碰就触发规则。

空间换时间是个笨但有效的路子。WAF对超长请求的处理往往有缺陷,你拼个几万字节的冗余数据在payload前面,有些WAF直接放弃检测,或者因为解析超时报错放行。sqlmap的`--random-agent`和`--delay`参数这时候反而次要了,你得手动改脚本,把payload塞进一个巨大的`multipart/form-data`里,用boundary字符串把检测引擎搞晕。

编码绕过得看具体场景。URL编码、Unicode编码、Hex编码,每层编码都可能让WAF规则失明。但别指望一种编码通吃——有的WAF会做两次解码,你编码一层它解一层,最后还是拦下来。我习惯组合牌:先Hex编码核心关键词,再整体URL编码一层,最后在关键位置插入随机大小写。三层下来,大多数正则匹配就废了。

还有条野路子——利用WAF的信任机制。不少WAF对来自搜索引擎的爬虫放行,你伪造`Referer: https://www.google.com/`,再配上`User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1)`,有些低配WAF直接放行。这招对云锁和加速乐有时候管用,但碰上硬刚的规则引擎就白搭。

sqlmap有个`--tamper`参数,内置了几十种脚本,但说实话,内置脚本对付主流WAF效果一般。真正好用的是自己写tamper脚本,针对目标WAF的规则特征做定制。比如目标WAF对`information_schema`这个字符串有精确匹配,你写个脚本把`information_schema`拆成`info`+`rmation_schema`,中间插入`/*!50000*/`这种MySQL版本注释,规则就断了。

最后说句实在的——WAF绕过是场情报战。你得先花时间摸清目标WAF的版本和规则库特征,再针对性地构造payload。盲打是浪费时间,而且容易触发封禁机制。sqlmap只是个引擎,方向盘在你自己手里。真正的高手,都是先手工把WAF的底裤扒了,再让sqlmap上去补刀。

分享到: