PHP任意文件上傳漏洞(CVE-2015-2348)

2021-12-29 FreeBuf

微信號:freebuf

安全研究人員今天發布了一個中危漏洞——PHP任意文件上傳漏洞(CVE-2015-2348

在上傳文件的時候只判斷文件名是合法的文件名就斷定這個文件不是惡意文件,這確實會導致其他安全問題。並且在這種情況下,在你自己的文件中檢查漏洞很不現實,因為這個漏洞可以繞過你對文件名後綴、文件類型(Content-Type)、Mime type、文件大小等的檢查,所以僅僅依靠這些檢查是救不了你的。

漏洞細節

這個漏洞存在於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, '.') + 1); $uploaded_size = $_FILES['uploaded']['size'];

if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {

$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.php\x00.jpg");

這本應該創建一個名為file.php\x00.jpg的文件,但實際上創建的文件是file.php。

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

如果你機器的php版本在 5.4.39, 5.5.x - 5.5.23, 或者 5.6.x - 5.6.7,可以通過檢查文件名中是否有\x00字符來解決本文中所述的問題。

安全建議

如果你的機器上存在這個漏洞,建議使用隨機字符串重命名文件名,而不是使用用戶上傳上來的name參數的值。

參考來源www.paulosyibelo.com,轉載請註明來自FreeBuf黑客與極客(FreeBuf.COM)


相關焦點

  • PHP代碼審計之----任意文件操作
    /include_once/require_once/spl_autoload文件讀取: file_get_contents/fread/readfile/file/highlight_file/show_source`文件寫入:file_put_contents/fwrite/mkdir/fputs文件上傳:move_uploaded_file/copy/rename文件上傳漏洞
  • 【php安全】--文件讀取漏洞
    這個漏洞很容易理解,部分程序在下載文件或者讀取顯示文件的時候,讀取文件的參數filename直接在請求裡面傳遞,後臺程序獲取這個文件路徑後直接讀取返回,問題在於這個參數是用戶可控的,可以直接傳入想要讀取的文件路徑即可利用。
  • PHP編碼安全:上傳文件安全
    1、文件上傳漏洞以下是一個不安全的上傳代碼示例,即文件上傳PHP接收代碼upload.php。<?圖1所示是惡意腳本的執行結果,其中列出了該目錄下的所有文件。圖1  上傳漏洞造成的webshell執行結果2、檢查文件類型防止上傳漏洞上面例子中的代碼非常簡單,並沒有進行任何的上傳限制。如果要限制,通常的做法是限制文件上傳類型。下面在PHP代碼中增加了文件類型限制來防止上傳漏洞。
  • 原創 | "白話"PHP文件包含漏洞
    接下來聊聊什麼是文件包含漏洞(以下探究,力求用最基本的環境去闡述漏洞產生的原理)在上面的實例中,可以知道include()函數靜態包含了functions.php文件,也就是,客戶端的用戶是不能隨意修改的,但是如果include()採用動態包含的方式去包含文件,且未做好安全措施,就有可能產生文件文件包含漏洞,下面來看一個採用include()動態包含文件的例子。
  • GitLab 任意文件讀取漏洞 (CVE-2016-9086) 和任意用戶 token 洩露漏洞
    近日研究者發現在其多個版本中存在文件讀取漏洞(CVE-2016-9086) 和 任意用戶authentication_token洩漏漏洞,攻擊者可以通過這兩個漏洞來獲取管理員的權限,進而控制所有gitlab項目。
  • php文件包含漏洞 - 乾貨
    >php中引發文件包含漏洞的通常是以下四個函數:include()include_once()require()require_once()reuqire() 如果在包含的過程中有錯,比如文件不存在等,則會直接退出,不執行後續語句。
  • PHP 文件包含漏洞姿勢總結
    分類文件包含漏洞可以分為 RFI (遠程文件包含)和 LFI(本地文件包含漏洞)兩種。而區分他們最簡單的方法就是 php.ini 中是否開啟了allow_url_include。如果開啟 了我們就有可能包含遠程文件。
  • PHP文件包含漏洞利用思路與Bypass總結手冊(二)
    目前,常見的兩種臨時文件包含漏洞利用方法主要是:PHPINFO() and PHP7 Segment Fault,利用這兩種奇技淫巧可以向伺服器上傳文件同時在伺服器上生成惡意的臨時文件,然後將惡意的臨時文件包含就可以達到任意代碼執行效果也就可以拿到伺服器權限進行後續操作。
  • PHP文件包含漏洞利用思路與Bypass總結手冊(完結)
    session.upload_progress.enabled = on:默認開啟這個選項,表示upload_progress功能開始,PHP 能夠在每一個文件上傳時監測上傳進度。這個信息對上傳請求自身並沒有什麼幫助,但在文件上傳時應用可以發送一個POST請求到終端(例如通過XHR)來檢查這個狀態。
  • PHPMailer 任意文件讀取漏洞
    ——公司:安恆信息崗位:Web安全 安全研究員部門:戰略支援部薪資:13-30K工作年限:1年+工作地點:杭州(總部)、廣州、成都、上海、北京工作環境:一座大廈,健身場所,醫師,帥哥,美女,高級食堂…【崗位職責】1.定期面向部門、全公司技術分享;2.前沿攻防技術研究、跟蹤國內外安全領域的安全動態、漏洞披露並落地沉澱
  • [網絡安全] 十五.文件上傳漏洞 (4)Upload-labs靶場及CTF題目01-10
    前文分享了編輯器漏洞和IIS高版本文件上傳漏洞,包括FCKeditor、eWebEditor、畸形解析漏洞等;本篇文章將詳細講解Upload-labs靶場及文件上傳漏洞10道CTF題目,並結合Caidao工具介紹拿站的流程及防禦原理。本文參考了B站Fox好友和參考文獻中的文章,並結合自己的經驗進行撰寫,在此感謝,也推薦大家閱讀參考文獻。
  • 看代碼學PHP滲透(3) - 實例化任意對象漏洞
    攻擊者可以使用 路徑穿越 來包含任意文件,當然使用路徑穿越符號的前提是 PHP5~5.3(包含5.3版本)版本 之間才可以。例如類名為: ../../../..我們再來說說第二個漏洞。在上圖第9行中,我們發現實例化類的類名和傳入類的參數均在用戶的控制之下。攻擊者可以通過該漏洞,調用PHP代碼庫的任意構造函數。
  • PHP上傳文件和下載
    4、$_FILES["myfile"]["tmp_name"]中的值是:文件被上傳後在伺服器存儲的臨時全路徑。5、$_FILES["myfile"]["error"]中的值是:文件上傳的錯誤代碼-php 4.2以後增加的功能。關於 error 文件上傳的錯誤代碼:UPLOAD_ERR_OK其值為 0,沒有錯誤發生,文件上傳成功。
  • PHP一些常見的漏洞梳理
    這個調用過程稱為文件包含。為了使代碼更靈活,將被包含的文件設置為變量用來進行動態調用。這就導致客戶端可以調用一個惡意文件,造成文件包含漏洞。文件包含漏洞在php中居多。造成執行任意代碼、包含惡意文件控制網站、敏感文件讀取等危害1.常見包含函數include():執行到include時才包含文件,找不到被包含文件時產生警告,但是腳本繼續執行。
  • CTF中常見的PHP漏洞小結
    當這個函數接受到了不符合的類型,這個函數將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息後,將return 0 !!!! 也就是雖然報了錯,但卻判定其相等了。這對於使用這個函數來做選擇語句中的判斷的代碼來說簡直是一個致命的漏洞,當然,php官方在後面的版本中修復了這個漏洞,使得報錯的時候函數不返回任何值。<?
  • Web安全之文件包含漏洞
    4、文件包含漏洞危害1、讀取web配置文件以及敏感的數據2、web伺服器的文件被外界瀏覽導致信息洩露;3、與文件上傳漏洞組合getshell,將惡意代碼執行解析一般來說,遠程文件包含漏洞危害更大二、文件包含漏洞利用1、偽協議利用file://http://php://僅能夠對伺服器本地的文件進行包含
  • PHP文件包含小總結
    不知是早上出門時,沒注意踩到狗屎,還是今天運氣好,發現一處竟然有文件包含漏洞,百度一波getshell姿勢,逐一嘗試後,發現可以利用日誌getshell。這裡本地模擬一下當時情況,復現一下。同時就讓我這個小菜雞總結一下getshell方式,以便之後遇到文件包含漏洞更快的去拿shell。
  • web安全篇(一):PHP文件包含漏洞姿勢總結
    0×01 文件包含Q:什麼是文件包含?A:簡單一句話,為了更好地使用代碼的重用性,引入了文件包含函數,可以通過文件包含函數將文件包含進來,直接使用包含文件的代碼。Q:文件包含漏洞的成因是什麼?A:在包含文件的時候,為了靈活包含文件,將包含文件設置為變量,通過動態變量來引入需要包含的文件時,用戶可以對變量的值可控而伺服器端未對變量值進行合理地校驗或者校驗被繞過,這樣就導致了文件包含漏洞,通常文件包含漏洞出現在PHP語言中。
  • 從建站打拿站 -- PHP(文件上傳)
    李白寫過那麼多詩,他自己會背麼?
  • Yii2 反序列化漏洞復現分析
    1、漏洞描述Yii是一套基於組件、用於開發大型Web應用的高性能PHP框架。Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在調用unserialize() 時,攻擊者可通過構造特定的惡意請求執行任意命令。