【PolarCTF2026年春季挑战赛】static

双写绕过,包含web目录下的flag.php即可

php 复制代码
<?php
highlight_file(__FILE__);
error_reporting(E_ALL);

function hard_filter(&$file) {
    # 禁止伪协议(php://, zip://, data://)和特殊字符(%2f, %00, \)
    $ban_extend = array("php://", "zip://", "data://", "%2f", "%00", "\\");
    foreach ($ban_extend as $ban) {
        if (stristr($file, $ban)) {
            return false;
        }
    }
    # 检测危险函数关键词(eval, system, exec等)和目录穿越(../),发现后删除该关键词并立即break
    $ban_keywords = array("eval", "system", "exec", "passthru", "shell_exec", "assert", "../");
    foreach ($ban_keywords as $keyword) {
        if (stristr($file, $keyword)) {
            $count = 0;
            $file = str_replace($keyword, "", $file, $count);
            break;
        }
    }
    # 删除末尾的 /
    $file = rtrim($file, '/');
    # 路径必须以 static/ 开头
    if (strpos($file, "static/") !== 0) {
        return false;
    }
    
    return true;
}
# 将URL中的file参数赋值给$file,如果没有这个参数就自动赋值为空值
$file = $_GET['file'] ?? '';
# 将$file经过hard_filter校验
if (!hard_filter($file)) {
    die("Illegal request!");
}
# 将用户传递的file参数后面添加.php
$real_file = $file . ".php";
# 解析文件的真实路径。例如realpath("static/home.php") → /var/www/html/static/home.php
$real_path = realpath($real_file) ?: $real_file;

echo "<br>=== 调试信息 ===<br>";
echo "1. 原始输入: " . htmlspecialchars($_GET['file'] ?? '') . "<br>";
echo "2. 过滤后file: " . htmlspecialchars($file) . "<br>";
echo "3. 拼接后的路径: " . htmlspecialchars($real_file) . "<br>";
echo "4. 真实解析路径: " . htmlspecialchars($real_path) . "<br>";
echo "5. 文件是否存在: " . (file_exists($real_path) ? "是" : "否") . "<br>";

if (file_exists($real_path)) {
    echo "6. 正在包含文件...<br>";
    # 开启输出缓冲区,开启后原本要直接输出道浏览器中的内容会先被暂存起来,不会立刻显示
    ob_start();
    include($real_path);
    # 把缓冲区里暂存的所有内容取出来,赋值给 $content 变量,然后清空并关闭缓冲区。
    $content = ob_get_clean();
    echo "7. 文件内容: " . htmlspecialchars($content) . "<br>";
} else {
    echo "6. 错误:文件不存在!<br>";
}
?>

通过上述的代码,其主要逻辑是

php 复制代码
1、先获取用户的file参数
2、经过hard_filter函数校验
3、文件添加.php后缀
4、使用realpath()解析真实的文件路径
5、将文件进行包含

那么关键点是我们要绕过hanrd_filter函数

php 复制代码
①
绕过点:
$ban_extend = array("php://", "zip://", "data://", "%2f", "%00", "\\");
    foreach ($ban_extend as $ban) {
        if (stristr($file, $ban)) {
            return false;
        }
    }
绕过方法:
这里限制的比较死,主流的伪协议都禁止了,phar://需要特殊特殊的环境,而且stristr不区分大小写匹配到直接返回false,就不尝试绕过


②
绕过点:
$ban_keywords = array("eval", "system", "exec", "passthru", "shell_exec", "assert", "../");
    foreach ($ban_keywords as $keyword) {
        if (stristr($file, $keyword)) {
            $count = 0;
            $file = str_replace($keyword, "", $file, $count);
            break;
        }
    }
绕过方法:
这里有一个关键就是break,当匹配成功一次之后就会跳出,因此我们可以考虑双写../绕过

③
绕过点:
if (strpos($file, "static/") !== 0) {
        return false;
    }
绕过方法:
通过../进行路径穿越

因此可以构造payload

php 复制代码
?file=static/....//flag
相关推荐
sbjdhjd3 小时前
CTF 技术复盘:从参数类型绕过到正则回溯 | Merry Christmas PHP CTF(gift.php & gift_plus.php)
安全·网络安全·云计算·php·ctf·红队·网络攻防
Chengbei1113 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
Latticy19 小时前
vulnhub系列靶机-mrRobot
web安全·网络安全·渗透测试
白猫不黑1 天前
网络安全/信息安全专业学习路线与入行指南:从大学到岗位的完整规划
网络·学习·安全·web安全·网络安全·黑客技术
xierui1231231 天前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
Chockmans1 天前
春秋云境CVE-2025-49113
安全·web安全·网络安全·网络攻击模型·安全威胁分析·春秋云境·cve-2025-49113
白猫不黑1 天前
从运维到网络安全:转行优势、路径与薪资前景全解析
运维·网络·web安全·网络安全·信息安全·渗透测试
AI备忘录1 天前
(十一)DHCP 配置命令五厂商对照:华为 华三 锐捷 迈普 思科
服务器·网络·网络协议·网络安全·华为
0xBADCODE1 天前
Flask SSTI读SECRET_KEY+伪造Session:税务系统渗透全流程
前端·后端·python·安全·web安全·网络安全·flask
菩提小狗2 天前
每日安全情报报告 · 2026-08-20
网络安全·漏洞·cve·安全情报·每日安全