文件上傳漏洞

目錄-常見web安全問題

文件上傳漏洞

文件上傳漏洞是指由於程序員未對上傳的文件進行嚴格的驗證和過濾,而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件。這裡上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。這種攻擊方式是最為直接和有效的,“文件上傳”本身沒有問題,有問題的是文件上傳後,服務器怎麼處理、解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的後果。

在瞭解文件上傳漏洞之前先了解什麼是Web容器、IIS、文件解析。

什麼是web容器?

web容器是一種服務程序,在服務器一個端口就有一個提供相應服務的程序,而這個程序就是處理從客戶端發出的請求,如tomcat、apache、nginx等等。(可以理解為給編程語言提供環境)

中間件:提供系統軟件和應用軟件之間連接的軟件,以便於軟件各部件之間的溝通。中間件處在操作系統和更高一級應用程序之間。

容器:給處於其中的應用程序組件(ASP,JSP,PHP)提供一個環境。使處於其中的應用程序組件之間跟容器中的環境變量接口交互,不必關注其他系統問題。

服務器:www服務器或http服務器。提供web信息遊覽服務。它只需支持http協議、html文檔格式以及url,向瀏覽器提供服務的程序。

什麼是IIS?
IIS全稱是互聯網信息服務,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服務。

.net Framework是基礎類庫,是程序運行的底層框架。

IIS是架設Web服務器用來提供網頁遊覽服務的,屬於系統環境。

一般用ASP.NET開發軟件,然後靠IIS對公網提供服務。

什麼是文件解析?

當服務器接收到一個HTTP請求的時候,IIS首先需要決定如何去處理這個請求(服務器處理.aspx和.html肯定是不一樣的),根據的是文件的後綴名。

服務器獲取所請求的頁面(也可以是文件)的後綴名後接下來會在服務器端尋找可以處理這類後綴名的應用程序,如果IIS找不到可以處理此類文件的應用程序,那麼IIS將直接把這個文件返還給客戶端。

解析漏洞

攻擊者在利用上傳漏洞時,通常會與Web容器的解析漏洞配合在一起。所以我們首先來了解一下解析漏洞,這樣才能更深入地瞭解上傳漏洞,並加以防範。
常見的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要講IIS、Apache容器。


IIS解析漏洞

IIS 6.0在解析文件時存在以下兩個解析漏洞。

  1. 當建立*.asa、*.asp格式的文件夾時,其目錄下的任意文件都將被IIS當做asp文件來解析。例如:建立文件夾parsing.asp,在parsing.asp文件夾內新建一個文本文檔test.txt,其內容為,然後在瀏覽器內訪問。
    “NOWO”是ASP提供獲取當前時間的函數,TXT是文本文檔格式,IIS是不會去解析此類文件的,應該會直接顯示其內容,而在parsing.asp文件夾中,卻被當作ASP腳本來解析。

  2. 當文件為*.asp;1.jpg時,IIS6.0同樣會以ASP腳本來執行,如:新建文件test.asp;1.jpg,內容為。

Apache解析漏洞

Apache是從右到左開始判斷解析,如果為不可識別解析,就再往左判斷,如xxx.php.owf.rar ,”.owf”和”.rar”這兩種後綴是apache解析不了的,apache就會把xxx.php.owf.rar解析成php。

怎麼去判斷是不是合法的後綴就是這個漏洞利用關鍵,測試時把常見的後綴都寫上,去測試是不是合法,任意不識別的後綴,逐級向上識別。

有些程序開發人員在上傳文件時,判斷文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等腳本擴展名,如果是,則不允許上傳,這時攻擊者就有可能上傳1.php.rar等擴展名來繞過程序檢測,並配合解析漏洞,獲取到WebShell。

繞過上傳漏洞

繞過上傳漏洞分以下兩種。

客戶端檢測:客戶端使用JavaScript檢測,在文件未上傳時,就對文件進行驗證;

服務器端檢測:服務端腳本一般會檢測文件的MIME類型,檢測文件擴展名是否合法,
甚至有些程序員檢測文件中是否嵌入惡意代碼。

在研究上傳漏洞之前,首先來看兩個小工具:中國菜刀和一句話圖片木馬。
“中國菜刀”這款軟件是用來管理網站文件的,非常小巧靈活,它僅僅需要一段簡短的代碼
就可以方便地管理網站。中國菜刀現在已經成為安全研究者手中必備的利器,其官方網站為:http://www.maicaidao.com。

該軟件提供的服務器端文件僅有一行代碼。目前支持的服務器端腳本包括:PHP、ASP、ASP.NET、JSP等,並且支持HTTPS安全連接的網站。常見的代碼如下:

Asp一句話:
Php 一句話:
Aspx一句話:

正因為代碼短小精悍,所以被黑客稱為一句話木馬(一句話後門)。
將保存為shell.php,上傳至PHP主機空間中,配置菜刀進行連接,如圖所示。

文件上傳漏洞

“圖片一句話”則是將一句話木馬插入在圖片文件中,而且並不損壞圖片文件,這一方法可以躲過少許的防火牆檢測。製作圖片一句話木馬的方法非常多,目前已經有安全研究人員設計出了專業的製作軟件:Edjpgcom。Edjpgcom的使用方法非常簡單:把一張正常的圖片拖到Edjpgcom.exe程序中,填寫相應的一句話代碼,就可以製作圖片一句話木馬。
在插入一句話木馬之後,以文本的方式打開圖片,就可以看到一句話木馬代碼就在裡面,而且不影響圖片正常預覽。
還有將一句話木馬與正常圖片通過CMD命令結合起來。

