Szarny.io

There should be one-- and preferably only one --obvious way to do it.

情報処理安全確保支援士試験 平成29年春期 午後Ⅰ問2 解説

解説

設問1

L氏からの確認内容 L氏が今日ログインしたと言っている回数
ログイン記録 L氏の利用者IDを用いた今日のログイン回数

もし不正ログインが行われているならば,

L氏本人によるログイン回数 < ログイン記録上でのL氏アカウントのログイン回数

となるはずですので,そこを突き合わせれば不正にログインされているかどうか判明します.

設問2

a クロスサイトリクエストフォージェリ
b 3
c 現在のパスワード
d 知りえない
e confirm
f submit

表2の項番3において,taikai_tokenパラメタそのものが存在しないにもかかわらず,退会処理が完了してしまっています.明らかに脆弱性っぽいと目星をつけておきます.

ここで,図2のHTMLを見てみます.このHTMLでは,2つのiframe,form,scriptがそれぞれ存在しています.
それぞれのformでは,退会ページに対するPOSTが行われるように設定されてあります.
行番号17,18を見ると,JavaScriptによって,ページを開いたすぐ後に1つ目のフォームの値をsubmitし,その1秒後に2つ目のフォームの値がsubmitされるように仕組まれていることが分かります.

setTimeout(function, delay)
function コールバック関数
delay 指定ミリ秒後に関数を実行

これらのスクリプトにより,退会処理が自動的に行われてしまうのだと考えられます.

このように,不正なスクリプトによってリクエストが偽造され,意図しない不可逆的な操作(書き込み,決済,退会とか)が引き起こされてしまう攻撃をクロスサイトリクエストフォージェリ(CSRF)といいます.
「遠隔操作で掲示板とか自治体とかに爆破予告が書き込まれた」とかで利用される攻撃手法です.

今回の場合では,,POSTデータを偽造して,退会ページに対してスクリプトによってタイミングをずらして送信することで,退会処理が引き起こされてしまうのだと考えられます.
とするならば,表1の(え),(お)より,最初に送信されるデータのaction_idに対応する値はconfirm,その次に送信されるデータのaction_idに対応する値はsubmitであると考えられます.

「プログラムの実装に不備があった」というのは,退会処理時に用いるtaikai_tokenのチェックに漏れがあったことだと考えられます.

一方で,パスワード変更画面では,変更の際に攻撃者が知りえない現在のパスワードを入力する必要があるので,クロスサイトリクエストフォージェリ攻撃は成立しないといえます.

設問3

カ,キ
g セッションハイジャック
h タグの中で利用できる属性を制限する

表1の(う)より,入力可能なHTMLタグが挙げられていますが,script要素の入力は許可されていないため,一見スクリプトの注入は不可能であるように考えられます.しかし,タグの属性にJavaScriptイベントハンドラを追加することで,任意のスクリプトが実行可能になってしまいます.

許可されない <script>alert(document.cookie)</script>
許可される <b>hogehoge_name</b>
許可される(!) <b onclick="alert(document.cookie)">hogehoge_name</b>

選択肢の中で,イベントハンドラであるものはカとキです.

そして,利用者が入力可能なHTML要素を変更しないまま,この脆弱性に対する対策を行うとすれば,それは不正な動作を引き起こす属性値の入力を許可しないことだと考えられます.