一、背景
現代的互聯(lián)網(wǎng)的Web應用程序中,文件上傳是一種常見(jiàn)的要求,因為它有助于提高業(yè)務(wù)效率。在Facebook和Twitter等社交網(wǎng)絡(luò )的Web應用程序中都允許文件上傳功能。在博客,論壇,電子銀行網(wǎng)絡(luò ),YouTube和企業(yè)支持門(mén)戶(hù),會(huì )給用戶(hù)和企業(yè)員工有效的共享文件。允許用戶(hù)上傳圖片,視頻,頭像和許多其他類(lèi)型的文件。
二、為什么會(huì )有文件上傳
在網(wǎng)站運營(yíng)過(guò)程中,不可避免地要對網(wǎng)站的某些頁(yè)面或者內容進(jìn)行更新,這個(gè)時(shí)候需要使用到網(wǎng)站的文件上傳功能。如果不對被上傳的文件進(jìn)行限制或者限制被繞過(guò),該功能便有可能會(huì )被利用上傳可執行文件、腳本到服務(wù)器上,進(jìn)而進(jìn)一步導致服務(wù)器淪陷。
上傳文件的時(shí)候,如果服務(wù)器端腳本語(yǔ)言,未對上傳的文件進(jìn)行嚴格的驗證和過(guò)濾,就有可能上傳惡意的腳本文件,從而控制整個(gè)網(wǎng)站,甚至是服務(wù)器。
1.網(wǎng)站被控制
2.服務(wù)器淪陷
3.同服務(wù)器的其他網(wǎng)站淪陷
有上傳文件的位置,且上傳到的目錄,能夠解析腳本語(yǔ)言, 就有可能存在文件上傳漏洞。
導致文件上傳漏洞的原因較多,主要包括以下類(lèi):
服務(wù)器配置不當(put可以直接向服務(wù)器上傳資源,不過(guò)默認是關(guān)閉的)
本地文件上傳限制被繞過(guò)
服務(wù)端過(guò)濾不嚴格被繞過(guò)
文件路徑截斷
文件解析漏洞導致文件執行
編輯器上傳漏洞
1.服務(wù)器配置不當
不需要上傳頁(yè)面即可上傳成功。(PUT協(xié)議)
2.本地文件上傳限制被繞過(guò)
只在客戶(hù)端瀏覽器上了限制而沒(méi)有在服務(wù)器上限制,只要修改數據包就可以輕松繞過(guò)。(前端繞過(guò))
3.過(guò)濾不嚴格或被繞過(guò)
有一些網(wǎng)站用了黑名單過(guò)濾掉了一些關(guān)的可執行腳本文件后 綴。但黑名單不全或者被繞過(guò),比如服務(wù)端過(guò)濾掉了后綴為 .php的 文件,但是沒(méi)有過(guò)濾掉.php3等其可執行的腳本文件后綴,攻擊者就可以上傳其它可執行的腳本文件后綴到服務(wù)器上。
常用的一些可執行的文件腳本后綴:
.php , .php2 , .php3 , .php5 ,.phtml
.asp , .aspx , .ascx , .ashx
.cer
.jsp , .jspx
某些情況下的服務(wù)器配置會(huì )導致.html、.xml等頁(yè)面后綴的文件也可被執行。
多文件上傳時(shí),有時(shí)服務(wù)器只對一個(gè)上傳的文件進(jìn)行了檢,這時(shí)通過(guò)上傳多個(gè)文件并將惡意文件雜進(jìn)其中也可繞過(guò)服務(wù)器的過(guò)濾。
4.文件路徑截斷
在上傳的文件中用一些特殊的符使得文件被上傳到服務(wù)器中時(shí)路徑被截斷從而控制文件路徑。 常用的進(jìn)行文件路徑截斷的字符如下:
/0
?(?后面的格式什么的變成參數)
%00 (00截斷)
5.文件解析漏洞
當服務(wù)器存在解析漏洞時(shí),合法的文件名便可導致有惡意代碼的文件被執行。
Apache解析漏洞
test.php.aaa.bbb.ccc任意不屬于黑名單且不屬于A(yíng)pache解析白名單之內的后綴名。
一個(gè)文件名為test.php.aaa.bbb.ccc的文件,Apache會(huì )從ccc的位置往php的位置開(kāi)始嘗試解析,如果ccc不屬于A(yíng)pache能解析的后綴名,那么Apache就會(huì )嘗試去解析bbb,這樣一直往前嘗試,直到遇到一個(gè)能解析的拓展名為止。
存在版本
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 格式的時(shí)候有兩個(gè)解析漏洞.
一個(gè)是如果目錄名包含
.asp、.asa、.cer
字符串,那么這個(gè)目錄下所有的文件都會(huì )按照 asp 去解析。
eg: “test.asp/1.jpg”
另一個(gè)是只要文件名中含有”.asp;、.asa;、.cer;”會(huì )優(yōu)先按 asp 來(lái)解析。
eg:“1.asp;.jpg”
IIS7.0/7.5是對php解析時(shí)有一個(gè)類(lèi)似于Nginx的解析漏洞,
對任意文件名只要在URL后面追加上字符串”/任意文件名.php”就會(huì )按照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 主要有這兩種漏洞:
一個(gè)是對任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg,可以添加為 test.jpg/x.php 進(jìn)行解析攻擊。
eg: “http://www.target.com/upload/1.jpg/1.php”
另一個(gè)是對低版本的 Nginx 可以在任意文件名后面添加%00.php 進(jìn)行解析攻擊。
存在版本
Nginx 0.5.*
Nginx 0.6.*
Nginx 0.7 <=>=>
Nginx 0.8 <=>=>
以上Nginx容器的版本下,上傳一個(gè)在waf白名單之內擴展名的文件1.jpg,然后以1.jpg%00.php進(jìn)行請求。
Nginx 0.8.41 – 1.5.6
以上Nginx容器的版本下,上傳一個(gè)在waf白名單之內擴展名的文件1.jpg,然后以1.jpg%20%00.php進(jìn)行請求。
六、文件上傳漏洞的利用
利用
1.找到上傳點(diǎn),嘗試上傳腳本文件
2.上傳成功,訪(fǎng)問(wèn)上傳的腳本文件
3.上傳失敗,采取過(guò)濾繞過(guò)方法
漏洞挖掘
1.上傳點(diǎn),圖片,文件,頭像等等
2.目錄、文件存在類(lèi)似upload.php等文件
3.目錄、文件存在編輯器目錄如ewebEditor、fckeditor、kingeditor。
七、文件上傳漏的防御
文件上傳漏洞的防御主要還是圍繞三部分,一是文件上傳路徑,二是文件訪(fǎng)問(wèn)權限,三是文件執行權限。
對于圖片文件的防御方法,主要是采用白名單以及圖片渲染。另外的一種方法是將用戶(hù)上傳的文件都放到指定的目錄中,同時(shí)在服務(wù)器配置中設定該目錄下的所有文件不可執行,但是該方法存在的風(fēng)險即是在路徑可知的情況下配合文件包含漏洞即可突破。
因此,個(gè)人覺(jué)得針對文件上傳的最好防御方法即是讓上傳路徑不可知,將用戶(hù)上傳文件的路徑保存到數據庫中,并且在需要的時(shí)候再去讀取加載。
聯(lián)系客服