warmup-wp

题目:

开局一个大大的滑稽 啥也没有

图片[1]-warmup-wp-Drton1博客

F12看源码:

图片[2]-warmup-wp-Drton1博客

看到有一个source.php的文件:

图片[3]-warmup-wp-Drton1博客

进来以后大致看了一下 还有一个hint.php文件

于是进行访问:

图片[4]-warmup-wp-Drton1博客

拿到flag的地址 在ffffllllaaaagggg

接下来进行代码审计:

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

可以看到 我们REQUEST传参一个file参数

一个if 语句判断是否为真 是真的话才会包含我们这个文件 也就是说只有让这个if里面的判断都为真 我们才能利用文件包含漏洞 拿flag。

总共有三个要满足的条件 1.要传进来一个file 2.是字符串 3.把file这个参数传进checkFile函数要返回真

前两个都很好满足,基本只要你只要传file的参数就能满足,重点是第三个要满足要求。

我们细看这个函数:

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;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                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;
        }

我们把file传参进来 要让这个函数返回true。

那么我就只看 return true的条件, 这里看到有三个地方return true;

第一个:

     if (in_array($page, $whitelist)) {
                return true;
            }

这个page参数就是我们传进函数的参数,就是我们传进来的file ,可以看到第一次他会检测page里面的内容是不是在白名单中 如果是就返回真

而白名单就两个source.php hint.php 这两个 如果我们单传file=source.php或者file=hint.php 是可以返回ture 但是最后包含的也是 include source.php 这对我们拿flag没有用。所以第一个返回true对我们来说就没有用。

第二个:

   $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

第二个返回true还是检测是否在白名单,但是这里他检测前多了一步,这里就涉及到两个函数 一个mb_substr() 一个mb_strop()

简单介绍一个mb_substr 就是substr函数 只不过加一个mb前缀就可以截取 中文了 mb_strop()函数会返回 这个字符串中目标字符的位置。

这个函数就是他对问号字符前的进行截取,把?号前的字符放再次跟白名单对比 如果在白名单 就返回真,这个我们就可以利用

我们可不可以传一个参数file=source.php?xxxxxxxxxxx 这样等他截取?前的就截取到了source.php这个字符串了,刚好也在白名单中。

那么就会返回真了 ,那么就符合条件了,可以进行文件包含这个file内容了,那么我们下一个问题就是文件包含怎么去包含一个名字为前面有source.php?文件名 的名子。

这里就有一个技巧了;

如果 file=source.php?/1.txt 会发生什么 不妨做个实验:

图片[5]-warmup-wp-Drton1博客

这里有没有报错 又没有内容呈现 ,没有报错说明这种写法可以,没有呈现说明没有1.txt这个文件。

我们换成ffffllllaaaagggg 并依次跳上一级目录 直到找到这个。

图片[6]-warmup-wp-Drton1博客

最终发现在第五个目录。

第三个:

 $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;

那第二个就拿到flag了,第三个呢?其实也能 我们仔细观察第三个的判断 发现,他跟第二个其实差不多就是多了一句:

url的解码:

 $_page = urldecode($page);

我们都知道? : , 汉字 这些东西在url框里会被自动编码。

图片[7]-warmup-wp-Drton1博客

?在url里的的编码就是%3F 传到服务器 服务器会自动给他进行一次url的解码 变成?, 而在这里他又进行了一次解码,那么我们想让他在这里变成?那么就要在传时候 把%3F再进行一次编码,这样服务器第一次解码变成%3F 这里再进行一次解码变成 ? 。

图片[8]-warmup-wp-Drton1博客

传参:

图片[9]-warmup-wp-Drton1博客

这里是让第三个返回真了。

所以这题有两个解法 都可以拿到flag。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论