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号