PortSwigger Web Security Academy の SQL injection ラボ群を、日本語の美容EC文脈で再構成した教材です。
各ラボは独立して動作する模擬サイト。実際のSQLサーバーは使わず、ブラウザ内で安全に攻撃を試せます。

全18問 Apprentice 2 / Practitioner 16 静的サイト・サーバ不要 所要時間 30〜50時間

教育目的のシミュレータです。すべての SQL 実行はブラウザ内で完結し、外部システムへの攻撃機能は持ちません。本サイトで学んだ技術を許可のないシステムに対して使用することは、不正アクセス禁止法その他の法令に違反する可能性があります。

知識ベース — 前提知識と概念整理
Knowledge Base · 各ラボから参照される基礎
KB1
基礎編 — Web と SQL の前提
クライアント・サーバ、URL パラメータ、Cookie、テーブルとカラム、文字列リテラルとエスケープ。
KB2
インジェクションの原理
文字列連結というアンチパターン、文字列リテラルを途中で閉じる、コメント記号、OR 1=1 の発想。
KB3
UNION 攻撃と DB 偵察
UNION の仕組み、カラム数特定、文字列カラム探索、複数値の連結、DB 種別フィンガープリント、テーブル列挙。
KB4
Blind SQL Injection
結果が見えない状況での1ビット観測、SUBSTRING と LENGTH、サブクエリ、条件付きレスポンス・エラー、可視エラー、時間ベース、自動化ツール。
KB5
OAST と回避
OAST と DNS チャネル、Oracle XXE トリック、Burp Collaborator、WAF の役割と限界、XML 文字参照によるフィルタ回避、レイヤ間エンコーディング問題。
Phase 1 — 基礎
Foundations / Apprentice + Easy Practitioner
01
WHERE 句で隠しデータを引き出す
商品カテゴリーフィルタへの注入で、未発表の新作商品を漏洩させる。SQLインジェクションの最初の一歩。
Apprentice
02
ログインバイパス
パスワードを知らずに店長アカウントとして管理画面にログインする。`--` でAND条件を消す古典手法。
Apprentice
03
UNION 攻撃 — カラム数判定
UNION で別クエリを連結する前段階。クエリのカラム数を `ORDER BY` または `UNION SELECT NULL` で特定する。
Practitioner
04
UNION 攻撃 — 文字列カラムの特定
UNION SELECTで文字列を返せるカラム位置を特定する。テストペイロード `'a','b','c'` を順に当てる。
Practitioner
05
UNION 攻撃 — 別テーブルからデータ取得
UNION SELECT username, password FROM members で全会員の認証情報を商品リストに紛れ込ませる。実害が見える瞬間。
Practitioner
06
UNION 攻撃 — 1カラムに集約
使えるカラムが1つしかない場合に、`||` 連結子で複数の値を1カラムにまとめて取得する。
Practitioner
Phase 2 — データベース調査
Database introspection / DB fingerprinting
07
DB バージョン取得 — Oracle
`v$version` テーブルから Oracle のバージョン情報を取得。攻撃者の偵察フェーズで最初に行うこと。
Practitioner
08
DB バージョン取得 — MySQL/Microsoft
`@@version` システム変数で MySQL/Microsoft SQL Server のバージョンを取得。
Practitioner
09
テーブル列挙 — Oracle
`all_tables` から全テーブル名を列挙、`all_tab_columns` から各カラム名を取得して認証テーブルを特定する。
Practitioner
10
テーブル列挙 — PostgreSQL
`information_schema.tables` から全テーブル名、`information_schema.columns` から各カラムを列挙。
Practitioner
Phase 3 — Blind SQL Injection
Inferential attacks / Response is not directly returned
11
条件付きレスポンスで Blind SQLi
クエリ結果が画面に出ない状況で、TrueとFalseで応答が変わる微差を観察してパスワードを1文字ずつ抽出する。
Practitioner
12
条件付きエラーで Blind SQLi
応答内容に差がない場合に、条件付きエラー(divide-by-zero等)を発生させて真偽を見分ける。
Practitioner
13
可視エラーから情報漏洩
SQLエラーメッセージが画面に表示される状況で、CASTによる型変換エラーを使って値そのものをエラーメッセージに含めて漏洩させる。
Practitioner
14
時間遅延で Blind SQLi(基礎)
応答内容にもエラーにも差がない場合、`pg_sleep(10)` で意図的に遅延を起こしてSQLiの存在を確認する。
Practitioner
15
時間遅延 + 情報抽出
CASE WHEN ... THEN pg_sleep(10) ELSE pg_sleep(0) END で、真偽に応じた応答時間差から1文字ずつ抽出する。
Practitioner
Phase 4 — 応用・回避
Out-of-band techniques and filter bypass
16
OAST 通信のトリガー
クエリが非同期実行されて応答に反映されない最難ケース。外部DNS問合せをトリガーしてSQLi存在を確認する。
Practitioner
17
OAST でデータ漏洩
DNSサブドメインに値を埋め込んで、Burp Collaborator(本サイトでは模擬DNSログ)経由でデータを抜き出す。
Practitioner
18
XML エンコードでフィルタ回避
WAFがSQLキーワードを遮断する状況で、XML数値文字参照(`S` 等)を使ってフィルタを回避する。
Practitioner