web安全之文件上傳漏洞攻擊與防范方法
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
一、 文件上傳漏洞與WebShell的關(guān)系
文件上傳漏洞是指網(wǎng)絡(luò)攻擊者上傳了一個(gè)可執(zhí)行的文件到服務(wù)器并執(zhí)行。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。這種攻擊方式是最為直接和有效的,部分文件上傳漏洞的利用技術(shù)門(mén)檻非常的低,對(duì)于攻擊者來(lái)說(shuō)很容易實(shí)施。 文件上傳漏洞本身就是一個(gè)危害巨大的漏洞,WebShell更是將這種漏洞的利用無(wú)限擴(kuò)大。大多數(shù)的上傳漏洞被利用后攻擊者都會(huì)留下WebShell以方便后續(xù)進(jìn)入系統(tǒng)。攻擊者在受影響系統(tǒng)放置或者插入WebShell后,可通過(guò)該WebShell更輕松,更隱蔽的在服務(wù)中為所欲為。 這里需要特別說(shuō)明的是上傳漏洞的利用經(jīng)常會(huì)使用WebShell,而WebShell的植入遠(yuǎn)不止文件上傳這一種方式。 1 Webshell簡(jiǎn)介WebShell就是以asp、PHP、jsp或者cgi等網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境,也可以將其稱(chēng)之為一種網(wǎng)頁(yè)后門(mén)。攻擊者在入侵了一個(gè)網(wǎng)站后,通常會(huì)將這些asp或php后門(mén)文件與網(wǎng)站服務(wù)器web目錄下正常的網(wǎng)頁(yè)文件混在一起,然后使用瀏覽器來(lái)訪問(wèn)這些后門(mén),得到一個(gè)命令執(zhí)行環(huán)境,以達(dá)到控制網(wǎng)站服務(wù)器的目的(可以上傳下載或者修改文件,操作數(shù)據(jù)庫(kù),執(zhí)行任意命令等)。 WebShell后門(mén)隱蔽較性高,可以輕松穿越防火墻,訪問(wèn)WebShell時(shí)不會(huì)留下系統(tǒng)日志,只會(huì)在網(wǎng)站的web日志中留下一些數(shù)據(jù)提交記錄,沒(méi)有經(jīng)驗(yàn)的管理員不容易發(fā)現(xiàn)入侵痕跡。攻擊者可以將WebShell隱藏在正常文件中并修改文件時(shí)間增強(qiáng)隱蔽性,也可以采用一些函數(shù)對(duì)WebShell進(jìn)行編碼或者拼接以規(guī)避檢測(cè)。除此之外,通過(guò)一句話木馬的小馬來(lái)提交功能更強(qiáng)大的大馬可以更容易通過(guò)應(yīng)用本身的檢測(cè)。<?php eval($_POST[a]); ?>就是一個(gè)最常見(jiàn)最原始的小馬,以此為基礎(chǔ)也涌現(xiàn)了很多變種,如<script language="php">eval($_POST[a]);</script>等。 2 文件上傳漏洞原理大部分的網(wǎng)站和應(yīng)用系統(tǒng)都有上傳功能,一些文件上傳功能實(shí)現(xiàn)代碼沒(méi)有嚴(yán)格限制用戶(hù)上傳的文件后綴以及文件類(lèi)型,導(dǎo)致允許攻擊者向某個(gè)可通過(guò)Web訪問(wèn)的目錄上傳任意PHP文件,并能夠?qū)⑦@些文件傳遞給PHP解釋器,就可以在遠(yuǎn)程服務(wù)器上執(zhí)行任意PHP腳本。 當(dāng)系統(tǒng)存在文件上傳漏洞時(shí)攻擊者可以將病毒,木馬,WebShell,其他惡意腳本或者是包含了腳本的圖片上傳到服務(wù)器,這些文件將對(duì)攻擊者后續(xù)攻擊提供便利。根據(jù)具體漏洞的差異,此處上傳的腳本可以是正常后綴的PHP,ASP以及JSP腳本,也可以是篡改后綴后的這幾類(lèi)腳本。 上傳文件是病毒或者木馬時(shí),主要用于誘騙用戶(hù)或者管理員下載執(zhí)行或者直接自動(dòng)運(yùn)行; 上傳文件是WebShell時(shí),攻擊者可通過(guò)這些網(wǎng)頁(yè)后門(mén)執(zhí)行命令并控制服務(wù)器; 上傳文件是其他惡意腳本時(shí),攻擊者可直接執(zhí)行腳本進(jìn)行攻擊; 上傳文件是惡意圖片時(shí),圖片中可能包含了腳本,加載或者點(diǎn)擊這些圖片時(shí)腳本會(huì)悄無(wú)聲息的執(zhí)行; 上傳文件是偽裝成正常后綴的惡意腳本時(shí),攻擊者可借助本地文件包含漏洞(Local File Include)執(zhí)行該文件。如將bad.php文件改名為bad.doc上傳到服務(wù)器,再通過(guò)PHP的include,include_once,require,require_once等函數(shù)包含執(zhí)行。 此處造成惡意文件上傳的原因主要有三種: 文件上傳時(shí)檢查不嚴(yán)。沒(méi)有進(jìn)行文件格式檢查。一些應(yīng)用僅僅在客戶(hù)端進(jìn)行了檢查,而在專(zhuān)業(yè)的攻擊者眼里幾乎所有的客戶(hù)端檢查都等于沒(méi)有檢查,攻擊者可以通過(guò)NC,Fiddler等斷點(diǎn)上傳工具輕松繞過(guò)客戶(hù)端的檢查。一些應(yīng)用雖然在服務(wù)器端進(jìn)行了黑名單檢查,但是卻可能忽略了大小寫(xiě),如將.php改為.Php即可繞過(guò)檢查;一些應(yīng)用雖然在服務(wù)器端進(jìn)行了白名單檢查卻忽略了%00截?cái)喾?,如?yīng)用本來(lái)只允許上傳jpg圖片,那么可以構(gòu)造文件名為xxx.php%00.jpg,其中%00為十六進(jìn)制的0x00字符,.jpg騙過(guò)了應(yīng)用的上傳文件類(lèi)型檢測(cè),但對(duì)于服務(wù)器來(lái)說(shuō),因?yàn)?/span>%00字符截?cái)嗟年P(guān)系,最終上傳的文件變成了xxx.php。 文件上傳后修改文件名時(shí)處理不當(dāng)。一些應(yīng)用在服務(wù)器端進(jìn)行了完整的黑名單和白名單過(guò)濾,在修改已上傳文件文件名時(shí)卻百密一疏,允許用戶(hù)修改文件后綴。如應(yīng)用只能上傳.doc文件時(shí)攻擊者可以先將.php文件后綴修改為.doc,成功上傳后在修改文件名時(shí)將后綴改回.php。 使用第三方插件時(shí)引入。好多應(yīng)用都引用了帶有文件上傳功能的第三方插件,這些插件的文件上傳功能實(shí)現(xiàn)上可能有漏洞,攻擊者可通過(guò)這些漏洞進(jìn)行文件上傳攻擊。如著名的博客平臺(tái)WordPress就有豐富的插件,而這些插件中每年都會(huì)被挖掘出大量的文件上傳漏洞。 3 文件上傳攻擊實(shí)例前文已經(jīng)提到造成文件上傳漏洞的原因有多種,下面以其中的第二種為例,選取 LibrettoCMS文件上傳漏洞(漏洞exploit-db編號(hào)為60560)詳解整個(gè)漏洞的利用過(guò)程。 Libretto是一款使用PHP語(yǔ)言和MySQL語(yǔ)言開(kāi)發(fā)的內(nèi)容管理系統(tǒng)。LibrettoCMS 2.2.2版本允許未驗(yàn)證的用戶(hù)上傳文件,并且可以對(duì)已上傳的文件進(jìn)行后綴名修改。雖然系統(tǒng)限制用戶(hù)只能上傳doc和pdf格式的文件,但修改文件名時(shí)處理錯(cuò)誤,導(dǎo)致用戶(hù)可修改文件后綴名。攻擊者可以將惡意文件后綴改為doc或者pdf,上傳成功后再將后綴修改為php即可執(zhí)行。 l 上傳doc后綴的WebShell訪問(wèn)該系統(tǒng)的文件管理頁(yè)面/plugins/pgrfilemanager/PGRFileManager.php,上傳一個(gè)正常的doc文件,發(fā)現(xiàn)可以上傳成功。編寫(xiě)一個(gè)PHP語(yǔ)言的WebShell后門(mén),也可以從網(wǎng)上下載已有的WebShell,并將WebShell文件的后綴修改為doc,此處將myshell.php后門(mén)修改為myshell.doc。 準(zhǔn)備好WebShell以后訪問(wèn)PGRFileManager.php文件管理頁(yè)面將myshell.doc上傳到服務(wù)器,如圖1所示,doc后綴的myshell已經(jīng)成功上傳。此時(shí)通過(guò)瀏覽器訪問(wèn)該doc格式的myshell是無(wú)法正常執(zhí)行的。 圖1 mybshell.doc成功上傳 l 將WebShell后綴改為php在文件管理頁(yè)面右鍵點(diǎn)擊mybshell.doc并選擇rename進(jìn)入修改文件名稱(chēng)頁(yè)面,將mybshell.doc改為mybshell.php并點(diǎn)擊Ok按鈕提交修改結(jié)果(如圖2所示)。此時(shí)myshell文件的后綴已被成功修改了php,受該應(yīng)用編碼實(shí)現(xiàn)影響文件管理頁(yè)面已經(jīng)無(wú)法讀取myshell.php文件,但我們?cè)谙到y(tǒng)服務(wù)器的文件上傳目錄里可以看見(jiàn)修改后的文件(如圖3所示)。 圖2 將mybshell.doc修改為mybshell.php 圖3 服務(wù)器里myshell后綴已改為php l 執(zhí)行Webshell此時(shí)服務(wù)器上傳目錄里的WebShell已經(jīng)是php后綴,服務(wù)器環(huán)境已可以正常解析,通過(guò)瀏覽器直接訪問(wèn)該文件:http://192.168.20.174/vlun/Mylibretto/userfiles/myshell.php,輸入WebShell中我們?cè)O(shè)置的密碼即可登錄到該WebShell頁(yè)面(如圖4所示)。從圖中我們可以看到,僅通過(guò)該WebShell文件攻擊者就可以在服務(wù)器上進(jìn)行文件管理,數(shù)據(jù)庫(kù)管理,執(zhí)行系統(tǒng)命令,執(zhí)行任意PHP代碼。借助該WebShell,攻擊者可以將其他WebShell文件放置到更深層的目錄中,或者將PHP后門(mén)代碼直接添加到系統(tǒng)中已有的很少用的php文件中以防止被系統(tǒng)管理員發(fā)現(xiàn)。 圖4 成功訪問(wèn)WebShell后門(mén) 4 文件上傳漏洞防御首先,上傳的文件能夠被Web容器解釋執(zhí)行。所以文件上傳后所在的目錄要是Web容器所覆蓋到的路徑。 防范文件上傳漏洞常見(jiàn)的幾種方法。 1、文件上傳的目錄設(shè)置為不可執(zhí)行 只要web容器無(wú)法解析該目錄下面的文件,即使攻擊者上傳了腳本文件,服務(wù)器本身也不會(huì)受到影響,因此這一點(diǎn)至關(guān)重要。 2、判斷文件類(lèi)型 在判斷文件類(lèi)型時(shí),可以結(jié)合使用MIME Type、后綴檢查等方式。在文件類(lèi)型檢查中,強(qiáng)烈推薦白名單方式,黑名單的方式已經(jīng)無(wú)數(shù)次被證明是不可靠的。此外,對(duì)于圖片的處理,可以使用壓縮函數(shù)或者resize函數(shù),在處理圖片的同時(shí)破壞圖片中可能包含的HTML代碼。 3、使用隨機(jī)數(shù)改寫(xiě)文件名和文件路徑 文件上傳如果要執(zhí)行代碼,則需要用戶(hù)能夠訪問(wèn)到這個(gè)文件。在某些環(huán)境中,用戶(hù)能上傳,但不能訪問(wèn)。如果應(yīng)用了隨機(jī)數(shù)改寫(xiě)了文件名和路徑,將極大地增加攻擊的成本。再來(lái)就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因?yàn)橹孛鵁o(wú)法攻擊。 4、單獨(dú)設(shè)置文件服務(wù)器的域名 由于瀏覽器同源策略的關(guān)系,一系列客戶(hù)端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問(wèn)題將得到解決。
l 系統(tǒng)開(kāi)發(fā)階段的防御系統(tǒng)開(kāi)發(fā)人員應(yīng)有較強(qiáng)的安全意識(shí),尤其是采用PHP語(yǔ)言開(kāi)發(fā)系統(tǒng)。在系統(tǒng)開(kāi)發(fā)階段應(yīng)充分考慮系統(tǒng)的安全性。對(duì)文件上傳漏洞來(lái)說(shuō),最好能在客戶(hù)端和服務(wù)器端對(duì)用戶(hù)上傳的文件名和文件路徑等項(xiàng)目分別進(jìn)行嚴(yán)格的檢查。客戶(hù)端的檢查雖然對(duì)技術(shù)較好的攻擊者來(lái)說(shuō)可以借助工具繞過(guò),但是這也可以阻擋一些基本的試探。服務(wù)器端的檢查最好使用白名單過(guò)濾的方法,這樣能防止大小寫(xiě)等方式的繞過(guò),同時(shí)還需對(duì)%00截?cái)喾M(jìn)行檢測(cè),對(duì)HTTP包頭的content-type也和上傳文件的大小也需要進(jìn)行檢查。 l 系統(tǒng)運(yùn)行階段的防御系統(tǒng)上線后運(yùn)維人員應(yīng)有較強(qiáng)的安全意思,積極使用多個(gè)安全檢測(cè)工具對(duì)系統(tǒng)進(jìn)行安全掃描,及時(shí)發(fā)現(xiàn)潛在漏洞并修復(fù)。定時(shí)查看系統(tǒng)日志,web服務(wù)器日志以發(fā)現(xiàn)入侵痕跡。定時(shí)關(guān)注系統(tǒng)所使用到的第三方插件的更新情況,如有新版本發(fā)布建議及時(shí)更新,如果第三方插件被爆有安全漏洞更應(yīng)立即進(jìn)行修補(bǔ)。對(duì)于整個(gè)網(wǎng)站都是使用的開(kāi)源代碼或者使用網(wǎng)上的框架搭建的網(wǎng)站來(lái)說(shuō),尤其要注意漏洞的自查和軟件版本及補(bǔ)丁的更新,上傳功能非必選可以直接刪除。除對(duì)系統(tǒng)自生的維護(hù)外,服務(wù)器應(yīng)進(jìn)行合理配置,非必選一般的目錄都應(yīng)去掉執(zhí)行權(quán)限,上傳目錄可配置為只讀。 l 安全設(shè)備的防御文件上傳攻擊的本質(zhì)就是將惡意文件或者腳本上傳到服務(wù)器,專(zhuān)業(yè)的安全設(shè)備防御此類(lèi)漏洞主要是通過(guò)對(duì)漏洞的上傳利用行為和惡意文件的上傳過(guò)程進(jìn)行檢測(cè)。惡意文件千變?nèi)f化,隱藏手法也不斷推陳出新,對(duì)普通的系統(tǒng)管理員來(lái)說(shuō)可以通過(guò)部署安全設(shè)備來(lái)幫助防御。目前華三通信公司發(fā)布的SecPath IPS系列產(chǎn)品經(jīng)過(guò)長(zhǎng)期的積累,不但可以基于行為對(duì)網(wǎng)絡(luò)中大量文件上傳漏洞的利用進(jìn)行檢測(cè),同時(shí)還能基于內(nèi)容對(duì)惡意文件進(jìn)行識(shí)別。 二、 結(jié)束語(yǔ)對(duì)攻擊者來(lái)說(shuō),文件上傳漏洞一直都是獲取服務(wù)器shell的重要途徑。對(duì)系統(tǒng)維護(hù)人員來(lái)說(shuō),文件上傳漏洞的巨大危害也無(wú)須贅述,積極學(xué)習(xí),深入了解漏洞的相關(guān)知識(shí)可以更從容的面對(duì)這類(lèi)攻擊。 該文章在 2018/1/3 18:26:55 編輯過(guò) |
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)... |