安全研究人员近日公开了一种针对 CloudFront WAF 的 XSS 攻击绕过技术。该技术利用 HTML 标签与 JavaScript URI 方案的特殊组合,成功绕过 WAF 的基本过滤规则,在目标站点注入恶意 JavaScript 代码。
一、攻击背景
CloudFront 是亚马逊云服务(AWS)提供的 CDN 与 Web 应用防火墙解决方案,被广泛应用于各类网站的安全防护。由于其部署规模大、覆盖面广,针对 CloudFront WAF 的攻防对抗一直是安全研究的热点领域。
本次公开的绕过技术聚焦于如何构造一个能让 WAF "视而不见" 的 XSS 有效载荷,使得恶意 JavaScript 代码在被注入目标页面后仍能正常执行。
二、有效载荷构造
以下是该研究团队使用的核心攻击载荷:
<目的/数据="javascript:alert/**/(document.domain)">//</object>
该载荷的绕过逻辑主要依赖以下两个关键技巧。
2.1 JavaScript URI 方案与 HTML 标签结合
攻击者选用了 <object> 标签,并将其 data 属性值设置为 JavaScript URI 方案。当浏览器解析该标签时,会尝试以 JavaScript 方式执行 data 属性中的内容,从而触发 XSS。
这里的核心技巧在于 javascript: 协议头的处理方式。为何偏偏选择 <object> 而不是更常见的 <img> 或 <iframe>?因为不同标签对 URI 的解析时机和上下文存在差异,<object> 的 data 属性恰好能在特定浏览器环境下直接触发脚本执行,同时又能规避部分针对常见注入点的检测规则。

2.2 冒号编码绕过检测
在标准的 HTML 解析中,:(冒号)字符可以被编码为 : 实体。当 WAF 基于字符串匹配进行恶意代码检测时,javascript: 与原始的 javascript: 并不完全一致,因此可能被判定为 "安全" 而放行。
但浏览器在渲染阶段会正确解析 : 为冒号,最终还原为可执行的 javascript: 协议头。这种检测与渲染之间的"时间差",正是绕过成立的根本原因。
2.3 注释符混淆 Payload 特征
载荷中插入的 /**/ 是 CSS/JavaScript 注释语法的组合。它在 WAF 的规则匹配层面可能打断连续字符串的识别,使得攻击特征更难被规则命中。
在代码执行层面,/**/ 作为空注释对最终行为没有影响,浏览器仍会完整执行 alert(document.domain) 调用。换句话说,对 WAF 而言这是一段"支离破碎"的字符串,但对浏览器来说它依然是一条完整的语句。
三、风险评估
该绕过技术的风险等级为中。
影响主要体现在以下方面:部署了 CloudFront WAF 且未开启 AWS Managed Rules 高级模式的站点,若后端应用存在 XSS 注入点,则可能被此类载荷突破;传统的正则匹配型 WAF 规则对此类编码变形攻击的防御能力有限。这并非 CloudFront 独有的缺陷,而是所有依赖纯字符串匹配的 WAF 都面临的共性问题——规则永远慢于变形技巧一步。
四、防御建议
针对上述绕过技术,建议采取以下防御措施:
- 启用 AWS WAF 的 Cross-site scripting 规则时,优先选择 "High" 敏感度等级,并开启 "Inspect HTML escaping" 选项。
- 严格限制用户输入,不依赖 WAF 作为唯一的 XSS 防护层,在服务端对所有输出进行上下文感知转义。
- 定期审查 WAF 日志,对异常编码请求(如
: 等 HTML 实体)进行标记和分析。
本质上,WAF 只是纵深防御中的一环。真正可靠的 XSS 防护仍然要在应用层完成:输入校验、输出编码、Content Security Policy(CSP)三者缺一不可。把安全完全交给 WAF,就像把门锁装在纸糊的墙上——看似有防护,实则一推就倒。
|