挖洞经验 | 篡改密码重置的加密参数实现账号劫持研究
字数 1237 2025-08-15 21:31:17

篡改密码重置的加密参数实现账号劫持研究

漏洞概述

本文介绍了一种通过篡改RSA加密参数实现账号劫持的技术。该漏洞存在于Web应用的密码重置功能中,由于客户端缺乏安全的防护机制,攻击者可以通过操纵加密参数来劫持其他用户的账户。

目标分析

目标网站(target.com)具有以下特点:

  • 所有参数操作都采用加密传输
  • 加密形式为RSA加密
  • 密码重置流程涉及客户端加密

密码重置流程

  1. 访问target.com/signin页面,输入需要重置密码的邮箱号
  2. 服务端向邮箱发送6位数授权码
  3. 访问target.com/forgotPasswd,输入邮箱、授权码和新密码完成重置

攻击过程详解

1. 初始观察

  • 密码重置请求包含4个加密参数:
    • Email
    • Username
    • Encrypted Password
    • Code
  • 直接替换为明文数值无效
  • 尝试复制其他会话的加密email和username也无效

2. 加密方式确认

  • 根据加密长度判断为RSA加密
  • 通过分析目标Web应用的js脚本,发现包含rsa方法名称
  • 确认采用客户端RSA加密

3. 加密机制分析

  • 关闭浏览器js脚本执行后,密码重置功能失效
  • 通过Chrome开发者工具(Console)发现rsaEncrypt方法
  • 该方法可以生成任意输入的加密数值
  • 加密串与会话相关,每次刷新页面都会变化

4. 攻击实施步骤

  1. 以攻击者邮箱attacker@email.com发起密码重置请求
  2. 获取授权码
  3. target.com/forgotpasswd页面执行密码重置操作
  4. 使用Burp拦截请求
  5. 在另一个浏览器标签中:
    • 访问target.com/forgotpasswd
    • 在Console中执行:
      s = "victim@email.com"
      rsaEncrypt(s)
      
    • 获取受害者邮箱的加密串
  6. 在Burp中将username参数替换为生成的rsaencryptedvictimemail
  7. 保持其他参数不变
  8. 提交请求

5. 攻击结果

  • victim@email.com对应的账号密码被成功更改
  • 实现账户劫持

漏洞原理

该漏洞的根本原因在于:

  1. Web应用在客户端执行加密操作
  2. 缺乏对加密参数的完整性验证
  3. 服务端未能正确关联加密参数与原始请求
  4. 允许攻击者混合使用不同来源的加密参数

防御措施

  1. 服务端验证

    • 在服务端验证加密参数的来源和一致性
    • 建立参数间的关联关系
  2. 加密机制改进

    • 避免完全依赖客户端加密
    • 使用服务端生成的token来关联请求
  3. 会话管理

    • 加强会话与请求参数的绑定
    • 防止参数跨会话使用
  4. 输入验证

    • 即使参数是加密的,也应验证其预期值和范围
  5. 安全设计

    • 关键操作如密码重置应采用更安全的流程设计
    • 考虑使用一次性链接而非授权码

总结

本案例展示了即使使用强加密算法(RSA),如果实现不当,仍然可能导致严重的安全漏洞。关键在于安全是一个系统工程,不能仅依赖单一的加密措施,而需要考虑整个流程的安全设计。开发者应当特别注意客户端加密的实现方式,确保关键操作有适当的服务端验证机制。

篡改密码重置的加密参数实现账号劫持研究 漏洞概述 本文介绍了一种通过篡改RSA加密参数实现账号劫持的技术。该漏洞存在于Web应用的密码重置功能中,由于客户端缺乏安全的防护机制,攻击者可以通过操纵加密参数来劫持其他用户的账户。 目标分析 目标网站(target.com)具有以下特点: 所有参数操作都采用加密传输 加密形式为RSA加密 密码重置流程涉及客户端加密 密码重置流程 访问 target.com/signin 页面,输入需要重置密码的邮箱号 服务端向邮箱发送6位数授权码 访问 target.com/forgotPasswd ,输入邮箱、授权码和新密码完成重置 攻击过程详解 1. 初始观察 密码重置请求包含4个加密参数: Email 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中执行: 获取受害者邮箱的加密串 在Burp中将 username 参数替换为生成的 rsaencryptedvictimemail 保持其他参数不变 提交请求 5. 攻击结果 victim@email.com 对应的账号密码被成功更改 实现账户劫持 漏洞原理 该漏洞的根本原因在于: Web应用在客户端执行加密操作 缺乏对加密参数的完整性验证 服务端未能正确关联加密参数与原始请求 允许攻击者混合使用不同来源的加密参数 防御措施 服务端验证 : 在服务端验证加密参数的来源和一致性 建立参数间的关联关系 加密机制改进 : 避免完全依赖客户端加密 使用服务端生成的token来关联请求 会话管理 : 加强会话与请求参数的绑定 防止参数跨会话使用 输入验证 : 即使参数是加密的,也应验证其预期值和范围 安全设计 : 关键操作如密码重置应采用更安全的流程设计 考虑使用一次性链接而非授权码 总结 本案例展示了即使使用强加密算法(RSA),如果实现不当,仍然可能导致严重的安全漏洞。关键在于安全是一个系统工程,不能仅依赖单一的加密措施,而需要考虑整个流程的安全设计。开发者应当特别注意客户端加密的实现方式,确保关键操作有适当的服务端验证机制。