情報不足環境下におけるSQLインジェクションの段階的手法

注入ポイントの特定とバックエンドクエリの推定

ターゲットシステムのデータベース構造や認証情報が一切開示されていない状態では、まずWebアプリケーションの入力インターフェースを観察し、パラメータ値がそのままSQLクエリに組み込まれている箇所を特定する必要があります。例えば、特定日付のシステム通知をフィルタリングして表示するページが存在する場合、バックエンドで実行されているクエリは以下の形式であると推測できます。

SELECT content_body FROM sys_notices WHERE publish_date='2023-11-08'

この構成において、テーブル名やデータ型は不明ですが、日付パラメータの入力値が直接SQL構文に展開されるため、ここを攻撃ベクトルとして利用できます。

現行データベース名の抽出

注入ポイントが確定した後、接続先のデータベース名を把握することが次の課題となります。標準的なMySQL環境ではDATABASE()関数が利用可能ですが、単純に単体のSELECT文を挿入すると表示崩れや構文エラーが発生します。これはUNION演算子の仕様により、結合元のクエリと結合先のクエリで返却する列数およびデータ型の順序が完全に一致している必要があるためです。

前述の推測クエリが4つのカラムを返すと仮定し、列数を揃えるためにプレースホルダーを埋め込みます。注入ペイロードは以下のように構築します。

' UNION SELECT 'pad', 'pad', 'pad', DATABASE() --

この値をURLクエリパラメータやフォームフィールドに設定し送信すると、アプリケーションの出力領域に現在のデータベース名が表示されます。これにより、対象スキーマの識別が完了します。

テーブル一覧の列挙

データベース名が判明したら、その内部に存在するテーブル構造の調査に移行します。関係型データベースではinformation_schemaという標準のメタデータ用スキーマが用意されており、ここからオブジェクト情報を取得可能です。

単純なSELECT文を実行すると複数行の結果が返却されますが、UNIONベースのインジェクションでは通常1行分の出力枠しか確保されていません。そのため、結果セットを単一の文字列へ集約する集約関数を利用し、列数調整と併用します。

' UNION SELECT NULL, NULL, NULL, GROUP_CONCAT(table_name SEPARATOR '|') FROM information_schema.tables WHERE table_schema=DATABASE() --

ペイロード実行後、画面出力には対象データベース内の全テーブル名が区切り文字付きで列挙されます。これにより、例えばarticle_datauser_registryといった実態テーブルの存在が確認可能です。

カラム構造の解析

ターゲットテーブルが特定された後は、そのテーブルが保有するフィールド名を列挙します。この作業もinformation_schema.columnsテーブルへ問い合わせることで実現できます。出力フォーマットの整合性を保つため、引き続き列数合わせと集約関数を適用します。

' UNION SELECT NULL, NULL, NULL, GROUP_CONCAT(column_name SEPARATOR '|') FROM information_schema.columns WHERE table_name='user_registry' AND table_schema=DATABASE() --

実行結果として、ログインID、パスワードハッシュ、アカウントステータスなどに対応するカラム名が抽出されます。スキーマ構造が可視化された時点で、最終的なレコード取得の準備が整います。

機密レコードの直接抽出

データベース名、テーブル名、フィールド構造が明確になった状態では、UNION SELECTを用いて対象レコードを直接取得するのみです。元の表示クエリと完全に同じ列数を返すようフィールドを並べ替え、条件式を常に真となる構文で結合します。

' UNION SELECT login_id, passwd_hash, NULL, account_status FROM user_registry WHERE 1=1 --

上記の構文を注入ポイントに挿入すると、アプリケーションの描画領域にユーザー登録情報が出力されます。この手法は、入力検証やパラメータ化クエリの導入が不十分な環境において、段階的に内部データを可視化するための標準的なアプローチです。

タグ: sql-injection information-schema union-query mysql-security web-vulnerability

6月20日 16:34 投稿