一、背景
現代的互聯網的Web應用程序中,文件上傳是一種常見的要求,因為它有助於提高業務效率。在Facebook和Twitter等社交網絡的Web應用程序中都允許文件上傳功能。在博客,論壇,電子銀行網絡,YouTube和企業支持門戶,會給用戶和企業員工有效的共享文件。允許用戶上傳圖片,視頻,頭像和許多其他類型的文件。
二、為什麼會有文件上傳
在網站運營過程中,不可避免地要對網站的某些頁面或者內容進行更新,這個時候需要使用到網站的文件上傳功能。如果不對被上傳的文件進行限制或者限制被繞過,該功能便有可能會被利用上傳可執行文件、腳本到服務器上,進而進一步導致服務器淪陷。
三、什麼是文件上傳漏洞
上傳文件的時候,如果服務器端腳本語言,未對上傳的文件進行嚴格的驗證和過濾,就有可能上傳惡意的腳本文件,從而控制整個網站,甚至是服務器。
四、文件上傳漏洞的危害
1.網站被控制
2.服務器淪陷
3.同服務器的其他網站淪陷
五、哪裡存在文件上傳漏洞
有上傳文件的位置,且上傳到的目錄,能夠解析腳本語言, 就有可能存在文件上傳漏洞。
導致文件上傳漏洞的原因較多,主要包括以下類:
服務器配置不當(put可以直接向服務器上傳資源,不過默認是關閉的)
本地文件上傳限制被繞過
服務端過濾不嚴格被繞過
文件路徑截斷
文件解析漏洞導致文件執行
1.服務器配置不當
不需要上傳頁面即可上傳成功。(PUT協議)
2.本地文件上傳限制被繞過
只在客戶端瀏覽器上了限制而沒有在服務器上限制,只要修改數據包就可以輕鬆繞過。(前端繞過)
3.過濾不嚴格或被繞過
有一些網站用了黑名單過濾掉了一些關的可執行腳本文件後 綴。但黑名單不全或者被繞過,比如服務端過濾掉了後綴為 .php的 文件,但是沒有過濾掉.php3等其可執行的腳本文件後綴,攻擊者就可以上傳其它可執行的腳本文件後綴到服務器上。
常用的一些可執行的文件腳本後綴:
.php , .php2 , .php3 , .php5 ,.phtml
.asp , .aspx , .ascx , .ashx
.cer
.jsp , .jspx
某些情況下的服務器配置會導致.html、.xml等頁面後綴的文件也可被執行。
多文件上傳時,有時服務器只對一個上傳的文件進行了檢,這時通過上傳多個文件並將惡意文件雜進其中也可繞過服務器的過濾。
4.文件路徑截斷
在上傳的文件中用一些特殊的符使得文件被上傳到服務器中時路徑被截斷從而控制文件路徑。 常用的進行文件路徑截斷的字符如下:
/0
?(?後面的格式什麼的變成參數)
%00 (00截斷)
5.文件解析漏洞
當服務器存在解析漏洞時,合法的文件名便可導致有惡意代碼的文件被執行。
Apache解析漏洞
test.php.aaa.bbb.ccc任意不屬於黑名單且不屬於Apache解析白名單之內的後綴名。
一個文件名為test.php.aaa.bbb.ccc的文件,Apache會從ccc的位置往php的位置開始嘗試解析,如果ccc不屬於Apache能解析的後綴名,那麼Apache就會嘗試去解析bbb,這樣一直往前嘗試,直到遇到一個能解析的拓展名為止。
存在版本
WampServer2.0All Version (WampServer2.0i / Apache 2.2.11)[Success]
WampServer2.1All Version (WampServer2.1e-x32 / Apache 2.2.17)[Success]
Wamp5 All Version (Wamp5_1.7.4 /Apache 2.2.6) [Success]
AppServ 2.4All Version (AppServ - 2.4.9 /Apache 2.0.59)[Success]
AppServ 2.5All Version (AppServ - 2.5.10 /Apache 2.2.8)[Success]
AppServ 2.6All Version (AppServ - 2.6.0 /Apache 2.2. [Success]
IIS 解析漏洞
test.asp/任意文件名 |test.asp;任意文件名 | 任意文件名/任意文件名.php
IIS6.0 在解析 asp 格式的時候有兩個解析漏洞.
一個是如果目錄名包含
.asp、.asa、.cer
字符串,那麼這個目錄下所有的文件都會按照 asp 去解析。
eg: “test.asp/1.jpg”
另一個是隻要文件名中含有”.asp;、.asa;、.cer;”會優先按 asp 來解析。
eg:“1.asp;.jpg”
IIS7.0/7.5是對php解析時有一個類似於Nginx的解析漏洞,
對任意文件名只要在URL後面追加上字符串”/任意文件名.php”就會按照php的方式去解析。
eg:”http://www.target.com/upload/1.jpg/1.php”
存在版本
IIS6.0 (Win2003 SP2 + IIS6.0) [Success]
IIS7.0 (Win2008 R1 + IIS7.0) [Success]
IIS7.5 (Win2008 R2 + IIS7.5) [Success]
Nginx 解析漏洞
任意文件名/任意文件名.php | 任意文件名%00.php
目前 Nginx 主要有這兩種漏洞:
一個是對任意文件名,在後面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg,可以添加為 test.jpg/x.php 進行解析攻擊。
eg: “http://www.target.com/upload/1.jpg/1.php”
另一個是對低版本的 Nginx 可以在任意文件名後面添加%00.php 進行解析攻擊。
存在版本
Nginx 0.5.*
Nginx 0.6.*
Nginx 0.7 <= 0.7.65
Nginx 0.8 <= 0.8.37
以上Nginx容器的版本下,上傳一個在waf白名單之內擴展名的文件1.jpg,然後以1.jpg%00.php進行請求。
Nginx 0.8.41 – 1.5.6
以上Nginx容器的版本下,上傳一個在waf白名單之內擴展名的文件1.jpg,然後以1.jpg%20%00.php進行請求。
六、文件上傳漏洞的利用
利用
1.找到上傳點,嘗試上傳腳本文件
2.上傳成功,訪問上傳的腳本文件
3.上傳失敗,採取過濾繞過方法
漏洞挖掘
1.上傳點,圖片,文件,頭像等等
2.目錄、文件存在類似upload.php等文件
七、文件上傳漏的防禦
文件上傳漏洞的防禦主要還是圍繞三部分,一是文件上傳路徑,二是文件訪問權限,三是文件執行權限。
對於圖片文件的防禦方法,主要是採用白名單以及圖片渲染。另外的一種方法是將用戶上傳的文件都放到指定的目錄中,同時在服務器配置中設定該目錄下的所有文件不可執行,但是該方法存在的風險即是在路徑可知的情況下配合文件包含漏洞即可突破。
因此,個人覺得針對文件上傳的最好防禦方法即是讓上傳路徑不可知,將用戶上傳文件的路徑保存到數據庫中,並且在需要的時候再去讀取加載。