您的位置:首页 > 其它

[BUUCTF]HCTF 2018 WarmUp wp

2020-06-02 06:39 597 查看

打开靶机后是一张滑稽的图片,按照惯例,我们F12看看源码,发现有提示:source.php
根据提示发现以下代码:

<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//白名单,并且发现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() 函数搜索数组中是否存在指定的值,即数组whitelist中是否能匹配$page

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//返回$page中从第一次出现“?”的位置
);//$_page为从$page中0位置开始截取长度为mb_strpos($page . '?', '?')的字符串
if (in_array($_page, $whitelist)) {
return true;
}//如果$_page能和白名单元素匹配返回true

$_page = urldecode($page);//URL解码
$_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\" />";
}
?>

checkfile函数的分析我已经在代码中加了注释,大家可以参考。

总的来说就是要满足3条件:

  • flie不能为空
  • file必须是字符串类型
  • 必须通过checkfile函数检验
    而checkfile函数中有很多if语句,只要有一个返回值就能通过,这里我们只能满足截取的那个if语句才能通过。
    构造参数file的值url解码后把“?”之前的内容和白名单匹配,全部成功即可拿到flag,但是我们还缺少file的值,别忘了代码中出现了一个hint.php
    好的我们知道了flag文件在ffffllllaaaagggg中,开始构造payload。
    因为他会进行一次url解码,而且服务器也会进行一次url解码,所以我们把“?”编码两次为%253f,构造payload=?file=source.php?../ffffllllaaaagggg
    但是并没有出现flag,想了想可能存在多级目录,ffffllllaaaagggg每个字母都出现了四次,试一试再加四次…/,果然最终出现了flag
    最终的payload:?file=source.php?../…/…/…/…/ffffllllaaaagggg
    ps:若有不足之处,欢迎大佬们及时斧正,感谢您的观看!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: