美文网首页
HCTF2018 WarmUp

HCTF2018 WarmUp

作者: jun123123 | 来源:发表于2019-10-12 20:45 被阅读0次

buuctf第一题。
打开页面看到一个滑稽表情,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\" />";
    }  
?> 

看到其中$whitelist数组有两个值分别为source.php和hint.php,进入hint.php页面:


1.png

告诉我们flag在ffffllllaaaagggg中。
回到source.php代码
首先看下面部分:

 if (! empty($_REQUEST['file'])  //$_REQUEST['file']值非空
        && is_string($_REQUEST['file'])  //$_REQUEST['file']值为字符串
        && emmm::checkFile($_REQUEST['file'])  //能够通过checkFile函数校验
    ) {
        include $_REQUEST['file'];  //包含$_REQUEST['file']文件
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
        //打印滑稽表情
    }  

一个if语句要求传入的file变量:

  • 非空
  • 类型为字符串
  • 能够通过checkFile()函数校验

同时满足以上三个要求即可包含file中的文件,否则打印滑稽表情
回到上面checkFile()函数

    highlight_file(__FILE__); //打印代码
    class emmm  //定义emmm类
    {
        public static function checkFile(&$page)//将传入的参数赋给$page
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
            if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
                echo "you can't see it";//打印"you can't see it"
                return false;//返回false
            }

            if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
                return true;//返回true
            }

            $_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);//url解码$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语句

  • 第一个if语句对变量进行检验,要求$page为字符串,否则返回false
  • 第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
  • 第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
  • 第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
    若以上四个if语句均未返回值,则返回false

有三个if语句可以返回true,第二个语句直接判断$page,不可用
第三个语句截取'?'前部分,由于?被后部分被解析为get方式提交的参数,也不可利用
第四个if语句中,先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。('?'两次编码值为'%253f'),构造url:
http://***:***/source.php?file=source.php%253f../ffffllllaaaagggg
无返回值,由于我们不知道ffffllllaaaagggg文件的具体位置,只能依次增加../,最终在
http://***:***/source.php?file=source.php%253f../../../../../ffffllllaaaagggg中成功回显flag
该漏洞cve编号为CVE-2018-12613,详情请戳

相关文章

  • BUUOJ刷题

    0x01 WarmUp 出处:HCTF2018 要使emmm::checkFile($_REQUEST['fil...

  • HCTF2018 WarmUp

    buuctf第一题。打开页面看到一个滑稽表情,f12发现提示source.php进入该页面,发现是代码审计,代码如...

  • warmup

    1. warmup是什么? Warmup是针对学习率优化的一种方式,Warmup是在ResNet论文中提到的一种学...

  • warmup

    Warmup上面我们提到了,进行基准测试前需要进行预热。一般我们前几次进行程序测试的时候都会比较慢, 所以要让程序...

  • 聊一聊学习率预热linear warmup

    什么是warmup warmup是针对学习率learning rate优化的一种策略,主要过程是,在预热期间,学习...

  • hctf2018

    打开题目,f12发现 以及hint和link:http://warmup.2018.hctf.io/index.p...

  • [PyTorch]Transformer-xl中的学习率sche

    定义调度器 step-wise学习率退火,可以看到在warmup阶段学习率是慢慢的上升的,而过了warmup阶段使...

  • Warmup Flower

    The indigo-and-white flowers are against a green backgrou...

  • PyTorch实现各种学习率调整策略

    参考 GitHub:Gradually-Warmup Learning Rate Scheduler for Py...

  • 热身+余弦衰减

    https://github.com/zhouyonglong/pytorch-gradual-warmup-lr

网友评论

      本文标题:HCTF2018 WarmUp

      本文链接:https://www.haomeiwen.com/subject/nsscmctx.html