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);");
}
?>
程式碼審計:檢查原始碼中的缺點和錯誤資訊,分析並找到這些問題引發的安全漏洞
對程式碼進行分析:
第一點:
正則表達函式: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+ 結束字元 \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的輸入陣列名