題目
分析
<?php
error_reporting(0); // 不顯示報錯資訊
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){ // get傳入的args值非空
$args = $_GET['args']; // 將傳入的值賦給args
if(!preg_match("/^\w+$/",$args)){ // 如果args從開頭到結尾匹配到非字母或非數字或非下劃線
die("args error!"); // 輸出"args error!"並退出指令碼
}
eval("var_dump($$args);"); // 將與arge值同名變數的相關資訊作為php程式碼執行
}
?>
根據程式碼內容能夠獲得的資訊主要有:
- 傳入 args 的字串引數只能包含字母數字下劃線。
- 以 args 值為變數名的變數被格式化後將作為 php 程式碼被執行後輸出。
顯然我們需要向 arge 傳入一個已經存在的變數以獲得變數內容。
先嚐試輸入 “flag” 但沒有輸出 flag 內容,遂 WP 解法:BugKu 變數1-雨落洛-部落格園
瞭解到 php 存在九大全域性變數,分別是 $_POST
$_GET
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
SERVER
$GLOBALS
和 $_ENV
。其中 $GLOBALS
是一個包含了全部變數的全域性組合陣列,透過向 args 傳入 GLOBALS 即可獲得包括 flag 的所有變數的名稱及內容。payload:?args=GLOBALS
:
輸出 flag 的變數名為 ZFkwe3。
參考
BugKu 變數1-雨落洛-部落格園