这个题的前身是一个cve漏洞(phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613))
刚入坑的小伙伴不要慌,我们一步一步慢慢来看
点开题目,日常f12发现有提示,所以我们进行访问
发现是源代码,让我们进行阅读(分为两块1、主函数部分 2、外部类)
外部方法:
这里对两个函数进行解释查询以下资料
(关于mb_strpos函数在测试时发现如果没有匹配到指定符号,将返回字符串长度)
我们进行一些本地测试加深理解:
代码如下:
class emmm
{
public static function checkFile(&$page)
{
//先看一下对函数里输入了什么
$a=&$page;
echo $a."<br>";
$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;
}
echo mb_strpos($page . '?', '?')."<br>";//没匹配到所以返回字符串长度
$_page = mb_substr($page,0, mb_strpos($page . '?', '?'));
echo "2".$_page."<br>";//经过一次后返回值
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
echo "3".$_page."<br>";//二次编码后的返回值
echo mb_strpos($page . '?', '?')."<br>";//注意输出时与第一次的区别
$_page = mb_substr($page,0, mb_strpos($_page . '?', '?'));
echo "4".$_page."<br>";//再次看经过截取后的输出
if (in_array($_page, $whitelist)) {
echo "sdf you can't see it";//证明进入该函数
return true;
}
echo "you can't see it";
return false;
}
}
看测试结果:
看到第4部分输出为白名单内的内容,证明我们已经绕过了检查部分,只需要将含有flag的文件包含进去即可;
这是我们观察到白名单中的提示:hint.php
所以进行目录穿越即可获得flag(ffffllllaaaagggg这里flag被写了四次所以使用4或5个../)
关于.和/的解释:
.表示当前目录
. .表示当前目录的上一级目录。
. ./表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
./表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。
例如:
文件夹 a
下面有 文件夹b c 和文件 d。
文件夹b下面有e.php 和文件f。
则e中的 . 表示 文件夹b
./f 表示b下面的文件f。
. .表示a文件夹。
. ./d 表示a文件夹下的d文件。
查阅资料:
PHP mb_substr() 函数 | 菜鸟教程 (runoob.com)
大佬博客
https://blog.csdn.net/m0_53314778/article/details/112629012