文件上传知识点总结
文章目錄
- 第一章 概述
- 第一節 漏洞概述
- 第二節 漏洞成因
- 第三節 漏洞危害
- 第二章 相關術語
- 第一節 WebShell
- 第二節 大馬
- 第三節 小馬
- 第四節 中國菜刀與一句話木馬配合實現了三大基本功能
- 第五節 GetShell
- 第三章 文件上傳的條件
- 第一節 一定的條件
- 第三章 策略
- 黑白名單策略
- 第三章 文件上傳的利用
- PUT 方法上傳文件
- 第四章 文件上傳的繞過
- 第一節 前端限制與繞過
- 第二節 服務器端檢測--MIME 類型
- 第二節 服務器端檢測--文件內容
- 第三節 服務器端檢測--后綴名
- 第四節 00 截斷
- 第五節 .htaccess 攻擊
- 第六節 文件名中包含php 關鍵字
- 第七節 匹配文件名
- 第五章 常見文件上傳漏洞
- 第一節 Web 容器解析漏洞
- 第二節 Nginx 空字節漏洞
- 第三節 常見編輯器上傳
- 第四節 常見CMS 上傳
- 第六章 文件上傳漏洞的防御
- 第一節 代碼角度
- 第二節 服務器角度
- 參考
第一章 概述
第一節 漏洞概述
文件上傳是Web 應用的必備功能之一,比如上傳頭像顯示個性化、上傳附件共享文件、上傳腳本更新網站等。 如果服務器配置不當或者沒有進行足夠的過濾,Web 用戶就可以上傳任意文件, 包括惡意腳本文件、exe 程序等,這就造成了文件上傳漏洞。第二節 漏洞成因
文件上傳漏洞的成因: 一方面服務器配置不當會導致任意文件上傳; 另一方面,Web 應用開放了文件上傳功能,并且對上傳的文件沒有進行足夠的限制; 再者就是,程序開發部署時候,沒有考慮到系統特性和驗證和過濾不嚴格而導致限制被繞過,上傳任意文件。第三節 漏洞危害
上傳漏洞最直接的威脅就是上傳任意文件,包括惡意腳本、程序等。 如果Web 服務器所保存上傳文件的可寫目錄具有執行權限,那么就可以直接上傳后門文件,導致網站淪陷。 如果攻擊者通過其他漏洞進行提權操作,拿到系統管理權限,那么直接導致服務器淪陷。 同服務器下的其他網站無一幸免,均會被攻擊者控制。 通過上傳漏洞獲得的網站后門,就是WebShell。第二章 相關術語
第一節 WebShell
在計算機科學中,Shell 俗稱殼(用來區別于“核”),是指“為使用者提供操作界面”的軟件(命令解釋器)。 類似于windows 系統給的cmd.exe 或者linux 下bash 等,雖然這些系統上的命令解釋器不止一種。WebShell 是一個網站的后門,也是一個命令解釋器,不過是以Web 方式(HTTP 協議)通信(傳遞命令消息),繼承了Web 用戶的權限。 WebShell本質上是在服務器端可運行的腳本文件,后綴名為 .php/.asp/.aspx/.jsp 等, 也就是說WebShell 接收來自于Web 用戶的命令,然后再服務器端執行。第二節 大馬
WebShell 也可以是大馬,也是網站木馬。 有一類WebShell 之所以叫大馬,是因為與小馬(一句話木馬)區分開,并且代碼比較大,但是功能比較豐富。 同樣,大馬有很多種腳本格式,其功能基本相同。 每個團隊都有自己的定制大馬。以下是一個簡單的例子。 輸入密碼,密碼一般直接寫在木馬文件中。在大馬中我們可以進行文件管理,執行系統命令等,還有一些其他定制功能。這是asp 的大馬。第三節 小馬
小馬就是一句話木馬,因為其代碼量比較小,就是一句簡單的代碼。
以下是各個腳本的一句話。
第四節 中國菜刀與一句話木馬配合實現了三大基本功能
@ 文件管理 在中國菜刀頁面繼承Web 用戶權限可以實現文件管理,包括文件查看、上傳、下載、修改、刪除甚至運行exe 程序等。@ 虛擬終端 在中國菜刀下可以獲得類似于cmd 和bash 的命令行接口,可以執行相關命令。@ 數據庫管理 我們可以使用中國菜刀進行數據庫管理,此時需要知道連接數據庫的賬密。以MYSQL 為例子,填寫配置,如下。 <T>MYSQL</T> //數據庫類型 <H>localhost</H> //數據庫地址 <U>root</U> //數據庫的用戶 <P></P> //數據庫的密碼,密碼為空就不寫 <L>utf8</L> //編碼此時,我們就可以執行SQL 語句,管理數據庫了。
第五節 GetShell
GetShell,顧名思義,就是獲取Web 的過程和結果。當然任意文件上傳是GetShell 的主要方式,但并不是唯一途徑。第三章 文件上傳的條件
第一節 一定的條件
第三章 策略
黑白名單策略
黑白名單是最常用的安全策略之一。 在計算機安全中,黑白名單類似于一個列表,列表中寫了一些條件或規則,如果“客體”在黑名單中,一律“禁止”,如果“客體”在白名單中,一律“允許”。類似于手機號碼的黑白名單。如,Chrome 瀏覽器的黑白名單策略:
| URLBlacklist | ·禁止用戶訪問您已阻止的網址。不過,用戶可以訪問黑名單之外的所有網址。 設置此政策:用戶將可以自由訪問所有網址。 |
| URLWhitelist | 將此政策與 URLBlacklist 政策搭配使用,可將特定網址設為黑名單的例外網址并允許用戶訪問。 |
白名單的優先級高于黑名單。您至少要在黑名單中添加一個條目,才能正常使用此政策。
不設置此政策:網址黑名單將沒有例外網址。
華為收集安裝軟件黑白名單策略
| 白名單模式 | ·檢查只能安裝的軟件,只允許終端主機安裝軟件白名單中的軟件,安裝其他軟件則屬于違規行為。 |
| 白名單+黑名單模式 | 檢查必須安裝的軟件和禁止安裝的軟件。 |
第三章 文件上傳的利用
PUT 方法上傳文件
HTTP 請求方法之一,允許想服務器直接寫入文件
Apache 如何開啟PUT 方法:
第一步 測試Apache 是否開啟了put 方法
telnet 172.16.132.161 80 ---- OPTIONS / HTTP/1.1 HOST:172.16.132.161 ----第二 步 apache 開啟put 方法操作
httpd.conf 文件開啟模塊 ---- LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so ----啟用模塊 ---- <Directory />Options +Indexes +FollowSymLinks +ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire all grantedDAV On </Directory> ----開啟文件鎖 ---- DavLockDB c:\phpstudy\www\DavLock ----第三步 上傳文件
---- PUT /info.php HTTP/1.1 HOST: 172.16.132.161 Content-Length: 18<?php phpinfo();?> ----第四章 文件上傳的繞過
第一節 前端限制與繞過
有些Web 應用的文件上傳功能,僅在前端用JS 腳本做了檢測,如檢測文件后綴名等。upload-labs 第一關,以下是經典的代碼。 <script type="text/javascript">function checkFile() {var file = document.getElementsByName('upload_file')[0].value;if (file == null || file == "") {alert("請選擇要上傳的文件!");return false;}//定義允許上傳的文件類型var allow_ext = ".jpg|.png|.gif";//提取上傳文件的類型var ext_name = file.substring(file.lastIndexOf("."));//判斷上傳文件類型是否允許上傳if (allow_ext.indexOf(ext_name) == -1) {var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name;alert(errMsg);return false;}} </script> 此段JS 代碼采用白名單策略,檢測文件后綴名。配合表單事件使用。 <form enctype="multipart/form-data" method="post" onsubmit="return checkFile()"><p>請選擇要上傳的圖片:<p><input class="input_file" type="file" name="upload_file"/><input class="button" type="submit" name="submit" value="上傳"/> </form> 前端JS 腳本檢測的安全防御是十分薄弱的。可以非常輕松的繞過。 方法一:因為JS 腳本的運行環境是瀏覽器,我們可以修改JS 代碼,甚至刪除表單事件。 方法二:使惡意文件后綴名符合白名單策略,用Burp 掛代理抓包,然后修改文件后綴名即可。對于文件上傳,只從Web 前端進行檢測顯然防護不足,那么服務器端檢測就特別重要了。一般服務器端檢測,采用黑白名單策略,檢測如下內容。第二節 服務器端檢測–MIME 類型
MIME (Multipurpose Internet Mail Extensions) 是描述消息內容類型的因特網標準。 MIME 消息能包含文本、圖像、音頻、視頻以及其他應用程序專用的數據。 常見的MIME 類型如下| .js | application/x-javascript |
| .html | text/html |
| .jpg | image/jpeg |
| .png | image/png |
| application/pdf |
在HTTP 協議中,使用Content-Type 字段表示文件的MIME 類型。
當我們上傳文件的時候,抓到HTTP 數據包。
由于服務器在檢測Content-Type 類型的時候,取得的變量來自于用戶,所以可以用Burp 抓包,修改這個字段,使其合法,即可繞過限制上傳任意文件。
訪問上傳的文件。
第二節 服務器端檢測–文件內容
除了檢測上傳文件的Content-Type 類型,為了保持安全性,服務器端還會檢測文件內容。 PHP 中有一個函數getimagesize(),這個函數本意是檢查圖片的大小,但是在檢查之前,該函數會判斷目標文件是否是一張圖片。 因此,可以用該函數來檢測文件的內容。upload-load 14 關。 function isImage($filename){$types = '.jpeg|.png|.gif';if(file_exists($filename)){$info = getimagesize($filename);$ext = image_type_to_extension($info[2]);if(stripos($types,$ext)){return $ext;}else{return false;}}else{return false;} }對于文件內容檢測,我們可以通過制作上傳圖片木馬繞過。
------ GIF89a ------ ------ copy smile.jpg/b+info.php/a smile_info.jpg ------文件幻數 png 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 jpg FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C gif 47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33第三節 服務器端檢測–后綴名
服務器端還會檢測文件后綴名。 服務器端在檢測文件名的時候,依然會采用黑白名單策略。黑名單策略,不允許上傳php|asp|aspx|jsp...等可執行腳本的文件;白名單策略,只允許上傳jpg|gif|png|doc|rar… 等格式的文件。@ 黑名單 代碼中$deny_ext 數據就是一個黑名單,數組元素就是不允許上傳的類型。 對于黑名單,我們可以尋找其他可允許上傳的類型來繞過限制。可以執行腳本后綴名
.php .php2 .php3 .php5 .phtml .asp .aspx .ascx .ashx .asa .cer .jsp .jspx @ 白名單 對于后綴名白名單策略,我們只能上傳在白名單內的文件后綴名。第四節 00 截斷
00 就是Null(空)字符,URL 中表現為%00,00 截斷會導致文件上傳路徑截斷。 我們以upload-labs 第十一關為例子說明這個問題。 if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;}else{$msg = '上傳失敗!';}}else{$msg = "只允許上傳.jpg|.png|.gif類型文件!";} }第五節 .htaccess 攻擊
.htaccess 是Apache 服務器的分布式配置文件,該配置文件會覆蓋Apache 服務器的全局配置,作用域是當前目錄及其子目錄。 如果一個Web 應用允許上傳.htaccess 文件,那就意味著攻擊者可以更改Apache 的配置,這是十分危險。 .htaccess 攻擊想象空間非常大。 首先看Apache 的配置,允許.htaccess 文件覆蓋掉Apache 的配置。- 將.png 文件當作PHP 文件解析
將以下代碼寫入文件,并保存成.htaccess 名字,放到測試目錄下
AddType application/x-httpd-php .png
在同一目錄下創建一個文件[info.png],文件內容如下 <?php phpinfo(); ?> 當我們訪問該文件時,[info.png] 內的PHP 代碼將會被執行。第六節 文件名中包含php 關鍵字
當文件名[info.php.png] 中包含關鍵字[.php],并且.htaccess 文件內容如下,info.php.png 中的代碼會被執行。AddHandler php5-script php
第七節 匹配文件名
以下配置是匹配文件名[ajest],找打該文件,并執行其中的PHP 代碼
<FilesMatch "ajest"> SetHandler application/x-httpd-php </FilesMatch>-
upload-labs 第四關
先上傳[.htaccess] 文件。再上傳[ajest]
第五章 常見文件上傳漏洞
第一節 Web 容器解析漏洞
Web容器解析漏洞,就是Web 容器在解析腳本出現的"bug"。
-
Apache 解析漏洞
info.php.xxx.xx.x -
IIS6.0 解析漏洞
@ asp;.jpg
time.asp;1.jpg
@ 1.asp/time.jpg -
PHP CGI 解析漏洞
@ IIS7.0/7.5
IIS7.0/7.5+PHP 環境
讓iis7.0/7.5 支持PHP 環境
http://localhost:8000/info.png/1.php
@ Nginx 解析漏洞
/info.png/1.php
cgi.fix_pathinfo
第二節 Nginx 空字節漏洞
- Nginx 文件名邏輯漏洞(CVE-2013-4745)
第三節 常見編輯器上傳
編輯器就是網站后臺編輯網頁的在線編輯器,會自動集成文件上傳功能,這些編輯器的某些版本也存在文件上傳漏洞。- ewebeditor
- fckeditor
第四節 常見CMS 上傳
CMS 又叫網站內容管理系統(網站的模板,快速建站,二次開發),市面上很多開源的CMS 的歷史版本中有很多存在文件上傳漏洞,但是產生文件上傳漏洞的原因不盡相同,情景也不似本章上文中介紹的那樣“直白”。類似的CMS 有很多,比如常見的dedeCMS、PHPcms 等。第六章 文件上傳漏洞的防御
關于文件上傳的防御,防住危險的腳本類型是最基本的防御,最理想的是能夠過濾掉圖片馬中的惡意代碼。如果一個Web 應用能夠上傳圖片木馬,那么我們認為這個Web 應用是不安全的。文件上傳漏洞的防御主要從以下幾個方面考慮。第一節 代碼角度
@ 采用白名單策略,嚴格限制上傳文件的后綴名。 @ 進行二次渲染,過濾掉圖片馬中的惡意代碼。 @ 上傳文件重命名,盡量少的從客戶端獲取信息。 @ 避免文件包含漏洞。 @ 嚴格處理文件路徑,防御00 截斷漏洞,避開空格、點 、::$DATA 等windows 特性。第二節 服務器角度
@ 及時更新Web 容器,防止解析漏洞的產生。 @ 可寫目錄不給執行權限。參考
IIS WebDAV安全配置 https://www.2cto.com/article/201307/228165.html Upload-labs通關手冊 https://xz.aliyun.com/t/2435 解析漏洞總結 https://www.secpulse.com/archives/3750.html總結
- 上一篇: Javafx+MySQL 学生成绩管理系
- 下一篇: 超硬核!兔兔阿里p7学长给的面试知识库