Hello there, ('ω')ノ
🎯 1. SQLインジェクションとは?
SQLインジェクションは、ユーザ入力がそのままSQLクエリに組み込まれ、意図しないクエリ操作が実行されてしまう脆弱性です。
例:id=1 OR 1=1
のような値を送ると、データベース全体のレコードが返るなど、認証回避・情報漏洩・データ改ざんが可能になります。
🧭 2. 診断対象となる画面・動作
対象 |
例 |
備考 |
ログインフォーム |
ID/パスワード入力欄 |
エラーメッセージが出る場合は特に注目 |
検索・一覧表示 |
商品ID・ユーザIDの指定など |
URLパラメータやPOSTデータに注入可能性あり |
詳細表示ページ |
?id=1 のようなパラメータ付きURL |
レコード単位でSQLを発行している可能性高 |
絞り込み・並び替え |
カテゴリ選択、検索条件 |
クエリを組み立てる構文ミスが狙い目 |
🔍 3. 入力ポイントの例
種類 |
場所 |
URLパラメータ |
/product.php?id=1 |
フォーム送信値 |
POSTのログインフォームなど |
Cookie |
ログイン情報や選択状態を保持するもの |
HTTPヘッダ |
Referer、User-Agent、X-Forwarded-For など |
JSON / GraphQL |
Web API に対する入力項目も対象 |
🧪 4. 基本診断手順
Step 1️⃣:挙動を観察
- 値を
1'
や '
で終わるようにして送信
- エラーメッセージ(
SQL syntax error
や unterminated string
)が出れば脆弱な可能性大
Step 2️⃣:条件を壊してみる(論理操作)
?id=1 OR 1=1
?id=1' OR 'a'='a
→ データが通常より多く返れば成功の兆候
Step 3️⃣:ブラインドSQLiの確認(応答差異)
?id=1 AND 1=1 → 正常レスポンス
?id=1 AND 1=2 → 異常または空のレスポンス
Step 4️⃣:データベース構造の抽出(UNION)
?id=1 UNION SELECT null,null,null
🧰 5. よく使うペイロード例
タイプ |
ペイロード例 |
正常値壊し |
' " , '-- |
ロジック変更 |
1 OR 1=1 |
ブラインド |
AND (SELECT 1)=1 |
UNIONベース |
UNION SELECT 1,2,3 |
Time-based |
AND SLEEP(5) (MySQL)
WAITFOR DELAY '00:00:05' (MSSQL) |
🧠 6. DBMSごとの特徴と違い
DBMS |
特徴的な構文 |
MySQL |
SLEEP(n) 、@@version |
PostgreSQL |
pg_sleep(n) 、current_database() |
SQL Server |
WAITFOR DELAY 、xp_cmdshell |
Oracle |
DBMS_LOCK.SLEEP(n) 、SELECT banner FROM v$version |
🛠️ 7. 診断ツール
ツール名 |
用途 |
Burp Suite |
リクエスト改変、Rewriterで便利 |
sqlmap |
自動診断、DB抽出も可能(非常に強力) |
NoSQLMap |
MongoDBなどNoSQL用 |
Postman |
JSONベースAPIへの攻撃試行 |
AuthMatrix |
認可と組み合わせたSQLi確認に便利 |
✅ 8. 脆弱性のサイン
サイン |
内容 |
エラーメッセージが返る |
DB構文が露出することもある |
OR 1=1 で全件表示される |
論理注入成功 |
正常と異常の応答が切り替わる |
ブラインドSQLi成功 |
SLEEP(5) でレスポンスが遅延 |
Time-based SQLi成功 |
🔐 9. 防御策の確認ポイント
防御内容 |
説明 |
プリペアドステートメントの使用 |
SQLのプレースホルダを利用(? , :param など) |
入力値のエスケープ |
可能だが単独では不十分。型制限も有効 |
DB権限の最小化 |
SELECT のみ許可するアカウント使用 |
エラー出力の制限 |
本番環境ではSQLエラーをユーザに見せない |
WAF(Web Application Firewall) |
パターン検出による補助的防御 |
📌 診断チェックリストまとめ
チェック項目 |
✔ / ✘ |
' , " , -- に対してエラーが出るか? |
|
OR 1=1 でレスポンスが変わるか? |
|
UNION SELECT が使えるか? |
|
SLEEP 等で時間差が起きるか? |
|
エラーメッセージが露出していないか? |
|
プリペアドステートメントが使われているか? |
|
🎁 補足:見つけやすいヒント
- URLやフォーム内で「ID」や「name」などを扱っている箇所
- レスポンスに
SQL syntax
や near '...'
などが含まれる
- 複数カラムの表示ページ(詳細ページ・検索結果など)
Best regards, (^^ゞ