文件上傳漏洞
文件上傳漏洞是指由于程序員未對(duì)上傳的文件進(jìn)行嚴(yán)格的驗(yàn)證和過濾,而導(dǎo)致的用戶可以越過其本身權(quán)限向服務(wù)器上上傳可執(zhí)行的動(dòng)態(tài)腳本文件。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。這種攻擊方式是最為直接和有效的,“文件上傳”本身沒有問題,有問題的是文件上傳后,服務(wù)器怎么處理、解釋文件。如果服務(wù)器的處理邏輯做的不夠安全,則會(huì)導(dǎo)致嚴(yán)重的后果。
在了解文件上傳漏洞之前先了解什么是Web容器、IIS、文件解析。
什么是web容器?
web容器是一種服務(wù)程序,在服務(wù)器一個(gè)端口就有一個(gè)提供相應(yīng)服務(wù)的程序,而這個(gè)程序就是處理從客戶端發(fā)出的請(qǐng)求,如Tomcat、Apache、Nginx等等。(可以理解為給編程語(yǔ)言提供環(huán)境)
中間件:提供系統(tǒng)軟件和應(yīng)用軟件之間連接的軟件,以便于軟件各部件之間的溝通。中間件處在操作系統(tǒng)和更高一級(jí)應(yīng)用程序之間。
容器:給處于其中的應(yīng)用程序組件(ASP,JSP,php)提供一個(gè)環(huán)境。使處于其中的應(yīng)用程序組件之間跟容器中的環(huán)境變量接口交互,不必關(guān)注其他系統(tǒng)問題。
服務(wù)器:www服務(wù)器或http服務(wù)器。提供web信息游覽服務(wù)。它只需支持http協(xié)議、html文檔格式以及url,向?yàn)g覽器提供服務(wù)的程序。
什么是IIS?
IIS全稱是互聯(lián)網(wǎng)信息服務(wù),包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服務(wù)。
.net Framework是基礎(chǔ)類庫(kù),是程序運(yùn)行的底層框架。
IIS是架設(shè)Web服務(wù)器用來(lái)提供網(wǎng)頁(yè)游覽服務(wù)的,屬于系統(tǒng)環(huán)境。
一般用ASP.NET開發(fā)軟件,然后靠IIS對(duì)公網(wǎng)提供服務(wù)。
什么是文件解析?
當(dāng)服務(wù)器接收到一個(gè)HTTP請(qǐng)求的時(shí)候,IIS首先需要決定如何去處理這個(gè)請(qǐng)求(服務(wù)器處理.aspx和.html肯定是不一樣的),根據(jù)的是文件的后綴名。
服務(wù)器獲取所請(qǐng)求的頁(yè)面(也可以是文件)的后綴名后接下來(lái)會(huì)在服務(wù)器端尋找可以處理這類后綴名的應(yīng)用程序,如果IIS找不到可以處理此類文件的應(yīng)用程序,那么IIS將直接把這個(gè)文件返還給客戶端。
解析漏洞
攻擊者在利用上傳漏洞時(shí),通常會(huì)與Web容器的解析漏洞配合在一起。所以我們首先來(lái)了解一下解析漏洞,這樣才能更深入地了解上傳漏洞,并加以防范。
常見的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要講IIS、Apache容器。
IIS解析漏洞
IIS 6.0在解析文件時(shí)存在以下兩個(gè)解析漏洞。
- 當(dāng)建立*.asa、*.asp格式的文件夾時(shí),其目錄下的任意文件都將被IIS當(dāng)做asp文件來(lái)解析。例如:建立文件夾parsing.asp,在parsing.asp文件夾內(nèi)新建一個(gè)文本文檔test.txt,其內(nèi)容為<%=NOW()%>,然后在瀏覽器內(nèi)訪問。
“NOWO”是ASP提供獲取當(dāng)前時(shí)間的函數(shù),TXT是文本文檔格式,IIS是不會(huì)去解析此類文件的,應(yīng)該會(huì)直接顯示其內(nèi)容,而在parsing.asp文件夾中,卻被當(dāng)作ASP腳本來(lái)解析。 - 當(dāng)文件為*.asp;1.jpg時(shí),IIS6.0同樣會(huì)以ASP腳本來(lái)執(zhí)行,如:新建文件test.asp;1.jpg,內(nèi)容為<%=NOW()%>。
Apache解析漏洞
Apache是從右到左開始判斷解析,如果為不可識(shí)別解析,就再往左判斷,如xxx.php.owf.rar ,”.owf”和”.rar”這兩種后綴是apache解析不了的,apache就會(huì)把xxx.php.owf.rar解析成php。
怎么去判斷是不是合法的后綴就是這個(gè)漏洞利用關(guān)鍵,測(cè)試時(shí)把常見的后綴都寫上,去測(cè)試是不是合法,任意不識(shí)別的后綴,逐級(jí)向上識(shí)別。
有些程序開發(fā)人員在上傳文件時(shí),判斷文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等腳本擴(kuò)展名,如果是,則不允許上傳,這時(shí)攻擊者就有可能上傳1.php.rar等擴(kuò)展名來(lái)繞過程序檢測(cè),并配合解析漏洞,獲取到WebShell。
繞過上傳漏洞
繞過上傳漏洞分以下兩種。
客戶端檢測(cè):客戶端使用JAVAScript檢測(cè),在文件未上傳時(shí),就對(duì)文件進(jìn)行驗(yàn)證;
服務(wù)器端檢測(cè):服務(wù)端腳本一般會(huì)檢測(cè)文件的MIME類型,檢測(cè)文件擴(kuò)展名是否合法,
甚至有些程序員檢測(cè)文件中是否嵌入惡意代碼。
在研究上傳漏洞之前,首先來(lái)看兩個(gè)小工具:中國(guó)菜刀和一句話圖片木馬。
“中國(guó)菜刀”這款軟件是用來(lái)管理網(wǎng)站文件的,非常小巧靈活,它僅僅需要一段簡(jiǎn)短的代碼
就可以方便地管理網(wǎng)站。中國(guó)菜刀現(xiàn)在已經(jīng)成為安全研究者手中必備的利器,其官方網(wǎng)站為:http://www.maicaidao.com。
該軟件提供的服務(wù)器端文件僅有一行代碼。目前支持的服務(wù)器端腳本包括:PHP、ASP、ASP.NET、JSP等,并且支持HTTPS安全連接的網(wǎng)站。常見的代碼如下:
Asp一句話:<%eval request(“xxx”)%>
Php 一句話:<%php @eval($_POST[xxx]);?>
Aspx一句話:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>
正因?yàn)榇a短小精悍,所以被黑客稱為一句話木馬(一句話后門)。
將<?php @eval(S_POST['xxx']);?>保存為shell.php,上傳至PHP主機(jī)空間中,配置菜刀進(jìn)行連接,如圖所示。

