1. 程式人生 > >CVE-2015-2348(PHP任意檔案上傳漏洞)

CVE-2015-2348(PHP任意檔案上傳漏洞)

漏洞編號:CVE-2015-2348

漏洞影響版本:PHP 5.4.38~5.6.6

漏洞成因:

        通常情況下,PHP的開發者會對檔案使用者上傳的檔案的型別、檔案大小、檔名字尾等進行嚴格的檢查來限制惡意的PHP指令碼檔案的上傳漏洞的產生,但是攻擊者有時候可以結合語言的特性以及多種繞過方法來實現檔案的上傳漏洞。

        該CVE漏洞的產生就是由於PHP的move_uploaded_file()函式存在邏輯缺陷所致,這個函式一般在檔案上傳時被呼叫!

move_uploaded_file ( string $filename , string $destination )

       這次的漏洞就出現在引數$destination,這個引數的是將使用者上傳的檔案移動到最終的目的地址。如果$destionation變數是從使用者$_GET或者$_POST中獲取的並且我們可控,那麼我們就可以利用空字元\00來截斷後面的拓展名,從而造成任意檔案上傳。

漏洞演示:

        在本次漏洞演示的過程中我們為了方便起見就採用了DVWA漏洞演示系統來演示這個函式的漏洞,當然因為我們研究的是這個函式存在的漏洞,所以我們也可以自己寫程式碼,來驗證這一個過程(一個用於上傳檔案的HTML網頁、一個用於驗證使用者上傳檔案是否合格的.php檔案並且該檔案中需要使用到move_upload_file函式即可、一個用於存放上傳檔案的資料夾、以及一個用於上傳的PHP檔案),現在想想其實第二種更加方便!哎~~~~

upload.php可以借鑑的程式碼

<html>
<body>
<form enctype="multipart/form-data" action="show.php" method="post">
<input name="file" type="file">
<input type="submit" value="upload">
<input type="hidden" name="address" value="1234">
</form> 
</body>
</html>

show.php程式碼:

<?php
 if(!empty($_FILES['file']['name'])){
     		$upload_name=$_FILES['file']['name'];
    		$type=substr($upload_name,strrpos($upload_name,'.')+1);
    		if($type == "jpg" || $type == "png" || $type == "gif"){
	        $address=$_POST['address'];
	        if (move_uploaded_file($_FILES['file']['tmp_name'],"uploads/".$address)) {
		echo "圖片地址:uploads/".$address;	}}
    }
?>
下面借用DVWA來進行演示這一個漏洞:

(1)訪問File Upload頁面,之後設定代理:



(2)上傳檔案(上傳一個php檔案),並用burpsuite抓包



(3)使用“\00”進行截斷操作

在Raw模組下修改包的內容


之後轉至hex模式下截斷



階段後:


釋放抓到的資料包,PHP檔案成功繞過過濾實現上傳!


安全建議

對於使用者上傳的檔案我們要進行嚴格的檢查,包括檔案型別、檔名稱、檔案大小、檔案內容等等!同時我們對於使用者上傳的檔案應該指定一個固定的檔案路徑來存放檔案,而不是讓使用者來指定該檔案的存放路徑,同時對於上傳之後的檔名我們可以使用隨機數來進行命名提高安全度。

注:此處既然可以使用“\00”來截斷,那麼我們除了可以上傳PHP檔案之外還可以上傳JSP、ASP類檔案,所以“任意檔案上傳”!一個標準的滲透測試其實到這裡才算是剛剛走了一半,至於後面的上傳一句話木馬、提取等操作我們就不再這裡演示了,本次的主要目的是驗證這個PHP函式存在這樣的漏洞,如果有感興趣的,可以自我研究!同時也可以研究一下我所說的第二種漏洞復現方法!