任意用户密码重置漏洞是:未经用户本身授权,非法修改任意账号密码的一种攻击方式;任意用户密码重置影响系统的稳定性,可由此作为攻击入口,进行持续攻击。
常见的任意用户密码重置类型大致分为四种:
1、验证码设计缺陷
2、绕过验证方式
3、权限未绑定
4、数据库未授权访问
一、验证码设计缺陷
1、验证码不失效
1.1、检测方法
获取验证码时,由于验证码不失效,可针对验证码进行枚举。
1.2、修复方法
1、优先进行验证码的校验。
2、验证码校验过一次即失效,再次验证需要重新生成新的验证码。
3、设定提交校验的验证码的有效期,时间不宜过长。
4、验证码的校验应当在服务器端进行,避免客户端校验,以防绕过。
2、仅判断验证码是否正确
2.1、检测方法
重置密码过程中,通过手机号获取验证码,但重置密码时仅校验了验证码是否正确,未对手机号和验证码的关联性做验证。
2.2、修复方法
校验手机号和验证码是否匹配。
3、验证码在响应中返回
3.1、检测方法
发送获取验证码的请求,抓取响应,在响应包中可查看验证码。
3.2、修复方法
验证码避免返回在响应中。
二、绕过验证方式
1、无任何验证
1.1、检测方法
密码重置页面五任何验证,通过账号,给定验证码及新密码即可更改。
1.2、修复方法
验证手机用户的有效性,获取短信验证码,确认重置密码时,验证手机号与短信验证码是否匹配。
2、修改返回包,绕过验证
2.1、检测方法
此方法一般是通过拦截响应包,修改响应中的code等参数,将其更改未成功验证的值,进行绕过。
2.2、修复方法
设置密码界面,提交修改密码处再次验证验证码。
3、直接访问设置密码界面
3.1、检测方法
重置密码的链接可在前端js中获取,直接访问重置密码的URL进行用户密码重置。
3.2、修复方法
修改js代码,删除密码重置api,严格控制用户权限。
4、邮箱中密码重置连接可fuzzing
4.1、检测方法
找回密码时,系统发送一个找回密码的链接到邮箱中,访问此链接,在URL中会明文显示出邮箱,并在页面中显示处邮箱和手机号,输入新密码,成功设置。
4.2、修复方法
URL中不明文显示email、id、手机号等敏感信息;手机号等信息不自动显示、链接中增加随机值校验。
三、权限未绑定
1、未判断手机号是否与用户绑定
1.1、检测方法
重置密码时未鉴权、未校验手机号是否与此用户匹配
1.2、修复方法
对用户进行鉴权,判断id是否为当前用户的id;更新密码时,验证旧密码。
2、Session覆盖导致任意用户密码重置
2.1、检测方法
用攻击者的session替换攻击者的session,绕过系统验证,重置被攻击者的密码。
2.2、修复方法
判断session与用户的匹配关系。
3、越权导致修改任意用户密码
3.1、检测方法
更新密码时未进行鉴权,可通过修改请求中ID等参数修改其他用户密码。
3.2、修复方法
对用户进行鉴权,判断id是否为当前用户的id;更新密码时,验证旧密码。
四、数据库未授权导致
数据库未授权访问,导致可直接访问数据库中的users表,修改任意用户的密码。
修复建议:对数据库设置访问权限,禁止未授权访问。