密码找回中的套路
字数 1516 2025-08-25 22:59:09

密码找回功能安全测试指南

1. 常见密码找回漏洞类型

1.1 用户凭证暴力破解

  • 验证码/Token可被暴力枚举
  • 缺乏尝试次数限制
  • 验证码复杂度不足

1.2 系统返回重要凭证

  • 响应中包含敏感信息(如重置token)
  • 前端源码暴露验证逻辑
  • API接口返回过多信息

1.3 邮箱/手机弱Token

  • 重置Token可预测
  • Token时效过长
  • Token未绑定特定用户

1.4 Token通用问题

  • 同一Token可用于多个用户
  • Token可重复使用
  • Token未在重置后失效

1.5 Session覆盖

  • 通过修改Session劫持重置流程
  • Session固定攻击
  • Session未正确绑定用户

1.6 用户凭证有效期问题

  • 重置链接永久有效
  • 时效设置过长(如24小时)
  • 无失效机制

1.7 凭证算法被破解

  • 使用可预测的算法生成Token
  • 加密算法强度不足
  • 密钥泄露

1.8 前端校验问题

  • 仅依赖前端验证
  • 可绕过前端验证
  • 关键逻辑放在客户端

2. 特殊攻击手法详解

2.1 Host Header欺骗攻击

原理

  • 应用使用$_SERVER['HTTP_HOST']动态生成密码重置链接
  • 攻击者可修改Host头指向自己控制的域名
  • 受害者点击链接时,攻击者可获取重置Token

