在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区。我把日常渗透过程中遇到的案例作了漏洞成因分析,这次,关注因重置凭证可暴破导致的任意用户密码重置问题。

传送门:

任意用户密码重置(一):重置凭证泄漏

任意用户密码重置(二):重置凭证接收端可篡改

任意用户密码重置(三):用户混淆

任意用户密码重置(四):重置凭证未校验

密码找回需要鉴别用户的合法身份,证明你就是你,通常有两种做法,一是网站将重置验证码发至用户绑定的邮箱或手机号,用户持重置验证码证明你就是你,二是用户输入密码保护问题对应的答案。其中,验证码、密保答案就是重置密码的重要凭证。有些网站生成四位数字的重置验证码,复杂度较低,[0000, 9999] 也就一万种组合,在如今的计算能力和网络带宽条件下,顺手的工具三五分钟的功夫就能枚举完。如果服务端又未设置验证码的存活有效期、未限制高频访问,那么极易暴破。

案例一

密码找回页面 http://www.xxxx.com/find-pw.html 用攻击者账号 13908081024 进入密码找回全流程,输入图片验证码、选择手机找回、获取短信验证码,发现短信验证码为 4 位数字且短信内容上未看到有效期信息,所以,可暴破短信验证码,进行后续的重置流程。

用账号枚举漏洞遍历得到的普通手机号 13908093346 为例,进入密码找回流程,提交短信验证码:

任意用户密码重置(五):重置凭证可暴破

其中,1234 是我随便输入的错误的短信验证码,需要对 code 参数值进行暴破以找出正确的短信验证码。

具体而言,我将该请求中的 code 参数值定义为枚举变量、以 [0000, 9999] 为字典,设定 32 个线程进行暴破:

任意用户密码重置(五):重置凭证可暴破

很快暴出短信验证码为 6909:

任意用户密码重置(五):重置凭证可暴破

提交短信验证码后顺利进入新密码设置页面,重置密码设为 PenTest1024 后提交,服务端返回“修改成功”:

任意用户密码重置(五):重置凭证可暴破

尝试用 13908093346/PenTest1024 登录,验证成功:

任意用户密码重置(五):重置凭证可暴破

案例二

密码找回页面 http://xx.xxxx.com/xxxx/findpassword 用攻击者账号 13908081024 进入密码找回全流程,输入图片验证码、选择手机找回、获取短信验证码,发现短信验证码为 4 位数字且短信内容上未告知有效期,所以,可暴破短信验证码,进行后续的重置流程。

用用户名枚举得到的普通手机号 15012804897 为例,进入密码找回流程,提交短信验证码:

任意用户密码重置(五):重置凭证可暴破

其中,1234 是我随便输入的错误的短信验证码,需要对 auto 参数进行暴破以找出正确的短信验证码:

任意用户密码重置(五):重置凭证可暴破

很快暴出短信验证码为 9997,输入后进入新密码提交页面,重置密码为 PenTest1024 后提交:

任意用户密码重置(五):重置凭证可暴破

尝试用 15012804897/PenTest1024 登录,验证成功:

任意用户密码重置(五):重置凭证可暴破

加固措施

密码重置凭证强度提高,建议六位数字,有效期十分钟,并且验证码应校验一次后立即作废。另外,服务端应限制枚举等恶意请求。

*本文作者:yangyangwithgnu