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

weixin_33860722發表於2018-09-19

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
6956152-e2a0f16dbf7177c9.png-w331s
image

註冊使用者名稱為000001的賬戶
6956152-09bf02a085e3e89a.png-w331s
image

由於是本地復現漏洞,所以我們直接從資料庫中修改為稽核通過
6956152-07fd6f83438d41a9.png-w331s
image

訪問

http://your_website/member/index.php?uid=0000001
6956152-f21b4b5617928de2.png-w331s
image

獲取cookie中last_vid_ckMd5值,設定DeDeUserID_ckMd5為剛才獲取的值,並設定DedeUserID為0000001 訪問

http://your_website/member/
6956152-0f72efccc4d23931.png-w331s
image
2、修改admin前臺登陸密碼

使用DeDeCMS前臺任意使用者密碼修改漏洞修改admin前臺密碼。 構造漏洞利用請求

http://yourwebsite/member/resetpassword.php

dopost=safequestion&safequestion=0.0&safeanswer=&id=1
6956152-c64db74709df8a95.png-w331s
image

從Burp獲取下一步利用連結

/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
6956152-e72391f48d34c1da.png-w331s
image

直接訪問該連結,修改新密碼
6956152-c45d0e4959e9a287.png-w331s
image

成功修改登陸admin密碼

3、修改後臺密碼

訪問

http://yourwebsite/member/edit_baseinfo.php

使用剛才修改的密碼再次修改密碼
6956152-5a8b183b6a6fee31.png-w331s
image

成功登陸
6956152-5ad66a1513db0b23.png-w331s
image

0x04 程式碼分析

1、 前臺任意使用者登陸

在分析漏洞之前,我們先來看看通過cookie獲取登陸狀態的程式碼。

/include/memberlogin.class.php 161行
6956152-5895d4b2e0e5b495.png-w331s
image

通過GetCookie函式從DedeUserID取到了明文的M_ID,通過intval轉化之後,直接從資料庫中讀取該id對應的使用者資料。 讓我們來看看GetCookie函式

/include/helpers/cookie.helper.php 56行
6956152-6cca3b427cbcc9a4.png-w331s
image

這裡的cfg_cookie_encode是未知的,DeDeCMS通過這種加鹽的方式,來保證cookie只能是服務端設定的,所以我們沒辦法通過自己設定cookie來登陸其他賬戶。 這裡我們需要從別的地方獲取這個加密後的值。

/member/index.php  161行
6956152-852b046b4b950994.png-w331s
image

161行存在一段特殊的程式碼,這段程式碼是用來更新最新的訪客記錄的,當last_vid沒有設定的時候,會把userid更新到這個變數中,更新到flag中。 而這裡的userid就是註冊時的使用者名稱(如果不是已存在的使用者名稱的話,會因為使用者不存在無法訪問這個頁面)。 通過這種方式,我們就可以通過已知明文來獲取我們想要的密文。 這裡我們通過註冊userid為形似00001或者1aaa這樣的使用者,在獲取登陸狀態時,mid會經過intval的轉化變為1,我們就成功的登陸到admin的賬戶下。 ps:該漏洞影響所有使用者

2、前臺任意使用者密碼修改

漏洞主要邏輯在 /member/resetpassword.php 75行至95行

6956152-f9b877217f94fdf6.png-w331s
image

當找回密碼的方式為安全問題時 dedecms會從資料庫中獲取使用者的安全問題、回答進行比對,當我們在註冊時沒設定安全問題時。 從資料庫中可以看到預設值為NULL(admin預設沒有設定安全問題)
6956152-e72eeecc46ada527.png-w331s
image

下面是設定了安全問題時資料庫的樣子,safequestion代表問題的id,safeanswer代表安全問題的回答。 我們需要繞過第一個判斷

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

這裡我們只要傳入0.0就可以繞過這裡,然後0.0 == 0為True,第二個判斷NULL==""為True,成功進入sn函式。 跟入/member/inc/inc_pwd_functions.php 第150行

6956152-f9c87be807891c1f.png-w331s
image

有效時間10分鐘,進入newmail函式 跟入/member/inc/inc_pwd_functions.php 第73行

6956152-fb5473bf811d6d92.png-w331s
image

77行通過random生成了8位的臨時密碼。 這裡我們使用的是安全問題修改密碼,所以直接進入94行,將key代入修改頁。 跳轉進入形似

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

的連結,進入修改密碼流程 唯一存在問題的是,這裡&錯誤的經過一次編碼,所以這裡我們只能手動從流量中抓到這個連結,訪問修改密碼。

3、修改後臺密碼安全隱患

在DeDeCMS的程式碼中,專門對前臺修改管理員密碼做了設定,如果是管理員,則一併更新後臺密碼,也就是這個安全隱患導致了這個問題。

/member/edit_baseinfo.php 119行
6956152-6fc8df9500355033.png-w331s
image

0x05 修復方案

截至該文章完成時,DeDeCMS的官方仍然沒有修復該漏洞,所以需要採用臨時修復方案,等待官方正式修復更新。 由於攻擊漏洞涉及到3個漏洞,但官方仍然沒有公開補丁,所以只能從一定程度上減小各個漏洞的影響。

  • 前臺任意使用者登陸漏洞:開啟新使用者註冊稽核,當發現userid為1xxxx或1時,不予以 通過稽核。

在官方更新正式補丁之前,可以嘗試暫時註釋該部分程式碼,以避免更大的安全隱患

/member/index.php 161-162行
6956152-57293b06d631b90a.png-w331s
image
  • 前臺修改後臺管理員密碼:設定較為複雜的後臺地址,如果後臺地址不可發現,則無法登陸後臺。
  • 前臺任意使用者密碼修改漏洞:

修改檔案/member/resetpassword.php 第84行

6956152-a5ce2a974a41f47a.png-w331s
image

將其中的==修改為===
6956152-66a346ea30f1bc28.png-w331s
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實驗室

相關文章