Web Application Security Memo

ウェブセキュリティに関するメモ書き

IPA ウェブ健康診断仕様を使ったWebアプリ脆弱性検査(CSRF編)

※当サイトにはプロモーションが含まれています。

公開日: 更新日:

ウェブ健康診断仕様

IPAが公開しているウェブ健康診断仕様の中にあるCSRF(クロスサイト・リクエスト・フォージェリ)の診断をやってみます。

診断内容

ウェブ健康診断仕様.pdf より抜粋

ウェブ健康診断仕様

診断する環境

  • クライアントOS:OS X
  • ブラウザ:Firefox (OWASP ZAPに対するプロキシ設定は済んでいるものとします)
  • HTTP通信を記録するツール:OWASP ZAP
  • 診断対象となるWebアプリケーション:

※ OWASP BWA、DVWA(Damn Vulnerable Web Application) については、こちらの記事 OWASP BWA (The Broken Web Applications) とは? を参照して下さい。

診断対象となるWebページ

DVWAの「CSRF」ページ(Security Level: low) を診断します。

手順1:環境を用意する

順番に起動していくだけなので詳細は省略します。

1-1. VirtualBoxを起動

1-2. VirtualBox内の OWASP BWA を起動

1-3. OWASP ZAP を起動

1-4. Firefox を起動

手順2:目的のWebページにアクセスする

2-1. OWASP BWAのトップページにアクセスする。

2-1-1. http://192.168.0.50/ にアクセスします。

OWASP BWAトップページ

2-2. DVWAのCSRFページにアクセスする。

2-2-1. “Damn Vulnerable Web Application” をクリックして、DVWAにアクセスするとログインページが表示されます。

2-2-2. Usernameに “admin”, Passwordに “admin” を入力して[Login]ボタンをクリックし、DVWAにログインします。

DVWAログインページ

2-2-3. 画面左の[CSRF]メニューをクリックして、今回診断を行うページにアクセスします。

DVWAトップページ

DVWAのCSRFページ

  • 入力フィールドを右クリックし、[要素を調査]を選択すると、開発ツールの画面が表示され、対象フィールドの name 属性名が “password_new” と “password_conf” であることが確認できます。

手順3:フォームをサブミットしてみる

フィールドに値を入力しサブミットしてみてどのような値がサーバに送信されているのか確認しておきます。

3-1-1. [New assword]フィールドに “foo”, [Confirm new password]フィールドに “foo”を入力して[Change]ボタンをクリックします。 診断前の確認

3-1-2. ブラウザ上で更新された箇所を確認します。

  • “Password Changed” と表示され、パスワードが変更されたようです。
  • 実際、ログインし直してみるとパスワードが変更されていました。

診断前の確認2

3-1-3. OWASP ZAPでリクエストの内容を確認します。

  • GETリクエストが行われています。
  • GETパラメータは、 “password_new”、”password_conf”、”Change” の3つです。
  • CSRF対策用トークンのパラメータはないようです。
  • PHPSESSIDという名前でセッションクッキーと思われるクッキーが送信されています。

診断前の確認3

3-1-4. Refererリクエストヘッダを削除してもう一度パスワード変更してみます。

  • もう一度フォーム上からパスワードを変更しますが、この際、OWASP ZAPでリクエストを一旦保留して Refererを削除します。

診断前の確認3

  • そしてサーバにリクエストを送信します。

診断前の確認3

3-1-5. ブラウザ上で更新された箇所を確認します。

  • “Password Changed” と表示され、パスワードが変更されたようです。
  • 実際、ログインし直してみるとパスワードが変更されていました。
  • Refererがなくてもパスワードは変更できるようです。

診断前の確認3

手順4:診断を行う

次の4つを診断します。

4-1. トークン等のパラメータが存在しない

  • 今回のリクエストにはトークンらしきパラメータが無いので該当します。

4-2. トークン等を削除しても特定副作用が実行される

  • トークンがないため未実行

4-3. トークン文字列の推測が可能

  • トークンがないため未実行

4-4. 別ユーザのトークンが使用できる

  • トークンがないため未実行

手順5:脆弱性診断の結果

  • 4-1に該当しましたので、脆弱性有りの判定となります。

手順6:対策アドバイス

  • パスワード変更の処理にはGETではなくPOSTメソッドを使用するようにします。
  • 「hiddenパラメータ」にCSRF対策用トークンをセットしておき、フォームをサブミットしたらその値が正しい場合のみ処理を実行するようにします。
  • このCSRF対策用トークンはセッションIDとは別の値として生成しておき、セッションに紐づけておきます。

その他

  • ウェブ健康診断仕様では、セッションIDをトークンとして利用しているかどうかについての診断は無いようです。
  • 問題点等ありましたらご指摘下さい。

[最終更新日: 2014年3月3日]

広告