風炫安全web安全學習第三十六節課-15種上傳漏洞講解(一)

風炫安全web安全學習第三十六節課 15種上傳漏洞講解(一)javascript

文件上傳漏洞

0x01 漏洞描述和原理

文件上傳漏洞能夠說是平常滲透測試用得最多的一個漏洞,由於用它得到服務器權限最快最直接。可是想真正把這個漏洞利用好卻不那麼容易,其中有不少技巧,也有不少須要掌握的知識。俗話說,知己知彼方能百戰不殆,所以想要研究怎麼防禦漏洞,就要了解怎麼去利用。php

網站web應用都有一些文件上傳功能,好比文檔、圖片、頭像、視頻上傳,當上傳功能的實現代碼沒有嚴格校驗上傳文件的後綴和文件類型,此時攻擊者就能夠上傳一個webshell到一個web可訪問的目錄上,並將惡意文件傳遞給PHP解釋器去執行,以後就能夠在服務器上執行惡意代碼,進行數據庫執行、服務器文件管理,服務器命令執行等惡意操做。
根據網站使用及可解析的程序腳本不一樣,此處能夠上傳的惡意腳本能夠是PHP、ASP、JSP文件,也能夠是篡改後綴後的這幾類腳本。html

WebShell 就是以 asp、php、jsp 或者 cgi 等網頁文件形式存在的一種命令執行環境,也能夠將其稱之爲 一種網頁後門。攻擊者在入侵了一個網站後,一般會將這些 asp 或 php 後門文件與網站服務器 web 目錄 下正常的網頁文件混在一塊兒,而後使用瀏覽器來訪問這些後門,獲得一個命令執行環境,以達到控制網站服務器的目的(能夠上傳下載或者修改文件,操做數據庫,執行任意命令等)。前端

上傳漏洞分類

0x02 基礎知識

php的超級全局變量 $_FILE

$_FILES['file']['name'] 客戶端文件名稱

$_FILES['file']['type'] 文件的MIME類型

$_FILES['file']['size'] 文件大小 單位字節

$_FILES['file']['tmp_name'] 文件被上傳後再服務器端臨時文件名,能夠在php.ini中指定

要注意的是在文件上傳結束後,默認的被儲存在臨時文件夾中,這時必須把他從臨時目錄中刪除或移動到其餘地方,不然,腳本運行完畢後,自動刪除臨時文件,可使用copy或者move_uploaded_file兩個函數java

文件頭content-type字段校驗(服務端MIME類型檢測)

MIME類型格式: 類別/子類別;參數 Content-Type: [type]/[subtype]; parametergit

MIME主類別: text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;github

Multipart:用於鏈接消息體的多個部分構成一個消息,這些部分能夠是不一樣類型的數據;web

Application:用於傳輸應用程序數據或者二進制數據;shell

Message:用於包裝一個E-mail消息;數據庫

Image:用於傳輸靜態圖片數據;

Audio:用於傳輸音頻或者音聲數據;

Video:用於傳輸動態影像數據,能夠是與音頻編輯在一塊兒的視頻數據格式。

0x02 校驗方式分類&總結

一、客戶端javascript校驗(通常只校驗後綴名)

二、服務端校驗

三、文件頭content-type字段校驗(image/gif)

四、後綴名黑名單校驗

五、文件內容頭校驗(GIF89a)

六、後綴名白名單校驗

七、自定義正則校驗

八、WAF設備校驗(根據不一樣的WAF產品而定)

0x03 漏洞利用

這次咱們用的靶場是:upload-labs: https://github.com/c0ny1/upload-labs

01利用HTTP PUT方式上傳文件

這個漏洞已通過時,幾乎不會再出此類漏洞

