検索
連載

「JSON文字列へのインジェクション」と「パラメータの追加」NoSQLを使うなら知っておきたいセキュリティの話(2)(2/2 ページ)

MongoDBを用いたWebアプリケーションで生じる可能性がある4種類の脆弱性のうち、今回は「JSON文字列へのインジェクション」と「パラメータの追加」のメカニズムと対策について説明します。

PC用表示
Share
Tweet
LINE
Hatena
前のページへ |       

パラメータの追加

 パラメータの追加とは、正常なリクエストには存在しないパラメータを追加することにより、本来は固定であるデータ項目を書き換えてデータベースに登録させる攻撃です。攻撃の手法などは、NoSQLとは直接関連しない「Mass Assignment」と呼ばれる攻撃方法に近いものです。

 そういう意味で本件はNoSQLに固有の問題というわけではありません。しかし、固定化されないスキーマを持つMongoDBのようなデータベースを使ったアプリケーションにおいて、より多く発生し得る脆弱性であると考えられます。

脆弱なアプリケーションの例

 下記はPHPで書かれた会員登録機能のプログラムの一部です。

// POSTメソッドの場合はデータ登録を実行
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // 登録するユーザーは一般会員扱いにする
    $member = array('type' => 'member');
    // 各パラメータ(name, birthyear, mail)を$member連想配列に格納
    foreach ($_POST['mform'] as $key => $value) {
        if (is_string($value)) {
            $member[$key] = $value;
        }
    }
    // DBに$member連想配列を登録
    $db->members->insert($member);
}
// GETメソッドの場合は登録フォームを表示
else {
    echo '<form method="post">
          名前: <input type="text" name="mform[name]">
          生年: <input type="text" name="mform[birthyear]">
          Mail: <input type="text" name="mform[mail]">
          <input type="submit" value="登録">
          </form>';
}

 ユーザーは登録フォームでボタンを押下して会員登録を行います。会員登録処理は、個別のパラメータ名を指定するのではなく、foreachのループ処理によってmform[xxx]という形式のリクエストパラメータをすべてデータベースに格納します。プログラム中でtypeを'member'にする処理を行っていますが、これを回避してtypeが'admin'のユーザーを登録させることが攻撃の目標です。

攻撃例

 攻撃方法は下記のリクエストパラメータを追加するだけです。

追加パラメータ例: mform[type]=admin


 するとforeachループ内の処理によって$member['type']が'admin'に上書きされてしまいます。データベースには下記のデータが登録されます。末尾のtypeが'admin'になっていることが分かります。

array('name' => 'foobar', 'birthyear' => '1990', 'mail' => 'a@example.jp', 'type' => 'admin')


 また、下記のようにパラメータを追加すると、そのデータがデータベースに登録されてしまいます。

追加パラメータ例: mform[foobar]=12345


 実害はありませんが、想定外のデータが登録されるという意味で好ましくはありません。

対策

 この問題への対策は、プログラムが受け入れるパラメータを制限することです。通常は、プログラム中に定義した、許可するパラメータのリスト(ホワイトリスト)を基に制限を行います。前回説明した検索処理におけるホワイトリストは、本ケースのような登録処理においても有効です。

 別の対策としては、foreachループの後ろに「$member['type'] = 'member'」といった処理を入れることによりtype値を上書きする方法も考えられますが、これはあまりよい対策ではありません。その理由としては、そもそも想定外のデータ項目(上の例で言うと「foobar」)がデータベースに登録される余地がある対策は望ましくないこと、そしてMongoDBやドライバの特殊文字の扱いによっては対策を回避される恐れがあることが挙げられます。

【関連リンク】

MongoDB Null Byte Injection Attack - Web App Security

http://www.idontplaydarts.com/2011/02/mongodb-null-byte-injection-attacks/

Mongo Security - PHP Manual

http://www.php.net/manual/ja/mongo.security.php


 以上、MongoDBを使うWebアプリケーションのセキュリティについて説明してきました。次回はCassandraやRedis、memcachedなど、それ以外のNoSQLについて取り上げます。

寺田 健(てらだ たけし)

三井物産セキュアディレクション

プロフェッショナルサービス事業部

シニアセキュリティスペシャリスト

ポータル・サイトなどでのWebアプリケーションのシステム開発・運用経験を生かし、セキュリティコンサルタントとして、Webアプリケーション・スマートフォンアプリケーションなどのセキュリティ診断や関連する研究開発に従事している。ECサイトや金融機関などのWebサイト検査の実績を持つ。CISSP、情報セキュリティアドミニストレータ。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       

Security & Trust 記事ランキング

  1. 「SMSは認証に使わないで」 米CISA、モバイル通信を保護する8つのベストプラクティスを公開
  2. 3割程度のSaaS事業者が標準的なセキュリティ対策をしていない アシュアードがSaaS事業者を調査
  3. 「このままゼロトラストへ進んでいいの?」と迷う企業やこれから入門する企業も必見、ゼロトラストの本質、始め方/進め方が分かる無料の電子書籍
  4. 中小企業の20%の経営層は「自社はサイバー攻撃に遭わない」と信じている バラクーダネットワークス調査
  5. AWS、組織のセキュリティインシデント対応を支援する「AWS Security Incident Response」を発表 アラートに圧倒されるセキュリティチームをどう支援?
  6. 「生成AIのサイバー攻撃への悪用」は増加する? 徳丸浩氏が予測する2025年のセキュリティ
  7. ChatGPTやClaudeのAPIアクセスをかたってマルウェアを配布するPython用パッケージ確認 Kasperskyが注意喚起
  8. 高度なAIでAIをテスト OpenAIが実践するAIモデルのレッドチーム演習とは
  9. 日本人の約半数が「1年前より危険」と考えるオンライン詐欺とは マカフィーがホリデーショッピング詐欺に関して調査
  10. 商用国家安全保障アルゴリズム(CNSA)の期限となる2030年までに暗号化/キー管理サービス市場が60億ドルに達するとABI Researchが予測 急成長の要因とは?
ページトップに戻る