Shikata Ga Nai

Private? There is no such things.

SQLインジェクション:`UNION SELECT`で必要なカラム数を特定する方法(NULL方式)

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