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