PHP 代碼審計之文件刪除

PHP 代碼審計之文件刪除


點擊右上角【關注】發哥微課堂頭條號,get更多相關技能~



0x00:前言

CMS 後臺很多欄目有上傳文件功能,上傳漏洞先暫時擱淺,在代碼處理的時候,有刪除舊文件這個操作,所以先審計下看有沒有刪除文件的漏洞。

0x01:代碼追蹤

首先打開後臺基本每個欄目都有上傳資料上傳圖片的功能,這裡就已產品欄為例,其目錄在 product/admin 下,打開 modifyinfo.php,找到上傳圖片的代碼,如下:

//刪除舊圖
if(!empty($_POST['delphoto'])){
foreach($_POST['delphoto'] as $val){
$strOldFile = $arrGPic['FileSavePath'].'s/'.$_POST['savephoto'][$val];
if (is_file($strOldFile)) { // 縮略圖刪除
unlink($strOldFile);
}
$strOldFile = $arrGPic['FileSavePath'].'b/'.$_POST['savephoto'][$val];
if (is_file($strOldFile)) { // 原文件刪除
unlink($strOldFile);
}

unset($_POST['photo'][$val]);
}
}

這裡修改產品信息的時候,對於接收 savephoto 值時並沒有做相關的處理操作,而是直接拼接到了文件保存路徑中,然後直接調用 unlink 進行了刪除。也就意味著可以修改下文件名加上../ 來越目錄。

這裡驗證的時候碰到些問題,第一個是代碼會首先判斷 delphoto 變量是否存在,這是基礎,沒有這個值是走不了刪除這一步的,之前驗證的時候,攔截的數據包中並沒有這個值,後來發現是編輯產品信息時,並沒有刪除圖片這個操作,只有刪除了原圖,發送請求時才會有這個 delphoto 參數,功能是這樣的:

PHP 代碼審計之文件刪除

第二個時,攔截數據包後有 delphoto 參數後,直接修改 savephoto 的名字為../../../../test.txt 沒有生效,為了測試我在根目錄下新建了一個 test.txt,後來發現是越多了,如果滲透過很多文件下載漏洞,../../../../etc/passwd 用多了的話,就會自然想著../ 能多不能少,這裡只需要越三層,多了會直接到電腦盤符,所以會發現 test.txt 還在。

0x02:滲透驗證

修改產品時,刪除原來的舊圖,然後選擇新圖片,保存時攔截請求包並修改相應數據,如下圖:

PHP 代碼審計之文件刪除

0x03:修復建議

修復時建議對刪除路徑中的可控變量進行特殊字符過濾,不允許包含. 和 / 等。


分享到:


相關文章: