Shikata Ga Nai

Private? There is no such things.

SQLインジェクション(SQL Injection)診断マニュアル

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 errorunterminated 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 DELAYxp_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 syntaxnear '...' などが含まれる
  • 複数カラムの表示ページ(詳細ページ・検索結果など)

Best regards, (^^ゞ