2016-06-02 15:06:12 ソース: 360 セキュリティ レポート 著者: Mobai 閲覧: 35 回
共有先:
MongoDB インジェクションについて議論する前に、MongoDB インジェクションとは何か、そしてその理由を理解する必要があります。他のデータベースよりもこのデータベースを好む理由。 MongoDB は SQL を使用しないため、いかなる形式のインジェクション攻撃に対しても脆弱ではないと想定されています。しかし、信じてください。セキュリティが組み込まれて生まれてくるものは何もありません。攻撃を防ぐために、いくつかのロジック コードを設定する必要があります。
MongoDB とは何ですか?
簡単に言えば、MongoDB は MongoDB 社によって開発されたオープン ソース データベースであり、JSCON ドキュメントと同様のさまざまな構造でファイルを保存できます。関連情報は一緒に保存されるため、MongoDB クエリ言語を使用した素早い検索が容易になります。
なぜ MongoDB を使用するのですか?
誰もが高速なクエリを求めているため、MongoDB は非常に人気があります。そのパフォーマンスは非常に優れています (10 億クエリ/秒)。人気のもう 1 つの理由は、関連データベースがうまく適合しない多くの場合に優れていることです。たとえば、非構造化アプリケーション、半構造化および多態性データ、または高いスケーラビリティ要件と複数のデータ センターを持つアプリケーションなどです。
ここで停止してください! オープンソース アプリケーションを実行している場合は、悪い状況が発生するのを防ぐために、ここで停止してください。オープンソース プロジェクト向けに無料のペネトレーション テストを提供しています。ここにアプリを送信してください。審査させていただきます。
インジェクション攻撃を見てみましょう
最初のケースでは、特定の ID のユーザー名と対応するパスワードを表示できる PHP スクリプトがあります。
上記のスクリプトでは、データベース名が security で、コレクション名が users であることがわかります。 U-id パラメータは GET アルゴリズムによって取得され、配列に渡され、関連する結果が得られます。いい感じですね。比較演算子と配列を入れてみましょう。
おっと!! データベース全体が対象になってしまいます。 http://localhost/mongo/show.php?u_id[$ne]=2 が入力され、次の MongoDB クエリが作成されたためです。 $qry= array("id" => ; array() 「$ne」 => 2))。したがって、スクリーンショット 1 からわかるように、id=2 を除くすべての結果が表示されます。
別の状況を考えてみましょう。プレスクリプトの作業内容は同じですが、findOne メソッドを使用して MongoDB クエリを作成します。
まず、findOne がどのように機能するかを見てみましょう。このメソッドの構文は次のとおりです。
db.collection.findOne(query, project)
これは、指定されたクエリ基準を満たすドキュメントを返します。たとえば、id=2 に関連する結果を検索する必要がある場合、次のコマンドが表示されます:
次に、ソース コードを見てみましょう:
ここで重要な点は、クエリをいくつかの部分で分割することです。方法を確認してから修正してください。それでは、次のクエリを入力するとどうなるでしょうか
http://localhost/mongo/inject.php?u_name=dummy'});return{something:1,something:2}}//&u_pass=dummy
これクエリを中断し、必要なパラメータを返します。出力を確認してみましょう:
これにより 2 つのエラーが発生しますが、これは単に存在しない 2 つのパラメータにアクセスしたいだけなのでしょうか? このエラーは、データベースのパラメータ内でユーザー名とパスワードが同じであることを間接的に示しています。これが私たちが望む結果です。
正しいパラメータを入力すれば、エラーは解消されます。
次に、データベース名を調べたいと思います。 MongoDB では、データベース名の検索に使用されるメソッドは db.getName() です。したがって、クエリは次のようになります:
このデータベースをダンプするには、まずコレクションの名前を見つける必要があります。 MongoDb では、コレクション名を検索するために使用されるメソッドは db.getCollectionNames() です。
これまで、データベースとコレクションの名前を取得しました。残っているのは、次のようにユーザー名セットを見つけることだけです:
同様に、内部関数 db.users.find()[2] を変更することで、他のユーザー名とパスワードを取得できます。例:
Now MongoDb については誰もがよく知っているので、関連する予防策を知りたいと思うかもしれません。
最初のケース、パラメーターが配列で渡される場合を考えてみましょう。この注入を防ぐには、配列内での比較演算子の実行を停止する必要がある場合があります。したがって、解決策の 1 つは、次の方法で implode() 関数を使用することです:
implode() 関数の戻り値は文字列配列です。したがって、取得されるのは、すべての結果ではなく、特定の ID に対応する 1 つの結果のみになります。
2 番目のケースでは、addslashes() メソッドを使用して、クエリが攻撃者によって破壊されないようにすることができます。正規表現を使用して特殊記号を置き換えることをお勧めします。次の正規表現を使用できます:
$u_name =preg_replace('/[^a-z0-9]/i', '', $_GET['u_name']);
この後、クエリが再び繰り返されないように、クエリを中断してみてください。
この記事は360警備放送から翻訳されたものです 転載する場合は「360警備放送から転載」と明記の上、リンクを貼ってください。
元のリンク: http://blog.securelayer7.net/mongodb-security-injection-攻撃-with-php/