DedeCMS-V5.7-UTF8-SP2 重置任意用户密码漏洞

: : DedeCMS-V5.7-UTF8-SP2存在任意用户密码重置漏洞,当用户未设置密保问题时,将会受该漏洞影响导致密码可被攻击者篡改。

漏洞复现:

密码找回:

进入密码找回页面

1666400066929

跳过验证:

在url框输入:

http:// dedecms网址/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=4

1666400370639

获取临时验证码

使用BP抓包,在回包中抓取临时验证码

PS:在回包中发现&被转义成实体字符,所以直接点击链接不会跳转到正确页面,正确链接应为:

http:// dedecms网址/member/resetpassword.php?dopost=getpasswd&id=4&key=G2cn9KxA

1666401374792

修改密码

成功进入修改密码界面后即可修改用户密码

1666403617141

修改成功

现在可以用新密码登录了!!!

1666403878562

漏洞原理:

在DedeCMS-V5.7-UTF8-SP2/uploads/member/resetpassword.php文件中的第75行可以看出,当参数$dopost==safequestion时可以直接进入验证密保问题的代码块中,从而绕过输入用户名、邮箱和验证码环节

1666405214523

在代码84行可以看出,if($row[‘safequestion’] == $safequestion && $row[‘safeanswer’] == $safeanswer)使用的是==判断,所以存在弱类型问题;在文件中默认$row[‘safequestion’]在数据中的内容为0,$row[‘safeanswer’]在数据库中的结果为空;

变量$safeanswer与$safequestion是用户可控制的变量,要绕过验证就得满足empty($safequestion)false$row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswertrue,所以可以赋值变量$safequestion为浮点型的0.0,进行绕过。

1666405616361

绕过后会进入sn的方法,并且传入参数$mid, $row['userid'], $row['email'], 'N';因此跟入sn方法,在DedeCMS-V5.7-UTF8-SP2/uploads/member/inc/inc_pwd_functions.php文件中第150-172行发现代码块,且该方法会调用newmail方法。

1666406453961

1666406641451

跟入newmail方法,在DedeCMS-V5.7-UTF8-SP2/uploads/member/inc/inc_pwd_functions.php文件中第73-123行中发现代码块,然后当传入的$send为N的时候便会下发重置密码的链接,进行密码修改操作。

1666408028987

1666408065192