自拍亚洲一区欧美另类,亚洲成人影院,亚洲午夜久久久久妓女影院,最近中文字幕高清中文字幕无,亚洲熟妇av一区二区三区漫画

互聯(lián)網(wǎng)知識(shí)

精準(zhǔn)傳達(dá) ? 價(jià)值共享

洞悉互聯(lián)網(wǎng)前沿資訊,探尋網(wǎng)站營(yíng)銷規(guī)律

常見的文件上傳的檢測(cè)方式與繞過的方法

作者:狐靈科技 | 2020-03-09 17:38 |點(diǎn)擊:

前言

文件上傳漏洞是我們平時(shí)滲透過程中經(jīng)常利用的漏洞,利用文件上傳我們可以直接得到webshell,是非常直接的攻擊方式。寫這篇文章主要是想對(duì)常見的文件上傳檢測(cè)和繞過進(jìn)行總結(jié),同時(shí)練習(xí)文件上傳php代碼的編寫。

以下上傳測(cè)試使用的HTML表單的代碼為:

<html>
    <head>
        <title>File Upload</title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="upload.php" method="POST" enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
            選擇文件: <input type="file" name="myfile">
            <input type="submit" value="Upload">
        </form>
    </body>
</html>

1.1 前端JavaScript檢測(cè)

前端一般都是使用js來限制我們的上傳類型和文件大小,這里以u(píng)pload-labs Pass-01的源碼為例:

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("請(qǐng)選擇要上傳的文件!");
        return false;
    }
    //定義允許上傳的文件類型
    var allow_ext = ".jpg|.png|.gif";
    //提取上傳文件的類型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判斷上傳文件類型是否允許上傳
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "該文件不允許上傳,請(qǐng)上傳" + allow_ext + "類型的文件,當(dāng)前文件類型為:" + ext_name;
        alert(errMsg);
        return false;
    }
}

對(duì)于前端的檢測(cè)我們可以抓包來修改文件類型,也可以禁用掉JavaScript??傊挥星岸说南拗剖欠浅2话踩?,非常容易被繞過。

2.1 后端檢測(cè)文件類型

2.1.1 檢測(cè)content-type

后端代碼大致為:

<?php
$allow_content_type = array("image/gif", "image/png", "image/jpeg");
$path = "./uploads";
$type = $_FILES["myfile"]["type"];

if (!in_array($type, $allow_content_type)) {
        die("File type error!<br>");
} else {
        $file = $path . '/' . $_FILES["myfile"]["name"];
        if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $file)) {
                echo 'Success!<br>';
        } else {
                echo 'Error!<br>';
        }
}
?>

繞過方法:

抓包將content-type改為圖片形式(即'image/png'等),即可成功上傳

2.1.2 檢測(cè)文件頭判斷文件類型

后端代碼大致為:

<?php
$allow_mime = array("image/gif", "image/png", "image/jpeg");
$imageinfo = getimagesize($_FILES["myfile"]["tmp_name"]);
$path = "./uploads";

if (!in_array($imageinfo['mime'], $allow_mime)) {
        die("File type error!<br>");
} else {
        $file = $path . '/' . $_FILES["myfile"]["name"];
        if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $file)) {
                echo 'Success!<br>';
        } else {
                echo 'Error!<br>';
        }
}
?>

此時(shí)雖然檢查的也是文件類型,但是是使用getimagesize()函數(shù)來獲取文件的MIME類型,此時(shí)檢測(cè)的不是數(shù)據(jù)包中的content-type,而是圖片的文件頭,常見的圖片文件頭如下:

gif(GIF89a) : 47 49 46 38 39 61

jpg、jpeg : FF D8 FF

png : 89 50 4E 47 0D 0A

繞過方法:

當(dāng)上傳php文件時(shí),可以使用winhex010editor等十六進(jìn)制處理工具,在數(shù)據(jù)最前面添加圖片的文件頭,從而繞過檢測(cè)

2.2 后端檢測(cè)文件擴(kuò)展名

