一、漏洞简介
网站在对密码修改的时候,未对修改密码的凭证、步骤做严格的限制,导致可以被绕过从而修改密码。
二、测试思路
1.首先尝试正常找回密码流程,选择不同的找回方式,记录所有数据包
2.分析数据包,找到敏感部分
3.分析后台找回机制所采用的验证手段
4.修改数据包验证推测
三、常见方法
A.验证码不失效
1.原理
一般情况下找回密码通过手机号码或者邮箱号码找回,短信验证码一般都有过期的时间,如果验证码没有过期时间或者是过期时间太久,导致可以爆破
2.测试方式
通过爆破、枚举的方法找到正确的验证码
B. 验证凭证回传
1.原理
验证码一般会发送到手机或者邮箱里,但是由于开发者的失误,通过抓取返回包可以看到验证码
2.测试方法
通过截断数据包分析验证码是否在数据包中,如果捕获到,就可以直接填写。
C.验证码未绑定
1.原理
输入手机号和验证码进行重置密码的时候,仅对验证码是够正确进行了判断,未对该验证码是否与手机号匹配做验证。
2.测试方法
在提交手机号和验证码的时候,替换手机号为其他手机号进行测试,成功通过验证并重置其密码。
D.用户名未绑定邮箱号/手机号
1.原理
用户名、手机号、验证码三者没有统一进行验证,仅判断了三者中的手机号和验证是否匹配和正确,如果正确则判断成功并进入密码修改界面。
2.测试方法
输入用户名获取验证码,通过抓包修改接收验证码的手机号为自己的号码,自己手机成功接收验证码,提交到网站进行验证,验证成功并进入密码修改界面。
E.修改新密码时未校验用户字段
1.原理
在重置密码界面,没有再次对用户ID进行校验,导致提交参数时可以将用户ID更改,从而修改其他用户的密码。
2.测试方法
使用自己账号和自己手机号进行密码重置,在最后重置密码时,抓包修改用户id相关信息,修改他人密码。
四、修复方法
1.一次性填写校验信息(原始密码、新密码等)后再提交修改密码请求;
2.对客户端提交的修改密码请求,应对请求的用户身份与当前登录的用户身份进行校验,判断是否有权修改用户的密码并对原始密码是否正确也进行判断;
3.不应该将用于接收验证信息的手机、邮箱等信息全部明文传到客户端,应对手机、邮箱等信息进行屏蔽处理,或不将此类信息返回到客户端;
4.对原始密码进行了验证的情况下,限制输入原始密码的错误次数,以及有效的限制,防止攻击者暴力破解原始密码;
5.重置密码链接中的关键信息应随机化,不可预测(例如token机制),且禁止将关键信息返回到客户端。