任意文件上傳漏洞syr


任意文件上傳漏洞

先來幾個一句話木馬看看

<%execute(request("value"))%>   #asp木馬
<?php eval($_POST["value"]);?>  #php木馬
<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%>  #aspx木馬
<?php echo file_get_contents('/path/to/target/file'); ?> #讀取服務器中的敏感文件
<?php echo system($_GET['command']); ?> #利用command參數執行系統命令

  已爆出的文件上傳漏洞:

  jQuery Upload File <= 4.0.2 中的任意文件上傳 在根目錄下/jquery-upload-file

漏洞原理

  web應用程序沒有對可上傳的文件類型,文件內容等作嚴格過濾,或者web服務器的解析漏洞沒有及時修復,導致攻擊者可上傳惡意的腳本文件,獲得執行服務端命令的能力。

漏洞利用

  1.如果沒有對上傳的文件名進行嚴格驗證,或者對上傳的文件進行重命名,攻擊者就可以上傳同名文件,對原有文件進行覆蓋。

  2.未驗證上傳文件的大小,攻擊者可以上傳巨大的文件,占用可利用磁盤空間。

  3.上傳一句話木馬,利用蟻箭等工具進行遠程連接,從而控制服務器。

檢測機制

  客戶端js驗證:這種不可靠,可以用來提示用戶可上傳的文件類型,攻擊者可以直接通過抓包工具進行繞過。

  MIME類型檢測:通過檢測MIME類型,判斷用戶上傳的文件是否合法,但是攻擊者可以抓包修改Content-Type:字段來繞過。

  文件后綴檢測:檢測文件的后綴名,如果不是合法的后綴,禁止上傳,最好用白名單進行過濾可上傳的文件后綴。如果是黑名單檢測,就有很多繞過方式:00截斷;大小寫繞過 ;雙寫繞過,如果后端驗證時,直接將檢測到的不合法后綴去掉,我們就可以雙寫來繞過;.htaccess文件上傳,首先上傳一個.htaccess文件,讓服務器可以解析我們上傳的指定文件名,之后將我們的木馬文件名設置為.htaccess中指定的文件名,上傳以后,就可以在服務端執行。

  文件內容檢測:服務端檢測文件的內容,通常會檢查文件頭,可以構造圖片碼繞過。

繞過方式

黑名單繞過

  1. 00截斷:

  抓包我們上傳的文件,將請求包中的文件名修改為test.php%00.jpg,在許多語言的函數中,字符串處理函數中會將0x00識別為終止符,會將00后的.jpg去掉,導致攻擊者上傳成功木馬文件。

  如果文件名是get方式傳輸的,直接在文件名中加%00,如果是post方式提交數據的,需要在16進制中加00 ,因為post中直接加%00不會被自動url解碼。

  2. 黑名單過濾不全:

  上傳.php3、.php5、index.html、等文件,這種情況發生在,如果黑名單對可執行的文件過濾不全的情況下,可以上傳。

  3. 特殊文件名繞過:

  在文件的后綴名后加點或者空格,Windows系統會自動將最后面的點或者空格去掉,導致上傳成功,但是Linux系統這種方法不行。

  test.asp.
  test.asp(空格)
  test.php:1.jpg
  test.php::$DATA
  shell.php::$DATA……

或者將后綴名進行換行繞過
test.ph
p

  4. 大小寫、雙寫繞過、url編碼繞過:

  將文件名中的點、斜杠、反斜杠url編碼或者二次url編碼,如果驗證文件擴展名時沒有進行url解碼,但是在服務器端進行url解碼了,我們就可以繞過限制。例如上傳 test%2Ephp

  5. .htaccess文件攻擊:

  只在apache服務中,存在該文件。這種方法可以繞過白名單檢測。

<FilesMatch "aa">
SetHandler application/x-httpd-php
</FilesMatch>

  我們首先上傳一個.htaccess文件,文件中指定任意的文件名當做代碼文件來解析,之后上傳指定文件名的文件,就可以執行文件中的代碼。

白名單繞過

  1.htaccess文件攻擊

  2. 00截斷

  3. 尋找其他測試的上傳文件接口:

  如果可上傳的文件是白名單驗證的,我們就可以找一些其他的上傳接口,通常一些測試接口是沒有做限制的,可上傳任意文件。

MIME類型檢測繞過

  通過指定MIME類型,讓瀏覽器遇到該擴展名的文件時,知道使用指定的應用程序來打開該文件。

如果上傳時提示文件類型不正確,我們可以抓包修改Content-Type字段值,修改為對應的值,就可以上傳木馬文件。

服務器解析漏洞

  1. Apache解析漏洞:apache 2.0-2.2版本可能存在該漏洞。

  Apache解析文件的順序是從右往左進行的,如果后面不存在能夠解析的后綴,默認會向前解析,直至遇到能夠解析的后綴。

 文件名設置為 test.php.abo.ddd.eee,當我們成功上傳這個文件后,訪問它,服務器就會把它當做php文件來執行。

  只有php5.3以下和apache聯動才會有module模式,會出現這種漏洞
  ​1)如果在Apache的conf里有這樣一行配置AddHandler php5-script.php,這時只要文件名里包含.php,即使文件名是test2.php.jpg也會以PHP來執行。
  2)如果在Apache的conf里有這樣一行配置AddType application/x-httpd-php.jpg,即使擴展名是jpg,一樣能以PHP方式執行。

  2.IIS 6.0解析漏洞

  (1). 目錄解析:

   創建一個.asp的文件夾,IIS 5.x-6.x版本的服務器,會將該文件夾下的所有文件(不管文件后綴是什么)都會當做asp文件來解析。
  (2). 文件解析:
  服務器默認不解析分號;后面的內容,我們將需要上傳的木馬文件名修改為 test.asp;.jpg ,上傳以后,就會保存為test.asp文件,從而進行解析,拿到webshell 。
  (3). IIS 6.0 默認的可執行文件后綴除了 .asp ,還有 .asa   .cer   .cdx

  3. nginx解析漏洞

  當url中有不存在的文件時,php默認向前解析,並且是以不存在的文件后綴去解析前一個文件的。

  我們訪問www.213.com/test.jpg/1.php ,當不存在1.php時,會向前解析,解析test.php。

 文件內容檢測繞過

  把代碼文件和圖片合成二進制文件,保存為新的圖片,但是上傳時,還要上傳為.php的后綴,才能夠被解析。

  Windows系統中,打開cmd命令框,輸入:

copy /b 1.png+test.php = 2.png  

  或者利用ExifTool工具來制做圖片碼

exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php

PUT方法寫入文件

  某些web服務器配置支持PUT方法來提交數據。如果沒有防御措施,那么攻擊者就可以利用PUT方法來向服務器寫入惡意文件。

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

防御方法

  1.上傳文件的存儲目錄,不給執行權限。(但是也要防止將源代碼回顯到前端頁面,這樣會造成信息泄露)也要防止攻擊者通過目錄遍歷../ 將惡意文件上傳到上一級目錄,有可能上一級目錄有執行權限。

  2. 上傳的文件進行重命名。

  3. 對可上傳的文件類型進行白名單校驗,只允許上傳可靠的文件類型。

  4.及時更新web應用軟件,防止解析漏洞的發生。

  5.不能存在本地文件包含漏洞:如果存在本地文件包含漏洞,攻擊者就可以上傳任意的文件,再結合本地文件包含漏洞,去執行上傳的文件。

 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM