DeDeCMS v5.7 密码修改漏洞分析

0x01 背景

织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。 2018年1月10日, 锦行信息安全公众号公开了一个关于DeDeCMS前台任意用户密码修改漏洞的细节[2]。 2018年1月10日,Seebug漏洞平台[3]收录该漏洞,漏洞编号为SSV-97074,知道创宇404漏洞应急团队成功复现该漏洞。 2018年1月17日,阿里先知平台公开了一个任意用户登陆漏洞[4][5],和一个安全隐患[6],通过组合漏洞,导致后台密码可以被修改。 2018年1月18日,知道创宇404漏洞应急团队成功复现该漏洞。

0x02 漏洞简述

整个漏洞利用链包括3个过程:

  1. 前台任意用户密码修改漏洞
  2. 前台任意用户登陆漏洞
  3. 前台管理员密码修改可影响后台的安全隐患

通过3个问题连起来,我们可以重置后台admin密码,如果我们获得了后台地址,就可以进一步登陆后台进行下一步攻击。

1、前台任意用户密码修改漏洞

前台任意用户密码修改漏洞的核心问题是由于DeDeCMS对于部分判断使用错误的弱类型判断,再加上在设置初始值时使用了NULL作为默认填充,导致可以使用弱类型判断的漏洞来绕过判断。 漏洞利用有几个限制:

  1. 漏洞只影响前台账户 admin账户在前台是敏感词无法登陆
  2. admin账户的前后台密码不一致,无法修改后台密码。
  3. 漏洞只影响未设置密保问题的账户
2、前台任意用户登陆漏洞

前台任意用户登陆漏洞主要是利用了DeDeCMS的机制问题,通过一个特殊的机制,我们可以获得任意通过后台加密过的cookie,通过这个cookie我们可以绕过登陆,实现任意用户登陆。 漏洞利用有一个限制: 如果后台开启了账户注册审核,那就必须等待审核通过才能进行下一步利用。

3、前台管理员密码修改可影响后台的安全隐患

在DeDeCMS的设计中,admin被设置为不可从前台登陆,但是当后台登陆admin账户的时候,前台同样会登陆管理员账户。 而且在前台的修改密码接口,如果提供了旧密码,admin同样可以修改密码,并且这里修改密码会同步给后台账户。 通过3个漏洞配合,我们可以避开整个漏洞利用下的大部分问题。 前台任意用户密码修改漏洞->修改admin密码,前台任意用户登录漏洞->登陆admin账户,通过刚才修改的admin密码,来重置admin账户密码。

0x03 漏洞复现

1、 登陆admin前台账户

安装DeDeCMS
image

注册用户名为000001的账户
image

由于是本地复现漏洞,所以我们直接从数据库中修改为审核通过
image

访问

http://your_website/member/index.php?uid=0000001
image

获取cookie中last_vid_ckMd5值,设置DeDeUserID_ckMd5为刚才获取的值,并设置DedeUserID为0000001 访问

http://your_website/member/
image
2、修改admin前台登陆密码

使用DeDeCMS前台任意用户密码修改漏洞修改admin前台密码。 构造漏洞利用请求

http://yourwebsite/member/resetpassword.php

dopost=safequestion&safequestion=0.0&safeanswer=&id=1
image

从Burp获取下一步利用链接

/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
image

直接访问该链接,修改新密码
image

成功修改登陆admin密码

3、修改后台密码

访问

http://yourwebsite/member/edit_baseinfo.php

使用刚才修改的密码再次修改密码
image

成功登陆
image

0x04 代码分析

1、 前台任意用户登陆

在分析漏洞之前,我们先来看看通过cookie获取登陆状态的代码。

/include/memberlogin.class.php 161行
image

通过GetCookie函数从DedeUserID取到了明文的M_ID,通过intval转化之后,直接从数据库中读取该id对应的用户数据。 让我们来看看GetCookie函数

/include/helpers/cookie.helper.php 56行
image

这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie来登陆其他账户。 这里我们需要从别的地方获取这个加密后的值。

/member/index.php  161行
image

161行存在一段特殊的代码,这段代码是用来更新最新的访客记录的,当last_vid没有设置的时候,会把userid更新到这个变量中,更新到flag中。 而这里的userid就是注册时的用户名(如果不是已存在的用户名的话,会因为用户不存在无法访问这个页面)。 通过这种方式,我们就可以通过已知明文来获取我们想要的密文。 这里我们通过注册userid为形似00001或者1aaa这样的用户,在获取登陆状态时,mid会经过intval的转化变为1,我们就成功的登陆到admin的账户下。 ps:该漏洞影响所有用户

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

漏洞主要逻辑在 /member/resetpassword.php 75行至95行

image

当找回密码的方式为安全问题时 dedecms会从数据库中获取用户的安全问题、回答进行比对,当我们在注册时没设置安全问题时。 从数据库中可以看到默认值为NULL(admin默认没有设置安全问题)
image

下面是设置了安全问题时数据库的样子,safequestion代表问题的id,safeanswer代表安全问题的回答。 我们需要绕过第一个判断

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

这里我们只要传入0.0就可以绕过这里,然后0.0 == 0为True,第二个判断NULL==""为True,成功进入sn函数。 跟入/member/inc/inc_pwd_functions.php 第150行

image

有效时间10分钟,进入newmail函数 跟入/member/inc/inc_pwd_functions.php 第73行

image

77行通过random生成了8位的临时密码。 这里我们使用的是安全问题修改密码,所以直接进入94行,将key代入修改页。 跳转进入形似

/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn

的链接,进入修改密码流程 唯一存在问题的是,这里&错误的经过一次编码,所以这里我们只能手动从流量中抓到这个链接,访问修改密码。

3、修改后台密码安全隐患

在DeDeCMS的代码中,专门对前台修改管理员密码做了设置,如果是管理员,则一并更新后台密码,也就是这个安全隐患导致了这个问题。

/member/edit_baseinfo.php 119行
image

0x05 修复方案

截至该文章完成时,DeDeCMS的官方仍然没有修复该漏洞,所以需要采用临时修复方案,等待官方正式修复更新。 由于攻击漏洞涉及到3个漏洞,但官方仍然没有公开补丁,所以只能从一定程度上减小各个漏洞的影响。

  • 前台任意用户登陆漏洞:开启新用户注册审核,当发现userid为1xxxx或1时,不予以 通过审核。

在官方更新正式补丁之前,可以尝试暂时注释该部分代码,以避免更大的安全隐患

/member/index.php 161-162行
image
  • 前台修改后台管理员密码:设置较为复杂的后台地址,如果后台地址不可发现,则无法登陆后台。
  • 前台任意用户密码修改漏洞:

修改文件/member/resetpassword.php 第84行

image

将其中的==修改为===
image

即可临时防护该该漏洞。

0x06 ref

[1] DeDeCMS官网 http://www.dedecms.com/ [2] 漏洞详情原文https://mp.weixin.qq.com/s/2ULQj2risPKzskX32WRMeg [3] Seebug漏洞平台https://www.seebug.org/vuldb/ssvid-97074 [4] 阿里先知平台漏洞分析1https://xianzhi.aliyun.com/forum/topic/1959 [5] 阿里先知平台漏洞分析2https://xianzhi.aliyun.com/forum/topic/1961 [6] 漏洞最早分析原文http://www.cnblogs.com/iamstudy/articles/dedecms_old_version_method.html 作者:LoRexxar'@知道创宇404实验室

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容