My Photo

« SQLインジェクション その8 | Main | クロスサイトリクエストフォージェリ(CSRF)その2 »

October 29, 2013

クロスサイトリクエストフォージェリ(CSRF)その1

発生箇所
  • クッキーのみでセッション管理が行われているサイト
  • HTTP認証、SSLクライアント証明書、径庭電話の携帯IDのみで利用者の識別が行われているサイト
影響を受けるページ CSRF脆弱性のあるページのみ
影響の種類 被害者の権限で「重要な処理」が実行させられる。

上記にある「重要な処理」とは、例として以下のようなものである。

  • 利用者のアカウントによる物品の購入
  • 利用者のアカウントによる退会処理
  • 利用者のアカウントによる掲示板への書き込み
  • 利用者のアカウントによるパスワードやメールアドレスの変更

入力-実行パターンのCSRF攻撃

以下のスクリプトはパスワード変更処理の概要を示したものである(概要であり、色々省略してある)。

スクリプト1:ログイン
<?php	// ログインしたことにする確認用スクリプト
session_start();
$id = @$_GET['id'];
if (!$id) { $id = 'yamada'; }
$_SESSION['id'] = $id;
?>
<html><body>
ログインしました。(id:<?php echo htmlspecailchars($id, NET_NOQUOTES, 'UTF-8'); ?>)<br>
</body></html>
スクリプト2:パスワード入力画面
<?php
session_start();
// ログイン確認は省略
?>
<html><body>
<form action="change_password.php" method="post">
新パスワード<input type="password" name="pwd"><br>
<input type="submit" value="パスワード変更">
</form>
</body></html>
スクリプト3:パスワード変更
<?php
function ex($s) {	// XSS対策用のHTMLエスケープと表示関数
	echo htmlspecialchars($s, ENT_COMPAT, 'UTF-8');
}
session_start();
$id = $_SESSION['id'];	// ユーザIDの取り出し
// ログイン確認は省略
$pwd = $_POST['pwd'];	// パスワードの取得
// パスワードの変更処理は省略
?>
<html><body>
<?php ex($id); ?>さんのパスワードを<?php ex($pwd); ?>に変更しました。
</body></html>

スクリプト1でログイン状態となり、スクリプト2で新しいパスワードを入力し、スクリプト3でパスワードを変更する、という流れである。
スクリプト3でパスワードが変更される条件は以下の3つ。

  • POSTメソッドでスクリプト3にリクエストされること
  • ログイン状態であること
  • POSTパラメータpwdとしてパスワードが指定されていること

上記の条件を満たすリクエストを送信させるのがCSRF攻撃である。
以下にCSRF攻撃用スクリプトを示す。

スクリプト4:攻撃用スクリプト
<html>
<body onload="document.forms[0].submit()">
<form action="http://example.jp/change_password.php" method="post">
<input type="hidden" name="pwd" value="cracked">
</form>
</body>
</html>

このスクリプトによる攻撃の流れは以下のようになる。

  1. 利用者が攻撃者による攻撃対象サイトにログインしている。
  2. 攻撃者が罠(前述のスクリプト4)を用意する。
  3. 利用者が罠を閲覧する。
  4. 罠のJavaScriptがされ、利用者のブラウザ上で攻撃対象サイトへPOSTメソッドで新しいパスワードが送信される。
  5. パスワードが変更される。

実際の攻撃では見えないiframeに攻撃用スクリプトを入れて攻撃します。
iframeの外側(罠サイトのドメイン)からiframe(攻撃対象サイトのドメイン)の内容は読み取れないので、CSRF攻撃では情報を盗み出すことはできない。
しかし、CSRF攻撃でパスワードが変更できる場合は、攻撃者は変更したパスワードで不正にログインして情報を盗み出すことができる。

CSRF攻撃とXSS攻撃の比較

CSRF攻撃と反射型のXSS攻撃は似ている。先の攻撃の流れで言うと1~3は同じで、それ以降が異なる。
CSRF攻撃は3のリクエストに対するサーバ側の処理を悪用するもので、やれることはサーバ側で用意された処理に限定される。
一方、XSS攻撃は3のリクエストに含まれるスクリプトはレスポンスにも含まれ、ブラウザ上で実行される。つまりブラウザ上でできることは何でもできる。
このように攻撃の広範さという点でXSSの脅威の方が大きいが、CSRFは以下の点で注意すべき脆弱性である。

  • CSRFは設計段階から対策を盛り込む必要がある。
  • 開発者の認知度がXSSに比べて低く、対策が進んでいない。

確認画面がある場合のCSRF攻撃

hiddenパラメータでパラメータを受け渡ししている場合は、確認画面がない場合と同じ方法で攻撃できる。

セッション変数でパラメータを受け渡ししている場合は、以下のような2段階の攻撃となる。

  1. 確認画面に対してパラメータをPOSTしてセッション変数にパラメータをセットさせる。
  2. タイミングをを見計らって実行画面を呼び出す。

これを実現する方法として、iframeを2つ使うことが考えられる。
第1のiframeはロードされるとすぐにPOSTする。これでセッション変数にパラメータがセットされる。
第2のiframeはロードされてから一定時間後にリクエストを送る。この時点でセッション変数にパラメータがセットされていれば攻撃が成功となる。
ウィザード形式のように最終実行が面まで多段になっていても、iframeを増やすことで対応できる。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.5.1 クロスサイト・リクエストフォージェリ(CSRF)

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« SQLインジェクション その8 | Main | クロスサイトリクエストフォージェリ(CSRF)その2 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/58477510

Listed below are links to weblogs that reference クロスサイトリクエストフォージェリ(CSRF)その1:

« SQLインジェクション その8 | Main | クロスサイトリクエストフォージェリ(CSRF)その2 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof