首頁  >  文章  >  後端開發  >  php任意檔案上傳漏洞

php任意檔案上傳漏洞

伊谢尔伦
伊谢尔伦原創
2016-12-02 09:56:432908瀏覽

漏洞細節:

這個漏洞存在於php中一個非常常用的函數中:move_uploaded_files,開發者總是用這個函數來移動 上傳 的檔案,這個函數會檢查 上傳的檔案是否是一個合法的檔案(是否是透過HTTP 的post 機制上傳的),如果是合法的文件,則將它一定到指定目錄中。

範例:

move_uploaded_file ( string $filename , string $destination )這裡的問題是,可以在檔案名稱中插入空字元(之前多次修復過這個漏洞,例如CVE-2006-7243) ,利用插入空字元的方式,攻擊者可以上傳任意文件,引起遠端程式碼執行漏洞等。

我在這裡用DVWA來示範這個例子,DVWA等級最高的一題中因為種種原因不是很容易通過,意在告訴開發者如何去開發更 安全 的文件上傳元件。讓我們來看看這個範例:

程式碼片段:

$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') +name, '.') + 1); $uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size $html .= ''; html .= 'Your image was not uploaded.';
$html .= ''; }
else {
$html .= $target_path . ' succesfully uploaded!';
.
.
漏洞,例如XSCH, XSS等,但是沒有RCE這種嚴重的漏洞,因為從PHP 5.3.1開始,空字元的問題已經被修復了。這裡的問題是,DVWA將使用者上傳的name參數傳遞給了move_upload_file()函數, 那麼php 執行的操作可能就是這樣子的:

move_uploaded_file($_FILES['name']['tmp_name'],” /file.phpx00.jpg”);這本來應該要建立一個名為file.phpx00.jpg的文件,但實際上建立的文件是file.php。

這樣,就繞過了程式碼中對後綴名的校驗,並且事實證明GD庫中又很多其他函數也存在這個問題(比如getimagesize(), imagecreatefromjpeg()…等),可以看這個例子。

如果你機器的php版本在 5.4.39, 5.5.x – 5.5.23, 或 5.6.x – 5.6.7,可以透過檢查檔案名稱中是否有x00字元來解決本文所述的問題。

安全建議如果你的機器上有這個漏洞,建議使用隨機字串重命名檔名,而不是使用使用者上傳上來的name參數的值。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn