当前位置:首页 > 百科

如何用sqlmap waf绕过

用sqlmap直接怼带WAF的何用站,十次有九次会被拦。何用返回一堆403,何用或者干脆给你个假页面,何用sqlmap自己都懵了。何用这不是何用sqlmap不行,是何用你没给它换衣服。WAF识别的何用是流量特征,不是何用你的意图。把特征改掉,何用它就不认识你了。何用

先搞清楚对面是何用什么WAF。别急着上tamper,何用连对手是何用谁都不知道,瞎打没意义。何用用wafw00f跑一下,或者手动看响应头、cookie里的关键字。Cloudflare、安全狗、ModSecurity、阿里云盾,每家的规则集不一样,绕过手法也不一样。我见过有人拿绕ModSecurity的脚本去打Cloudflare,跑了一晚上啥也没出来,还以为是脚本不行。

确认WAF类型之后,第一步是调整sqlmap的基础参数。默认的User-Agent是sqlmap/1.x,这跟举着牌子告诉WAF“我是来注入的”没区别。加--random-agent,让它每次请求换一个浏览器UA。延迟也加上,--delay=2或者--delay=3,别一秒钟发几十个包,WAF不封你封谁。还有--randomize,这个参数很多人忽略,它会在每次请求时随机化一些参数值,让流量看起来不那么机械。

接下来是tamper脚本。sqlmap自带了几十个,在/usr/share/sqlmap/tamper/目录下。但别一股脑全加上,脚本之间会冲突,而且请求量暴增反而更容易触发规则。常用的几个:space2comment把空格替换成/**/,between把大于号替换成BETWEEN,charencode做URL编码。针对ModSecurity,modsecurityversioned和modsecurityzeroversioned效果不错。Cloudflare的话,space2randomblank配合charunicodeencode有时候能过。

但tamper不是万能的。现在的WAF很多都上了机器学习,光靠替换关键字已经不够了。你得看它到底拦的是什么。用-v 3把请求和响应都打出来,对比一下正常请求和被拦请求的区别。有时候问题出在Content-Length上,有时候是某个header缺失了。我遇到过一个站,WAF只检查POST body里有没有union select,但GET参数完全不看。这种直接把注入点换到GET就完了,根本不需要tamper。

还有一种情况是WAF会封IP。跑几分钟就429或者直接连接超时。这时候代理池就派上用场了。--proxy指定单个代理,或者用--proxy-file加载一个代理列表。配合--proxy-freq控制切换频率。但免费代理质量参差不齐,很多已经被WAF标记了,用之前先拿--proxy加--check-tor测一下。花钱买住宅代理更稳,但成本得自己掂量。

分块传输也是个路子。--chunked参数让sqlmap把请求体拆成多个chunk发送,有些WAF对chunked编码的解析有问题,会直接放行。这个手法对老版本的WAF特别有效,新版的可能已经修了。还有--hpp,HTTP参数污染,同一个参数名传两次,WAF取第一个值,后端取最后一个值。PHP和ASP.NET对重复参数的处理不一样,得试。

说到底,绕WAF是个体力活加运气活。没有一套参数能通吃所有站。你得不停地试,看响应,改参数,再试。sqlmap的--tamper可以同时指定多个脚本,用逗号隔开,但顺序很重要。先做编码再做替换,和先替换再编码,结果完全不同。我一般把charencode放最后,因为它会把所有特殊字符都编码,前面的替换就白做了。

最后提醒一句,别在没授权的情况下拿这些技术去打别人的站。自己搭个靶场,装个ModSecurity或者安全狗,慢慢调。绕过WAF的快感在于解决问题,不在于搞破坏。技术本身没有对错,看你怎么用。

分享到: