Loading

DeDeCMS v5.7任意用户登录及密码修改_漏洞分析

一、 前台任意用户登陆

漏洞复现

1)登录注册的000001账号:

image-20211105102115552

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

image-20211105102347311

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

image-20211105102835408

image-20211105102749416

漏洞分析

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

image-20211105121005794

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

image-20211105121803304

这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie绕过判断来登陆其他账户。

从其他地方可以来获取这个加密后的值

/member/index.php

在访问会员主页的处理方法中,此处有记录会员的访客记录,134行从cookie中获取last_vid的值

image-20211105124959790

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

image-20211105125644440

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

image-20211105125752423

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

image-20211105130636512

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

image-20211105130746720

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

image-20211105131028249

二、前台任意用户密码修改

漏洞复现

注册一个没有设置安全问题的账号,访问修改密码的url:

http://yourwebsite/member/resetpassword.php

post:
dopost=safequestion&safequestion=0.0&safeanswer=&id=1

利用burp抓包,forward跳到下一个包出现如图

image-20211105141158102

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

img

漏洞分析

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

image-20211105142013207

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

image-20211105142237842

所以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号

image-20211105142932310

posted @ 2021-11-05 14:47  Atomovo  阅读(779)  评论(0编辑  收藏  举报