“圖片一句話”則是將一句話木馬插入在圖片文件中,而且并不損壞圖片文件,這一方法可以躲過少許的防火墻檢測(cè)。制作圖片一句話木馬的方法非常多,目前已經(jīng)有安全研究人員設(shè)計(jì)出了專業(yè)的制作軟件:Edjpgcom。Edjpgcom的使用方法非常簡(jiǎn)單:把一張正常的圖片拖到Edjpgcom.exe程序中,填寫相應(yīng)的一句話代碼,就可以制作圖片一句話木馬。
在插入一句話木馬之后,以文本的方式打開圖片,就可以看到一句話木馬代碼就在里面,而且不影響圖片正常預(yù)覽。
還有將一句話木馬與正常圖片通過CMD命令結(jié)合起來(lái)。


注:如果直接以文本的方式打開圖片插入一句話,可能會(huì)造成文件損壞。
知道了程序員是如何防護(hù)上傳漏洞及一句話圖片木馬后,下面深入研究攻擊者是如何繞過程序員的防護(hù)思維來(lái)上傳一句話木馬文件的。
客戶端檢測(cè)
使用FileBug瀏覽器插件
FireBug是一款開源的瀏覽器插件,它支持Firefox、Chrome等瀏覽器。它可以讓W(xué)eb開發(fā)者輕松地調(diào)試HTML、JavaScript、AJAX、css等前端腳本代碼,屬于Web開發(fā)人員的必備武器。正由于FireBug功能強(qiáng)大,所以也被黑客認(rèn)為是必備利器。
中間人攻擊
中間人攻擊這種方式與FireBug完全不同,F(xiàn)ireBug是刪除客戶端的JavaScript驗(yàn)證,而使用Burp Suite則是按照正常的流程通過JavaScript驗(yàn)證,然后在傳輸中的HTTP層做手腳。
首先把木馬文件擴(kuò)展名改為一張正常圖片的擴(kuò)展名,比如JPG擴(kuò)展名,在上傳時(shí)使用Burp Suite攔截上傳數(shù)據(jù),再將其中的擴(kuò)展名JPG修改為PHP,就可以繞過客戶端驗(yàn)。
服務(wù)器端檢測(cè)
白名單與黑名單驗(yàn)證
(1)黑名單過濾方式
黑名單過濾是一種不安全的方式,黑名單定義了一系列不安全的擴(kuò)展名,服務(wù)器端在接收文件后,與黑名單擴(kuò)展名對(duì)比,如果發(fā)現(xiàn)文件擴(kuò)展名與黑名單里的擴(kuò)展名匹配,則認(rèn)為文件不合法。
(2)白名單過濾方式
白名單的過濾方式與黑名單恰恰相反,黑名單是定義不允許上傳的文件擴(kuò)展名,而白名單則是定義允許上傳的擴(kuò)展名,白名單擁有比黑名單更好的防御機(jī)制。如:$WhiteList=
array(rar’,jpg’,png,bmpy,gif,jpg;doc);在獲取到文件擴(kuò)展名后對(duì) WhiteList數(shù)組里的擴(kuò)展名迭代判斷,如果文件擴(kuò)展名被命中,程序?qū)⒄J(rèn)為文件是合法的,否則不允許上傳。
MIME驗(yàn)證
MIME類型用來(lái)設(shè)定某種擴(kuò)展名文件的打開方式,當(dāng)具有該擴(kuò)展名的文件被訪問時(shí),瀏覽器會(huì)自動(dòng)使用指定的應(yīng)用程序來(lái)打開。如GIF圖片MIME為image/gif,CSS文件MIME類型為text/ess。
目錄驗(yàn)證
在文件上傳時(shí),程序通常允許用戶將文件放到指定的目錄中,然而有些Web開發(fā)人員為了讓代碼更“健壯”,通常會(huì)做一個(gè)操作,如果指定的目錄存在,就將文件寫入目錄中,不存在則先建立目錄,然后寫入。
截?cái)嗌蟼鞴?/strong>
文件名后綴有一個(gè)%00字節(jié),可以截?cái)嗄承┖瘮?shù)對(duì)文件名的判斷。在許多語(yǔ)言函 數(shù)中,處理字符串的函數(shù)中0x00被認(rèn)為是終止符
例如: 網(wǎng)站上傳函數(shù)處理xxx.asp%00.jpg時(shí),首先后綴名是合法的jpg格式,可以 上傳,在保存文件時(shí),遇到%00字符丟棄后面的 .jpg,文件后綴最終保存的后綴 名為xxx.asp
文件上傳漏洞防御
首先,上傳的文件能夠被Web容器解釋執(zhí)行。所以文件上傳后所在的目錄要是Web容器所覆蓋到的路徑。 其次,用戶能夠從Web上訪問這個(gè)文件。如果文件上傳了,但用戶無(wú)法通過Web訪問,或者無(wú)法得到Web容器解釋這個(gè)腳本,那么也不能稱之為漏洞。 最后,用戶上傳的文件若被安全檢查、格式化、圖片壓縮等功能改變了內(nèi)容,則也可能導(dǎo)致攻擊不成功。
防范文件上傳漏洞常見的幾種方法:
1.文件上傳的目錄設(shè)置為不可執(zhí)行
只要web容器無(wú)法解析該目錄下面的文件,即使攻擊者上傳了腳本文件,服務(wù)器本身也不會(huì)受到影響,因此這一點(diǎn)至關(guān)重要。
2.判斷文件類型
在判斷文件類型時(shí),可以結(jié)合使用MIME Type、后綴檢查等方式。在文件類型檢查中,強(qiáng)烈推薦白名單方式,黑名單的方式已經(jīng)無(wú)數(shù)次被證明是不可靠的。此外,對(duì)于圖片的處理,可以使用壓縮函數(shù)或者resize函數(shù),在處理圖片的同時(shí)破壞圖片中可能包含的HTML代碼。
3.使用隨機(jī)數(shù)改寫文件名和文件路徑
文件上傳如果要執(zhí)行代碼,則需要用戶能夠訪問到這個(gè)文件。在某些環(huán)境中,用戶能上傳,但不能訪問。如果應(yīng)用了隨機(jī)數(shù)改寫了文件名和路徑,將極大地增加攻擊的成本。再來(lái)就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因?yàn)橹孛鵁o(wú)法攻擊。
4.單獨(dú)設(shè)置文件服務(wù)器的域名
由于瀏覽器同源策略的關(guān)系,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。
5.限制上傳文件大小
限制上傳文件的大小,防止由于內(nèi)存、磁盤耗盡造成的拒絕服務(wù)。
可以配置web server允許的最大Post大小。
可以在代碼層面獲取上傳文件的大小,根據(jù)文件類型的不同進(jìn)行進(jìn)一步的過濾。
6.確保上傳文件被訪問正確返回
1.將文件上傳目錄設(shè)置為靜態(tài)資源目錄,防止被解析為腳本執(zhí)行。
2.使用代理頁(yè)面隱藏文件真實(shí)路徑。
3.使用上述方法時(shí),確保Content-Type與實(shí)際文件類型一致。
4.如果文件不允許在頁(yè)面展示,僅允許下載,請(qǐng)?jiān)O(shè)置Content-disposition:attachment。
備注:
這篇文章摘抄來(lái)自網(wǎng)絡(luò)。我打算總結(jié)一些列架構(gòu)師需要的優(yōu)秀文章,由于自己寫會(huì)花太多時(shí)間,我決定做一個(gè)搬運(yùn)工,為大家篩選優(yōu)秀的文章,最后我會(huì)做成索引方便大家查找。