web安全之文件上傳漏洞攻擊與防范方法

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png


一、 文件上傳漏洞與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

?

?

轉載于:https://my.oschina.net/u/3477605/blog/3057669

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536423.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rabbit and Grass【博弈】

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4728 Accepted Submission(s): 3592 Problem Description 大學時光是浪漫的&#xff0c;女生是浪漫的&#xff0c;圣誕更是浪漫的&#xff…

蘋果可彎曲屏幕新專利獲準,折疊iPhone最快2020年現身?

當三星Galaxy Fold、華為Mate X等折疊手機陸續問世時&#xff0c;所有果粉都想問一個問題折疊iPhone在哪里&#xff1f;就在最近有報導指出&#xff0c;蘋果獲得一項關于折疊屏幕的新專利。新專利出爐&#xff0c;但折疊iPhone還要再等等。本周二&#xff0c;美國專利與商標局授…

Brave Game【博弈】

Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14813 Accepted Submission(s): 10086 Problem Description 十年前讀大學的時候&#xff0c;中國每年都要從國外引進一些電影大片&#xff0c;其中…

Google File System 學習筆記

GFS翻譯&#xff1a;https://www.cnblogs.com/cxxjohnson/p/4984309.html 一、GFS架構&#xff1a; 二、保存文件的方式 1、保存小文件&#xff1a;磁盤中分塊&#xff0c;每個block大小為1024Byte,每個文件的索引由塊號偏置組成 2、保存大文件&#xff1a;把block換成chunk,每…

探討奇技淫巧

2019獨角獸企業重金招聘Python工程師標準>>> 探討奇技淫巧 起源 在工程實踐中&#xff0c;我們常常會遇到一些奇技淫巧。所謂奇技淫巧&#xff0c;就是官方在設計或者實踐中并未想象出的代碼風格或者使用場景。其實也就是類似于 react 的 hoc,本來源自于社區&#x…

悼念512汶川大地震遇難同胞——選拔志愿者【博奕】

悼念512汶川大地震遇難同胞——選拔志愿者 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11716 Accepted Submission(s): 7537 Problem Description 對于四川同胞遭受的災難&#xff0c;全國人民紛紛伸出援…

mall整合SpringBoot+MyBatis搭建基本骨架

本文主要講解mall整合SpringBootMyBatis搭建基本骨架&#xff0c;以商品品牌為例實現基本的CRUD操作及通過PageHelper實現分頁查詢。 mysql數據庫環境搭建 下載并安裝mysql5.7版本&#xff0c;下載地址&#xff1a;dev.mysql.com/downloads/i…設置數據庫帳號密碼&#xff1a;r…

Web框架之Django_01初識(三大主流web框架、Django安裝、Django項目創建方式及其相關配置、Django基礎三件套:HttpResponse、render、redirect)...

摘要&#xff1a; Web框架概述 Django簡介 Django項目創建 Django基礎必備三件套(HttpResponse、render、redirect) 一、Web框架概述&#xff1a; Python三大主流Web框架&#xff1a; Django&#xff1a;大而全&#xff0c;自帶了很多功能模塊&#xff0c;類似于航空母艦&am…

Bone Collector【01背包】

F - Bone Collector HDU - 2602 Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag wit…

Gamma階段第八次scrum meeting

每日任務內容 隊員昨日完成任務明日要完成的任務張圓寧#91 用戶體驗與優化https://github.com/rRetr0Git/rateMyCourse/issues/91&#xff08;持續完成&#xff09;#91 用戶體驗與優化https://github.com/rRetr0Git/rateMyCourse/issues/91牛宇航#86 重置密碼的后端邏輯https:/…

【動態規劃】多重背包

問題 Q: 【動態規劃】多重背包 時間限制: 1 Sec 內存限制: 64 MB 提交: 112 解決: 49 [提交] [狀態] [討論版] [命題人:admin] 題目描述 張琪曼&#xff1a;“魔法石礦里每種魔法石的數量看起來是足夠多&#xff0c;但其實每種魔法石的數量是有限的。” 李旭琳&#xff1a;…

【動態規劃】完全背包問題

問題 O: 【動態規劃】完全背包問題 時間限制: 1 Sec 內存限制: 64 MB 提交: 151 解決: 71 [提交] [狀態] [討論版] [命題人:admin] 題目描述 話說張琪曼和李旭琳又發現了一處魔法石礦&#xff08;運氣怎么這么好&#xff1f;各種嫉妒羨慕恨啊&#xff09;&#xff0c;她們有…

springboot超級詳細的日志配置(基于logback)

前言 java web 下有好幾種日志框架&#xff0c;比如&#xff1a;logback&#xff0c;log4j&#xff0c;log4j2&#xff08;slj4f 并不是一種日志框架&#xff0c;它相當于定義了規范&#xff0c;實現了這個規范的日志框架就能夠用 slj4f 調用&#xff09;。其中性能最高的應該使…

【動態規劃】簡單背包問題II

問題 J: 【動態規劃】簡單背包問題II 時間限制: 1 Sec 內存限制: 64 MB 提交: 127 解決: 76 [提交] [狀態] [討論版] [命題人:admin] 題目描述 張琪曼&#xff1a;“為什么背包一定要完全裝滿呢&#xff1f;盡可能多裝不就行了嗎&#xff1f;” 李旭琳&#xff1a;“你說得…

Vue組件通信

前言 Vue組件之間的通信 其實是一種非常常見的場景 不管是業務邏輯還是前段面試中都是非常頻繁出現的 這篇文章將會逐一講解各個傳值的方式 不過在此之前 先來總結一下各個傳值方式吧 1.父組件向子組件傳值 > props2.子組件向父組件傳值 > $emit3.平級組件傳值 > 總線…

【動態規劃】0/1背包問題

問題 H: 【動態規劃】0/1背包問題 時間限制: 1 Sec 內存限制: 64 MB 提交: 152 解決: 95 [提交] [狀態] [討論版] [命題人:admin] 題目描述 張琪曼和李旭琳有一個最多能用m公斤的背包&#xff0c;有n塊魔法石&#xff0c;它們的重量分別是W1&#xff0c;W2&#xff0c;…&a…

貓哥教你寫爬蟲 005--數據類型轉換-小作業

小作業 程序員的一人飲酒醉 請運用所給變量&#xff0c;使用**str()**函數打印兩句話。 第一句話&#xff1a;1人我編程累, 碎掉的節操滿地堆 第二句話&#xff1a;2眼是bug相隨, 我只求今日能早歸 number1 1 number2 2 unit1 人 unit2 眼 line1 我編程累 line2 是bug相…

索引失效

轉載于:https://blog.51cto.com/11009785/2406488

棋盤問題【深搜】

棋盤問題 POJ - 1321 在一個給定形狀的棋盤&#xff08;形狀可能是不規則的&#xff09;上面擺放棋子&#xff0c;棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列&#xff0c;請編程求解對于給定形狀和大小的棋盤&#xff0c;擺放k個棋子的所有可行…

python isinstance()

isinstanceisinstance(object, classinfo) 判斷實例是否是這個類或者object是變量 classinfo 是類型(tuple,dict,int,float) 判斷變量是否是這個類型 舉例&#xff1a; class objA: pass A objA() B a,v C a string print isinstance(A, objA) #注意該用法 print isinst…