WebDAV是一種基於 HTTP 1.1協議的通訊協議.它擴展了HTTP 1.1,在GET、POST、HEAD等幾個HTTP標準方法之外添加了一些新的方法。使應用程序可直接對Web Server直接讀寫,並支持寫文件鎖定(Locking)及解鎖(Unlock),還能夠支持文件的版本控制。當WebDAV開啓PUT,MOVE,COPY,DELETE方法時,攻擊者就能夠向服務器上傳危險腳本文件。

此時可使用OPTIONS探測服務器支持的http方法,若是支持PUT,就進行上傳腳本文件,在經過MOVE或COPY方法更名。當開啓DELETE時還能夠刪除文件

02繞過前端驗證

<?php
//文件上傳漏洞演示腳本之js驗證
$uploaddir = 'uploads/';
if (isset($_POST['submit'])) {
    if (file_exists($uploaddir)) {
        if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
            echo '文件上傳成功,保存於:' . $uploaddir . $_FILES['upfile']['name'] . "\n";
        }
    } else {
        exit($uploaddir . '文件夾不存在,請手工建立!');
    }
    //print_r($_FILES);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=gbk"/>
    <meta http-equiv="content-language" content="zh-CN"/>
    <title>文件上傳漏洞演示腳本--JS驗證明例</title>
    <script type="text/javascript">
       function checkFile() {
            var file = document.getElementsByName('upfile')[0].value;
            if (file == null || file == "") {
                alert("你尚未選擇任何文件,不能上傳!");
                return false;
            }
            //定義容許上傳的文件類型
            var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
            //提取上傳文件的類型
            var ext_name = file.substring(file.lastIndexOf("."));
            //alert(ext_name);
            //alert(ext_name + "|");
            //判斷上傳文件類型是否容許上傳
            if (allow_ext.indexOf(ext_name + "|") == -1) {
                var errMsg = "該文件不容許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型爲:" +     ext_name;
                alert(errMsg);
                return false;
            }
        }
    </script>
<body>
<h3>文件上傳漏洞演示腳本--JS驗證明例</h3>
<form action="" method="post" enctype="multipart/form-data" name="upload" onsubmit="return     checkFile()">
    <input type="hidden" name="MAX_FILE_SIZE" value="204800"/>
    請選擇要上傳的文件:<input type="file" name="upfile"/>
    <input type="submit" name="submit" value="上傳"/>
</form>
</body>
</html>

繞過方式

去掉前端的提交時候的驗證checkFile 函數既可

演示地址:Pass-01/index.php

03修改MIME類型繞過上傳

MIME type的縮寫爲(Multipurpose Internet Mail Extensions)表明互聯網媒體類型(Internet media type),MIME使用一個簡單的字符串組成,最初是爲了標識郵件Email附件的類型,在html文件中可使用content-type屬性表示,描述了文件類型的互聯網標準。

?php
if($_FILE['userfile']['type'] != "image/gif"){ //檢測content-type
    echo "sorry,we only allow uploading GIF images";
    exit;
}
else
{
    echo "Upload success!";
}
?>

以上是一個簡單的服務器上傳驗證代碼,只要content-type符合image/gif就容許上傳

繞過方式

使用Burp截取上傳數據包,修改Content-Type的值,改成image/gif便可成功繞過上傳webshell

演示地址:Pass-02/index.php

04後綴名黑名單校驗之上傳特殊腳本文件後綴突破

使用黑名單,禁止上傳.asp,.aspx,.php,.jsp 結尾的文件。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//刪除文件名末尾的點
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //轉換爲小寫
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if(!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上傳出錯!';
            }
        } else {
            $msg = '不容許上傳.asp,.aspx,.php,.jsp後綴文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夾不存在,請手工建立!';
    }
}

繞過方式

使用特殊文件.php,.phtml、php二、php三、php五、phtml、pht。來突破上傳,在特定狀況下一樣也能夠解析

演示地址:Pass-03/index.php
參考
http://blog.evalshell.com/2020/12/20/風炫安全web安全學習第三十六節課-15種上傳漏洞講解/

相關文章
相關標籤/搜索