XSS笔记
字数 1183 2025-08-12 11:33:49
XSS攻击原理与防御全面指南
一、编码基础
1. URL编码
- 作用:处理URL中的特殊字符(如
&),避免歧义 - 格式:
%后跟ASCII码的十六进制表示(如空格为%20) - 解析流程:
- 浏览器自动进行一次URL编码
- 服务器自动进行一次URL解码
2. HTML编码
HTML实体编码
- 作用:防止特殊字符(如
<>)被解析为HTML标签 - 格式:
- 命名实体:
<、>、
 - 数字实体:
&#xHH;(十六进制)或&#DDD;(十进制)
- 命名实体:
HTML字符编码
- 特点:
- 十进制/十六进制可混用
- 数字前可加多个
0(混淆作用) - 例:
j和j都表示字母j
3. JS Unicode编码
- 格式:
\u00后跟十六进制数字(如\u0061表示a) - 限制:不能编码控制字符(引号、括号、反引号等)
二、前端解析流程
-
DOM构建阶段:
- 浏览器构建DOM树节点
- 对节点内容解析前进行HTML解码
-
JS执行阶段:
- DOM树构建完成后JS解释器开始工作
- 进行JS Unicode解码
关键点:必须清楚区分服务器解析、浏览器解析和JS解析的时机
三、XSS类型与原理
1. 反射型(非持久型)
- 特点:
- 需要页面回显
- 网页源代码中可见payload
- 攻击流程:
客户端 → [GET/POST恶意JS] → 服务器 → [返回未过滤代码] → 浏览器解析执行
2. 存储型(持久型)
- 特点:
- 与数据库交互
- 网页源代码中可见payload
- 攻击流程:
客户端 → [提交恶意JS] → 服务器 → [存储到DB] → [查询返回] → 浏览器解析执行
3. DOM型
- 特点:
- 网页源代码中无payload
- 浏览器兼容性影响大
- 攻击流程:
客户端 → [插入恶意JS] → JS解释器解析执行
四、常用Payload
1. 基础Payload
<script>alert`1`</script>
<audio src='#' onerror=alert`1`>
<svg onload="alert`1`"></svg>
<iframe onload="alert`1`"></iframe>
2. 高级技巧
-
HTML注释:
<!-- --!>也是有效注释 -
伪协议:
<a href="javascript:alert`1`">click</a>可变形为:
<a href="java&NewLine;script:alert`1`">click</a> -
空白字符绕过:
// 以下写法等效 onerror = alert`1` onerror = alert`1` -
字符串重组:
- 取反或异或运算重组字符串(应对严格过滤)
五、特殊注意事项
-
编码限制:
- HTML字符编码生成的引号无法闭合属性值
- 浏览器仅对属性值进行HTML编码
-
标签限制:
- 以下标签内不能直接嵌入JS,需先闭合:
<title>, <style>, <script>, <textarea>, <noscript>, <xmp>, <iframe>
- 以下标签内不能直接嵌入JS,需先闭合:
-
防御误区:
htmlspecialchars()默认不转义单引号,需设置第二参数- HttpOnly不能防止所有XSS攻击(BurpSuite仍可操作)
六、防御措施
1. 输入处理
- 编码转换:
htmlspecialchars($str, ENT_QUOTES); // 转义单双引号
2. Cookie安全
setcookie(name, value, expire, path, domain, secure, httponly);
// 设置httponly=true防止JS访问
3. 内容安全策略(CSP)
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'unsafe-inline'">
七、高级技巧
-
DOM型XSS常见触发点:
element.innerHTML = userInput; document.write(userInput); -
编码混合使用:
<!-- 混合URL编码和HTML编码 --> <a href="javascri&#x70;t:alert%281%29">click</a> -
非常规事件处理器:
<details ontoggle="alert`1`"></details> <select onfocus="alert`1`"></select>
八、推荐资源
- 《XSS Cheat Sheet》 - 全面收集各种Payload
- 浏览器编码解码原理
九、总结要点
- XSS通常需要配合CSRF才能发挥最大危害
- 浏览器兼容性对XSS效果影响显著
- 防御需结合输入过滤、输出编码和CSP策略
- 关注新兴Web技术(如Web Components)可能引入的新攻击面