重置“织梦内容管理系统dedecms”管理员后台密码重现及分析

“织梦内容管理系统"dedecms是集简单、健壮、灵活、开源几大特点的开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,超过六成的站点正在使用织梦CMS或基于织梦CMS核心开发。

0×00 概述

2018年1月,网上爆出“织梦内容管理系统"dedecms v5.7 sp2的前台任意用户密码重置和前台任意用户登录漏洞,加上一个管理员前台可修改其后台密码的安全问题,形成漏洞利用链,这招组合拳可以重置管理员后台密码。

先来看看整体利用流程:

重置admin前台密码—>用admin登录前台—>重置admin前后台密码

0×01 前台任意用户密码重置分析

组合拳第一式:重置管理员前台密码

漏洞文件:member\resetpassword.php:75

可以看到要进入sn函数,必须满足

($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)

通过查询数据库可知

row['safeanswer']=空,$row['safequestion']=0

所以传入的payload中$safeanswer为空符合条件,而如果$safequestion传入0,则遇到

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

就置空了,继而空和0不等无法进入sn函数。

所以这里可以运用php的弱类型问题,参考www.lsablog.com/network_security/ctf/hackinglab-cn-series-decryption-can-md5-be-bumped/

将$safequestion传入0.0即可绕过判断

继续跟进sn函数

\member\inc\inc_pwd_functions.php:150

先看看dede_pwd_tmp表

为空

所以执行

继续跟进newmail函数,在73行

关键代码:

$mailbody = “亲爱的”.$userid.”:\r\n您好!感谢您使用”.$cfg_webname.”网。\r\n”.$cfg_webname.”应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:”.$randval.” 请于三天内登陆下面网址确认修改。\r\n”.$cfg_basehost.$cfg_memberurl.”/resetpassword.php?dopost=getpasswd&id=”.$mid;

可以看出生成了8位随机码key以md5加密放入dede_pwd_tmp表中,再跳转到url

$cfg_basehost.$cfg_memberurl.”/resetpassword.php?dopost=getpasswd&id=”.$mid.”&key=”.$randval

http://127.0.0.1:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/resetpassword.php?dopost=getpasswd&id=2&key=gnUckBp3

mid可控,key也知道了,就可以重置任意mid用户密码了,继续跟进dopost=getpasswd这段代码,在

member\resetpassword.php:96

关键代码

判断key的md5是否和dede_pwd_tmp的pwd相同,是则更新用户密码,完成任意用户密码重置。

第一式第一步:访问链接:

http://192.168.43.173:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanwser=&id=1

第一式第二步:再访问:

http://127.0.0.1:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/resetpassword.php?dopost=getpasswd&id=1&key=gnUckBp3

重置管理员前台密码为pass000

0×02 前台任意用户登录分析

组合拳第二式:管理员登录前台

判断用户登录的函数在

再到138行

可以看到

在看看GetNum函数,在398行

替换非数字字符为空。

还有

整体来说就是从cookie中获取DedeUserID的值,去除非数字字符,再经过整形转化,形成mid,再进入数据库查询。

继续跟进GetCookie函数,

关键一行

这个$cfg_cookie_encode是未知的,需要任意文件读取或下载才能获得,这形似加salt的方式保证了cookie只能服务端生成,防止客户端伪造,这里需要DedeUserID__ckMd5的值 == ($cfg_cookie_encode.$_COOKIE[DedeUserID])的md5的前16位才能通过验证。

至此,进入下一阶段,看看DedeUserID_ckMd5和DedeUserID的来源,他们在登录后产生,来看看登录代码,

可以看到登录验证成功就

而这个$uid是mid(不是用户名),

自然要来看看PutCookie方法了,

跟进PutCookie方法,

关键是这两行

这里就设置了DedeUserID和DedeUserID_ckMd5。

现在再进入下一个阶段,若需要伪造cookie使管理员登录前台,必须满足

DedeUserID__ckMd5的值 == ($cfg_cookie_encode.$_COOKIE[DedeUserID])的md5的前16位

而管理员的DedeUserID已知为1,$cfg_cookie_encode无法得到,所以关键在于找到满足这个条件的DedeUserID__ckMd5密文。

那就搜索PutCookie看看哪个键会满足这个条件,

来到member/index.php:139

关键代码:

可以看出$last_vid为空则把$uid赋值给$last_vid,而这个$uid就是可控的用户名,再

这里假如构造出类似0000001或1abcde这样的用户名,因为last_vid__ckMd5的值 == ($cfg_cookie_encode.$_COOKIE[last_vid])的md5的前16位,满足条件!

接着在登录类的构造函数中mid经过GetNum和intval函数的过滤,就形成了1,接着进入数据库查询再展示到页面。

漏洞触发流程:

第一阶段:

访问member/index.php?uid=0000001产生last_vid和last_vid__ckMd5

第二阶段:

登录成功—>PutCookie(设置$key和$key.’__ckMd5′)—>产生DedeUserID(uid)和DedeUserID__ckMd5—>修改DedeUserID(uid)和DedeUserID__ckMd5分别为last_vid和last_vid__ckMd5—>满足GetCookie的验证条件

第三阶段:

IsLogin(M_ID)—>__construct(GetCookie(“DedeUserID”))—>GetCookie(验证DedeUserID__ckMd5值是否等于substr(md5($cfg_cookie_encode.$_COOKIE[DedeUserID]),0,16))

—>满足条件—>返回0000001给mid—>GetNum和intval函数过滤—>mid=1—>入库查询—>管理员登录前台

组合拳第二式:

需要先将用户0000001通过审核,再访问

http://127.0.0.1:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/index.php?uid=0000001

获取cookie中last_vid_ckMd5值48741df1f12d04bd

再登录0000001帐号

然后设置DeDeUserID_ckMd5为last_vid_ckMd5的值,并设置DedeUserID为0000001。

刷新页面,成功以管理员登录前台

0×03 重置管理员前后台密码

组合拳第三式:重置管理员后台密码

看看出问题的文件

member\edit_baseinfo.php:115

关键代码:

//如果是管理员,修改其后台密码

这里旧密码是和member表的pwd比对,已经被利用漏洞前台重置,可以重置密码,由于是管理员,所以前台和后台密码都重置了。

组合拳第三式:

原登录密码就是刚刚重置的前台密码pass000,修改新密码为010101,成功登录管理后台!

0×04修复方案

1.关闭会员功能。

2.若不影响业务,可以尝试注释下面代码

member/index.php:163~164

3.将管理员后台地址改复杂。

4.关注官方更新。

0×05结语

又是一次组合攻击,再一次证明,单一漏洞危害可能有限,但是多个漏洞组合起来威力将大大增强!所以不要轻视任何一个微小漏洞,也不要放过任何一个可能存在漏洞的地方。

0×06参考资料

https://xianzhi.aliyun.com/forum/topic/1961

www.freebuf.com/column/161703.html

https://xianzhi.aliyun.com/forum/topic/1959

https://blog.formsec.cn/2018/01/11/DedeCMS-password-reset/

https://lorexxar.cn/2018/01/19/dedecms-vul1/

*本文作者:LSA,转载请注明来自FreeBuf.COM

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226B0HJBU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券