1. 程式人生 > >web安全之檔案上傳漏洞攻擊與防範方法

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

一、 檔案上傳漏洞與WebShell的關係

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

檔案上傳漏洞本身就是一個危害巨大的漏洞,WebShell更是將這種漏洞的利用無限擴大。大多數的上傳漏洞被利用後攻擊者都會留下WebShell以方便後續進入系統。攻擊者在受影響系統放置或者插入WebShell後,可通過該WebShell更輕鬆,更隱蔽的在服務中為所欲為。

這裡需要特別說明的是上傳漏洞的利用經常會使用WebShell,而WebShell的植入遠不止檔案上傳這一種方式。

1 Webshell簡介

WebShell就是以asp、php、jsp或者cgi等網頁檔案形式存在的一種命令執行環境,也可以將其稱之為一種網頁後門。攻擊者在入侵了一個網站後,通常會將這些asp或php後門檔案與網站伺服器web目錄下正常的網頁檔案混在一起,然後使用瀏覽器來訪問這些後門,得到一個命令執行環境,以達到控制網站伺服器的目的(可以上傳下載或者修改檔案,操作資料庫,執行任意命令等)。

WebShell後門隱蔽較性高,可以輕鬆穿越防火牆,訪問WebShell時不會留下系統日誌,只會在網站的web日誌中留下一些資料提交記錄,沒有經驗的管理員不容易發現入侵痕跡。攻擊者可以將WebShell隱藏在正常檔案中並修改檔案時間增強隱蔽性,也可以採用一些函式對WebShell進行編碼或者拼接以規避檢測。除此之外,通過一句話木馬的小馬來提交功能更強大的大馬可以更容易通過應用本身的檢測。<?php eval($_POST[a]); ?>就是一個最常見最原始的小馬,以此為基礎也湧現了很多變種,如<script language="php">eval($_POST[a]);</script>等。

2 檔案上傳漏洞原理

大部分的網站和應用系統都有上傳功能,一些檔案上傳功能實現程式碼沒有嚴格限制使用者上傳的檔案字尾以及檔案型別,導致允許攻擊者向某個可通過Web訪問的目錄上傳任意PHP檔案,並能夠將這些檔案傳遞給PHP直譯器,就可以在遠端伺服器上執行任意PHP指令碼。

當系統存在檔案上傳漏洞時攻擊者可以將病毒,木馬,WebShell,其他惡意指令碼或者是包含了指令碼的圖片上傳到伺服器,這些檔案將對攻擊者後續攻擊提供便利。根據具體漏洞的差異,此處上傳的指令碼可以是正常字尾的PHP,ASP以及JSP指令碼,也可以是篡改字尾後的這幾類指令碼。

上傳檔案是病毒或者木馬時,主要用於誘騙使用者或者管理員下載執行或者直接自動執行;

上傳檔案是WebShell時,攻擊者可通過這些網頁後門執行命令並控制伺服器;

上傳檔案是其他惡意指令碼時,攻擊者可直接執行指令碼進行攻擊;

上傳檔案是惡意圖片時,圖片中可能包含了指令碼,載入或者點選這些圖片時指令碼會悄無聲息的執行;

上傳檔案是偽裝成正常字尾的惡意指令碼時,攻擊者可藉助本地檔案包含漏洞(Local File Include)執行該檔案。如將bad.php檔案改名為bad.doc上傳到伺服器,再通過PHP的include,include_once,require,require_once等函式包含執行。

此處造成惡意檔案上傳的原因主要有三種:

檔案上傳時檢查不嚴。沒有進行檔案格式檢查。一些應用僅僅在客戶端進行了檢查,而在專業的攻擊者眼裡幾乎所有的客戶端檢查都等於沒有檢查,攻擊者可以通過NC,Fiddler等斷點上傳工具輕鬆繞過客戶端的檢查。一些應用雖然在伺服器端進行了黑名單檢查,但是卻可能忽略了大小寫,如將.php改為.Php即可繞過檢查;一些應用雖然在伺服器端進行了白名單檢查卻忽略了%00截斷符,如應用本來只允許上傳jpg圖片,那麼可以構造檔名為xxx.php%00.jpg,其中%00為十六進位制的0x00字元,.jpg騙過了應用的上傳檔案型別檢測,但對於伺服器來說,因為%00字元截斷的關係,最終上傳的檔案變成了xxx.php。

檔案上傳後修改檔名時處理不當。一些應用在伺服器端進行了完整的黑名單和白名單過濾,在修改已上傳檔案檔名時卻百密一疏,允許使用者修改檔案字尾。如應用只能上傳.doc檔案時攻擊者可以先將.php檔案字尾修改為.doc,成功上傳後在修改檔名時將字尾改回.php。

使用第三方外掛時引入。好多應用都引用了帶有檔案上傳功能的第三方外掛,這些外掛的檔案上傳功能實現上可能有漏洞,攻擊者可通過這些漏洞進行檔案上傳攻擊。如著名的部落格平臺WordPress就有豐富的外掛,而這些外掛中每年都會被挖掘出大量的檔案上傳漏洞。

3 檔案上傳攻擊例項

前文已經提到造成檔案上傳漏洞的原因有多種,下面以其中的第二種為例,選取 LibrettoCMS檔案上傳漏洞(漏洞exploit-db編號為60560)詳解整個漏洞的利用過程。

