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, (^^ゞ