Hello there, ('ω')ノ
✅ 背景と目的
UNION型SQLインジェクションを成立させるには:
元のSELECT文とカラム数・データ型を一致させる必要がある
そこで「NULLを使ったUNION SELECT」でカラム数を特定する手法を紹介します。
🧪 手順:NULLの個数を増やす
以下のようなペイロードを順番に試していきます:
' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL-- ...
このNULLたちは、元のクエリのカラムと合うまで増やしていくのがポイントです。
💡 なぜNULLを使うのか?
NULLはすべての型に自動変換可能- 数値型、文字型、日付型が混ざったクエリでも安全に通る可能性が高い
💥 期待されるエラー内容(例)
All queries combined using a UNION must have an equal number of expressions
→ これはカラム数が一致していないことを示しています。
✅ 成功パターンの確認方法
| 状況 | 判断 |
|---|---|
| HTTPエラー発生 | カラム数が違う |
| 何も変化なし | 不一致の可能性あり(応答に違いが出ない) |
| HTML上で行が追加される | 正しいカラム数!UNION成功! |
| JavaやPHPエラーが出る | NULLが描画時に例外を起こす=注入成功の兆候 |
✅ NULL方式の長所・短所
| 項目 | 内容 |
|---|---|
| 👍 長所 | 型を気にせずカラム数を探れる/すぐUNION本番に移行できる |
| ⚠️ 短所 | 見た目で成功/失敗の区別がつきにくい場合がある |
📌 結論
UNION型SQLiではまずNULLを使ってカラム数を探るのが鉄則。
ORDER BY方式とあわせて使えば成功率アップ- 成功後は
NULLを文字列や関数などのペイロードに置き換えて情報抽出へ進む
Best regards, (^^ゞ