Shikata Ga Nai

Private? There is no such things.

Nullバイトを使ったNoSQLインジェクション ― MongoDBの条件を無効化して非公開データを引き出す

Hello there, ('ω')ノ

🧠 概要

NoSQLインジェクションの一手法として、「ヌル文字(null character)」を使うテクニックがあります。特にMongoDBでは、\u0000(URLエンコードでは%00)以降のクエリが無視されるケースがあり、後続の制約条件をバイパスできるという脆弱性になります。


🎯 攻撃の背景

通常のクエリ例:

this.category == 'fizzy' && this.released == 1
  • この条件では、「カテゴリがfizzyかつ、リリース済み(released == 1)」の商品のみが表示されます。
  • 未公開の製品(released == 0)は対象外。

💥 攻撃方法:nullバイトで後続条件を打ち消す

攻撃リクエスト(URL):

https://insecure-website.com/product/lookup?category=fizzy'%00
  • %00 = \u0000(ヌル文字)

結果として生成されるクエリ:

this.category == 'fizzy'\u0000' && this.released == 1

期待される効果:

  • MongoDBが\u0000以降を無視 → this.released == 1 の条件が除外される。
  • → fizzyカテゴリの未公開商品(released == 0)も表示されてしまう。

✅ 利用条件とコツ

ポイント 内容
Nullバイトの使い方 %00 を注入することで、サーバー側でクエリの途中を切断
クエリ構造がわからない場合 &&が含まれていそうな場所を推測して null を挿入
他のペイロードと併用 条件に%00\ を追加して後続を無視させる
応答の変化に注目 商品数が明らかに増えたら、未公開商品が表示された証拠

⚠️ 注意点

  • アプリによっては、nullバイトでの中断が無効化されていることもあります(WAFや最新のMongoDBドライバなど)。
  • %00を含むリクエストは、ログやセキュリティ製品に検知されやすいため、実環境での使用は注意が必要です。

🧩 まとめ

  • Nullバイト(%00)は、MongoDBクエリの後続条件を無効化する強力なインジェクション手段
  • releasedのような「公開/非公開」の制約をバイパスすることで、通常見えないデータを引き出すことが可能。
  • 非常に簡単な入力で深刻な情報漏洩につながるため、開発側ではnull文字の除去や厳格な入力検証が必須です。

💡 たった一文字 %00 が、認証も検証もすり抜ける。Nullバイトはセキュリティにおける“見えない爆弾”です。

Best regards, (^^ゞ