从Nacos derby RCE学习derby数据库的利用
字数 1273 2025-08-29 22:41:02
Derby数据库RCE漏洞分析与利用教学
1. 漏洞概述
本漏洞主要针对使用Derby数据库嵌入模式的Nacos系统,允许通过特定接口执行任意Derby语句,进而实现远程代码执行(RCE)。
漏洞利用条件
- 使用Derby数据库的嵌入模式
- 拥有有效token(需权限绕过漏洞或已知密码)
- 受影响版本:
- 2.x系列 < 2.4.0
- 1.x系列 ≤ 1.4.7
漏洞特点
- 利用存在条件竞争,需多次发送payload才能成功
- 实际环境中使用Derby数据库的Nacos较少(约10%)
2. 漏洞原理
2.1 Derby数据库特性
Derby是一种嵌入式Java数据库,具有以下关键特性:
- 允许加载外部Java类到数据库中
- 可以调用加载类中的方法
官方文档参考:Derby开发指南
2.2 Nacos漏洞点
- 历史漏洞(CVE-2021-29442):Derby接口存在未授权SQL注入
- 修复措施:增加了
@Secured修饰符,改为需要鉴权 - Removal接口:可以执行用户上传文件中的每行SQL语句
2.3 漏洞修复
Nacos 2.4.0中:
- 默认禁用Derby接口
- 限制Derby语句执行范围
3. 漏洞利用方法
3.1 简单命令执行
参考POC:vulhub/nacos/CVE-2021-29442
利用步骤:
- 通过removal接口传入SQL文件
- 让Derby数据库远程加载恶意Java类
- 创建方法指向恶意类的exec方法
- 通过Derby接口调用方法并传入命令
注意:由于条件竞争,需要多次发送payload
3.2 注入任意内存马
原始方法问题
- 简单命令执行易触发告警
- 现有POC内存马是写死的
改进方法
利用Java Memory WebShell Generator (JMG)生成的内存马:
- JMG生成的注入器包含两个public static方法:
gzipDecompressinvokeMethod
- 修改SQL语句指向
gzipDecompress方法 - 传入任意byte[]数据触发实例化
适用场景:Nacos使用嵌入Tomcat的Spring环境
3.3 不出网利用
原始方法问题
使用SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE写文件存在限制:
- 最大16,336字节
- 16进制转换后实际限制约8KB
绕过限制的方法
- 创建表存储JAR的16进制数据
- 分多次写入数据
- 最后导出到文件
适用内存马:
- 冰蝎、蚁剑:<8KB
- 哥斯拉:~10KB
- Suo5:~15KB
4. 详细利用步骤
4.1 命令执行POC
-- 通过removal接口上传的SQL文件内容
CREATE FUNCTION EXEC AS 'com.example.EvilClass' EXTERNAL NAME 'com.example.EvilClass.exec';
4.2 内存马注入POC
-- 使用JMG生成的内存马
CREATE FUNCTION INJECT AS 'com.example.MemoryShell' EXTERNAL NAME 'com.example.MemoryShell.gzipDecompress';
4.3 不出网写入大文件
-- 第一步:创建表
CREATE TABLE JAR_DATA (ID INT, DATA VARCHAR(16336));
-- 第二步:分块插入数据
INSERT INTO JAR_DATA VALUES (1, '第一部分16进制数据');
INSERT INTO JAR_DATA VALUES (2, '第二部分16进制数据');
-- 第三步:导出到文件
CALL SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE(
'SELECT DATA FROM JAR_DATA ORDER BY ID',
'/path/to/output.jar',
null,
null,
null
);
5. 防御建议
- 升级Nacos到2.4.0或更高版本
- 禁用Derby数据库接口(如无需使用)
- 加强权限控制,避免token泄露
- 监控异常SQL语句执行