mongodbの脆弱性診断 - smarttechgeeks
TRANSCRIPT
MongoDBの脆弱性診断
2015年11月 桃原裕太
目次
・自己紹介
・Webアプリケーション脆弱性診断とは?
・SQLインジェクションについて
・MongoDBの脆弱性診断について
-演算子のインジェクションについて
-その他の脆弱性について
・おわりに
自己紹介
株式会社 シーエー・アドバンス / 桃原 裕太
前職はプログラマで、ECサイトやその他の開発業務に携わっていました。
※市役所ホームページ、車載器、圧延制御システム等
最近はWebアプリケーション脆弱性診断を行っています。
Webアプリケーション脆弱性診断とは?(1/4)
Webサイトに脆弱性がないか、擬似攻撃を行って調査しています。
※注意点※
脆弱性診断は許可をもらっているサイトか、
自分で管理しているサイトに対してのみ行いましょう。
本資料で得た知識を他人のサイトで実施しないでください。
・不正アクセス禁止法に触れる可能性があります
・擬似攻撃により、対象サイトにて被害が発生する可能性があります
例)データが吹っ飛んだり
Webアプリケーション脆弱性診断とは?(2/4)
例)商品購入(正常なパターン)
itemId name price
1 アイテム1 100円
2 アイテム2 200円
購入(itemId=1,price=100)
アイテム1入手
Webアプリケーション脆弱性診断とは?(3/4)
例)商品購入(不正なパターン)
itemId name price
1 アイテム1 100円
2 アイテム2 200円
購入(itemId=1,price= 50)
アイテム1入手
Webアプリケーション脆弱性診断とは?(4/4)
調査した結果、脆弱性だと判断した場合は開発者へ報告します。
タイトル 商品を任意の価格で購入することが可能
危険度 High
説明 パラメータpriceを操作することで、任意の価格で商品を購入することが可能。
影響度 売上の減少など
SQLインジェクションについて(1/3)
知っている方がほとんどだと思いますが、MongoDBの脆弱性についてお話する前に
簡単にSQLインジェクションについて説明します。
SQLインジェクションとは?
ブラウザ等から送られる、悪意のあるSQL文やその一部により
データベースを不正に操作できる脆弱性です。
SQLインジェクションについて(2/3)
例)ログイン(正常なパターン)
ログイン
ログイン完了
http://example.net/login.php?uid= admin&pwd=password
【発行されるSQL】
SELECT
*
FROM
USERS
WHERE
uid= ‘admin‘
and password = ‘password‘;
結果、
adminでログイン可能
例)ログイン(不正なパターン)
SQLインジェクションについて(3/3)
ログイン
ログイン完了
http://example.net/login.php?uid= admin&pwd=1‘or 1=1
【発行されるSQL】
SELECT
*
FROM
USERS
WHERE
uid= ‘admin‘
and password = ‘1‘ or 1=1;
結果、
最初にヒットしたユーザーでログイン可能
MongoDBの脆弱性診断について(1/2)
SQLは書かないので、SQLインジェクションはないのですが、
MongoDB特有の脆弱性が存在します。
・インジェクション系の脆弱性
・パラメータを柔軟に受け入れることに起因する脆弱性
MongoDBの脆弱性診断について(2/2)
診断時のチェックポイントは下記の4つになります。
1 演算子のインジェクション
2 SSJI(Server Side Javascript Injection)
3 JSON文字列へのインジェクション
4 パラメータの追加
演算子のインジェクションについて(1/3)
PHPやRubyで発生しやすい。
リクエストパラメータを柔軟に受け取れるのが原因。
1 演算子のインジェクション
2 SSJI(Server Side Javascript Injection)
3 JSON文字列へのインジェクション
4 パラメータの追加
演算子のインジェクションについて(2/3)
比較的、攻撃しやすい脆弱性なので詳しく解説します。
攻撃例について(PHPの場合)
※ $ne は、「≠(not equal)」です。
正常なリクエスト 不正なリクエスト
http://example.net/login.php?uid=admin&pwd=password http://example.net/login.php?uid=admin&pwd [$ne] =1
$user = $collection->find(array(
"uid" => $_GET[‘uid’], // admin
"pwd" => $_GET[‘pwd’], // password
));
結果、
adminでログイン可能
$user = $collection->find(array(
"uid" => $_GET[‘uid’], // admin,
"pwd" => $_GET[‘pwd’], // array("$ne" => 1)
));
結果、(adminのパスワードが1以外の場合)
adminでログイン可能
演算子のインジェクションについて(3/3)
対策方法(PHPの場合)
・受け取ったパラメータをString型にキャストする
→ $pwd = (string)$_GET[‘pwd’];
・型チェック、等
その他の脆弱性について(1/3)
・MongoDBではJavascriptが使えます。(複雑な絞り込み条件をしたい時に役立ちます)
・入力値の検証をしなかった場合、脆弱性につながる可能性があります。
1 演算子のインジェクション
2 SSJI(Server Side Javascript Injection)
3 JSON文字列へのインジェクション
4 パラメータの追加
その他の脆弱性について(2/3)
・Javaで発生しやすい
・入力値の検証をしなかった場合、脆弱性につながる可能性があります。
1 演算子のインジェクション
2 SSJI(Server Side Javascript Injection)
3 JSON文字列へのインジェクション
4 パラメータの追加
その他の脆弱性について(1/3)
・フォームから想定していないパラメータが来た場合、
パラメータ名の検証をしていないと、そのままDBに登録されます。
1 演算子のインジェクション
2 SSJI(Server Side Javascript Injection)
3 JSON文字列へのインジェクション
4 パラメータの追加
おわりに
セキュリティに興味のある方
実際に業務に携わっている方
おわりに
ぜひ情報交換しましょう!
おわりに
ご静聴ありがとうございました。