Oracle injection
削除された投稿のウェイバックマシンのコピーを提供する: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の友人で同僚であるAbhisek Dattaは、https://github.com/MaksymBilenko/docker-oracle-12cを紹介してくれました。これにより、t2.large AWS UbuntuマシンとDocker上にインスタンスをセットアップできました。
このブログ投稿の過程で、Oracleをネイティブインストールとして完全なネットワークアクセスを持つように模倣できるように、dockerコマンドを--network="host"
フラグと共に実行しました。
URLまたはホスト名/ポート番号の指定をサポートするOracleパッケージ
ホストとポートの指定をサポートするパッケージや関数を見つけるために、Oracle Database Online DocumentationでGoogle検索を実行しました。具体的には、
検索結果は以下の通りです(すべてがアウトバウンドネットワークを実行するために使用できるわけではありません)
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経由でのデータの外部への送信を示すために文書化されています。
しかし、関数がホスト名とポート番号を引数として受け入れるため、これをポートスキャナのように機能させることができます。
以下にいくつかの例を示します。
ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
は、ポートが閉じていることを示しており、セッション値がポートが開いていることを指しています。
UTL_SMTP
UTL_SMTP
パッケージは、SMTP経由でメールを送信するために設計されています。Oracleのドキュメントサイトに提供されている例では、このパッケージを使用してメールを送信する方法が示されています。しかし、私たちにとって興味深いのは、ホストとポートの指定ができる点です。
以下に、タイムアウトを2秒に設定したUTL_SMTP.OPEN_CONNECTION
関数の簡単な例が示されています。
ORA-29276: 転送タイムアウト
はポートが開いていることを示しますが、SMTP接続が確立されていません。一方、ORA-29278: SMTP一時エラー: 421 サービスが利用できません
はポートが閉じていることを示します。
UTL_TCP
UTL_TCP
パッケージとその手続きおよび関数はTCP/IPベースのサービスとの通信を可能にします。特定のサービス向けにプログラムされている場合、このパッケージはネットワークへの入り口となるか、TCP/IP接続のすべての側面を制御できるため、完全なサーバーサイドリクエストを実行できます。
Oracleのドキュメントサイトの例では、このパッケージを使用してウェブページを取得するための生のTCP接続を行う方法を示しています。これをさらに簡略化して、メタデータインスタンスや任意のTCP/IPサービスにリクエストを行うために使用することができます。
興味深いことに、生のTCPリクエストを作成できる能力から、このパッケージはすべてのクラウドプロバイダーのインスタンスメタデータサービスをクエリするためにも使用できます。メソッドタイプや追加ヘッダーなどはすべてTCPリクエスト内で渡すことができます。
UTL_HTTPとWebリクエスト
おそらく、あらゆるOut of Band Oracle SQL Injectionチュートリアルで最も一般的で広く文書化されているテクニックは、UTL_HTTP
パッケージです。このパッケージは、ドキュメントによって次のように定義されています - UTL_HTTPパッケージはSQLおよびPL/SQLからのハイパーテキスト転送プロトコル(HTTP)呼び出しを行います。これを使用して、HTTP経由でインターネット上のデータにアクセスできます。
さらに、次のようなクエリを使用して、基本的なポートスキャンを実行することもできます。
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;
Last updated