文件上傳漏洞


文件上傳漏洞


注:如果直接以文本的方式打開圖片插入一句話,可能會造成文件損壞。

知道了程序員是如何防護上傳漏洞及一句話圖片木馬後,下面深入研究攻擊者是如何繞過程序員的防護思維來上傳一句話木馬文件的。

客戶端檢測

使用FileBug瀏覽器插件

FireBug是一款開源的瀏覽器插件,它支持Firefox、Chrome等瀏覽器。它可以讓Web開發者輕鬆地調試HTML、JavaScript、AJAX、CSS等前端腳本代碼,屬於Web開發人員的必備武器。正由於FireBug功能強大,所以也被黑客認為是必備利器。

中間人攻擊

中間人攻擊這種方式與FireBug完全不同,FireBug是刪除客戶端的JavaScript驗證,而使用Burp Suite則是按照正常的流程通過JavaScript驗證,然後在傳輸中的HTTP層做手腳。
首先把木馬文件擴展名改為一張正常圖片的擴展名,比如JPG擴展名,在上傳時使用Burp Suite攔截上傳數據,再將其中的擴展名JPG修改為PHP,就可以繞過客戶端驗。

服務器端檢測

白名單與黑名單驗證

(1)黑名單過濾方式
黑名單過濾是一種不安全的方式,黑名單定義了一系列不安全的擴展名,服務器端在接收文件後,與黑名單擴展名對比,如果發現文件擴展名與黑名單裡的擴展名匹配,則認為文件不合法。

(2)白名單過濾方式
白名單的過濾方式與黑名單恰恰相反,黑名單是定義不允許上傳的文件擴展名,而白名單則是定義允許上傳的擴展名,白名單擁有比黑名單更好的防禦機制。如:$WhiteList=
array(rar’,jpg’,png,bmpy,gif,jpg;doc);在獲取到文件擴展名後對 WhiteList數組裡的擴展名迭代判斷,如果文件擴展名被命中,程序將認為文件是合法的,否則不允許上傳。

MIME驗證

MIME類型用來設定某種擴展名文件的打開方式,當具有該擴展名的文件被訪問時,瀏覽器會自動使用指定的應用程序來打開。如GIF圖片MIME為image/gif,CSS文件MIME類型為text/ess。

目錄驗證

在文件上傳時,程序通常允許用戶將文件放到指定的目錄中,然而有些Web開發人員為了讓代碼更“健壯”,通常會做一個操作,如果指定的目錄存在,就將文件寫入目錄中,不存在則先建立目錄,然後寫入。

截斷上傳攻擊

文件名後綴有一個%00字節,可以截斷某些函數對文件名的判斷。在許多語言函 數中,處理字符串的函數中0x00被認為是終止符

例如: 網站上傳函數處理xxx.asp%00.jpg時,首先後綴名是合法的jpg格式,可以 上傳,在保存文件時,遇到%00字符丟棄後面的 .jpg,文件後綴最終保存的後綴 名為xxx.asp

文件上傳漏洞防禦

首先,上傳的文件能夠被Web容器解釋執行。所以文件上傳後所在的目錄要是Web容器所覆蓋到的路徑。 其次,用戶能夠從Web上訪問這個文件。如果文件上傳了,但用戶無法通過Web訪問,或者無法得到Web容器解釋這個腳本,那麼也不能稱之為漏洞。 最後,用戶上傳的文件若被安全檢查、格式化、圖片壓縮等功能改變了內容,則也可能導致攻擊不成功。
防範文件上傳漏洞常見的幾種方法:

1.文件上傳的目錄設置為不可執行
只要web容器無法解析該目錄下面的文件,即使攻擊者上傳了腳本文件,服務器本身也不會受到影響,因此這一點至關重要。

2.判斷文件類型
在判斷文件類型時,可以結合使用MIME Type、後綴檢查等方式。在文件類型檢查中,強烈推薦白名單方式,黑名單的方式已經無數次被證明是不可靠的。此外,對於圖片的處理,可以使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。

3.使用隨機數改寫文件名和文件路徑
文件上傳如果要執行代碼,則需要用戶能夠訪問到這個文件。在某些環境中,用戶能上傳,但不能訪問。如果應用了隨機數改寫了文件名和路徑,將極大地增加攻擊的成本。再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因為重命名而無法攻擊。

4.單獨設置文件服務器的域名
由於瀏覽器同源策略的關係,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。

5.限制上傳文件大小
限制上傳文件的大小,防止由於內存、磁盤耗盡造成的拒絕服務。
可以配置web server允許的最大Post大小。
可以在代碼層面獲取上傳文件的大小,根據文件類型的不同進行進一步的過濾。

6.確保上傳文件被訪問正確返回
1.將文件上傳目錄設置為靜態資源目錄,防止被解析為腳本執行。
2.使用代理頁面隱藏文件真實路徑。
3.使用上述方法時,確保Content-Type與實際文件類型一致。
4.如果文件不允許在頁面展示,僅允許下載,請設置Content-disposition:attachment。


備註:

這篇文章摘抄來自網絡。我打算總結一些列架構師需要的優秀文章,由於自己寫會花太多時間,我決定做一個搬運工,為大家篩選優秀的文章,最後我會做成索引方便大家查找。


分享到:


相關文章: