20090218 第5回「phpによるwebアプリケーションのセキュリティ入門」

33
PHP ににに web ににににににににに にににににににに第第第第第第

Upload: hiromu-shioya

Post on 24-May-2015

2.711 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

「 PHPによるwebアプリケーショ

ンのセキュリティ入門」

第5回社内勉強会

Page 2: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

攻撃を防ぐには攻撃の種類を知る防御の方法を知る

なにより

攻撃されている、ということを知る

Page 3: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

本日のお題

PHPによる webアプリケーション

のセキュリティ入門

Page 4: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

本日の目標業務でおなじみ PHPを例に

PHPに限ったことじゃない基礎知識と危機感を持って帰ってください

Page 5: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

本日ご紹介しますのはXSSCSRFSQLインジェクション

Page 6: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

クロスサイトスクリプティング 略称: XSS 入力データを無防備に HTML出力 ↓

ブラウザがタグとして解釈 ↓

当然 <script>タグも有効 ↓

閲覧したクライアント上で任意の JavaScriptコードを実行させることができる

Page 7: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

やってみよう デモ

Page 8: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

クロスサイトスクリプティングJavaScriptを実行されるとこんなに危険 クッキーの値を設定・取得できる

セッションハイジャック 意図しないページ遷移を起こさせる

クロスサイト・リクエスト・フォージェリ (後述 ) ページ全体を置き換える

フィッシング フォームのアクションを書き換える

フォーム情報の不正取得

Page 9: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

対策 表示するときは文字列をエスケープする htmlspecialchars($value, ENT_QUOTES) ; http://jp.php.net/htmlspecialchars

'&' (アンパサンド ) は '&amp;' になります。ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート ) は '&quot;'になります。ENT_QUOTES が設定されている場合のみ、 ''' (シングルクオート ) は '&#039;'になります。'<' (小なり ) は '&lt;' になります。'>' (大なり ) は '&gt;' になります。

Page 10: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

不十分な場合もある・1 タグの属性に出力する場合

<a href="{$url}">LINK</a>

$url = htmlspecialchars( "javascript:alert(document.cookie)", ENT_QUOTES) ;

安全な URLであるかチェックする必要がある IEのバグ:

java\tscript:alert()

Page 11: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

不十分な場合もある・2 そもそも設計を見直すべき場合

<script>{$hoge}</script><style>{$piyo}</style>

それは本当に必要か?

Page 12: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

入力に HTMLタグを許可したい場合 結構大変 例:はてなダイアリーの場合

ホワイトリストで制限する 独自タグを実装する あきらめる

Page 13: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

まとめクライアントから送られてくる値は信用しない $_GET, $_POST $_REQUESTは使わないようにしよう

エスケープは表示する直前に行う元データを加工してしまうと転用しづらい

私たちはケータイだから関係ないや…と思わずしっかり対策する

Page 14: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

クロスサイト・リクエスト・フォージェリ 略称: CSRF / XSRF

「しーさーふ」ってダサいよね 攻撃者が攻撃用のページを用意 ↓

利用者がアクセスすること ↓

攻撃リクエストが送信される

Page 15: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

やってみよう デモ

Page 16: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

クロスサイト・リクエスト・フォージェリ恐ろしいところ:正規のリクエストと見分けがつかない

対策が大変パスワードを再入力させる CAPTCHAを使うトークンを使う

Page 17: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

トークン? CAPTCHA? トークンって?

ユーザごとに固有の値 登録時に一度だけ生成する使い捨ての値

 ワンタイムトークン CAPTCHA

こんなの

Page 18: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

トークンによる対策の概要 フォームでトークン生成 ↓

hiddenフィールドから一緒に送信 サーバ側でセッションに格納 ↓

リクエストとセッションを突き合わせる ↓

合致したら正当なリクエストとして扱う

Page 19: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

私たちは携帯向けサイトを作っている cookieが使えない

セッション IDを URLで引き回すのも前時代的 webサーバが複数ある

PHP標準のセッション機能が使えない 油断しがち

「ソースが見えない」

「パラメータは改竄できない」は幻想

Page 20: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

対策いろいろ 端末識別 IDによる認証

ケータイサイトでは基本 賛否両論ありますが…

クリティカルな箇所はトークン チートページを作って自分自身のアカウントを攻撃 ↓

自分のパラメータを書きかえられちゃうとマズー DB 、 memcachedなどを使っていろいろ実装する必要がある

入力値のチェック クライアントから送られてくる値は信用しない $_GET, $_POST $_REQUESTは使わないようにしよう

大事なことなので二回言いました

Page 21: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

まとめ いろいろ大変 手を抜くと被害が大きい 大変だが油断しないこと

人には言えない痛い目に遭ってます

Page 22: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

SQLインジェクション アプリケーションが想定しない

SQL文を実行させること デモスクリプトで削除に使ってるクエリ$sql = "DELETE FROM bbs" . " WHERE id = {$_POST['id']}" . " AND pass = '{$_POST['pass']}' " . " LIMIT 1" ; 見るからに危険

Page 23: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

こんな攻撃ページを作った<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>

Page 24: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

やってみよう デモ

Page 25: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

SQLにパラメータを埋め込む 展開すると

MySQLは [#]から行末までと[/* ~ */]がコメント

ということは…

DELETE FROM bbs WHERE id = 0 OR 1 # AND pass = '' LIMIT 1

Page 26: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

対策 プリペアドステートメントとバインド使え。

以上。 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() ;

Page 27: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

使えない場合は? (数値型 ) 数値型は数値としての妥当性をチェックする intval() is_int() is_numeric() preg_match("/^[0-9]+$/", $param)

それぞれ挙動が違うので適切なものを利用する

Page 28: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

使えない場合は? (文字列型・1) データベース接続モジュールが提供するエスケープ関数を利用する string mysql_escape_string(

string $unescaped_string) string pg_escape_string(

[resource $connection], string $data)

Page 29: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

使えない場合は? (文字列型・2) 自力でエスケープ

DB 元の文字 エスケープ

OracleMS SQLDB2

‘ ‘’

MySQLPostgreSQL

‘ ‘’ or \’

\ \\

PostgreSQLは 8.1.4から設定で「 \‘」を拒否できるようになった

「 ''」を使うのが望ましい 1

Page 30: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

全体のまとめ 一番よくある攻撃3種類を簡単に紹介 攻撃されることを前提にした設計・コーディングを リクエストパラメータは絶対に信用しない 攻撃者は執念深い 「ケータイだから」と油断は禁物

攻撃方法はこれだけじゃない 常に情報を収集する努力を

Page 31: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

必読 PHPサイバーテロの技

法―攻撃と防御の実際 社内蔵書にあるので必読 この本だけで十分とは

言い切れないのが恐ろしい

Page 32: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

リンク集 クロスサイトスクリプティング - 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

Page 33: 20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

おしまい

ご清聴ありがとうございました