Hello there, ('ω')ノ
1. 攻撃チェーン全体像
Blind Boolean-Based SQLiとは
Blind(盲目的): サーバから明確なエラーメッセージやデータは返ってこない。
Boolean-Based: SQLクエリ内の条件分岐を利用し、 「条件が正しい場合と間違っている場合でレスポンス挙動が変わる」ことを利用する。
URLパス利用: 通常はクエリパラメータやPOSTデータが使われるが、 今回はURLのパス部分そのものを操作するのが特徴。
2. 実際の流れと具体的テクニック
ステップ1: URLパス内の変数確認
例:
https://target.com/profile/1234
この 1234 の部分が
- 動的にデータベースから値を取得しているか
- 存在しないIDを指定した場合の挙動が異なるか
をまず調査します。
ステップ2: Blind Boolean条件付きペイロード投入
基本ペイロード例:
https://target.com/profile/1234 AND 1=1 https://target.com/profile/1234 AND 1=2
- 1=1 の場合 → 正常ページが表示されるか
- 1=2 の場合 → エラーや404など違う挙動になるか
この差を利用し、SQL Injectionの有無を判定します。
ステップ3: 実際のデータ抽出
例えば次のように条件を細かく詰めていきます:
- ユーザ名1文字目がaかどうかを確認
/profile/1234 AND SUBSTRING((SELECT username FROM users LIMIT 1),1,1)='a'
- レスポンス挙動を観察し、一文字ずつ推測
これを繰り返すことで、 データベースからの情報抽出が可能になります。
3. 攻撃成立条件まとめ
| 項目 | 内容 |
|---|---|
| URLパス利用 | クエリやPOSTではなく、URLパス変数がSQLと結びついていること |
| Blind条件差 | 成功/失敗でレスポンスステータスや内容が変化すること |
| WAF無効化 | WAFや入力フィルタが適切に働いていないこと |
4. チェックリスト形式まとめ
✅ URLパスSQLi確認手順
- [ ] URLパス内の値がデータベースと関連しているか確認
- [ ] 存在しないID指定時のレスポンス挙動確認
- [ ] Boolean-Basedペイロード投入(AND 1=1 / AND 1=2)
- [ ] SUBSTRINGやASCII関数利用によるBlindデータ抽出試行
✅ 防御確認チェックリスト
- [ ] URLパス部分に対する入力値サニタイズ有無確認
- [ ] プレースホルダー・プリペアドステートメント利用有無確認
- [ ] エラー詳細レスポンス非公開設定
- [ ] WAF・IDS/IPSのログチェック
Best regards, (^^ゞ