
本文详解在引号被反斜杠转义、尖括号被过滤的受限环境下,如何通过 HTML 实体编码构造合法的 onerror 事件 payload,成功触发存储型 XSS,重点演示 eval() 配合编码绕过的实战技巧。
本文详解在引号被反斜杠转义、尖括号被过滤的受限环境下,如何通过 html 实体编码构造合法的 `onerror` 事件 payload,成功触发存储型 xss,重点演示 `eval()` 配合编码绕过的实战技巧。
在实际渗透测试中,遇到存储型 XSS 时,常会遭遇服务端的多重防护:如对单/双引号自动添加反斜杠(\)、移除或编码 标签、甚至过滤关键词(如 script、javascript:)。此时直接注入 会被拦截或破坏语法结构,导致 payload 失效。
但关键在于:HTML 解析器会在执行 JavaScript 前,先完成 HTML 实体解码。这意味着,只要将 JS 代码中的敏感字符(如引号、括号、字母)转换为十进制 HTML 实体(如 a → a),就能在不使用原始符号的前提下,拼出可执行的 JS 表达式。
例如,目标存在如下受控 标签:
@@##@@
虽然 " ' ( ) 等字符被转义或过滤,但我们可以将 alert('1') 全量 HTML 编码为:
立即学习“前端免费学习笔记(深入)”;
alert('1')
对应解码后即为 alert('1') —— 注意:( 是 ( 的命名实体,) 是 ),' 是 ',均属标准 HTML 实体,兼容性好且绕过所有基于正则的引号/括号检测。
最终构造的绕过 payload 如下:
@@##@@
✅ 优势分析:
- 无任何原始双引号 " 或单引号 ',规避反斜杠转义;
- 无 符号,绕过标签过滤;
- eval() 动态执行解码后的字符串,语义完整;
- 所有实体均为 W3C 标准,主流浏览器(Chrome/Firefox/Safari/Edge)均支持。
⚠️ 注意事项:
- 不要混淆 '(单引号)与 '(等价但更通用),推荐优先使用 ' 提高可读性;
- 若目标环境严格过滤 eval,可改用 Function 构造器:Function(alert('1'))();
- 存储型 XSS 需确保 payload 被持久化并渲染在用户上下文中,建议配合 onload/onerror 等事件属性使用;
- 切勿在非授权系统中实操——本技术仅限合规渗透测试与安全研究。
总结而言,HTML 实体编码是突破基础输入过滤的高效手段。它不依赖特殊字符,不触发常见 WAF 规则,且与 DOM 渲染流程天然契合。掌握 x; + &named; 的组合技巧,能显著提升在受限 XSS 场景下的利用成功率。











