Shikata Ga Nai

Private? There is no such things.

LAB: NoSQLインジェクションの検出

Hello there, ('ω')ノ

🧠 概要

このラボでは、MongoDBを使用した製品カテゴリフィルターにNoSQLインジェクションの脆弱性が存在します。攻撃者はこの脆弱性を利用して、通常は表示されない未公開の製品情報を取得できます。この演習を通じて、NoSQLインジェクションの基本的な検出方法と、脆弱性の悪用手法を学びます。


🛠️ 手順

  1. カテゴリフィルターの確認

    Burp Suiteのブラウザでラボにアクセスし、任意の製品カテゴリ(例:Gifts)を選択します。この操作により、以下のようなリクエストが送信されます:

   GET /filter?category=Gifts
  1. リクエストのインターセプトと送信

    Burp Suiteの「Proxy」タブで、上記のリクエストを確認し、右クリックして「Send to Repeater」を選択します。

  2. シンタックスエラーの誘発

    Repeaterで、categoryパラメータの値にシングルクォート(')を追加して送信します:

   GET /filter?category=Gifts'

レスポンスにJavaScriptのシンタックスエラーが表示されれば、ユーザー入力が適切にサニタイズされていない可能性があります。

  1. 有効なJavaScriptペイロードの送信

    次に、categoryパラメータに以下のような有効なJavaScriptペイロードを送信します:

   Gifts'+'

このペイロードをURLエンコード(Ctrl+U)して送信し、レスポンスにエラーが表示されないことを確認します。これは、サーバー側でインジェクションが発生している可能性を示します。

  1. ブール条件の挿入による挙動の確認

    • 偽の条件を挿入:

      categoryパラメータに以下のペイロードを送信します:

      Gifts' && 0 && 'x
      

      URLエンコードして送信し、製品が表示されないことを確認します。

    • 真の条件を挿入:

      次に、以下のペイロードを送信します:

      Gifts' && 1 && 'x
      

      URLエンコードして送信し、製品が表示されることを確認します。

  2. 常に真となる条件の挿入

    categoryパラメータに以下のペイロードを送信します:

   Gifts'||1||'

URLエンコードして送信し、レスポンスに未公開の製品が含まれていることを確認します。


🔍 ポイントとコツ

  • シンタックスエラーの観察: シングルクォートや特殊文字を挿入して、エラーメッセージの有無を確認します。

  • ブール条件の操作: &&||を使用して、クエリの論理条件を操作し、レスポンスの変化を観察します。

  • 常に真となる条件の利用: '||1==1||'のような条件を挿入して、すべてのデータが表示されるかを確認します。

  • URLエンコードの重要性: 特殊文字を含むペイロードは、必ずURLエンコードして送信します。


🧩 まとめ

このラボを通じて、NoSQLインジェクションの基本的な検出方法と、MongoDBにおける脆弱性の悪用手法を学びました。実際のアプリケーションでも、ユーザー入力のサニタイズやクエリの構築方法に注意を払い、同様の脆弱性を防ぐことが重要です。

Best regards, (^^ゞ