IPA ウェブ健康診断仕様を使ったWebアプリ脆弱性検査(CSRF編)
※当サイトにはプロモーションが含まれています。

IPAが公開しているウェブ健康診断仕様の中にあるCSRF(クロスサイト・リクエスト・フォージェリ)の診断をやってみます。
- ウェブ健康診断については、以前の記事 IPA ウェブ健康診断仕様とは?で説明しています。
診断内容
ウェブ健康診断仕様.pdf より抜粋

診断する環境
- クライアントOS:OS X
- ブラウザ:Firefox (OWASP ZAPに対するプロキシ設定は済んでいるものとします)
- HTTP通信を記録するツール:OWASP ZAP
- 診断対象となるWebアプリケーション:
- VirtualBoxで導入した OWASP BWA上のDVWA(Damn Vulnerable Web Application)
- OWASP BWAのIPアドレス:192.168.0.50
※ 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/ にアクセスします。

2-2. DVWAのCSRFページにアクセスする。
2-2-1. “Damn Vulnerable Web Application” をクリックして、DVWAにアクセスするとログインページが表示されます。
2-2-2. Usernameに “admin”, Passwordに “admin” を入力して[Login]ボタンをクリックし、DVWAにログインします。

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


- 入力フィールドを右クリックし、[要素を調査]を選択すると、開発ツールの画面が表示され、対象フィールドの name 属性名が “password_new” と “password_conf” であることが確認できます。
手順3:フォームをサブミットしてみる
フィールドに値を入力しサブミットしてみてどのような値がサーバに送信されているのか確認しておきます。
3-1-1. [New assword]フィールドに “foo”, [Confirm new password]フィールドに “foo”を入力して[Change]ボタンをクリックします。 
3-1-2. ブラウザ上で更新された箇所を確認します。
- “Password Changed” と表示され、パスワードが変更されたようです。
- 実際、ログインし直してみるとパスワードが変更されていました。

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

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

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

3-1-5. ブラウザ上で更新された箇所を確認します。
- “Password Changed” と表示され、パスワードが変更されたようです。
- 実際、ログインし直してみるとパスワードが変更されていました。
- Refererがなくてもパスワードは変更できるようです。

手順4:診断を行う
次の4つを診断します。
4-1. トークン等のパラメータが存在しない
- 今回のリクエストにはトークンらしきパラメータが無いので該当します。
4-2. トークン等を削除しても特定副作用が実行される
- トークンがないため未実行
4-3. トークン文字列の推測が可能
- トークンがないため未実行
4-4. 別ユーザのトークンが使用できる
- トークンがないため未実行
手順5:脆弱性診断の結果
- 4-1に該当しましたので、脆弱性有りの判定となります。
手順6:対策アドバイス
- パスワード変更の処理にはGETではなくPOSTメソッドを使用するようにします。
- 「hiddenパラメータ」にCSRF対策用トークンをセットしておき、フォームをサブミットしたらその値が正しい場合のみ処理を実行するようにします。
- このCSRF対策用トークンはセッションIDとは別の値として生成しておき、セッションに紐づけておきます。
その他
- ウェブ健康診断仕様では、セッションIDをトークンとして利用しているかどうかについての診断は無いようです。
- 問題点等ありましたらご指摘下さい。
[最終更新日: 2014年3月3日]
広告