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

IPAが公開しているウェブ健康診断仕様の中にあるXSS(クロスサイト・スクリプティング)の診断をやってみます。
- ウェブ健康診断については、以前の記事 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の「XSS Reflected」ページ(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のXSS reflectedページにアクセスする。
2-2-1. “Damn Vulnerable Web Application” をクリックして、DVWAにアクセスするとログインページが表示されます。
2-2-2. Usernameに “admin”, Passwordに “admin” を入力して[Login]ボタンをクリックし、DVWAにログインします。

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


- 入力フィールドを右クリックし、[要素を調査]を選択すると、開発ツールの画面が表示され、対象フィールドの name 属性名が “name” であることが確認できます()。
手順3:診断を行う
4つの検出パターンを入力・サブミットし、レスポンスを調査します。
3-1. 検出パターン1
3-1-1. 検出パターン1の文字列を入力して[Submit]ボタンをクリックします。 
3-1-2. ブラウザ上で更新された箇所を確認します。
- 入力した文字列のうち、画面上には「’>”>」が表示され、その後に水辺線が表示されました。

3-1-3. OWASP ZAPでリクエストの内容を確認します。 
3-1-4. OWASP ZAPでレスポンスの内容を確認します。
- 入力した文字列が、エスケープ等されずにそのまま出力されていることが分かります。

3-1-5. 脆弱性の有無を判断します。
- ウェブ健康診断仕様によると、脆弱性有無の判定基準は「エスケープ等されずに出力される」であるため、今回は脆弱性有りと判定できます。
3-2. 検出パターン2
3-2-1. 検出パターン2の文字列を入力して[Submit]ボタンをクリックします。 
3-2-2. ブラウザ上で更新された箇所を確認します。
- JavaScriptのalert()が実行され、クッキーの内容が表示されました。

3-2-3. OWASP ZAPでリクエストの内容を確認します。 
3-2-4. OWASP ZAPでレスポンスの内容を確認します。
- 入力した文字列が、エスケープ等されずにそのまま出力されていることが分かります。

3-2-5. 脆弱性の有無を判断します。
- ウェブ健康診断仕様によると、脆弱性有無の判定基準は「エスケープ等されずに出力される」であるため、今回は脆弱性有りと判定できます。
3-3. 検出パターン3
3-3-1. 検出パターン3の文字列を次のようにURLに入力してアクセスします。

3-3-2. ブラウザの表示が更新されました。
- Not Found という文字列と共に、検出パターン3の文字列が表示されています。

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

3-3-4. OWASP ZAPでレスポンスの内容を確認します。
- 検出パターン3の文字列が表示されていますが、“<“ → “<”, “>” → “>” というように文字参照に変換されています。

3-3-5. 脆弱性の有無を判断します。
- ウェブ健康診断仕様によると、脆弱性有無の判定基準は「エスケープ等されずに出力される」であるため、今回は脆弱性無しと判定できます。
3-4. 検出パターン4
3-4-1. 検出パターン4の文字列を入力して[Submit]ボタンをクリックします。 
3-4-2. ブラウザ上で更新された箇所を確認します。

3-4-3. OWASP ZAPでリクエストの内容を確認します。 
3-4-4. OWASP ZAPでレスポンスの内容を確認します。
- 入力した文字列が、入力フィールドの下あたりに
タグに囲われて出力されています。エスケープ等はされていませんが、この場所でJavaScriptが実行されることはありません。
- 入力した文字列は、ここ以外には出力されていません。

3-4-5. 脆弱性の有無を判断します。
- ウェブ健康診断仕様によると、脆弱性有無の判定基準は「href 属性等に出力される」であるため、今回は脆弱性無しと判定できます。
手順4:脆弱性診断の結果
検出パターン1,2において脆弱性有りの判定となりました。
手順5:対策アドバイス
- ウェブページに出力する全ての要素に対して、エスケープ処理を施す。
- 入力値の内容チェックを行う。
- CookieにHttpOnly属性を付ける。
- それに伴いTRACEメソッドを無効化する。
その他
- 問題点等ありましたらご指摘下さい。
[最終更新日: 2014年2月28日]
広告