从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漏洞点

  1. 历史漏洞(CVE-2021-29442):Derby接口存在未授权SQL注入
  2. 修复措施:增加了@Secured修饰符,改为需要鉴权
  3. Removal接口:可以执行用户上传文件中的每行SQL语句

2.3 漏洞修复

Nacos 2.4.0中:

  • 默认禁用Derby接口
  • 限制Derby语句执行范围

3. 漏洞利用方法

3.1 简单命令执行

参考POC:vulhub/nacos/CVE-2021-29442

利用步骤:

  1. 通过removal接口传入SQL文件
  2. 让Derby数据库远程加载恶意Java类
  3. 创建方法指向恶意类的exec方法
  4. 通过Derby接口调用方法并传入命令

注意:由于条件竞争,需要多次发送payload

3.2 注入任意内存马

原始方法问题

  • 简单命令执行易触发告警
  • 现有POC内存马是写死的

改进方法

利用Java Memory WebShell Generator (JMG)生成的内存马:

  1. JMG生成的注入器包含两个public static方法:
    • gzipDecompress
    • invokeMethod
  2. 修改SQL语句指向gzipDecompress方法
  3. 传入任意byte[]数据触发实例化

适用场景:Nacos使用嵌入Tomcat的Spring环境

3.3 不出网利用

原始方法问题

使用SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE写文件存在限制:

  • 最大16,336字节
  • 16进制转换后实际限制约8KB

绕过限制的方法

  1. 创建表存储JAR的16进制数据
  2. 分多次写入数据
  3. 最后导出到文件

适用内存马

  • 冰蝎、蚁剑:<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. 防御建议

  1. 升级Nacos到2.4.0或更高版本
  2. 禁用Derby数据库接口(如无需使用)
  3. 加强权限控制,避免token泄露
  4. 监控异常SQL语句执行

6. 参考资源

  1. Derby官方文档
  2. vulhub POC
  3. 改进版内存马POC
  4. Java Memory WebShell Generator
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方法: gzipDecompress invokeMethod 修改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 4.2 内存马注入POC 4.3 不出网写入大文件 5. 防御建议 升级Nacos到2.4.0或更高版本 禁用Derby数据库接口(如无需使用) 加强权限控制,避免token泄露 监控异常SQL语句执行 6. 参考资源 Derby官方文档 vulhub POC 改进版内存马POC Java Memory WebShell Generator