Libretto是一款使用PHP語言和MySQL語言開發的內容管理系統。LibrettoCMS 2.2.2版本允許未驗證的使用者上傳檔案,並且可以對已上傳的檔案進行字尾名修改。雖然系統限制使用者只能上傳doc和pdf格式的檔案,但修改檔名時處理錯誤,導致使用者可修改檔案字尾名。攻擊者可以將惡意檔案字尾改為doc或者pdf,上傳成功後再將字尾修改為php即可執行。

l 上傳doc字尾的WebShell

訪問該系統的檔案管理頁面/plugins/pgrfilemanager/PGRFileManager.php,上傳一個正常的doc檔案,發現可以上傳成功。編寫一個PHP語言的WebShell後門,也可以從網上下載已有的WebShell,並將WebShell檔案的字尾修改為doc,此處將myshell.php後門修改為myshell.doc。

準備好WebShell以後訪問PGRFileManager.php檔案管理頁面將myshell.doc上傳到伺服器,如圖1所示,doc字尾的myshell已經成功上傳。此時通過瀏覽器訪問該doc格式的myshell是無法正常執行的。

 

圖1 mybshell.doc成功上傳

l 將WebShell字尾改為php

在檔案管理頁面右鍵點選mybshell.doc並選擇rename進入修改檔名稱頁面,將mybshell.doc改為mybshell.php並點選Ok按鈕提交修改結果(如圖2所示)。此時myshell檔案的字尾已被成功修改了php,受該應用編碼實現影響檔案管理頁面已經無法讀取myshell.php檔案,但我們在系統伺服器的檔案上傳目錄裡可以看見修改後的檔案(如圖3所示)。

 

圖2 將mybshell.doc修改為mybshell.php

 

圖3 伺服器裡myshell字尾已改為php

l 執行Webshell

此時伺服器上傳目錄裡的WebShell已經是php字尾,伺服器環境已可以正常解析,通過瀏覽器直接訪問該檔案:http://192.168.20.174/vlun/Mylibretto/userfiles/myshell.php,輸入WebShell中我們設定的密碼即可登入到該WebShell頁面(如圖4所示)。從圖中我們可以看到,僅通過該WebShell檔案攻擊者就可以在伺服器上進行檔案管理,資料庫管理,執行系統命令,執行任意PHP程式碼。藉助該WebShell,攻擊者可以將其他WebShell檔案放置到更深層的目錄中,或者將PHP後門程式碼直接新增到系統中已有的很少用的php檔案中以防止被系統管理員發現。

 

圖4 成功訪問WebShell後門

4 檔案上傳漏洞防禦

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

防範檔案上傳漏洞常見的幾種方法。

1、檔案上傳的目錄設定為不可執行

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

2、判斷檔案型別

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

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

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

4、單獨設定檔案伺服器的域名

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

 

l 系統開發階段的防禦

系統開發人員應有較強的安全意識,尤其是採用PHP語言開發系統。在系統開發階段應充分考慮系統的安全性。對檔案上傳漏洞來說,最好能在客戶端和伺服器端對使用者上傳的檔名和檔案路徑等專案分別進行嚴格的檢查。客戶端的檢查雖然對技術較好的攻擊者來說可以藉助工具繞過,但是這也可以阻擋一些基本的試探。伺服器端的檢查最好使用白名單過濾的方法,這樣能防止大小寫等方式的繞過,同時還需對%00截斷符進行檢測,對HTTP包頭的content-type也和上傳檔案的大小也需要進行檢查。

l 系統執行階段的防禦

系統上線後運維人員應有較強的安全意思,積極使用多個安全檢測工具對系統進行安全掃描,及時發現潛在漏洞並修復。定時檢視系統日誌,web伺服器日誌以發現入侵痕跡。定時關注系統所使用到的第三方外掛的更新情況,如有新版本釋出建議及時更新,如果第三方外掛被爆有安全漏洞更應立即進行修補。對於整個網站都是使用的開原始碼或者使用網上的框架搭建的網站來說,尤其要注意漏洞的自查和軟體版本及補丁的更新,上傳功能非必選可以直接刪除。除對系統自生的維護外,伺服器應進行合理配置,非必選一般的目錄都應去掉執行許可權,上傳目錄可配置為只讀。

l 安全裝置的防禦

檔案上傳攻擊的本質就是將惡意檔案或者指令碼上傳到伺服器,專業的安全裝置防禦此類漏洞主要是通過對漏洞的上傳利用行為和惡意檔案的上傳過程進行檢測。惡意檔案千變萬化,隱藏手法也不斷推陳出新,對普通的系統管理員來說可以通過部署安全裝置來幫助防禦。目前華三通訊公司釋出的SecPath IPS系列產品經過長期的積累,不但可以基於行為對網路中大量檔案上傳漏洞的利用進行檢測,同時還能基於內容對惡意檔案進行識別。

二、 結束語

對攻擊者來說,檔案上傳漏洞一直都是獲取伺服器shell的重要途徑。對系統維護人員來說,檔案上傳漏洞的巨大危害也無須贅述,積極學習,深入瞭解漏洞的相關知識可以更從容的面對這類攻擊

 

轉載自:http://www.h3c.com.cn/About_H3C/Company_Publication/IP_Lh/2014/05/Home/Catalog/201408/839582_30008_0.htm