Hi! Could we please enable some services and cookies to improve your experience and our website?
Online Sandbox for SQL and PHP: Write, Run, Test, and Share SQL Queries and PHP Code
<?php
// 展示当前文件源码,CTF惯用手段
// highlight_file(__FILE__);
// 定义一个类 emmm,包含文件名检查函数
class emmm
{
// 静态方法,校验传入的文件名是否允许被包含
public static function checkFile(&$page)
{
// 设置白名单,只有 source.php 和 hint.php 允许被 include
$whitelist = [
"source" => "source.php",
"hint" => "hint.php"
];
// 如果 $page 未定义或不是字符串,提示并拒绝
if (!isset($page) || !is_string($page)) {
echo "you can't see it1";
return false;
}
// 如果传入值严格等于白名单中的某个值,放行
if (in_array($page, $whitelist)) {
return true;
}
// ====== 第一次尝试“问号截断”处理 ======
// 追加问号后再查找问号,确保 mb_strpos 总能找到 '?'
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
echo $_page; //1
echo "\n";
// 取“截断前”的部分再去白名单匹配一次,仍然白名单限定
if (in_array($_page, $whitelist)) {
return true;
}
// ====== 第二次尝试:URL 解码后再做相同处理 ======
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
echo $_page; //2
// 如果解码后的“截断名”是白名单,也放行
if (in_array($_page, $whitelist)) {
echo "\n";
echo $page;
return true;
}
// 三次校验均失败,返回错误
echo "\nyou can't see it2\n";
return false;
}
}
// ========== 主逻辑入口 ==========
$file = "source.php%253/fffffllllaaaagggg";
if (
emmm::checkFile($file) // 3. 通过 checkFile 校验
) {
// 条件全部满足后 include 目标文件
echo "\nyes";
exit;
} else {
// 否则输出一张图片作为提示
echo "nonono";
}
?>