0x04 找回密码出现的问题。


下面介绍一些我在cms遇到的找回密码时候犯得错误。

找回密码很多都是验证的token 就是在找回密码的时候生成一个token 然后存储到数据库中。 然后把找回密码的地址发到邮箱中 url中就含有token 由用户点开后就能修改密码 基本就是验证的这个token。 其实一般的可以找回任意用户密码的原因就是弱token 导致可以被攻击者搞到。 包括很多厂商验证的时候就是四位纯数字啥的。 可以枚举。 当然也可以延伸一下, 一些cms的密码加密方式很难破掉。 有时候我们拿到了管理的密码破不掉也是鸡肋。 所以有时候也可以利用这种方法 一般找回密码是用的邮箱 首先我们可以注入把管理的邮箱注入出来 然后再去找回密码 再把数据库的token注入出来 再构造一下地址 就能重置密码。 这个给我印象比较深的是 在ssctf的比赛中嘛 当时机油问了问我 那wordpress那题 有个插件的注入 然后因为都知道wp的加密基本很难破。 所以也是用的这种方法。 因为一般都是弱token的问题 随便找几个例子了

rand 函数生成的token


$resetpwd = md5(rand());

可以看到这个生成的token 就是对rand()函数生成出来的数字进行md5一次

来看一下rand()

注释:在某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。 如果不指定一些参数的话 那么最大值才32768 一个并不算大的值 那么我们首先对这32768种可能 md5出来一个列表 然后我们直接枚举这32768种可能 总会有一个对的。

例子: WooYun: Thinksaas找回密码处设计错误利用账户可找回密码。

修改hdwiki任意用户密码


$encryptstring=md5($this->time.$verification.$auth);

补丁后 多了一个$auth$timetemp=date("Y-m-d H:i:s",$this->time);$auth = util::strcode($timetemp, 'ENCODE'); 可以$auch 是对时间来了一个算法。 结果这个算法的KEY并没有初始化 导致了如果我们知道了这个时间 就可以自己生成出来加密的字符串 这里带入算法的是时间 这里是我们可以知道的。

例子: WooYun: Hdwiki设计缺陷知邮箱可改密码(包括管理员) //绕过补丁继续找回hdwiki任意用户密码