San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
閉じる
プライバシー設定
ウェブサイト運営に必要なCookieや類似技術を使用しています。追加のCookieは貴社の同意がある場合のみ利用されます。同意は「Agree」をクリックすることでいただけます。どのデータが収集され、どのようにパートナーと共有されているかの詳細は、Cookieポリシープライバシーポリシーをご確認ください。
Cookieは、貴社デバイスの特性や、IPアドレス、閲覧履歴、位置情報、固有識別子などの特定の個人情報を取得、解析、保存するために使用されます。これらのデータは様々な目的で利用されます。分析Cookieによりパフォーマンスを評価し、オンライン体験やキャンペーンの効果向上に役立てます。パーソナライズCookieは、利用状況に応じた情報やサポートを通じ、貴社専用の体験を提供します。広告Cookieは、第三者が貴社のデータをもとにオーディエンスリストを作成し、ソーシャルメディアやネット上でのターゲット広告に使用します。貴社は各ページ下部のリンクから、いつでも同意の許可、拒否、または撤回が可能です。
ご送信ありがとうございます。内容を受け付けました。
申し訳ありません。フォーム送信時にエラーが発生しました。
/
/
Attacks

NoSQLインジェクション攻撃

Introduction

攻撃者は、MongoDBなどSQL問合せ言語を用いないデータベースの脆弱性を突いて、クエリにコードを注入する可能性があります。この記事では、NoSQLインジェクションと従来のSQLインジェクションの違いや回避方法について解説します。また、NoSQLインジェクション攻撃の概要、具体例、ブラインドインジェクション、ペイロードについても紹介します。

NoSQLインジェクション攻撃

noSQLとは

NoSQLデータベースは、SQL問合せ言語を用いない非リレーショナルなデータベースです。代表例として、MongoDB、Cassandra DB、CouchDB、Riakなどがあり、特にMongoDBが有名です。

SQLインジェクションとNoSQLインジェクションの違いは、NoSQLデータベースが用途に応じた様々なデータモデルを採用している点にあります。SQLデータベースはテーブルにデータを保存するのに対し、NoSQLはドキュメント、キー・バリュー、グラフ、カラムファミリーなど多様な形式でデータを扱います。動的なスキーマ定義により、新たなフィールドやデータの追加・変更が容易です。

NoSQLインジェクションとは

NoSQLインジェクションとは、NoSQLデータベースを利用するウェブアプリに生じたミスを指します。この脆弱性を利用すると、悪意ある者が認証を回避し、データの読み出しや改ざん、果てはアプリの完全な制御を奪う恐れがあります。こうした攻撃は、入力データの検証不足によって引き起こされます。

NoSQLインジェクションはどのように機能するか

  • MongoDBを例にした簡単なケース

攻撃者は、ログイン認証を回避するために、各フィールドにMongoDBの演算子、例えば $eq(と等しい)、$ne(と等しくない)、または $gt(より大きい)などを入力して試みる場合があります。以下は、PHPアプリでフォームから直接入力値を利用してクエリを組み立てる危険な方法です:

$question = array("user" => $_POST["username"], "secret word" => 
 $_POST["password"]);

PHPの標準的なエスケープ処理によりログイン認証を確認していた場合、攻撃者は正常に見えるMongoDBクエリを注入し、検証を回避できることがあります。次のPOSTリクエストを送信するだけで実行される可能性があります:

username[$ne]=1& password[$ne]=1

PHPはこれを次のような配列に変換します:

array("username" => array("$ne" => 1), "secret key" => 
array("$ne" => 1));

これにより、ユーザ名とパスワードが1と等しくない全てのユーザが返され、攻撃者は検証を回避してMongoDBに送信する恐れがあります。

NoSQL injection on MongoDB
NoSQL injection on MongoDB
  • JavaScriptインジェクション

JavaScriptによるNoSQLインジェクションの例では、検証されずに入力値をMongoDBの$where演算子に渡す脆弱なアプリが問題となります。攻撃者はこの弱点を利用して、制限された機能のJavaScriptコードを注入できます。直接任意のJavaScriptを実行できなくても、十分な被害を与える可能性があります。

通常、MongoDBでは$where演算子付きのfind()関数を使ってコレクションを検索します。例えば:

db.collection.find( { $where: function() { 
 return (this.name == 'Invicti') } } );

「Invicti」という名前のレコードが取得されます。脆弱なPHPアプリでは、$userData変数など、検証されていないクライアント入力が直接クエリに埋め込まれる可能性があります:

db.collection.find( { $where: function() { 
 return (this.name == $userData) } } );

注入が成功すると、攻撃者は例えば「'a'; sleep(5000)」のような文字列を$userDataに注入し、サーバを5秒間停止させる恐れがあります。サーバは以下のクエリを実行します:

db.collection.find( { $where: function() { 
return (this.name == 'a'; sleep(5000) ) } } );

これは、クエリがアプリ内の言語で書かれているために可能な注入の一例に過ぎません。例えば、サーバサイドでNode.jsを利用している場合、Node.jsへのJavaScriptインジェクションも考えられ、これはMongoDB、ExpressJS、AngularJS、Node.jsからなるMEANスタックでよく見られるケースです。

NoSQLインジェクションはどう確認するか

  1. 安全なコーディング手法

これらのデータベースは新しい技術であり、SQLやリレーショナルデータベースに慣れた開発者にとっては、不適切なコード記述のリスクが高まります。NoSQLデータベースのセキュリティルールやガイドラインは、十分に注意して確認すべきです。

  1. 入力値の検証

SQLインジェクションと同様、クエリ作成時には検証されていない入力値の使用を避け、全ての入力値を検証する必要があります。

  1. 最小権限の原則

ウェブアプリのセキュリティでは、基本として最小権限の原則を守るべきです。これにより、万が一攻撃が成功しても、被害を限定することが可能です。

NoSQLインジェクションの防止策

効果的なMongoDBなどへのインジェクション攻撃は、従来のSQLインジェクションよりも被害が大きくなる恐れがあります。攻撃者はデータを抽出するだけでなく、アプリ上でコードを実行し、不正な管理操作を行ったり、管理者のユーザ情報を乗っ取ってサーバを制御する可能性もあります。特に、NoSQLデータベースは新しい技術であるため、開発者が十分に慣れていないケースが多く、こうしたリスクが高まります。

多くの有名なNoSQL製品はまだ開発初期の段階にあるため、最新版の利用が推奨されます。例えば、MongoDBは以前のバージョンで多くのインジェクション脆弱性が指摘されましたが、最新版ではセキュリティが大幅に強化されています。

WallarmはNoSQLインジェクションにどのように役立つか

NoSQLでもインジェクション攻撃のリスクは完全には排除できません。開発や運用で十分な安全対策を講じたとしても、アプリに脆弱性が残る可能性は常にあります。攻撃を未然に防ぎ、アプリのセキュリティを強化するためには、Wallarmのような包括的で一元管理されたセキュリティソリューションの導入が有効です。

Wallarmを利用すれば、こうした危険を検出し回避することが可能です。プラットフォームは最新の脅威を確認し、警告を発します。オンプレミスのアプリからクラウドネイティブなAPIセキュリティまで、Wallarm API security Platformは、貴社の事業を新たな脅威から守るための重要な要素を提供します。また、どのWAF/WAAPが攻撃検知に優れているかを確認でき、攻撃者がどのような手法を用いているか、現行のセキュリティ対策がどの攻撃を検出しているかを把握する一助となります。

FAQ

参考資料

最新情報を購読

更新日:
February 25, 2025
学習目標
最新情報を購読
購読
関連トピック