2006年9月末に通っていたPHP講習会のセキュリティ編が開講されたので受講してきました・・・のは2006年11月27日、28日。すでに半年が経過しております。まとめるのが遅すぎますが自分メモなのでご容赦ください。
第1回「セキュリティの概要」
●セキュリティサイクル
・「セキュリティサイクル」(予防→検出→対策→回復)を回しましょう。
・運用マニュアルを作成しましょう。運用は重要です。
●php.iniの推奨設定
たくさん列挙されましたが、抜粋。
・expose_php=off → 隠しURL(クレジット、バージョン表示)を参照不可にする
・display_errors=off → エラー詳細の非表示(開発中はonに)
・error_log=ファイル名 → 外部から参照されない別ディレクトリに設定
・register_globals=off → 定数・変数を上書きさせない
・magic_quotes_gpc=off → SQLインジェクション対策には不完全なのでoff
●入力値のチェック
ブラックリストではなく正規表現でホワイトリストを作成しましょう。
●セッション(クッキー)管理
phpに限らず慎重に。
●パラメータの露出
クエリストリング(GET値)、hidden値は慎重に。
●プログラムコードの流出
・info.phpの削除忘れ
・バックアップファイル、バージョン管理ファイル(sample.php.bl)
・libsフォルダの権限設定ミス
→テキスト状態で表示されるのでソースコードが漏洩します。
第1回は以上です。標題の通り概論であり既知の内容が多かったです。
第2回「詳細な脆弱性とその対策」
いよいよ具体的な脆弱性の説明になります。
●ブルートフォース攻撃
力技攻撃。総当りでID,PW,URLを試す。
対策:パスワード強度を高める、Basic認証、POST/GET値のホワイトリストチェック。
●Nullバイト攻撃
「\0」が文字列の終端として認識されそれ以降の入力値が認識されない関数がある。
対策:バイナリセーフでない関数にユーザー入力をいれてはいけない。
●SQLインジェクション
勝手にSQL文を発行されデータベースが不正操作される。
対策:SQL文のエスケープ。DBごとに関数が異なる(mysql_real_escape_string(),pg_escape_string())。
●ディレクトリトラバーサル
相対パス「../」「..\」により想定外のデータにアクセスされる。
対策:不正文字列を削除する。basename()でファイル名を取得するのはNullバイト攻撃の危険がある。
●コマンドインジェクション
ユーザー入力からOSコマンドが実行される。
対策:サニタイジングする(escapeshellarg())。
●セッションハイジャック
セッション変数(PHPSESSID)をGET値などで指定するとそのIDでセッションが継続する。
リンクに記述されていて踏んだ場合など第三者にIDが知られるとセッションが乗っ取られる。
対策1:セッションはCookieのみにする。携帯電話などCookieが使えない場合はGETの利用も有効だけど・・・。
対策2:session_start()のあとにsession_regenerate_id(true)を実行してセッションIDを変更する。
(php5.1.0未満は古いセッションファイルが残るので削除を自前で実装する必要あり)
●クロスサイト・スクリプティング(XSS)
ユーザー入力のhtmlをそのまま表示してしまうとjavascriptが実行されたりする。
対策:HTML生成時にサニタイジング。
htmlspecialchars($str,ENT_QUOTES)。もしくはsmartyのescape。
●クロスサイト・リクエスト・フォージェリ(CSRF)
サイトの管理者権限をもつユーザーに不正な操作を強いる。
例:不正処理が記述されたHTMLメールをサイト管理者宛てに送る。サイト管理者がメール閲覧時にログイン状態であるとその処理が実行される。文章で説明しづらい。
対策:ワンタイムチケットを発行する。リファラーチェックはダメ。POSTに変換もダメ。
詳細な攻撃方法が説明され勉強になりました。とくにCSRFの手法はよく思いつくなぁという感じです。この被害って過去に例があるんでしょうか?
講義はコーディングではなく座学でしたので、現場の開発者以外でもWebに関わる人には勉強になると思います。
おまけ
AAで図解!ずばり一目で全く解らないコンピュータセキュリティ
上記の授業とは無関係ですがAAでセキュリティがわかります。超わかりやすい。
コメント