1. 程式人生 > >上傳檔案攻擊

上傳檔案攻擊

檔案上傳是WEB應用很常見的一種功能,本身是一項正常的業務需求,不存在什麼問題。但如果在上傳時沒有對檔案進行正確處理,則很可能會發生安全問題。本文將對檔案上傳的檢測方式以及如何繞過相應檢測方式進行詳細的分析,並提供針了對檔案上傳攻擊的安全防護方法。

檔案上傳攻擊是指攻擊者利用WEB應用對上傳檔案過濾不嚴,導致可以上傳應用程式定義類型範圍之外的檔案到Web伺服器。比如可以上傳一個網頁木馬,如果存放上傳檔案的目錄剛好有執行指令碼的許可權,那麼攻擊者就可以直接得到一個WebShell。

檔案上傳攻擊的原理

由於伺服器端沒有對使用者上傳的檔案進行正確的處理,導致攻擊者可以向某個可通過 Web 訪問的目錄上傳惡意檔案,並且該檔案可以被Web伺服器解析執行。

攻擊者要想成功實施檔案上傳攻擊,必須要滿足以下三個條件:

1.可以上傳任意指令碼檔案,且上傳的檔案能夠被Web伺服器解析執行,具體來說就是存放上傳檔案的目錄要有執行指令碼的許可權。

2.使用者能夠通過Web訪問這個檔案。如果檔案上傳後,不能通過Web訪問,那麼也不能成功實施攻擊。

3.要知道檔案上傳到伺服器後的存放路徑和檔名稱,因為許多Web應用都會修改上傳檔案的檔名稱,那麼這時就需要結合其他漏洞去獲取到這些資訊。如果不知道上傳檔案的存放路徑和檔名稱,即使你上傳了也無法訪問。

主流檔案上傳檢測方式概述

主流的檔案上傳檢測方式有以下五種:

1.客戶端javascript檢測

客戶端檢測通常在上傳頁面裡含有專門檢測檔案上傳的javascript程式碼,在檔案被上傳之前進行檢測,最常見的就是檢測上傳檔案的檔案型別和大小是否合法。

2.服務端MIME型別檢測

這類檢測方法通過檢查http包的Content-Type欄位中的值來判斷上傳檔案是否合法。

3.服務端副檔名檢測

這類檢測方法通過在服務端檢測上傳檔案的副檔名來判斷檔案是否合法。

4.服務端目錄路徑檢測

這類檢測一般通過檢測路徑是否合法來判斷。

5.服務端檔案內容檢測

這類檢測方法相當對上面四種檢測方法來說是最為嚴格的一種。它通過檢測檔案內容來判斷上傳檔案是否合法。這裡,對檔案內容的檢測主要有兩種方法。A.通過檢測上傳檔案的檔案頭來判斷。通常情況下,通過判斷前10個位元組,基本就能判斷出一個檔案的真實型別。B.檔案載入檢測,一般是呼叫API或函式對檔案進行載入測試。常見的是影象渲染測試,再嚴格點的甚至是進行二次渲染。

如何繞過檔案上傳檢測

上面我們分析了主流的檔案上傳檢測方式,下面我們就來看下如何繞過上面提到的檔案上傳檢測方式,本文只討論如何繞過前三種檢測方式。

1.繞過客戶端javascript檢測

這種檢測方法是最不安全的,也是最容易被攻擊者繞過的。Web應用不應只採用這一種手段檢測上傳檔案,但可以作為一種輔助手段。因為採用客戶端javascript檢測可以增強應用對使用者的友好度。由於javascript檢測是在客戶端實現的,所以我們完全能夠控制它。可以在瀏覽器端禁用js指令碼,比如在FireFox上安裝FireBug這一外掛就可以實現這一功能。另外一種是通過代理工具來實現,下面介紹利用Burp Suite來繞過客戶端javascript檢測。Burp Suite不僅僅只是一個代理工具,更是一款強大的網路滲透利器。關於Burp Suite的詳細資料請自行百度。

這個站點http://www.target.com(注:由於該網站為真實站點,為了目標網站的安全,所以用target來代替真實域名)的檔案上傳功能只採用了客戶端javascript檢測,所以很容易被繞過。下面我們來具體看下操作方法。

首先,我們看一下正常情況下上傳一個.asp檔案,應用會有什麼反應。