2.2.1 黑名單檢測(cè)

后端代碼大致為:

<?php
// 實(shí)際情況中黑名單內(nèi)數(shù)據(jù)會(huì)更多更全面
$blacklist = array('php', 'asp', 'aspx', 'jsp');
$path = "./uploads";
$type = array_pop(explode('.', $_FILES['myfile']['name']));

if (in_array(strtolower($type), $blacklist)) {
        die("File type errer!<br>");
} else {
        $file = $path . '/' . $_FILES['myfile']['name'];
        if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file)) {
                echo 'Success!<br>';
        } else {
                echo 'Error!<br>';
        }
}
?>

眾所周知使用黑名單是非常不安全的,很多網(wǎng)站會(huì)使用擴(kuò)展名黑名單來限制上傳文件類型,有些甚至在判斷時(shí)都不用strtolower()來處理,因此造成漏洞

繞過方法:

  1. 使用一些特殊擴(kuò)展名來繞過(如php可以使用php3、php4、php5等來代替)
  2. 在后端比較沒有轉(zhuǎn)換大小寫處理時(shí),使用大小寫混淆(如將php改為pHp等)來繞過

2.2.2 白名單檢測(cè)

大致代碼如下,與黑名單檢測(cè)沒有太大差別:

<?php
$whitelist = array('png', 'jpg', 'jpeg', 'gif');
$path = "./uploads";
$type = array_pop(explode('.', $_FILES['myfile']['name']));

if (!in_array(strtolower($type), $whitelist)) {
        die("File type errer!<br>");
} else {
        $file = $path . '/' . $_FILES['myfile']['name'];
        if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file)) {
                echo 'Success!<br>';
        } else {
                echo 'Error!<br>';
        }
}

白名單相對(duì)與黑名單就安全許多,要求只能是特定擴(kuò)展名的文件才能上傳,雖然我們無法從代碼層面來繞過,但這樣也不是絕對(duì)的安全,可以利用其他漏洞來繞過

繞過方法:

  1. 使用%00截?cái)辔募麃砩蟼鳎ê竺鏁?huì)講)
  2. 如果目標(biāo)還存在文件包含漏洞,那么就可以上傳圖片馬再文件包含來拿shell

2.3 后端檢測(cè)文件內(nèi)容

2.3.1 文件內(nèi)容替換

這種主要是將文件中的敏感字符替換掉,大致代碼類似于下面這樣:

<?php
$path = "./uploads";
$content = file_get_contents($_FILES['myfile']['tmp_name']);
$content = str_replace('?', '!', $content);
$file = $path . '/' . $_FILES['myfile']['name'];

if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file)) {
        file_put_contents($file, $content);
        echo 'Success!<br>';
} else {
        echo 'Error!<br>';
}
?>

此時(shí)如果我們要上傳php的一句話<?php @eval($_POST['shell']);?>時(shí),php的語言標(biāo)記中的?會(huì)被替換為!,這樣一句話就不能被執(zhí)行了

繞過方法:

主要還是要根據(jù)實(shí)際過濾的字符來判斷,如果寫死的話可能是沒辦法的(一般不會(huì),因?yàn)檫€要兼顧圖片上傳)

比如過濾掉問號(hào),我們就可以使用<script language='php'>system('ls');</script>這樣的一句話。具體方法要看實(shí)際代碼過濾了哪些字符。

2.3.2 圖片二次渲染

我們以u(píng)pload-labs Pass-16的源碼為例:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 獲得上傳文件的基本信息,文件名,類型,大小,臨時(shí)文件路徑
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // 獲得上傳文件的擴(kuò)展名
    $fileext= substr(strrchr($filename,"."),1);

    //判斷文件后綴與類型,合法才進(jìn)行上傳操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上傳的圖片生成新的圖片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "該文件不是jpg格式的圖片!";
                @unlink($target_path);
            }else{
                //給新圖片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上傳出錯(cuò)!";
        }
...

