- 题目:一上来给了个图片还是很懵的,于是尝试查看一下源代码:发现有提示:
- 于是访问source.php得到了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;
}
//这段代码的意思是检查page变量是否没有被设置,并且检查是否不是字符串,满足一个就返回FALSE
if (in_array($page, $whitelist)) {
return true;
}
//如果page变量在白名单数组内,返回TRUE
//如果不在,继续执行下面代码
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
//将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;
}
}
//这里才是核心逻辑,请求一个file参数
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\" />";
}
?>
- 构造payload:?file=hint.php得到提示:但是不是直接访问:说明我们传的参数不在白名单,于是在前面加个hint或者source.php都可以,?file=hint.php?/.../.../.../.../ffffllllaaaagggg,由于不知道在哪个文件夹下,可能是多层,经过尝试发现/.../.../.../.../刚好可以得到结果