脆弱性ってなんなん?って思ったのでちょっとまとめた。
簡単に言うと、
脆弱性とは、コンピュータやネットワークなどの情報システムにおいて、第三者が保安上の脅威となる行為(システムの乗っ取りや機密情報の漏洩など)に利用できる可能性のあるシステム上の欠陥や仕様上の問題点。
以下のサイトが詳しい。
http://www.ipa.go.jp/security/vuln/20050623_websecurity.html
で対策としては、
1. アプリと
2. サーバと
3. ネットワークを
守れと。
監視しろと。
無駄なものは省けと。
そんな感じ。
で、今回ちょっとウェブアプリに関する脆弱性についてまとめてみる。
◆ SQL インジェクション
何か:SQLコマンドを用いた攻撃
対策:SQL文の組み立てにバインド機構を使用
利用できない場合、SQL文の変数に対しエスケープ処理
パラメータにSQL文を直接指定しない
エラーメッセージをブラウザに表示しない
データベースアカウントに適切な権限を与える
◆ OS コマンド・インジェクション
何か:OSコマンドを用いた攻撃
対策:シェルを起動できる言語機能の利用を避ける
利用する場合は、引数を構成する全ての変数に対してチェック
◆ パス名パラメータの未チェック/ディレクトリ・トラバーサル
何か:外部にwebサーバないのフォルダ構成がばれることによる攻撃
対策:外部からのパラメータにファイル名を指定しない
固定のディレクトリを指定しディレクトリ名がばれないようにする
ウェブサーバ内のファイルへのアクセス権限を設定
ファイル名のチェック
◆ セッション管理の不備
何か:このセッションID の発行や管理に不備がある場合悪意のある人にロ
グイン中の利用者のセッションID を不正に取得される
対策:セッションIDを推測が困難なものにする
セッションIDをURLパラメータに格納しないようにする
HTTPS通信で利用するCookieにはsecure属性を加える
ログイン成功後に、新しくセッションを開始するようにする
ログイン成功後に、既存のセッションIDとは別に秘密情報を発行。ページの遷移毎にその値を確認
セッションIDを固定値にしない
セッションIDをCookieにセットする場合、有効期限の設定に注意する
◆ クロスサイト・スクリプティング
何か:入力値を用いて出力値を出すウェブアプリにおいて、出力値にスクリプトを埋め込まれる
解決:ウェブページに出力する全ての要素に対して、エスケープ処理
出力は「http://」「https://」に限定
要素の内容を動的に生成しない
スタイルシートを外部サイトから取り込めるようにしない
入力値の内容チェックを行う
入力されたHTMLテキストから構文解析木を作成し、スクリプト排除
入力されたHTMLテキストから、スクリプトに該当する文字列を排除
HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)指定
Cookie情報の漏えい対策として、TRACEメソッドを無効化し、発行するCookieにHttpOnly属性を加える
◆ CSRF(クロスサイト・リクエスト・フォージェリ)
何か:Webサイトにスクリプトや自動転送を仕込むことにより閲覧者に意図せず別のWebサイト上で何らかの操作を行なわせる攻撃
解決:処理を実行するページを POST メソッドでアクセス
「hidden パラメータ」に秘密情報が挿入されるよう前のページを自動生成。
処理実行直前のページで再度パスワードの入力を求める
入力されたパスワードが正しい場合のみ処理を実行
Refererが正しいリンク元かを確認し、正しい場合のみ処理を実行
重要な操作後、ユーザーの登録済みメールアドレスに結果を自動送信
◆ HTTP ヘッダ・インジェクション
何か:HTTPヘッダに、任意の情報を挿入することで攻撃を行う手法
解決:ヘッダの出力を直接行わない
ウェブアプリケーションの実行環境や言語に用意されているヘッダ出力用APIを使用
改行コードを適切に処理するヘッダ出力用APIを利用できない場合、改行を許可しない
外部からの入力の全てについて、改行コードを削除する
◆ メールの第三者中継
何か:全く関係のない第三者のメールサーバを踏み台にして送信元を偽造
解決:外部からのパラメータをメールヘッダの内容に指定しない
外部からのパラメータをメールヘッダに指定する場合は、危険な文字を排除