20090218 第5回「phpによるwebアプリケーションのセキュリティ入門」
TRANSCRIPT
「 PHPによるwebアプリケーショ
ンのセキュリティ入門」
第5回社内勉強会
攻撃を防ぐには攻撃の種類を知る防御の方法を知る
なにより
攻撃されている、ということを知る
本日のお題
PHPによる webアプリケーション
のセキュリティ入門
本日の目標業務でおなじみ PHPを例に
PHPに限ったことじゃない基礎知識と危機感を持って帰ってください
本日ご紹介しますのはXSSCSRFSQLインジェクション
クロスサイトスクリプティング 略称: XSS 入力データを無防備に HTML出力 ↓
ブラウザがタグとして解釈 ↓
当然 <script>タグも有効 ↓
閲覧したクライアント上で任意の JavaScriptコードを実行させることができる
やってみよう デモ
クロスサイトスクリプティングJavaScriptを実行されるとこんなに危険 クッキーの値を設定・取得できる
セッションハイジャック 意図しないページ遷移を起こさせる
クロスサイト・リクエスト・フォージェリ (後述 ) ページ全体を置き換える
フィッシング フォームのアクションを書き換える
フォーム情報の不正取得
対策 表示するときは文字列をエスケープする htmlspecialchars($value, ENT_QUOTES) ; http://jp.php.net/htmlspecialchars
'&' (アンパサンド ) は '&' になります。ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート ) は '"'になります。ENT_QUOTES が設定されている場合のみ、 ''' (シングルクオート ) は '''になります。'<' (小なり ) は '<' になります。'>' (大なり ) は '>' になります。
不十分な場合もある・1 タグの属性に出力する場合
<a href="{$url}">LINK</a>
$url = htmlspecialchars( "javascript:alert(document.cookie)", ENT_QUOTES) ;
安全な URLであるかチェックする必要がある IEのバグ:
java\tscript:alert()
不十分な場合もある・2 そもそも設計を見直すべき場合
<script>{$hoge}</script><style>{$piyo}</style>
それは本当に必要か?
入力に HTMLタグを許可したい場合 結構大変 例:はてなダイアリーの場合
ホワイトリストで制限する 独自タグを実装する あきらめる
まとめクライアントから送られてくる値は信用しない $_GET, $_POST $_REQUESTは使わないようにしよう
エスケープは表示する直前に行う元データを加工してしまうと転用しづらい
私たちはケータイだから関係ないや…と思わずしっかり対策する
クロスサイト・リクエスト・フォージェリ 略称: CSRF / XSRF
「しーさーふ」ってダサいよね 攻撃者が攻撃用のページを用意 ↓
利用者がアクセスすること ↓
攻撃リクエストが送信される
やってみよう デモ
クロスサイト・リクエスト・フォージェリ恐ろしいところ:正規のリクエストと見分けがつかない
対策が大変パスワードを再入力させる CAPTCHAを使うトークンを使う
トークン? CAPTCHA? トークンって?
ユーザごとに固有の値 登録時に一度だけ生成する使い捨ての値
ワンタイムトークン CAPTCHA
こんなの
トークンによる対策の概要 フォームでトークン生成 ↓
hiddenフィールドから一緒に送信 サーバ側でセッションに格納 ↓
リクエストとセッションを突き合わせる ↓
合致したら正当なリクエストとして扱う
私たちは携帯向けサイトを作っている cookieが使えない
セッション IDを URLで引き回すのも前時代的 webサーバが複数ある
PHP標準のセッション機能が使えない 油断しがち
「ソースが見えない」
「パラメータは改竄できない」は幻想
対策いろいろ 端末識別 IDによる認証
ケータイサイトでは基本 賛否両論ありますが…
クリティカルな箇所はトークン チートページを作って自分自身のアカウントを攻撃 ↓
自分のパラメータを書きかえられちゃうとマズー DB 、 memcachedなどを使っていろいろ実装する必要がある
入力値のチェック クライアントから送られてくる値は信用しない $_GET, $_POST $_REQUESTは使わないようにしよう
大事なことなので二回言いました
まとめ いろいろ大変 手を抜くと被害が大きい 大変だが油断しないこと
人には言えない痛い目に遭ってます
SQLインジェクション アプリケーションが想定しない
SQL文を実行させること デモスクリプトで削除に使ってるクエリ$sql = "DELETE FROM bbs" . " WHERE id = {$_POST['id']}" . " AND pass = '{$_POST['pass']}' " . " LIMIT 1" ; 見るからに危険
こんな攻撃ページを作った<form action="http://localhost/Part2/2-1.php" method="POST">sql:<input type="text" name="id“ value="0 OR 1 #“ readonly="true" /><br /><input type="submit" name="delete“ value="Do It!" /></form>
やってみよう デモ
SQLにパラメータを埋め込む 展開すると
MySQLは [#]から行末までと[/* ~ */]がコメント
ということは…
DELETE FROM bbs WHERE id = 0 OR 1 # AND pass = '' LIMIT 1
対策 プリペアドステートメントとバインド使え。
以上。 PHP 5.2 以上は
PDOで…
$sql = "DELETE FROM bbs" . " WHERE id = :id" . " AND pass = :pass " . " LIMIT 1" ;$pdo = new PDO($connection_param) ;$stmt = $pdo->prepare($sql) ;$stmt->bindParam(":id", $_POST['id'] , PDO::PARAM_INT) ;$stmt->bindParam(":pass", $_POST['pass'], PDO::PARAM_STR) ;$stmt->query() ;
使えない場合は? (数値型 ) 数値型は数値としての妥当性をチェックする intval() is_int() is_numeric() preg_match("/^[0-9]+$/", $param)
それぞれ挙動が違うので適切なものを利用する
使えない場合は? (文字列型・1) データベース接続モジュールが提供するエスケープ関数を利用する string mysql_escape_string(
string $unescaped_string) string pg_escape_string(
[resource $connection], string $data)
使えない場合は? (文字列型・2) 自力でエスケープ
DB 元の文字 エスケープ
OracleMS SQLDB2
‘ ‘’
MySQLPostgreSQL
‘ ‘’ or \’
\ \\
PostgreSQLは 8.1.4から設定で「 \‘」を拒否できるようになった
「 ''」を使うのが望ましい 1
全体のまとめ 一番よくある攻撃3種類を簡単に紹介 攻撃されることを前提にした設計・コーディングを リクエストパラメータは絶対に信用しない 攻撃者は執念深い 「ケータイだから」と油断は禁物
攻撃方法はこれだけじゃない 常に情報を収集する努力を
必読 PHPサイバーテロの技
法―攻撃と防御の実際 社内蔵書にあるので必読 この本だけで十分とは
言い切れないのが恐ろしい
リンク集 クロスサイトスクリプティング - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
クロスサイトリクエストフォージェリ - Wikipedia http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%
E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA
SQL インジェクション - Wikipedia http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%
B7%E3%83%A7%E3%83%B3
開発者のための正しい CSRF 対策 http://www.jumperz.net/texts/csrf.htm
はてなダイアリー XSS 対策 - はてなダイアリーのヘルプ http://hatenadiary.g.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa%e3%83%80%e3%82%a4%e
3%82%a2%e3%83%aa%e3%83%bcXSS%e5%af%be%e7%ad%96
徳丸浩の日記 – そろそろ SQL エスケープに関して一言いっとくか – SQL のエスケープ再考
http://www.tokumaru.org/d/20080601.html#p01
Amazon.co.jp : PHP サイバーテロの技法―攻撃と防御の実際 http://www.amazon.co.jp/gp/product/4883374718/ref=sib_rdr_dp
おしまい
ご清聴ありがとうございました