1. 程式人生 > >BugkuCTF變數1(全域性陣列)

BugkuCTF變數1(全域性陣列)

正版writeup
題目程式碼

flag In the variable ! <?php 
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>

程式碼審計:檢查原始碼中的缺點和錯誤資訊,分析並找到這些問題引發的安全漏洞
對程式碼進行分析:
第一點:

var_dump():列印變數的相關資訊
正則表達函式:preg_match():用於進行正則表示式匹配,成功返回 1 ,否則返回 0 。

語法:    preg_match (pattern , subject, matches);
			pattern:正則;	
			subject:需要匹配檢索物件;
			match: 可選,儲存匹配結果的陣列,

error_reporting(0);// 關閉錯誤報告
PHP 有諸多錯誤級別,使用erro_reporting()函式可以設定在指令碼執行時的級別。如果沒有設定可選引數 level,error_reporting() 僅會返回當前的錯誤報告級別。
highlight_file()

函式對檔案進行語法高亮顯示。

語法:highlight_file(filename,return)
   			  filename 	必需。要進行高亮處理的 PHP 檔案的路徑。
  			  return 	可選。如果設定 true,則本函式返回高亮處理的程式碼。

第三點

/^\w+ / i

/ / /i 兩個/ / 表明正則表示式的開始與結束; ^ 表示開始字元, 結束字元 \w 包含【a-z,A-Z,,0-9】中的字
符,+代表可以有一個,或多個\w 後面的一個i是不區分大小寫,其實放在這裡沒用了,因為\w包含著
大小寫 總的加起來意思是 以[a-z,A-Z,
,0-9]中的其中一個字元開始,中間可以有任意個[a-z,A-Z,,0-9]
字元,最後再以[a-z,A-Z,
,0-9]中的一個字元結束 比如適合的有:a,a09,a_01,001 不適合的有a-
5,@12,¥12,中文字元,這些都不在[a-z,A-Z,_,0-9]範圍裡面
i表示不區分大小寫

對writeup:

?args=GLOBALS

可變變數:兩個$$一個可變變數獲取了一個普通變數的值作為這個可變變數的變數名。
全域性陣列,可以在函式內部呼叫全域性變數,

$GLOBALS[] 包含正在執行指令碼所有超級全域性變數的引用內容

$GLOBALS[];

最後的[]沒有輸入的問題:
這裡的$args = $_GET[‘args’];將url裡 的args=後的值賦給args,如下例

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

假設使用者訪問的是 http://example.com/?name=Hannes

以上例程的輸出類似於:

Hello Hannes!

這裡輸出的是一串字元,個人想法是作為一段陣列,因此,使用GLOBAL[]時,類似C的輸入陣列名