代码审计四(找回密码问题)

验证Token

在找回密码的时候生成一个token,然后存储到数据库中,然后把找回密码的地址发送到邮箱中,这个url中就含有token,由用户点开后就可以修改密码。

延伸

一些CMS的密码加密方式很难被破掉,有时候拿到了管理的密码破不掉

利用方法:一般找回密码是用的邮箱,首先把管理的邮箱注入出来,然后再去找回密码,再把数据库的token注入出来,构造一下地址就可以重置密码了。

rand函数生成Token

$resetpwd=md5(rand());

对 rand() 函数生成出来的数字进行md5,某些平台下(例如:Windows )Rand_max只有32768,如果需要的范围大于32768,那么指定min和max参数就可以生成大于Rand_MAX的数了,或者考虑使用mt_rand()来替代它

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

$timetemp=date("Y-m-d H:i:s",$this->time);
$auth=util::strcode($timetemp,'ENCODE');`

算法的 KEY 并没有初始化,如果知道了这个时间,就可以生成加密的字符串

DedeCMS-V5.7前台任意用户密码重置

漏洞影响:
该漏洞允许攻击者修改任意前台用户密码。

漏洞利用条件:
1,开启会员模块
2,攻击者拥有一个正常的会员账号
3,目标没有设置安全问题

漏洞分析

漏洞文件为/member/resetpassword.php:
这个文件是来找回用户密码的,这里可以通过邮箱找回,也可以通过安全问题找回。
在这里插入图片描述
来看看代码中问题出在哪里:
在这里插入图片描述
这里先接受了一个id变量,用来查询用户。
接下来看到:
在这里插入图片描述
这里的dopost变量就是找回用户密码的操作,可以通过邮件找回也可以通过安全问题找回,上图就是通过安全问题找回($dopost == “safequestion”)
首先mid变量通过正则来过滤提交的id参数,然后拼接到下面的select查询语句中,

$sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";

漏洞重点在这里:

if(empty($safequestion)) $safequestion = '';

if(empty($safeanswer)) $safeanswer = '';

判断这两个变量是否为空,是就等于空字符,这两个变量对应的就是找回密码的安全问题和安全问题的答案。
接下来判断我们在找回密码页面提交的安全问题和答案是否和数据库中存的一样,一样的话进入执行这个sn函数,这个就是找回密码的,否则不是。
问题就出在从数据库中获取safequestion,然后与传过来的数据进行判等。用的是双等号,又因为用户没有设置安全问题,数据库里面默认存的是0。
在这里插入图片描述
通过php弱类型的转换’0.0’ == '0’了。(内部运算:先是把0.0(浮点数(0.0)转换为int(0),然后字符串(‘0’)转换为int(0),最后 0==0 ,所以相等了。)

可以看到使用”0.0”,”0.”,”0e1”都可以绕过前面的判断,最后进入sn()函数,继续跟进sn()函数。
(记住这里我们的send为N)

sn()函数在文件/member/inc/inc_pwd_functions.php:
在这里插入图片描述
这里发现还是要进行发邮箱验证,继续跟进newmail函数,看看是否可以不用验证邮箱进行绕过。
在这里插入图片描述

else if ($send == 'N'){
	return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
}

可以看到当send为N时,直接在前端页面返回了验证码
(而我们这里刚好就是N,见前文)
又因为用户id是我们可以控制的,safequestion(默认情况)下可以绕过。

那么也就达成了修改前台任意用户密码的效果。

漏洞验证

通过分析代码我们知道我们请求的地址是这样了

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}

这里我们注册两个个账号:
账号一 test 密码 test 这是我们的目标账号 id为2
账号二 secquan 密码 secquan 这是我们的攻击账号 id为3
在这里插入图片描述
在这里插入图片描述
这里登录了secquan的账号 ,我们要重置目标id为2的账号,发送请求url,

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=2

在这里插入图片描述
在这里插入图片描述
这里直接返回了邮箱验证里的验证码

这时候我们再来请求修改页URL:

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=getpasswd&id=2&key=ROivopAb

然后就可以直接重置密码了。

这里修改id的值即可修改对应的用户的密码。

但是这个漏洞存在一个缺陷,因为通过分析可以看出来只有没有设置安全问题的用户才会受此漏洞的影响;而且只能修改前台用户的密码。

参考:
https://blog.csdn.net/Fly_hps/article/details/79845427
https://www.cnblogs.com/-qing-/p/10849028.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值