攻防世界-warmup详解

warmup

进入题目后只有一个图片,我们查看源代码,发现源码信息;
攻防世界-warmup详解_第1张图片
查看source.php

 
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)     //check函数检查传入的page是否在白名单里
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {    //判断page是不是字符型
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {     //成功返回true
                return true;
            }

            $_page = mb_substr(						//mb_substr() 函数返回字符串的一部分
                $page,
                0,
                mb_strpos($page . '?', '?')		//mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);				//url编码
            $_page = mb_substr(						//截取问好前面的
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {				//在白名单返回true
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])				//对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\" />";
    }  
?> 

攻防世界-warmup详解_第2张图片
发现一个新文件,找到flag相关信息,这里flag四次双写提示我们flag路径攻防世界-warmup详解_第3张图片
可以看到最后的include 是可以动态构造参数的,那应该就是解题关键了不过要经过三个判断
第一个:检查一个变量是否为空
第二个:是否为字符串
第三个:通过函数来检查
我们要构造的payload本身就满足前两点所以无视重要是第三点的这个函数
函数作用是分三步检查传进来的参数是否满足白名单:
构造payload:
source.php?file=hint.php?/…/…/…/…/…/…/ffffllllaaaagggg
source.php?file=hint.php%253f…/…/…/…/…/…/ffffllllaaaagggginclude

include语句包含并运行指定文件。(以下文档也适用于require。)
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_ path 指定的目录寻找。如果在include_ path 下没找到该文件则include最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则include结构会发出一条警告;这一点和require不同,后者会发出一个致命错误。
如果定义了路径一-- 不管是绝对路径(在Windows下以盘符或者| 开头,在Unix/Linux下以/开头)还是当前目录的相对路径(以. 或者…开头) --include_ path 都会被完全忽略。例如一个文件以.开头,则解析器会在当前目录的父目录下寻找该文件。
htps://blog.csdn.netqq_ 42016346

简单说就是include文件包含是遇到 …/…/会将以.开头,则解析器会在当前目录的父目录下寻找该文件,所以我们要进行转义。
或者对问好进行两次url编码

攻防世界-warmup详解_第4张图片
在这里插入图片描述
flag:
flag{25e7bce6005c4e0c983fb97297ac6e5a}

你可能感兴趣的:(攻防世界web高手进阶,warmup,安全)