大致意思是后端調(diào)用了php的GD庫,提取了文件中的圖片數(shù)據(jù),然后再重新渲染,這樣圖片中插入的惡意代碼就會(huì)被過濾掉了

我自己在測(cè)試時(shí)發(fā)現(xiàn)不管是直接修改文件頭來制作的圖片馬,還是利用copy命令制作的圖片馬,都無法避免其中的一句話被過濾掉。

而看了一篇文章發(fā)現(xiàn)其實(shí)要把一句話插入到圖片數(shù)據(jù)中,這樣經(jīng)過渲染后這部分?jǐn)?shù)據(jù)還是會(huì)保留下來。大家可以看一下作為參考:https://secgeek.net/bookfresh-vulnerability/

3.1 解析漏洞及其他漏洞

3.1.1 IIS解析漏洞

IIS6.0

在IIS6.0中有兩個(gè)很重要的asp解析漏洞:

  1. 假設(shè)當(dāng)前有一個(gè)名為"xxx.asp"的目錄,那么該目錄下的所有文件都將被作為asp文件解析
  2. 假設(shè)上傳一個(gè)名為"test.asp;xxx.jpg"時(shí),該文件會(huì)被當(dāng)做asp文件解析

IIS7.5

這個(gè)其實(shí)不能算IIS的洞,它其實(shí)是php的解析漏洞,這個(gè)漏洞利用條件是服務(wù)器在php.ini中將cgi.fix_pathinfo的值設(shè)置為1

然后當(dāng)我們?cè)L問服務(wù)器上任意一個(gè)文件時(shí)(如:http://test.com/a.jpg),當(dāng)我們?cè)赨RL后面添加`.php`(即:http://test.com/a.jpg/.php),那么文件a.jpg就將被作為php文件來解析

3.1.2 Apache解析漏洞

利用低版本apache擴(kuò)展名解析特性

在了解這個(gè)解析漏洞之前,我們要首先了解apache和php的三種結(jié)合方式:

Apache和php三種結(jié)合方式:

1.CGI

2.Module

3.FastCGI

該解析漏洞只有在apache和php以Module方式結(jié)合時(shí)才存在,而且Apache還有一個(gè)特性:

Apache在解析文件時(shí)會(huì)以文件名從右向左解析,當(dāng)最后一個(gè)擴(kuò)展名無法識(shí)別時(shí),就會(huì)向左查看是否有可以識(shí)別的文件名,如果沒有的話就以配置中的默認(rèn)文件類型來解析

例如:

a.php.xxx因?yàn)閤xx無法識(shí)別,而左邊的php可識(shí)別,就會(huì)被解析為php文件

因此,如果上傳文件名為a.php.xxx的一句話,訪問后就很可能拿到shell

CVE-2017-15715

還有一個(gè)apache的解析漏洞就是CVE-2017-15715,這個(gè)漏洞利用方式就是上傳一個(gè)文件名最后帶有換行符(只能是\x0A,如上傳a.php,然后在burp中修改文件名為a.php\x0A),以此來繞過一些黑名單過濾

具體的漏洞分析可以看p牛:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html

3.1.3 %00截?cái)?/h3>

這個(gè)多數(shù)被利用在截?cái)嗦窂剑玫臈l件是:

PHP < 5.3.4

magic_quotes_gpc 關(guān)閉

因?yàn)?code style="padding: 0.2em 0px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(221, 17, 68); border-radius: 3px; background-color: rgba(0, 0, 0, 0.04); box-sizing: border-box; margin: 0px; word-break: break-all; border: none !important;">0x00是字符串的結(jié)束標(biāo)志符,所以php在讀取到0x00時(shí)就不會(huì)再往后讀取,我們可以利用這些截?cái)嘧址竺娌恍枰膬?nèi)容

以u(píng)pload-labs的Pass-12為例,源碼如下:

$is_upload = false;
$msg = null;
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 = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上傳出錯(cuò)!';
        }
    } else{
        $msg = "只允許上傳.jpg|.png|.gif類型文件!";
    }
}

