MS Access SQL Injection
オンラインプレイグラウンド
DBの制限事項
文字列の連結
文字列の連結は、& (%26)
および+ (%2b)
文字を使用して可能です。
コメント
MS Accessにはコメントがありませんが、NULL文字を使用してクエリの最後を削除することができるようです。
もしこれがうまくいかない場合は、クエリの構文を修正することもできます:
スタックされたクエリ
サポートされていません。
LIMIT
LIMIT
演算子は実装されていません。ただし、TOP
演算子を使用してSELECTクエリの結果を最初のN行に制限することが可能です。TOP
は、返される行数を表す整数を引数として受け入れます。
TOPと同様に、LAST
を使用して最後からの行を取得できます。
UNIONクエリ/サブクエリ
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリをいかにして実行するかを考えることになります。MS Accessでは、サブクエリや追加のクエリではFROM
が指定されている必要があります。
したがって、UNION SELECT
やUNION ALL SELECT
、または条件で括弧内にSELECT
を実行したい場合は、常に有効なテーブル名を指定する必要があります。
したがって、有効なテーブル名を知る必要があります。
チェーンの等号 + サブストリング
これにより、現在のテーブルの値を取得することができますが、テーブル名を知る必要はありません。
MS Access は '1'=2='3'='asd'=false
などの 奇妙な構文 を許可します。通常、SQLインジェクションは WHERE
句の中にあるため、これを悪用することができます。
MS AccessデータベースでSQLiがあるとし、1つの カラム名がusername であることを知っている(または推測している)場合、それが exfiltrate
したいフィールドであるとします。チェーンの等号テクニックが使用されたときのWebアプリの異なる応答をチェックし、Mid
関数を使用して サブストリング を取得する ブールインジェクション を使用してコンテンツを exfiltrate
することができます。
もしテーブルの名前とダンプする列がわかっている場合は、Mid
、LAST
、TOP
の組み合わせを使用して、ブール型SQLiを介してすべての情報を漏洩することができます。
オンラインプレイグラウンドで確認してみてください。
テーブル名の総当たり攻撃
チェーンイコールテクニックを使用して、次のようにテーブル名を総当たり攻撃することもできます:
Feel free to check this in the online playground.
Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing Columns names
You can brute-force current columns names with the chaining equals trick with:
または、group by を使用して:
または、次のようにして、異なるテーブルの列名を総当たり攻撃することもできます:
データのダンプ
すでに、chaining equals technique を使用して現在のテーブルおよび他のテーブルからデータをダンプする方法について説明しました。しかし、他にも方法があります:
要するに、クエリは「if-then」ステートメントを使用して、成功した場合は「200 OK」をトリガーし、それ以外の場合は「500 Internal Error」をトリガーします。 TOP 10演算子を利用することで、最初の10件の結果を選択することが可能です。 LASTの後に使用することで、10番目のタプルのみを考慮できます。その値を使用して、MID演算子を使用して単純な文字の比較を行うことができます。 MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプすることができます。
時間ベース
その他の興味深い関数
Mid('admin',1,1)
:位置1から長さ1の部分文字列を取得します(初期位置は1)LEN('1234')
:文字列の長さを取得しますASC('A')
:文字のASCII値を取得しますCHR(65)
:ASCII値から文字列を取得しますIIF(1=1,'a','b')
:if thenCOUNT(*)
:アイテムの数をカウントします
テーブルの列挙
こちらから、テーブル名を取得するクエリを確認できます。
しかし、MSysObjects
テーブルを読む権限がない場合に SQL インジェクションを見つけるのは非常に一般的です。
ファイルシステムアクセス
Web ルートディレクトリのフルパス
Web ルートの絶対パスを知ることは、さらなる攻撃を容易にする可能性があります。アプリケーションのエラーが完全に隠されていない場合、ディレクトリパスは存在しないデータベースからデータを選択しようとして明らかにされることがあります。
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access は、Web ディレクトリのフルパス名を含むエラーメッセージを返します。
ファイル列挙
次の攻撃ベクトルは、リモートファイルシステム上のファイルの存在を推測するために使用できます。指定されたファイルが存在する場合、MS Access はデータベース形式が無効であることを通知するエラーメッセージをトリガーします。
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
ファイルを列挙する別の方法は、データベース.テーブル アイテムを指定することです。指定されたファイルが存在する場合、MS Access はデータベース形式のエラーメッセージを表示します。
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
.mdb ファイル名の推測
次のクエリを使用して、データベースファイル名 (.mdb) を推測できます。
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
ここで、name[i] は .mdb ファイル名であり、realTable はデータベース内の存在するテーブルです。MS Access は常にエラーメッセージをトリガーしますが、無効なファイル名と有効な .mdb ファイル名を区別することができます。
.mdb パスワードクラッカー
Access PassView は、Microsoft Access 95/97/2000/XP または Jet Database Engine 3.0/4.0 のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。
参考文献
Last updated