アプリケーションの開発において、テストは必須作業である。脆弱性の発生原因の1つは、このテストが不十分であるという点にある。Webアプリケーションの検査では、入力チェック漏れやサニタイジング漏れの検査を行うが、本来であれば、これらの検査は開発時のテスト工程で行うべきものだろう。
例えば、最近騒がれているSQLインジェクションについては、シングルクォート「'」の入力や、「' or 1=1--」といった文字列を入力した場合の反応をチェックするテストを行うとよい。SQLインジェクションは、これらの文字列の入力だけで確認できるわけではないが、少なくとも、これら文字列を入力した場合にエラーが発生したり、間違った動作をしたりしなければ、完璧ではないものの、最低限の目安にはなるだろう。実際のテストでは、脆弱性ごとの入力パターンをテスト項目に含めるようにすることを推奨する。
以下に簡単ではあるが、代表的な脆弱性を調べるための入力パターンと確認方法を示す。もちろん、これだけではなく、もっと入力パターンを増やしてもよい。なお、これらのテストはデータ破壊やシステム停止を引き起こす可能性があるため、必ずテスト環境で実施するようにしてほしい。
Buffer Overflow
操作:5000バイトの長さの文字列を入力
確認:言語処理系やDBドライバなどが直接エラーを出力したりしないか? 誤動作しないか?
Cross Site Scripting
操作:「'>"><script>alert()</script>」を入力
確認:アラートボックスが表示されるか?
操作:任意の文字列(例:abc)を入力
確認:次に表示される画面内のフォームに含まれるか? 含まれるなら、value属性がしっかりとクォートされているか?
Parameter Manipulation
操作:数値パラメータの場合、(元の値-1)、(元の値+1)としてみる
確認:異なる機能が実行されたり、本来アクセスできるべきでない情報が表示されたりするか?
Session Exploitation
操作:連続してセッションIDを発行させてみる
確認:それらのセッションIDに規則性はあるか? 発行されるセッションIDが推測できる場合、推測したセッションIDを使ってアクセスし、他人になりすますことができるか?
SQL Injection
操作:シングルクォート「'」を入力
確認:DBドライバのエラーメッセージが表示されるか?
操作:「' or 1=1--」を入力
確認:認証バイパスや、テーブル内の全レコードへアクセスできたりするか?
OS Command Injection
操作:「||/bin/date|」(Unix系のサーバを想定)
確認:時刻が出力されるか?
Cross Site Request Forgeries
操作:処理をコミットするリクエストで送信されるパラメーターの一覧を見る
確認:Cookie以外のパラメータに、他人が推測できないパラメーターを含んでいるか? Cookie以外のパラメータがすべて推測可能であれば脆弱だ。
Copyright © ITmedia, Inc. All Rights Reserved.