由于是白名單限制了上傳文件類型,因此我們無法在文件名處做文章。但最終move_uploaded_file()的目標(biāo)目錄是我們可控的,我們可以將POST傳入的save_path改為../upload/shell.php%00,這樣后面的內(nèi)容就會(huì)被截?cái)嗟簦@就導(dǎo)致了任意文件上傳

還要注意的是%00是url編碼,在以POST傳參時(shí)應(yīng)該使用burpsuite對(duì)其進(jìn)行url decode,或者修改hex值為00;而當(dāng)GET傳參時(shí)因?yàn)闉g覽器會(huì)做一遍url decode,所以直接傳%00即可。

3.1.4 利用.htaccess解析

.htaccess文件(或者"分布式配置文件"),全稱是Hypertext Access(超文本入口)。提供了針對(duì)目錄改變配置的方法, 即,在一個(gè)特定的文檔目錄中放置一個(gè)包含一個(gè)或多個(gè)指令的文件, 以作用于此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。管理員可以通過Apache的AllowOverride指令來設(shè)置。

利用.htaccess的條件:Apache中配置AllowOverride All

.htaccess文件可以配置將特定的文件按規(guī)定的文件類型進(jìn)行解析,可以用以下兩種方式來配置:

<FilesMatch "test">
  SetHandler application/x-httpd-php
</FilesMatch>

這一種采用正則匹配,只要文件名為test的文件都將被作為php文件解析

AddType application/x-httpd-php .jpg

第二種是將.jpg文件都作為php文件解析

這樣我們?nèi)绻軐?htaccess上傳到服務(wù)器的話,就可以再根據(jù)我們自己設(shè)定的規(guī)則來解析上傳的文件,以此來繞過上傳過濾

總結(jié)

常見的文件上傳的檢測(cè)和繞過方式基本是以上幾種。在實(shí)戰(zhàn)或CTF比賽中往往是幾種類型的結(jié)合,因此繞過也需要幾種方式的結(jié)合。

首先我認(rèn)為最重要的是前期的信息收集,服務(wù)器的類型、版本,使用的腳本語言、版本,只要做到對(duì)這些很清楚后才能考慮之后能否利用一些如%00截?cái)?、服?wù)器解析漏洞來進(jìn)行文件上傳。

在測(cè)試時(shí),一般我們都先要fuzz看一下檢測(cè)是哪種類型,是前端還是后端?黑名單還是白名單?上傳后的shell能否被成功執(zhí)行?是否有文件內(nèi)容的檢測(cè)?

如果是黑名單的話,就要嘗試各種特殊文件名(php、Php、PHP、pht、php5、phtml),或者在擴(kuò)展名后添加空格、::$DATA、.等字符,再或者是嘗試上傳.htaccess

如果是白名單,就要看是否可以使用%00截?cái)?,或者利用服?wù)器的解析漏洞。如果真的過濾很死的話,不妨再找一下目標(biāo)的文件包含漏洞,嘗試?yán)梦募瑏斫馕鰣D片馬。

個(gè)人認(rèn)為現(xiàn)在文件上傳在代碼層除了邏輯問題外已經(jīng)很少有漏洞了,大多數(shù)情況下都是利用服務(wù)器解析漏洞等來getshell,這篇文章也只是作為自己入門文件上傳的總結(jié)。如果有錯(cuò)誤,請(qǐng)各位師傅指正。

如沒特殊注明,文章均為狐靈科技原創(chuàng),轉(zhuǎn)載請(qǐng)注明?? "常見的文件上傳的檢測(cè)方式與繞過的方法
多一份免費(fèi)策劃方案,總有益處。

請(qǐng)直接添加技術(shù)總監(jiān)微信聯(lián)系咨詢

網(wǎng)站設(shè)計(jì) 品牌營(yíng)銷

多一份參考,總有益處

聯(lián)系狐靈科技,免費(fèi)獲得專屬《策劃方案》及報(bào)價(jià)

咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

業(yè)務(wù)熱線:15082661954 / 大客戶專線:15523356218