MongoDB のセキュリティ、PHP でのインジェクション攻撃
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/
ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

php8.1の列挙関数は、指定された定数を定義することにより、コードの明確さとタイプの安全性を高めます。 1)列挙は、整数、文字列、またはオブジェクトであり、コードの読みやすさとタイプの安全性を向上させることができます。 2)列挙はクラスに基づいており、トラバーサルや反射などのオブジェクト指向の機能をサポートします。 3)列挙を比較と割り当てに使用して、タイプの安全性を確保できます。 4)列挙は、複雑なロジックを実装するためのメソッドの追加をサポートします。 5)厳密なタイプのチェックとエラー処理は、一般的なエラーを回避できます。 6)列挙は魔法の価値を低下させ、保守性を向上させますが、パフォーマンスの最適化に注意してください。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...
