DeDeCMS v5.7 SP2 正式版 前台任意用戶密碼修改復現實驗
一、漏洞概述
簡介
織夢內容管理系統(DedeCms) [1] 以簡單、實用、開源而聞名,是國內 最知名的 PHP 開源網站管理系統,也是使用用戶最多的 PHP 類 CMS 系統, 在經歷多年的發展,目前的版本無論在功能,還是在易用性方面,都有了長 足的發展和進步,DedeCms 免費版的主要目標用戶鎖定在個人站長,功能 更專注於個人網站或中小型門戶的構建,當然也不乏有企業用戶和學校等在 使用該系統。
漏洞條件
cms版本:DeDeCMS v5.7 SP2 正式版
限制:
1.只影響前台賬戶
2.只能修改未設置安全問題的賬戶
環境
php7.3.4
mysql5.7.26
二、環境搭建
本次復現環境搭建在window10物理機下,用phpstudy來搭建網站。
下載源碼地址:點擊下載 注:如果瀏覽器下載不了,可以復制連接到迅雷下載
下載完成后解壓到phpstudy的www/html目錄下

在瀏覽器訪問網站uploads/install來安裝網站,這個就不演示了,因為我已經安裝好了,文件自動刪除了
安裝完成后先訪問后台打開會員的功能,后台地址: http://127.0.0.1/dedeCMS5.7/uploads/dede/index.php

之后在創建一個用戶,但是千萬千萬不要設置安全問題,這里我設置的密碼是test123

創建成功后我們就開始復現
三、漏洞復現
復現過程要用到burpsuite,先用burpsuite打開攔截,然后再瀏覽器訪問
127.0.0.1/dedeCMS5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=3 //這里的id是指會員注冊的uid

然后之間發出,后面會在到攔截一個數據包,里面有參數key要記住,然后再發出去,就可以跳轉到修改密碼的網頁
這里的臨時驗證碼就是上面的key,這里我將密碼改為123123

然后用修改的密碼登入復現成功

代碼分析
該漏洞出現的原因在於/member/resetpasswordd.php中的

分析這段代碼,這里有兩種找回密碼的方式,其中漏洞在以安裝問題取回密碼的代碼下
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); }
上面的if語句進行了兩個判斷,判斷的是用 ==,這是php的弱比較,在php中 === 和 == 不同,用===進行比較,會先判斷兩個字符串類型是否相同,再進行比較。
用==進行比較時,會將字符串類型轉化成相同的,然后再進行比較。如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換成數值並且比較按照數值來進行
給個例子:

$row['safequestion']和$row['safeanswer']的值分別是數據庫中safequestion和safeanswer的值

可以看到在不設置安全問題時safequestion和safeanswer分別是0和null,其中dopost和safequestion和safeanswer都是我們可控的,於是得到我們的playload:
resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=3
臨時修復方案
將弱比較改為強比較
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } 改為: if($row['safequestion'] === $safequestion && $row['safeanswer'] === $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); }
