XSS详解
字数 2274 2025-08-10 20:35:59
XSS攻击详解与防御指南
一、XSS攻击概述
XSS(Cross Site Scripting)即跨站脚本攻击,是一种HTML注入攻击。当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。
攻击原理
- 攻击者通过正常输入手段夹带恶意HTML脚本代码
- 服务器未对用户输入进行安全验证
- 受害者浏览器访问被注入恶意脚本的页面
- 恶意脚本在受害者浏览器中执行
攻击三要素
- 攻击者:构造并注入恶意脚本
- 目标服务器:存在漏洞的Web应用
- 受害者浏览器:信任目标服务器并执行恶意脚本
二、XSS攻击类型
1. 反射型XSS(非持久型XSS)
特点:
- 即时性:不经过服务器存储,直接通过HTTP请求完成攻击
- 需要诱骗用户点击特定链接
- 反馈率低,较难发现和修复
- 主要用于盗取用户敏感信息
攻击流程:
- 攻击者发现存在反射型XSS的URL
- 构造特定XSS代码
- 将构造的XSS代码发送给受害者
- 受害者点击后执行XSS代码
- 攻击者获取目标信息(如cookie)
2. 存储型XSS(持久型XSS)
特点:
- 持久性:恶意脚本被永久存储在服务器(数据库、文件系统等)
- 危害面广,可能让用户机器成为DDoS攻击肉鸡
- 盗取用户敏感私密信息
- 隐蔽性强,危害更大
常见场景:
- 论坛发帖
- 留言板
- 评论区
- 用户资料编辑
3. DOM-based型XSS
特点:
- 不依赖服务器端数据
- 完全在客户端执行
- 基于JavaScript动态检查和修改页面内容
- 常见输入源:document.URL、location.hash、location.search等
三、XSS漏洞挖掘方法
反射型XSS挖掘
工具扫描:
- Safe3WVS
- Burpsuite
- AWVS
- Appscan
- W3af
手工检测方法:
- 见框就插:在输入框输入测试字符串
- 查看源代码确定字符串位置
- 测试过滤字符:
<>""/&() - 根据过滤情况构造特定XSS代码
测试步骤:
- 输入唯一字符串(如"whoami")
- 查看源代码中字符串出现位置
- 尝试闭合前标签并插入脚本
- 构造如
"><script>alert('XSS')</script>
存储型XSS挖掘
测试方法:
- 在留言/评论处输入测试标签(如
<a>标签) - 使用F12审查元素查看是否被过滤
- 如未被过滤,构造完整XSS代码
- 使用XSS平台创建项目并嵌入恶意脚本
隐蔽测试技巧:
- 避免直接使用
<script>alert("xss")</script> - 使用
<a>标签等更隐蔽的方式测试 - 将恶意脚本嵌入看似正常的留言中
DOM-based XSS挖掘
测试方法:
- 分析页面JavaScript代码
- 查找从URL获取参数的代码
- 测试参数是否未经处理直接输出到页面
- 尝试注入脚本代码
示例测试:
<script>
document.write(document.URL.substring(document.URL.indexOf("a=")+2,document.URL.length));
</script>
测试URL:test.html?a=<script>alert("xss")</script>
四、XSS攻击危害
- 网络钓鱼:盗取各类用户账号
- 窃取用户信息:获取cookies和隐私信息
- 会话劫持:执行任意操作(转账、发帖等)
- 强制广告:弹出广告页面、刷流量
- 网页挂马:篡改页面信息、删除内容
- DDoS攻击:利用客户端发起攻击
- 信息收集:获取浏览历史、真实IP、开放端口等
- 控制受害者机器:向其他网站发起攻击
- 结合其他漏洞:如CSRF漏洞实施进一步攻击
- 权限提升:进一步渗透网站
- 传播蠕虫:跨站脚本蠕虫传播
五、XSS防御措施
通用防御原则
- 输入过滤:对用户输入进行严格验证
- 输出编码:在输出到页面时进行编码
- 内容安全策略(CSP):限制脚本执行来源
- HttpOnly标志:保护cookie不被JavaScript访问
反射型XSS防御
- Web页面渲染内容应全部来自服务端
- 避免直接从URL、document.referrer等DOM API获取数据直接渲染
- 谨慎使用以下方法:
- eval
- new Function()
- document.write()
- document.writeln()
- window.setInterval()
- window.setTimeout()
- innerHTML
- document.createElement()
- 对涉及DOM渲染的字符串参数做escape转义
- 前端渲染时对所有字段做escape转义编码
存储型XSS防御
- 后端入库前对所有字段统一进行转义处理
- 后端输出给前端数据时统一进行转义处理
- 前端渲染时不信任任何后端数据,对所有字段做转义处理
编码与转义
-
HTML实体编码:
<→<>→>"→"'→'/→/
-
JavaScript编码:
- 使用
\x或\u进行编码 - 如
<→\x3C
- 使用
-
URL编码:
- 使用encodeURIComponent()对URL参数编码
其他防御措施
-
设置安全头部:
- X-XSS-Protection
- Content-Security-Policy
- X-Content-Type-Options
-
框架安全特性:
- 使用现代框架(React、Angular、Vue等)的内置XSS防护
- 避免使用不安全的API
-
定期安全测试:
- 自动化扫描
- 人工渗透测试
- 代码审计
六、实战防御示例
输入过滤示例
function xssFilter(input) {
return input.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'")
.replace(/\//g, "/");
}
输出编码示例
<?php
function htmlEncode($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
echo htmlEncode($userInput);
?>
CSP策略示例
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; object-src 'none'; style-src 'self' 'unsafe-inline';
通过全面实施这些防御措施,可以显著降低XSS攻击的风险,保护Web应用和用户数据的安全。