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