作者:HackBraid
0x01 背景
设计缺陷和逻辑相关的漏洞是目前漏洞挖掘者比较关注的,最近在国外漏洞披露平台hackerone上就有位白帽子挖掘到了Uber的一个修改任意账户密码的逻辑漏洞获得了10000$的丰厚奖励。所以如何在源码中找逻辑漏洞是安全和开发人员必须熟悉的技能,主要总结了安装问题、找回密码这两篇内容,这篇讲的是代码审计中找回密码的设计缺陷导致的任意用户密码重置的安全问题。
找回密码的原理:验证auth,在找回密码的时候生成一个auth,然后存储到数据库中,然后把找回密码的地址发到邮箱中 url中就含有auth,由用户点开后就能修改密码。
0x02 rand函数生成auth
Windows环境下rand()最大值为32768,所以可被穷举,使用不当就会出现漏洞。之前出现过的漏洞代码如下:
可以看到重置密码链接就两个参数,一个是邮箱另外一个就是auth,然而auth是使用了rand()函数生成的,所以我们可以写个脚本生成1-32768的md5值,然后使用burp来Fuzz就能重置任意用户密码了。
生成1-32768的md5脚本如下:
之后我们以重置管理员admin@admin.com的密码为例,首先抓重置密码的包并设置好变量如下:
然后爆破resetpwd这个auth字段,发现爆破成功!
0x03 auth过于简单可被猜解跟与rand函数生成auth类似,这里讲另外一个auth生成的算法,算法中的Key没初始化导致的可被枚举,缺陷代码如下:
简单分析可知这里重置密码的auth是由$encryptstring=md5($this->time.$verification.$auth);
这段代码生成的,而$this->time
和$vertification=rand(1000,9999)
都是可控的变量(一个是当前时间的时间戳、一个是1000-9999随机的数值,这两个可以生成一个字典),所以关键点就是$auth
,我们跟进strcode
函数
函数里有个$key
是生成$auth
的关键,而$key
是对一个字符串进行了截取操作,里面$_SERVER[“HTTP_USER_AGENT”]
是我们请求header里的user_agent变量,用户可控;后面有个PP_KEY居然没有初始化,至此$key
也可控了即$auth
可控,最终就可以构造找回密码链接来重置任意账户密码了。