任意用户密码重置(三):用户混淆
字数 1107 2025-08-18 11:37:02
任意用户密码重置漏洞分析:用户混淆案例详解
漏洞概述
任意用户密码重置漏洞是逻辑漏洞中最常见的一类,主要出现在密码找回功能中。本文重点分析因用户混淆导致的任意用户密码重置问题,包含三个典型案例及防御措施。
漏洞核心要素
密码找回逻辑包含四个关键要素,若未完整关联则可能导致漏洞:
- 用户标识:用户名、用户ID、cookie等
- 接收端:手机、邮箱等验证凭证接收方式
- 凭证:验证码、token等验证手段
- 当前步骤:流程中的步骤状态
案例一:Cookie混淆攻击
漏洞描述
通过篡改会话cookie,将攻击者账号的密码重置流程应用于其他用户账号。
攻击步骤
- 使用攻击者账号(yangyangwithgnu)发起密码找回流程
- 完成邮箱验证码校验,进入新密码设置页面
- 拦截提交请求(包含PHPSESSID=dcusc1ahkn4ioqeeav9c6e0bdq)
- 不发送该请求,新开页面为普通账号(liuwei)发起密码找回
- 此时PHPSESSID已关联到liuwei账号
- 发送之前拦截的请求,成功重置liuwei密码
漏洞原因
服务端仅依赖PHPSESSID判断目标账号,未校验账号与流程的一致性。
案例二:请求参数篡改攻击
漏洞描述
通过直接修改请求中的用户名参数实现任意用户密码重置。
攻击步骤
- 攻击者完成自身账号的密码找回流程
- 拦截第三步请求(含accountname参数)
- 将accountname改为目标账号(zhangzhiqiang)
- 放行请求,成功重置目标账号密码
额外发现
- 短信验证码(vcode)参数可置空或删除,服务端不校验
- 结合其他问题可实现批量密码重置
案例三:Token中的用户ID篡改
漏洞描述
通过修改重置链接中的base64编码用户ID实现攻击。
攻击步骤
- 获取攻击者账号的重置链接,含NDI1NTg=(42558的base64)
- 解码发现42558是攻击者用户ID
- 替换为目标账号的用户ID的base64编码
- 访问修改后的链接,成功重置目标账号密码
关键点
REST风格URL中的参数需特别注意,/后的部分可能是参数值。
防御措施
- 一致性验证:服务端应验证重置用户与接收凭证的一致性
- 服务端生成:关键参数应由服务端生成,不从客户端获取
- 四要素关联:用户标识、接收端、凭证、当前步骤必须完整关联
- 参数校验:严格检查HTTP参数污染、缺失等问题
- 会话绑定:密码找回流程应与初始请求会话严格绑定
总结
任意用户密码重置漏洞的核心在于用户标识与其他要素的关联缺失。攻击者通过cookie混淆、参数篡改等方式利用这种缺失,防御关键在于服务端对所有关键要素的严格验证和关联。