挖洞经验 | 篡改密码重置的加密参数实现账号劫持研究
字数 1237 2025-08-15 21:31:17
篡改密码重置的加密参数实现账号劫持研究
漏洞概述
本文介绍了一种通过篡改RSA加密参数实现账号劫持的技术。该漏洞存在于Web应用的密码重置功能中,由于客户端缺乏安全的防护机制,攻击者可以通过操纵加密参数来劫持其他用户的账户。
目标分析
目标网站(target.com)具有以下特点:
- 所有参数操作都采用加密传输
- 加密形式为RSA加密
- 密码重置流程涉及客户端加密
密码重置流程
- 访问
target.com/signin页面,输入需要重置密码的邮箱号 - 服务端向邮箱发送6位数授权码
- 访问
target.com/forgotPasswd,输入邮箱、授权码和新密码完成重置
攻击过程详解
1. 初始观察
- 密码重置请求包含4个加密参数:
- Username
- Encrypted Password
- Code
- 直接替换为明文数值无效
- 尝试复制其他会话的加密email和username也无效
2. 加密方式确认
- 根据加密长度判断为RSA加密
- 通过分析目标Web应用的js脚本,发现包含rsa方法名称
- 确认采用客户端RSA加密
3. 加密机制分析
- 关闭浏览器js脚本执行后,密码重置功能失效
- 通过Chrome开发者工具(Console)发现
rsaEncrypt方法 - 该方法可以生成任意输入的加密数值
- 加密串与会话相关,每次刷新页面都会变化
4. 攻击实施步骤
- 以攻击者邮箱
attacker@email.com发起密码重置请求 - 获取授权码
- 在
target.com/forgotpasswd页面执行密码重置操作 - 使用Burp拦截请求
- 在另一个浏览器标签中:
- 访问
target.com/forgotpasswd - 在Console中执行:
s = "victim@email.com" rsaEncrypt(s) - 获取受害者邮箱的加密串
- 访问
- 在Burp中将
username参数替换为生成的rsaencryptedvictimemail - 保持其他参数不变
- 提交请求
5. 攻击结果
victim@email.com对应的账号密码被成功更改- 实现账户劫持
漏洞原理
该漏洞的根本原因在于:
- Web应用在客户端执行加密操作
- 缺乏对加密参数的完整性验证
- 服务端未能正确关联加密参数与原始请求
- 允许攻击者混合使用不同来源的加密参数
防御措施
-
服务端验证:
- 在服务端验证加密参数的来源和一致性
- 建立参数间的关联关系
-
加密机制改进:
- 避免完全依赖客户端加密
- 使用服务端生成的token来关联请求
-
会话管理:
- 加强会话与请求参数的绑定
- 防止参数跨会话使用
-
输入验证:
- 即使参数是加密的,也应验证其预期值和范围
-
安全设计:
- 关键操作如密码重置应采用更安全的流程设计
- 考虑使用一次性链接而非授权码
总结
本案例展示了即使使用强加密算法(RSA),如果实现不当,仍然可能导致严重的安全漏洞。关键在于安全是一个系统工程,不能仅依赖单一的加密措施,而需要考虑整个流程的安全设计。开发者应当特别注意客户端加密的实现方式,确保关键操作有适当的服务端验证机制。