DeDeCMS v5.7任意用户登录及密码修改_漏洞分析
一、 前台任意用户登陆
漏洞复现
1)登录注册的000001账号:

2)访问空间,http://your_website/member/index.php?uid=000001后,设置DedeUserID值为last_vid,DedeUserID__ckMd5值为last_vid__ckMd5

3)设置完成后访问http://dedecms/member/index.php即可访问到id为1的管理员用户会员


漏洞分析
首先来看网站会员登录类memberlogin.class.php中获取cookie的操作,170行从GetCookie方法中获得DedeUserID,然后经过intval赋值给了M_ID,之后以M_ID的值来查询fields

查看GetCookie方法,看到有两个if判断,先取浏览器中的DedeUserID值,如果存在,则比较DedeUserID__ckMd5和md5($cfg_cookie_encode+DedeUserID)的值是否相等,相等则通过验证返回。

这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie绕过判断来登陆其他账户。
从其他地方可以来获取这个加密后的值
/member/index.php
在访问会员主页的处理方法中,此处有记录会员的访客记录,134行从cookie中获取last_vid的值

要是没有last_vid的值,则用$uid代替,这里的uid就是DedeUserID,000001。之后调用了PutCookie方法

在PutCookie方法中采用了和前面相同的MD5加盐方式进行加密

所以此时我们只需要在访问空间,然后浏览器中拿到last_vid和last_vid_ckMd5,设置DedeUserID值为last_vid,DedeUserID__ckMd5值为last_vid__ckMd5则可以完美的绕过限制,返回DedeUserID的值

之后经过intval函数,把0000001转换成1

结果就是返回的admin的会员中心了

二、前台任意用户密码修改
漏洞复现
注册一个没有设置安全问题的账号,访问修改密码的url:
http://yourwebsite/member/resetpassword.php
post:
dopost=safequestion&safequestion=0.0&safeanswer=&id=1
利用burp抓包,forward跳到下一个包出现如图

把amp;删掉后放行,即可跳转到修改界面

漏洞分析
在修改密码处理类中member\resetpassword.php,当dopost == "safequestion"时候,转入以下逻辑。经过两个if判断后会跳入sn函数,而sn方法就是密码修改的处理方法

需要进入sn,则要绕过84行的if判断为真,从数据库中看到,没有设置安全问题时候,safequestion=0,safeanswer=null

所以payload:safequestion=0.0&safeanswer=经过第一个if后safequestion = 0.0,经过第二个if变成safeanswer='',则绕过了84行的判断,0.0==0为true,''==null为true。进入到了sn方法
77行随即生成了一个key,因为是通过安全问题找回,则跳转到94行,返回了漏洞复现中的url,其id=1为管理员的id号


浙公网安备 33010602011771号