ぶろぐ

日記です

PHPセキュリティ対策ポイント一覧


PHPというか、Webアプリケーション全般に言えることかな?
既存の攻撃パターンを勉強しようと思った
ので、どういうものがあるか調べてみた
ネットで調べようと思ったんですが、手持ちのパーフェクトPHPに詳しく書かれていたので、参考にします。
全部理解するぞー!

  • スクリプト挿入攻撃
    • ブログなどに、攻撃スクリプトを仕掛けてそれを閲覧する第三者を攻撃すること。エスケープをしっかりやればOKみたい
  • XSS
    • スクリプト挿入攻撃は、ブログなどのコンテンツに攻撃スクリプトを埋め込ます攻撃手段だが、XSSはGETやPOSTなどから攻撃コードを挿入させる。攻撃コードを挿入させるために、間接的な何かを使うことからCross site Scriptingって呼んでいるみたい。対処方法はスクリプト挿入攻撃と同じで、攻撃スクリプトをエスケープすることで無効化する。
  • CSRF
    • あのイケメンSNSで騒がれていたやつだはず。ユーザーの意図しない操作をそのユーザーの権限で実行するってやつ。「記事を削除する」という操作を、ユーザーは意図しないのに実行する。これ怖いなーと思った。http://localhost/hoge/del.phpにdel_id = all的なものをpostすると、リソースの削除が行えるプログラムがあるとする。ログイン状態で意図しないのに実行してしあったら…乙!ってことはだ…ネットバンクにログイン中に、オレ口座に100万入金、っていうデータをPOSTしてそれが受理されたらヒャッハー!ってことだ。
    • もちろん対策はある。危険な操作の前には、パスワード入力処理を挟む。ネットバンクならカードの番号の2番目と9番目を入力してね、とかやってたなそう言えば。
    • もうひとつの対策としては、ワンタイムトークンを使う。処理を受け付けるフォームを作成するとき、一緒にランダムなトークン(よーは文字列)を渡す。そのトークンと一緒に処理がやってきたなら、正常。渡したトークンが違う、もしくはトークンがなくて処理だけがやってきた場合は異常、とみなして処理を行わない。実装コードはパーフェクトPHPを読もう☆
  • SQLインジェクション
    • twitterでもテスターが鯖を停止させたよとかでにぎわっていたあれ。これホントやばい。これ知ってないと情弱。知らない奴には参照権限しかないユーザーしか渡す気しない。更新系クエリ実行するなら、これを抑えておかないと上司にバカにされそう。自己チェックテスト項目には入れよう。
    • 原理は、PHPが実行するSQL文にいけないSQLを仕込まし実行すること。良くあるのは、パスワード知らなくてもログインできたりとか。select * from hoge;って感じでデータ取得出来ちゃったりとか。
    • 対策は
      • プリペアドステートメントを使う。PDOお勧めみたい。
        • ごめんなさい使ったことないですorz
      • 文字をエスケープする。エスケープして無害な文字にする。
        • mysql_real_escape_string()とか使う。
  • セッション固定攻撃
    • セッションアダプションだと・・・?何だそれは
  • セッションハイジャック
    • セッションIDを何とか取得して、そのIDを使うことで正規のユーザーのふりをすること。
  • HTTPヘッダインジェクション
  • メール第三者中継
  • 変数汚染攻撃
  • Nullバイト攻撃
    • ここは例のC言語セキュアコーディングの話と関連するぞ
  • ディレクトリトラバーサル
  • eval利用攻撃
  • ファイルアップロード攻撃
  • インクルード攻撃
  • パス・ディスクロージャー攻撃
  • コマンドインジェクション

思った事

途中で疲れた…。
C言語のセキュアコーディングを目指す気持ちは一緒!
レイヤーが違う感じ。

  • PHP外部から入力されるデータは危険なのでそのまま使わない事
  • PHP外部に出力するデータはエンコードして危険性をなくすこと

が基本だと思った。

  • echo htmlspecialchars($str, ENT_NOQUOTES);

が基本なので

//関数名にセンスがないw
function echo2($str) {
    echo htmlspecialchars($str, ENT_NOQUOTES);
}

的な感じでechoをラッパーしちゃう関数を慣習的に使っとけば結構防げるんじゃね?と思った。XSSとかは。
と思ったらh()が慣習的みたい。
サニタイジングはだめっぽい。サニタイジングは、入力時に危険性を排除することを言うみたいで、それよりは出力時にecho htmlspecialchars($str, ENT_NOQUOTES);で危険性を排除したほうがいいみたい。
この辺深く追いたい(´・ω・`)
セッションアダプションってなんだ?やばい匂いがする。今日はここまでにして次調べよー

脱情弱

「うわー脆弱性だらけだぜこれー」「うひゃーひでーなーこれ。どこが作ったの?PG大丈夫か?」「ヒャッハー」とか言われないように、ちゃんと理解しようず!!
パーフェクトPHPは神書籍です。ありがとうございます。

あと

読んでないけど、この辺後で読もう。
IPA資料
http://www.ipa.go.jp/security/vuln/websecurity.html
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
http://www.amazon.co.jp/gp/product/4797361190