![]() |
【連載】
セキュアなWebサイトを運営するための
Webアプリケーションに潜むセキュリティホール
第2回 顧客データがすべて盗まれる?!
〜OSやデータベースへの攻撃〜
国分裕
三井物産セキュアディレクション
2003/6/5
| ※ご注意 他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。 本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。 また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。 |
「第1回 サーバのファイルが丸見え?!」では、「Forceful Browsing(強制的ブラウズ)」や「Path Traversal(パスの乗り越え)」によって、任意のファイルを読み出されてしまう危険性について紹介した。
今回は、Webアプリケーションを通じてSQL文を実行する攻撃や、OSコマンドを実行する攻撃について解説する。重要な企業情報や顧客データを守るためにぜひ活用してほしい。
| SQL Injection(SQLインジェクション:SQLの挿入) |
Webサイトを構成する要素の1つにデータベースがある。Webアプリケーションからデータベースを操作するために使われるのがSQLで、このSQLを偽造してデータベースの操作をしてしまおう、というのがこの攻撃だ。
アプリケーションの裏にデータベースがあり、データベースと連携してサービスを行っているシステムが攻撃対象となる。データベースに含まれるデータすべてを奪われる、削除されるなどの被害が想定される。
SQLはアプリケーション内のいろいろな個所で使われる。例えばユーザー名とパスワードを入力させてログイン処理をする場合を考えてみる。
次のようなSQLを使っているとしよう。
$SQL="SELECT * FROM user WHERE
userid='$input_userid' AND password='$input_password'";
|
ユーザーにuseridとpasswordを入力させ、それらが一致したレコードが取り出されることを想定している。ところが、ユーザーからの入力が次のような場合はどうだろう?
input_userid |
dummy |
input_password |
'or'A'='A
|
実際に実行されるSQLは、
SELECT * FROM user WHERE userid='dummy'
AND password=''or'A'='A' |
というSQLになり、すべてのレコードが該当するようなSQL文に変わってしまう。これにより、その中のいずれかのユーザーでログインできてしまうだろう。
また、次のようなこともできる場合がある。
input_userid |
dummy |
input_password |
';DELETE
from user WHERE 'A'='A |
この場合に実行されるSQLは、
| SELECT * FROM user WHERE userid='dummy' AND password='';DELETE from user WHERE 'A'='A' |
となり、すべてのレコードが消えてしまう。このように、SQL文を挿入(Injection)することから、SQL Injectionと呼ばれる。
対策の1つは、ごく当たり前の「入力値チェック」と「サニタイジング」だ。入力値チェックで、各パラメータが想定しているパターンに合致するかを確認する、その後、SQL文を実行する際に、SQLで特殊文字として定義されている文字をサニタイジングすることになる。SQLの文脈とパラメータの挿入位置によりサニタイジングが必要な特殊文字は変わってくる。
以下にほとんどのRDBMSが準拠している「SQL92」での特殊文字を挙げる。
|
||||||||||||||||||
| 表1 SQL92での特殊文字 |
各RDBMSが個別に拡張している文字もある。各RDBMSのマニュアルを確認しておいていただきたい。どんな文字が特殊文字なのかを考えるのが面倒ならば、英数字だけしか入力できないようにしてしまうのも1つの手だ。
例えば、電話番号(03-1234-5678)を入力させたい場合に、1つの入力欄にすべての桁を以下のように入力させるのではなく、
電話番号:
<input type="text" size="13"
value="03-1234-5678"> |
次のように3つの区分に分割しておくことで、数字だけに入力値を制限できるだろう。
電話番号:
-
-
<input type="text" size="4"
value="03">-<input type="text" size="4"
value="1234">-<input type="text" size="4"
value="5678"> |
もちろん、こういった工夫で回避できない場合も多々あるだろうが、可能な限り英数字だけに制限する方が安全だ。
| コラム - 日本語はどうする? 英数字だけでなく日本語を入力させたい場合が多々あるだろう。 いまのところ、2バイト文字を使ってチェックを回避し、XSS、OS Command Injection(後述)、SQL Injectionを行う手法は見つかっていない。文字化けを回避するなどアプリケーションの動作のために日本語文字種の制限をすることはあるだろうが、いまのところセキュリティ的に気にする必要はないだろう。 もちろん、今後何か手法が見つかるかもしれないので、そのときはこの限りではない。 |
もう1つの対策として、準備済みSQL文(プレースホルダ、バインドメカニズムと呼ばれることもある)を使う方法がある。自分でSQL文すべてを書くのではなく、SQL文の一部を可変に指定しておき、後でその部分を埋めて実行する、というような動作をする。
もともとは、繰り返し処理など似たようなSQL文を毎回コンパイル・実行する場合の性能低下を防ぐために考えられたものと思われるが、セキュリティ的にも有効だ。各言語で準備済みSQL文が使えるならば、多少プログラム行が増えてしまうことになるが積極的に使っていただきたい。
|
|
| リスト1 ASP(Active Server Pages)での例 |
これを使うことで、入力値チェックやサニタイジングをすべてシステムに任せることができる。
| 1/2 | 「OS
Command Injection」へ |
Webアプリケーションに潜むセキュリティホール バックナンバー
- 第1回 サーバのファイルが丸見え?!
- 第2回 顧客データがすべて盗まれる?!
- 第3回 気を付けたい貧弱なセッション管理
- 第4回 エラーメッセージの危険性
- 第5回 Webアプリケーションの検査テクニック
- 第6回 Webサイトのセッションまわりを調べる方法
- 第7回 攻撃されないためのセッション管理の検査方法
- 第8回 Webサイトの問い合わせ画面に含まれる脆弱性
- 第9回 オンラインショッピングにおける脆弱性の注意点
- 第10回 安全なWebアプリケーション開発のススメ
- 第11回 Webアプリケーションファイアウォールによる防御
- 第12回 mod_securityのXSS対策ルールを作成する
- 第13回 OSコマンドインジェクションを防ぐルールを作成する
- 最終回 Webアプリケーションの脆弱性を総括する
| Profile |
| 国分 裕(こくぶ ゆたか) 三井物産セキュアディレクション勤務。セキュリティコンサルタン トとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ 検査などの実績を持つ。 三井物産セキュアディレクション 主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サー ビスも実施中。 |
|
||||||||
| Security&Trust記事一覧 |
- 不安が残る、アドビの「脆弱性直しました」 (2010/7/21)
開きたいのはPDFだけなのに……Acrobat Readerをインストールしたら、真っ先に変更すべき設定を解説します - クラウド利用時にクリアすべきリスクと課題 (2010/7/13)
技術、運用、契約で気を付けるべき課題は。前編に引き続き、クラウドを利用する上で把握しておきたいポイントを解説する - 情報漏えい対策を通じて「守るべきもの」とは (2010/7/12)
企業はセキュリティをどうやって確保しているのだろうか。情報漏えい対策のいまを、オリンパスの事例とカード業界の事例で学ぶ - クラウドコンピューティングの心理的課題 (2010/7/7)
利点のみがクローズアップされがちなクラウド、企業が安心して使うには? クラウド利用のリスクと課題を2回に分けて解説する
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報









