密码重置功能逻辑漏洞测试旨在绕过设计者的预期流程,非法获取或修改用户账户的凭证。与传统的注入类漏洞不同,这类漏洞源于业务逻辑设计缺陷和验证机制的不严谨,通常无法通过自动化扫描器发现,需要手动进行深度推理和测试。本方案的核心目标是:通过攻击者思维,系统性地验证密码重置流程的每个环节,发现并利用其逻辑缺陷,从而未授权地重置任意用户密码。
- 测试策略-漏洞类型
测试需覆盖密码重置的完整生命周期:发起请求 -> 身份验证 -> 凭证传递 -> 密码修改。
漏洞类型一:身份验证绕过类
此类漏洞允许攻击者在不验证身份的情况下直接进入重置流程。
参数篡改:
测试方法: 在提交重置请求时,拦截HTTP请求(使用Burp Suite等工具),寻找标识目标用户的参数(如 user_id, username, email)。
案例: 请求 POST /reset-password 包含 email=victim@example.com。将其修改为 email=attacker@example.com,但系统却向 attacker@example.com 发送了重置 victim@example.com 密码的链接。漏洞在于:服务端仅使用了客户端提供的邮箱来发送链接,而未校验该邮箱是否与待重置账户的邮箱一致。
响应包状态码篡改:
测试方法: 拦截服务器返回的响应,特别是当输入一个不存在的用户名/邮箱时,服务器可能返回 HTTP 404 或 {“status”: “error”}。而当输入正确用户时,返回 HTTP 200 或 {“status”: “success”}。尝试在请求无效用户时,强制将响应修改为“成功”状态码,以期跳过验证。
案例: 攻击者输入无效邮箱,拦截到 HTTP 404,使用代理工具将其改为 HTTP 200,试图欺骗前端显示“重置邮件已发送”的页面。
漏洞类型二:凭证泄漏与弱验证类
此类漏洞涉及重置令牌(Token)的生成、传输与验证。
Token泄漏:
测试方法: 重置令牌是否直接出现在响应体中?在为合法用户(用测试账户)请求重置时,拦截所有服务器响应,搜索是否在JSON或HTML注释中返回了Token。
Token可预测/暴力破解:
测试方法: 为两个不同用户请求重置令牌,比较其Token的规律(如长度、字符集、递增趋势)。使用Burp Intruder对Token端点进行暴力破解,尝试遍历所有可能的Token值以重置目标账户。
案例: Token为4位或6位数字,且无速率限制或失败锁定机制,可被轻松破解。
Token未绑定用户:
这是最经典的漏洞之一。
测试方法: 用攻击者账户A请求重置,获得一个有效Token。退出登录,访问重置页面(/reset-password?token=),在输入新密码前,拦截请求,将请求中的用户名参数(或隐藏在表单中的user_id)修改为受害者账户B。
案例: 如果密码重置成功,说明服务端仅验证了Token的有效性,而未校验该Token是否是由当前要重置的用户(账户B)发起的。
漏洞类型三:功能滥用与权限提升类
邮箱轰炸:
测试方法: 对同一邮箱地址频繁调用“发送重置邮件”接口,检查是否缺乏次数限制、频率限制或图形验证码,导致被用来骚扰用户。
用户名枚举:
测试方法: 在重置页面输入不同用户名,根据服务器的响应差异来判断用户是否存在。例如:输入存在用户返回“邮件已发送”,输入不存在用户返回“用户未注册”。这种差异可被攻击者用来挖掘网站的有效用户名单。
主邮箱覆盖:
测试方法: 在某些流程中,系统会向用户的“备用邮箱”或“手机号”发送验证码。测试是否可以通过参数篡改,将接收验证码的通道改为攻击者控制的邮箱或手机号。
系统化测试流程
信息收集: 完整走一遍密码重置流程,用代理工具记录所有请求与响应,绘制流程图,标识出所有参数、端点、验证步骤。
入口点测试: 对流程的每个步骤进行测试,重点关注:
每个HTTP请求: 尝试修改所有参数。
每个验证点: 尝试绕过(如跳过短信验证码步骤)。
每个分支逻辑: 测试成功和失败时的不同处理方式。
令牌分析: 如果流程涉及令牌,深入研究其生成(是否可预测?)、传输(是否泄漏?)、验证(是否绑定用户?有效期多长?)、失效(使用后是否立即作废?)的每一个环节。
速率限制测试: 对所有涉及验证的接口(发送邮件、短信、提交Token)进行批量请求测试,检查是否存在防护机制。漏洞修复建议
强化身份验证: 在发送重置邮件前,使用图形验证码或邮件验证码进行初次验证。
安全Token设计: 使用长且 cryptographically secure 的随机数作为Token,确保其不可预测。Token必须与用户ID强绑定并在使用后立即失效。
消除信息差异: 无论用户名是否存在,均返回“重置指令已发送至您的邮箱”的通用信息,防止用户名枚举。
实施速率限制: 对所有公共接口(如 /forgot-password, /verify-token) 实施严格的IP级或账户级速率限制。
服务端控制: 绝对信任客户端传来的任何数据。所有权限和用户身份的判断必须在服务端进行。