タグ別アーカイブ: HTMLエンコード

セキュリティの勉強してます。(その3)

最近仕事先のセキュリティの試験を受けるために勉強しているので、そのときのメモです。

—————————————–
セキュリティプログラミング
—————————————–

入力値チェックの考え方:
・ユーザの入力値はいっさい信用しない
・ホワイトリスト方式(許可するものだけ通過させる)でチェックする

入力値チェックの対象:
・フォーム入力
・Cookie
・HTTPヘッダ
・セレクトボックスやhiddenタグの内容もチェックする

クライアント側でのチェック:
・通常javascriptが使われる
・サーバや回線への負担が少ないが、ユーザに改ざんされる恐れがある
・信用してはいけない

入力値を出力する際に処理が必要な場面:
・HTMLの特殊処理
・javascriptに出力する場合
・SQL文を生成する場合
・OSコマンドを利用する場合
・URLを生成する場合
・HTTPヘッダを生成する処理
・メールを送信する処理
・ファイル名を生成する処理

HTML内に出力する場合:
・特殊な意味をもつ文字を変換する→<、>、”、&、’の5つ
・変換を怠った場合、XSSなどの攻撃を受ける可能性がある
・ユーザ入力を画面に表示する場合は必ずHTMLエンコードを行う

HTMLタグの属性値として入力値を利用する場合:
・属性値はダブルクォートで括っておく
・入力値内のダブルクォートとHTMLエンコードする

javascriptに入力値を利用する場合:
・出力自体を避ける
・DOMを利用する(ブラウザ側が必要なエンコードを行ってくれる)

SQLに入力値を利用する場合:
・prepared statementを利用する(DBMS側が必要なエンコードを行ってくれる)

OSコマンドに入力値を利用しない:
・動的にコマンドを生成する処理は避ける

URLに入力値を利用する場合:
・URLがhttp://かhttps://で始まっているかチェックする

HTTPヘッダに入力値を利用する場合:
・改行文字を削除する
・エンコードする

メールヘッダに入力値を利用する場合:
・改行文字を削除する
・エンコードする

ファイル名に入力値を利用する場合:
・ファイル名の指定自体をしない
・指定できるファイルを限定する

文字コードの指定:
・ブラウザが認識できる文字コード指定が無い場合、ブラウザが文字コードを誤って認識し、UTF-7を使ったXSSの危険性等がある
・Contentsヘッダ、mimeヘッダの文字コードを必ず指定する

ブラウザが認識できる文字コード:
・HKCR¥Mime¥Database¥Charaset以下にあるもの
・HKEY_CLASSES_ROOT¥Mime¥Database¥Charaset(レジストリ)

マルチバイト文字を使った攻撃:
・入力文字列の文字コードをチェックし、妥当でない場合はエラーとする
・壊れた文字を削除してから使うことは危険
・壊れた文字を削除する性質を持ったモジュールは、コードの妥当性チェックに使える(mb_convert_stringなど)

IEのContent-Type無視問題対策:
・text/plain→HTMLエンコードを行ったHTMLとして表示することで誤認を避けることができる
・BMPファイルをHTMLと誤認する場合がある→画像はBMP以外の形式に変換する

エラーメッセージの抑制:
・エラーメッセージから漏れる情報→モジュールやライブラリの情報、アプリケーションの物理パス、ソースコードやSQLの断片、エラー画面自体に脆弱性のある場合もあり
・エラーメッセージをユーザに見せない→ログに書き出す、デフォルトエラー画面をカスタマイズする

バックドア、デバッグモード:
・不要な機能は削除する
・管理者、開発者のみが利用できるようにする(認証必須)

HTMLページやアプリケーションソース内のコメント:
・攻撃者にとって非常に有効な情報となる場合があるので、必ず削除する