a. 我們訪問這個URL(http://www.target.com/AdvHTML_Popups/upload.asp),會出現一個上傳檔案的頁面

b. 我們先選擇一個.asp檔案,這時會提示不允許上傳這種型別的檔案。注意,這時我們還沒有點選“件,這時會提示按鈕,就出現提示資訊。我們可以判斷出這個網站是在客戶端判斷上傳檔案型別的合法性的。如圖1:

圖1

上面的情況證明在正常情況下是不能成功上傳.asp檔案的,那麼下面就來看下如何繞過這種檢測吧。

c. 我們先開啟Burp Suite代理工具,然後配置瀏覽器使用代理。如圖2:

圖2

d. 我們先把剛才的那個.asp副檔名改為.gif,然後點選“然後點選“為那按鈕。這時Burp Suite中就會攔截到瀏覽器提交的HTTP資料包。我們把filename欄位的值webshell.gif修改為webshell.asp,再點選“再點選“ell”按鈕,會發現檔案成功上傳到伺服器。如圖3:

圖3

2.繞過服務端MIME型別檢測

服務端MIME型別檢測是通過檢查http包的Content-Type欄位中的值來判斷上傳檔案是否合法的。我們來訪問http://193.168.20.235/upload.html,這是一個上傳頁面,當你選擇上傳檔案,點選“上傳”按鈕後,會跳轉到uploadf.php中進行處理。先來看下uploadf.php的程式碼,如圖4:

圖4

那麼我們如何繞過這種檢測方式呢?下面來看具體操作,還是用Burp Suite來完成。

我準備上傳webshell.php到伺服器,這是個一句話木馬。選擇好檔案,然後點選“上傳”,這時Burp Suite攔截到發往伺服器的HTTP請求,我們在Burp Suite修改HTTP資料包中的內容,然後點選“據包中的內容,然按鈕把資料包再轉發給伺服器。如圖5:

圖5

這時會提示檔案成功上傳,還會顯示檔案儲存路徑,說明我們成功繞過了服務端的MIME檔案型別檢測,如圖6。

圖6

現在我們用中國菜刀連線一下,可以成功訪問到,效果如圖7:

圖7

3.繞過服務端副檔名檢測

現在我們來看下如何繞過服務端副檔名檢測,先來看下這兩段程式碼,如圖8:

圖8

上面的程式碼是一個上傳表單,在選擇上傳檔案,點選“上傳”按鈕後會跳轉到uploadfiles.asp中進行處理。我們來看下uploadfiles.asp檔案中檢測上傳副檔名的程式碼,如圖9:

圖9

上面程式碼的意思是先得到上傳檔案的副檔名,然後和允許上傳的檔案型別對比,如果不符合定義,則提示“上傳的檔案格式不對!”。

下面具體看下如何繞過這種檢測方式,我們先直接上傳一個.asp的木馬,會提示上傳檔案格式不對,這和我們預期的結果一致,如圖10:

圖10

現在我們將webshell.asp改為webshell.asp;test.jpg,再次上傳,會發現我們的webshell被成功上傳到伺服器上,如圖11。

圖11

現在我們來訪問下,地址為http://192.168.1.105/bookpic/webshell.asp;test.jpg,可以正常訪問,如圖12。

圖12

注:這裡利用了IIS的解析漏洞,當檔名為1.asp;1.jpg時,IIS會將此檔案解析為1.asp,檔名被截斷,導致指令碼被執行。而且存放上傳檔案的目錄要有執行指令碼的許可權,否則不能執行成功。

設計安全的檔案上傳功能

上面我們介紹了主流的檔案上傳檢測以及繞過檢測的方式,那麼如何設計出一個安全的檔案上傳功能呢?下面我們就來總結一下。

1.設定儲存上傳檔案的目錄為不可執行

只要Web伺服器無法解析該目錄下的檔案,即使攻擊者上傳了指令碼檔案,伺服器本身也不會受到影響,此點至關重要。

2.判斷檔案型別

在判斷檔案型別時,可以結合使用MIME Type、字尾檢查等方式。在檔案型別檢查中,強烈建議採用白名單的方式。此外,對於圖片的處理可以使用壓縮函式或者resize函式,在處理圖片的同時破壞圖片中可能包含的惡意程式碼。

3.使用隨機數改寫檔名和檔案路徑

檔案上傳如果要執行程式碼,則需要使用者能夠訪問到這個檔案。在某些環境中,使用者能上傳,但不能訪問。如果採用隨機數改寫了檔名和路徑,將極大地增加攻擊成本。與此同時,像webshell.asp;1.jpg這種檔案,將因為檔名被改寫而無法成功實施攻擊。

相關推薦

檔案攻擊

檔案上傳是WEB應用很常見的一種功能,本身是一項正常的業務需求,不存在什麼問題。但如果在上傳時沒有對檔案進行正確處理,則很可能會發生安全問題。本文將對檔案上傳的檢測方式以及如何繞過相應檢測方式進行詳細的分析,並提供針了對檔案上傳攻擊的安全防護方法。 檔案上傳攻擊是指

web安全之檔案漏洞攻擊與防範方法

一、 檔案上傳漏洞與WebShell的關係 檔案上傳漏洞是指網路攻擊者上傳了一個可執行的檔案到伺服器並執行。這裡上傳的檔案可以是木馬,病毒,惡意指令碼或者WebShell等。這種攻擊方式是最為直接和有效的,部分檔案上傳漏洞的利用技術門檻非常的低,對於攻擊者來說很容易實施。 檔案上傳漏洞本身就是一

yii2框架開發之安全xss、csrf、sql注入、檔案漏洞攻擊

常見的漏洞攻擊:1、xss:是跨站指令碼攻擊    分3類:1、儲存型2、反射型3、蠕蟲型2、csrf:是跨站請求偽造攻擊    分2類:1、get型2、post型3、sql注入4、檔案上傳xss攻擊:xss攻擊可以:盜取使用者賬號、也可以盜取後進行非法轉賬、還可以篡改系統資

springMVC檔案,MultipartHttpServletRequest、MultipartFile進行檔案

這裡使用apache的開源jar包完成上傳功能,使用jar包分別是:common-fileupload.jar和common-io.jar  先編寫上傳檔案幫助類,如果需要區分檔案型別,可以將檔案字尾擷取進行判斷; springmvc-mvc.xml配置,這裡主要配置spri

在使用axios進行檔案的坑

在進行檔案上傳後臺報錯 在使用axios進行檔案上傳時,後臺的grails程式經常或出現不能獲取file的情況 No signature of method No signature of method: org.springframework.security.web.servle

Django檔案

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body&g

springmvc 檔案的時候.The request sent by the client was syntactically incorrect

 出現這個問題的原因,下面這篇文章已經講得很清楚的。 http://blog.csdn.net/kunkun378263/article/details/41863101 我遇到的場景是:MultipartFile上傳檔案,提交表單的時候除了上傳檔案還有幾個數字。我們知

laravel 結合plupload檔案到本地

首先定義上傳類 class Uploads { public static function upfiles($files, $path = '', $format_data = false, $add_domain = false) { $res = ['errno' =&g

檔案 原始碼

//前臺index.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>檔案上傳</title> </he

FTPClient檔案大小為0位元組的問題解決

今天通過FTPClient上傳圖片時出現,雖然無錯誤出現但是上傳到伺服器端的圖片大小為0。 之前的程式碼 public static boolean uploadFile(String host, int port, String username, String password,S

Ajax 檔案(input file FormData)

FormData物件用以將資料編譯成鍵值對,以便用XMLHttpRequest來發送資料。其主要用於傳送表單資料,但亦可用於傳送帶鍵資料(keyed data),而獨立於表單使用。 jQuery Ajax 上傳檔案 通過 Ajax 向後臺傳送檔案(包括圖片)時,其引數型別屬於物件。可以建立一個 FormD

Ajax檔案及攜帶引數

HTML程式碼 <div class="form-group"> <label class="col-sm-2 control-label">檔案上傳</label> <div class="col-sm-10"

Qt Http QHttpMultiPart檔案到java http伺服器

                         Qt Http QHttpMultiPart上傳檔案到java http伺服器 1.最近專案用到了Qt上傳檔案到HT

Postman Post請求檔案

Postman Post請求上傳檔案 一、選擇post請求方式,輸入請求地址 二、填寫Headers Key:Content-Type Value:multipart/form-data [{"key":"Content-Type","value":"multipart/form-da

java圖片-檔案/圖片到七牛

java圖片上傳-檔案(圖片)上傳到七牛 一、在配置檔案中引入依賴(注:七牛開發者url:https://developer.qiniu.com/kodo) <-- 引入依賴 --> <dependency> <

nodejs 檔案

1、html程式碼 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta name="viewport" content="width=device-width, initia

form表單提交資料的同時檔案程式碼示例

                              form表單提交資料的同時在表單中上傳檔案程式碼示例    一

spring mvc 檔案幫助類(留備用)

package com.service.impl; import com.entity.UploadInfo; import com.service.UploadHelp; import org.springframework.web.context.ContextLoader; import o

SpringMVC Ajax檔案例項

做了一個檔案上傳模組,因為傳統的form提交會有頁面重新整理,不符合我的使用要求,所以我採用Ajax提交方式,這裡說明下,我的應用程式前端為Ajax提交,後端SpringMVC接收處理。 傳統form提交檔案方式: <form id="uploadPic" action="/user/

robot framework 遇到頁面彈出框檔案時處理

最近在做公司公司頁面自動化的時候遇到上傳檔案的彈出框,如下圖,在點選選擇檔案的時候回彈出一個檔案選擇視窗,記錄下處理方法 下載安裝AutoIt 軟體,安裝python 安裝AutoItLibrary,這個過程網上一大堆,不做敘述 將AutoItLibrary匯入到robotframew