密码找回中的套路
字数 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
攻击步骤:
- 拦截密码重置请求
- 修改Host头为攻击者控制的域名(如
evil.com?.target.com) - 受害者收到包含恶意域名的重置链接
- 受害者点击链接时,攻击者从访问日志获取重置Token
防御措施:
- 使用服务器配置的固定域名生成链接
- 验证Host头的合法性
- 使用
$_SERVER['SERVER_NAME']替代HTTP_HOST
2.2 验证链接批量发送漏洞
原理:
- 后端接受邮箱/手机号数组作为输入
- 只要数组中有一个有效账户,就向所有地址发送相同重置链接
- 攻击者可插入自己的邮箱获取他人重置链接
攻击步骤:
- 构造包含受害者邮箱和攻击者邮箱的数组
emails[]=victim@example.com&emails[]=attacker@evil.com - 提交请求后,两个邮箱都会收到相同的重置链接
- 攻击者使用自己邮箱收到的链接重置受害者密码
防御措施:
- 只接受单个邮箱/手机号作为输入
- 重置链接与接收者绑定,不可通用
- 记录重置链接发送日志
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. 防御建议
-
输入验证:
- 严格验证所有输入参数
- 使用白名单验证邮箱/手机号格式
- 拒绝数组形式的批量输入
-
Token安全:
- 使用高熵值随机Token
- 设置合理有效期(建议1小时内)
- Token使用后立即失效
-
链接生成:
- 使用配置的固定域名
- 避免依赖客户端提供的Host头
- 链接中包含用户标识
-
日志监控:
- 记录所有密码重置操作
- 监控异常重置行为
- 设置重置频率限制
-
安全编码:
- 避免SQL拼接
- 关键逻辑放在服务端
- 实施深度防御策略