WAF(Web应用防火墙)不是神。它只是规则匹配器,就像机场安检,只查你兜里有没有刀,不查你脑子里有没有杀人计划。XSS绕过WAF的核心思路就一句话:让WAF看不懂你的payload,但浏览器能看懂。
先看个最蠢的例子。你提交``,WAF直接拦下。这没什么好说的,规则库第一页就写着。但如果你写成`
再说个偏门的——换请求方式。很多WAF对GET请求检查严格,对POST宽松,因为POST里可能有富文本内容,误报率高。你把payload放POST体里,用`enctype=text/plain`提交,有些WAF直接不解析这种格式。或者用JSON格式,WAF对JSON的键值对解析经常有bug,你往value里塞payload,它只检查key。我见过一个真实案例,某大厂WAF对`application/json`请求只检查`data`字段,其他字段全放行。你写`{ "x":""}`,它愣是没反应。
别迷信大小写转换。WAF规则大多不区分大小写,但有些编码后的字符大小写转换会出问题。比如`%2f`是斜杠,WAF解码后检查,但如果你用`%2F`(大写F),某些WAF的数据库里存的是小写`%2f`,匹配不上。这种低级错误在开源WAF里常见,商业版偶尔也有。
最实用的技巧还是“事件替代”。`onerror`被拦就用`onmouseover`,`onfocus`被拦就用`onblur`。WAF规则库不可能覆盖所有事件,总有漏网的。配合`
最后说句实在话。WAF绕过不是玄学,是信息差。你比WAF更懂浏览器解析机制,你就能赢。但别指望一套payload通杀所有WAF——每个产品的解码顺序、规则覆盖范围、性能限制都不一样。测试时带上抓包工具,看WAF到底拦的是哪一段,针对性改就行。这活儿跟开锁差不多,钥匙不对就换根铁丝,总能捅开。