重置密码功能是为了用户可以在忘记密码时重新设置账号凭证的一个有效途径,其本身并未安全问题,但是在重置密码中的验证机制不够完善也就造成了问题的出现,其最主要的原因是用户名,辅助凭证,辅助验证码没有进行统一验证。其可以导致用户账号丢失、信息丢失、财产损失等,对企业来讲,任意账号重置的漏洞将会丢失大量数据,失去用户信任,严重妨碍企业业务,带来巨大的财产损失。
密码重置流程
重置密码的过程,是证明身份并重新设置登录凭证的过程
Step 1:输入账号名以及注册账号时预留的辅助验证凭证(手机号/邮箱)
Step 2:后端服务向该用户绑定的手机号/邮箱等发送验证码,或重置连接(重置连接为了安全性一般具备时效性)
Step 3.0:用户输入验证码,证明操作者是账号所有者,后端进行重置密码
Step 3.1:用户使用重置连接,证明操作者是账号所有者,后端进行重置密码
常见问题汇总
任意验证码发送
当程序发送短信时没有将手机号/邮箱与账号进行匹配,就会导致任意验证码发送问题,攻击者可以用自己手机号码、邮箱收到的重置用验证码,用以重置其它用户的密码。或者利用此功能进行短信轰炸。
严重程度
中
测试方法
使用与账号不匹配的手机号/邮箱尝试接收验证码,查看是否接收成功,如果成功则存在问题。
修复建议
发送短信验证码时需要
出现阶段:Step 2:后端服务向该用户绑定的手机号/邮箱等发送验证码,或重置连接(重置连接为了安全性一般具备时效性)
任意重置连接发送
当程序发送重置连接时没有将手机号/邮箱与账号进行匹配,就会导致重置连接发送问题,攻击者可以用自己手机号码、邮箱收到的重置连接,用以重置其它用户的密码。或者利用此功能进行短信轰炸。
严重程度
中
测试方法
使用与账号不匹配的手机号/邮箱尝试接收重置连接,查看是否接收成功,如果成功则存在问题。
修复建议
发送重置内容需要验证重置凭证与账号匹配
出现阶段:Step 2:后端服务向该用户绑定的手机号/邮箱等发送验证码,或重置连接(重置连接为了安全性一般具备时效性)
重置连接过于简单
重置连接过于简单,则容易被攻击者猜测从而直接通过篡改的方式直接模拟其他账号的重置连接,从而达到重置其他账号的目的。
严重程度
中
测试方法
分析重置连接中是否有明确的用户名标识,或用户id的标识,如果有用户名标识,或id标识易于模拟则存在问题
修复建议
1、重置连接应为后端验证身份后生成的一条重置信息,重置信息保存在数据库或内存中,且具有时效性。单重置密码时先判断数据库或内存中是否存在此重置信息
2、重置连接需要进行加密处理,连接参数应为无法猜测的密文串,而非明文信息
出现阶段:Step 2:后端服务向该用户绑定的手机号/邮箱等发送验证码,或重置连接(重置连接为了安全性一般具备时效性)
最终的重置请求未验证身份(此处才是真正的任意密码重置漏洞)
最终重置请求没有验证用户身份信息。攻击者用自己的手机号码短信验证码走重置流程,最后一步重置请求抓包修改身份信息为其它用户的,从而进行其它用户密码的重置
严重程度
高
测试方法
1、观察最终的重置密码请求是否为用户名,辅助验证凭证(手机号/邮箱),验证码同时验证,具体关注点
- 修改密码的请求中是否同时传递了,辅助验证凭证(手机号/邮箱),验证码
- 辅助验证凭证(手机号/邮箱),验证码正确的情况下,将账号修改为攻击账号
修复建议
最终重置请求需要同步验证账号,凭证,凭证码的匹配情况
出现阶段:Step 3.0:用户输入验证码,证明操作者是账号所有者,后端进行重置密码