2021-06-19

2021/6/17
buu

[HCTF 2018]WarmUp
打开后看源码发现source.php找到如下代码,又在注释中找到了hint.php打开提示
在这里插入图片描述
先分析找到的代码,发现include()应该是文件包含

<?php
    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或者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)) { //如果page存在whitelist中
                return true; //返回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 (! empty($_REQUEST['file'])  //request file不为空
        && is_string($_REQUEST['file'])  //file是字符串
        && emmm::checkFile($_REQUEST['file'])  //file满足checkfile中的条件
    ) {
        include $_REQUEST['file'];  //文件包含
        exit;
    } else {
        echo "<br><img  src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; 
    }  
?> flag{8cf4f0f6-dacd-4f5f-8db8-3f715450c111}

REQUEST[‘file’]需要满足三个条件
1.不为空
2.为字符串
3.满足函数checkfile校验
而checkfile校验有四个检测
1.判断是否为字符串
2.判断page是否在whitelist数组中
3.截取page中’?'前一部分判断是否whitelist数组中
4.判断url解码并截取后的page是否存在于whitelist中 //重点!

因此构造payload
http://ce6b0c43-8e75-431c-81d6-64ea74a049ba.node3.buuoj.cn/source.php?file=source.php?../…/…/…/…/ffffllllaaaagggg

相关函数
highlight_file() 函数对文件进行语法高亮显示。
highlight_file(filename,return)
in_array()函数搜索数组中是否存在指定的值
in_array(search,array,type)
如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
mb_strpos($ string, $ a):查找字符串a在字符串string中首次出现的位置,起始位置以0开始;
mb_substr($string, $start, $end):在字符串string中截取以start开始,以end结尾的子串;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值