攻击步骤

  1. 拦截密码重置请求
  2. 修改Host头为攻击者控制的域名(如evil.com?.target.com
  3. 受害者收到包含恶意域名的重置链接
  4. 受害者点击链接时,攻击者从访问日志获取重置Token

防御措施

  • 使用服务器配置的固定域名生成链接
  • 验证Host头的合法性
  • 使用$_SERVER['SERVER_NAME']替代HTTP_HOST

2.2 验证链接批量发送漏洞

原理

  • 后端接受邮箱/手机号数组作为输入
  • 只要数组中有一个有效账户,就向所有地址发送相同重置链接
  • 攻击者可插入自己的邮箱获取他人重置链接

攻击步骤

  1. 构造包含受害者邮箱和攻击者邮箱的数组
    emails[]=victim@example.com&emails[]=attacker@evil.com
    
  2. 提交请求后,两个邮箱都会收到相同的重置链接
  3. 攻击者使用自己邮箱收到的链接重置受害者密码

防御措施

  • 只接受单个邮箱/手机号作为输入
  • 重置链接与接收者绑定,不可通用
  • 记录重置链接发送日志

2.3 手机号SQL注入

原理

  • 密码重置功能中手机号参数直接拼接SQL查询
  • 攻击者可构造恶意输入执行SQL命令

攻击示例

-- 正常查询
SELECT * FROM users WHERE phone='13800138000'

-- 恶意注入
phone=13800138000' AND 1=1 OR '1'='1

特殊案例

  • 使用数学函数绕过检测(如sqrt平方根函数)
  • 通过计算使SQL条件恒真

防御措施

  • 使用参数化查询
  • 对输入进行严格过滤
  • 使用ORM框架避免直接SQL拼接

3. 其他测试要点

3.1 密码重置流程测试

  • 测试各步骤是否可跳过或乱序执行
  • 验证中间步骤的Session依赖
  • 检查步骤间状态传递的安全性

3.2 Token安全性测试

  • 分析Token生成算法(长度、熵值、随机性)
  • 测试Token时效性
  • 验证Token与用户绑定关系

3.3 验证码测试

  • 验证码是否可OCR识别
  • 验证码是否可重复使用
  • 验证码暴力破解测试

3.4 响应信息测试

  • 检查响应中是否泄露敏感信息
  • 测试不同情况下的错误信息差异
  • 验证API接口信息过滤

4. 防御建议

  1. 输入验证

    • 严格验证所有输入参数
    • 使用白名单验证邮箱/手机号格式
    • 拒绝数组形式的批量输入
  2. Token安全

    • 使用高熵值随机Token
    • 设置合理有效期(建议1小时内)
    • Token使用后立即失效
  3. 链接生成

    • 使用配置的固定域名
    • 避免依赖客户端提供的Host头
    • 链接中包含用户标识
  4. 日志监控

    • 记录所有密码重置操作
    • 监控异常重置行为
    • 设置重置频率限制
  5. 安全编码

    • 避免SQL拼接
    • 关键逻辑放在服务端
    • 实施深度防御策略
密码找回功能安全测试指南 1. 常见密码找回漏洞类型 1.1 用户凭证暴力破解 验证码/Token可被暴力枚举 缺乏尝试次数限制 验证码复杂度不足 1.2 系统返回重要凭证 响应中包含敏感信息(如重置token) 前端源码暴露验证逻辑 API接口返回过多信息 1.3 邮箱/手机弱Token 重置Token可预测 Token时效过长 Token未绑定特定用户 1.4 Token通用问题 同一Token可用于多个用户 Token可重复使用 Token未在重置后失效 1.5 Session覆盖 通过修改Session劫持重置流程 Session固定攻击 Session未正确绑定用户 1.6 用户凭证有效期问题 重置链接永久有效 时效设置过长(如24小时) 无失效机制 1.7 凭证算法被破解 使用可预测的算法生成Token 加密算法强度不足 密钥泄露 1.8 前端校验问题 仅依赖前端验证 可绕过前端验证 关键逻辑放在客户端 2. 特殊攻击手法详解 2.1 Host Header欺骗攻击 原理 : 应用使用 $_SERVER['HTTP_HOST'] 动态生成密码重置链接 攻击者可修改Host头指向自己控制的域名 受害者点击链接时,攻击者可获取重置Token 攻击步骤 : 拦截密码重置请求 修改Host头为攻击者控制的域名(如 evil.com?.target.com ) 受害者收到包含恶意域名的重置链接 受害者点击链接时,攻击者从访问日志获取重置Token 防御措施 : 使用服务器配置的固定域名生成链接 验证Host头的合法性 使用 $_SERVER['SERVER_NAME'] 替代 HTTP_HOST 2.2 验证链接批量发送漏洞 原理 : 后端接受邮箱/手机号数组作为输入 只要数组中有一个有效账户,就向所有地址发送相同重置链接 攻击者可插入自己的邮箱获取他人重置链接 攻击步骤 : 构造包含受害者邮箱和攻击者邮箱的数组 提交请求后,两个邮箱都会收到相同的重置链接 攻击者使用自己邮箱收到的链接重置受害者密码 防御措施 : 只接受单个邮箱/手机号作为输入 重置链接与接收者绑定,不可通用 记录重置链接发送日志 2.3 手机号SQL注入 原理 : 密码重置功能中手机号参数直接拼接SQL查询 攻击者可构造恶意输入执行SQL命令 攻击示例 : 特殊案例 : 使用数学函数绕过检测(如 sqrt 平方根函数) 通过计算使SQL条件恒真 防御措施 : 使用参数化查询 对输入进行严格过滤 使用ORM框架避免直接SQL拼接 3. 其他测试要点 3.1 密码重置流程测试 测试各步骤是否可跳过或乱序执行 验证中间步骤的Session依赖 检查步骤间状态传递的安全性 3.2 Token安全性测试 分析Token生成算法(长度、熵值、随机性) 测试Token时效性 验证Token与用户绑定关系 3.3 验证码测试 验证码是否可OCR识别 验证码是否可重复使用 验证码暴力破解测试 3.4 响应信息测试 检查响应中是否泄露敏感信息 测试不同情况下的错误信息差异 验证API接口信息过滤 4. 防御建议 输入验证 : 严格验证所有输入参数 使用白名单验证邮箱/手机号格式 拒绝数组形式的批量输入 Token安全 : 使用高熵值随机Token 设置合理有效期(建议1小时内) Token使用后立即失效 链接生成 : 使用配置的固定域名 避免依赖客户端提供的Host头 链接中包含用户标识 日志监控 : 记录所有密码重置操作 监控异常重置行为 设置重置频率限制 安全编码 : 避免SQL拼接 关键逻辑放在服务端 实施深度防御策略