情報処理安全確保支援士(情報セキュリティスペシャリスト) - SE娘の剣 -

情報処理安全確保支援士(情報セキュリティスペシャリスト)試験に合格するためのサイトです。
過去問を多数引用しながら、基礎知識をしっかり学んでもらうように作ってあります。
また、情報処理安全確保支援士(情報セキュリティスペシャリスト)を楽しく学べるように工夫したいと思います。

9.サーバセキュリティ

 DOM(Document Object Model)とは、JavaScriptなどのアプリケーションからWEBページ(Document)を操作する仕組みです。以下に詳しい解説があります。
 https://www.ipa.go.jp/files/000024729.pdf
 
上記にあるように、HTMLファイルの中にJavaScriptを記載することで、HTMLファイルの文字を表示を変えることができます。
この仕組みを使った、DOMベースのXSS(クロスサイトスクリプティング)にも注意する必要があります。 

セキュアプログラミングとは、セキュリティの高いプログラミングをするという考え方です。具体的には、「脆弱性のある関数を使わない」、「入力値をチェックする」、「エラーメッセージをそのまま表示しない」、「CookieにSecure属性を加える」、ながあります。
 IPAでは、以下のWebサイトにて、「セキュア・プログラミング講座」が掲載されています。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html

DOM(Document Object Model)ベースのXSS(クロスサイトスクリプティング)についてです。
XSSには、反射型と格納型とDOM based XSSの3つに分けられます。
多くのサイトなので解説がされているのが、反射型のXSSです。対策の中心はエスケープ処理です。
IPAのサイトが分かりやすすぎるので、改めて解説する気も起きなくなります・・・。
https://www.ipa.go.jp/files/000024729.pdf

が、私なりに書いてみると、

➀従来のXSS(反射型XSS)
クライアント→(URLにアクセス)→サーバ
       ←(コンテンツを送る)
       →(スクリプトを入れて送る)
      ←(スクリプトを組み込まれたものがクライアントに送付)
 発露

②DOM based XSS

クライアント→(URLにアクセス)→ サーバ
       ←(コンテンツを送る)
 発露

※javaScriptなので、サーバは無関係にクライアント側で実施される
 また、サーバにJavaScript部分の記載は送られないので、サーバにログも残らない。

攻撃手法ですが、具体的にはURLに#とスクリプトを付与します。

H26秋SC午後Ⅱ問2をみてみましょう。
問題文
(Ⅰ)DOMベースのXSSの対策
JavaScriptによるWebページ操作に問題がある場合に起きるXSSは,DOMベースのXSSと呼ばれている。JavaScriptを利用する場合は,注意が必要である。
例えば,図2に示すHTML(HTTP://www.example.jp/domXSS.html)があった場合に,図3に示すURIにブラウザからアクセスすると,“1"という警告ダイアログが表示される。
<html>
<body>
<script>
 document.write(decodeURIComponent(location.hash));
</script>
</body>
</html>
図2 HTML  (HTTP://www.example.jp/domXSS.html)

http://www.example.jp/domxss.html〔 g 〕<script>alert(1)〔 h 〕
図3 警告ダイアログが表示されるURI

 反射型(reflected型,non-persistent型)のXSSと違って,DOMベースのXSSでは攻撃者が注入するデータがWebサイトからの応答中に出力されない。ブラウザ上のHTMLデータに入力データを動的に挿入するようなJavaScriptが応答中に含まれていると,入力データにスクリプトが含まれていたときに,そのスクリプトがブラウザ上で実行されてしまう。そのため、DOMベースのXSSは,③反射型のXSSとは診断方法が異なる。
 DOMベースのXSSの対策のためには,"document.write", "innerHTML"などの,動的にブラウザ上のHTMLデータを操作するメソッドやプロパティを使用するのではなく,"createElement"などのDOM操作用のメソッドやプロパティを使用して,ブラウザ上のHTMLデータを構築することが必要である。
図2のスクリプトを簡単に言うと、「リンクのうちhash(#)以降の文字列をブラウザに表示しなさい」ということです。
 もう少し詳しく説明します。

document.write(decodeURIComponent(location.hash));

hash(ハッシュ)とは記号の「#」のことです。
 ・location.hashによりURIにおけるハッシュ(#)以降の部分を取得する。
 ・decodeURIComponentによりdecodeされた状態の文字にする。
 ・document.write関数によりハッシュ(#)以降の文字列をブラウザに表示する。

では、この仕組みを用いて、問題文にある「"1"という警告ダイアログを表示」させるにはどうしたらいいか。
#のあとに警告ダイアログが表示させるスクリプト文字を挿入します。
 http://www.example.jp/domXSS.html#<script>alert(1)</script>
 この結果、#以降の<script>alert(1)</script>が文字として取得され,警告ダイアログが表示されます。
aa

1.クリックジャッキングとは
情報セキュリティスペシャリスト試験の過去問(H24SC春午前2問1)では、「 Webページのコンテンツ上に透明化した標的サイトのコンテンツを配置し,利用者が気づかないうちに標的サイト上で不正操作を実行させる。」とあります。ジャッキングとは、飛行機を乗っ取るハイジャックをイメージしてください。クリックを乗っ取ると考えればいいでしょう。

情報セキュリティスペシャリスト試験の過去問(H26年秋SC午後Ⅱ問2)で詳しく問われましたので、その内容を確認しましょう。
(Ⅱ)クリックシャッキングの対策
 クリックシャツキングの対策には,④HTTP応答ヘッダで“X-FRAME-OPTIONS”にDENYを指定することによって,自サイトをフレーム内で表示させないようにする方法がある。近年,クリックシャッキングによると思われる事件が発生しており,この応答ヘッダに対応したブラウザが増えている。

IPAの資料(https://www.ipa.go.jp/files/000026479.pdf)に、詳しい解説があるので、時間があれば読んでください。
この資料では、「クリックジャッキング攻撃とは、ユーザを視覚的にだまして正常に見えるウェブページ上のコンテンツをクリックさせ、別のウェブページのコンテンツをクリックさせる攻撃のこと」と述べられています。
クリックジャッキング_情報セキュリティスペシャリスト試験 
※出典:https://www.ipa.go.jp/files/000026479.pdf

ユーザには、後ろにある悪意のページしか見えていないのですが、実際には表側にあるサイトをクリックしているのです。このケースでは、勝手に「情報公開」にしてしまいます。
具体的な透過方法は、iframe等によりクリックさせたいサイトを読み込み、そのページをCSS(Cascading Style Sheets)の設定で透明にします。

2.対策
対策ですが、自社のWebサイトが攻撃者のサイトのiframe内で勝手に表示されないようにします。具体的には、ブラウザからコンテンツを要求されると,Webサーバはブラウザに対して「このサイトをiframe内で表示させないようにしてください」いう通知を送るのです。このとき、Webサーバからの通知に使うのが「X-FRAME-OPTIONS」というHTTPヘッダです。Webサーバが通知した「X-FRAME-OPTIONS」をブラウザが確認し,拒否が設定されていればブラウザはiframe内にコンテンツを表示しません。

セキュアプログラミングを理解するにあたり、実際にプログラミングしてみることはとてもいいことだ。
Webサイトを作るのに簡単なのはPHPなので、PHPで簡易なプログラムを組んでいきたい。

PHPのインストール
XAMPPが便利だ。PHPだけでなく、MySQLやその他プログラムが一度にインストールできる。そして、Windowsでも動作する。検証にはもってこいだ。
https://www.apachefriends.org/jp/index.html
以下の「ダウンロード」タブから最新のファイルをダウンロード(青ボタン)しよう。
xampp
今回は、xampp-win32-1.8.3-4-VC11-installer.exe(125Mbyte)を取得した。

インストール
入れるだけ。簡単である。全部インストールしてもいいのであるが、要らなさそうなものはチェックをはずした。とりあえず、PHPとMySQLがあればいいだろう。
install
デフォルトのフォルダは以下。ここに、PHPのプログラムファイルも入れる。
C:\xampp

サービスの起動
ボタンを押すだけ。とりあえずPHPをやるために、最低限Apacheだけは起動しておこう。ついでにMySQLもかな。Apacheのエラーが出た場合には、なにか80番のWebサービスが既に起動している可能性がある。
コントロールパネルの「サービス」にて、それらしきサービスを停止しておこう。
start











サービスの起動確認
以下のサイト(自分自身)にアクセスしてみよう。
http://127.0.0.1/index.php
「XAMPP Windows版へようこそ!」らしき画面がでれば無事にPHP動作環境が完了である。

XAMPPによるインストール
以下で確認してほしい。
XAMPP(ザンプ)をインストールしてPHP

簡単なスクリプトを書く
「ログイン画面」を作っていく。
HTMLファイルに「ログイン画面」と書いてもいいが、せっかくなのでPHPのプログラミングで書く。
テキストファイルを開き、以下を記載する。
<?php
print('ログイン画面')
?>

ファイルを保存
このファイルを名前を付けて保存(login.php)とする。拡張子はphpとする必要がある。
これを、以下に入れるだけでよい。
C:\xampp\htdocs

画面を表示してみる
http://127.0.0.1/login.php

以下のように、PHPプログラムで書いた「ログイン画面」という言葉が表示される。
login

HTTPのメソッドには8つのメソッドがある。
http://nw.seeeko.com/archives/50654465.html

POSTとGETの動作の違いをPHPのスクリプトで体験してみよう。
分かりやすさを優先して、余分なものは全て消してある。実際のプログラムはもう少し整形することになるだろう。
ここではあくまでも、仕組みをシンプルにお伝えすることを優先している。

スクリプトの内容
login.html
ログイン画面<br>
<FORM ACTION="result.php" METHOD="POST">
ID:<INPUT TYPE="text" NAME="id" VALUE=""><br>
Password:<INPUT TYPE="password" NAME="password" VALUE=""><br>
<INPUT TYPE="submit" VALUE="Login">
</FORM>

実際の画面は以下のようになる
login
result.php ※結果表示のスクリプト
<?php
print($_REQUEST['id']);
?>
さん、ログインしました。

POSTの場合
IDとしてuser1と、パスワードを入力してLoginボタンを押す。その後の画面(result.php)は以下のようになる。
post

GETの場合
login.htmlの赤字の「POST」部分を「GET」に変更して実行する。
GETの場合は、以下のように、入力した情報がURLに表示される。ログインIDやパスワードが漏えいするので、これはよくない。それで、POSTが使われる。
http://127.0.0.1/result.php?id=user1&password=pass
get
c2f058cb 

なるほど。
じゃあ、GETは使われないのですね?
そうでもない。Yahoo!やGoogleの検索ではURLに値が表示される。おそらくGETで処理しているはずだ。
以下は、Yahoo!にて「network」というキーワードで検索した結果である。URLに p=network の表示がある。
これにより、この検索結果のURLを保存しておいたり、誰かに共有することも可能であり、それは一つの利点である。
 また、Referer機能により、リンク先にリンク元の情報が送られる。このようにGETを利用してURLに情報が埋めこまれているから、どの検索エンジンのどのキーワードでリンク先に来たかが分かる。これによって、アクセス元の詳細な分析も可能になる。
yahoo
Googleの場合は、さらにシンプルである。
たとえば、「security」というキーワードを検索すると、結果のURLは以下
https://www.google.co.jp/#q=security

セッション管理には3つがあると述べたが、一番多いのはCookieである。
実際に試してみよう。session
PHPでプログラミングをする場合、以下を書くだけである。

  session_start();

プログラムとしては、以下のようになる。
login.php  ※ポイントのみの最低限に絞っている
<?php
  session_start();
?>

ログイン画面<br>
<FORM ACTION="result.php" METHOD="POST">
ID:<INPUT TYPE="text" NAME="id" VALUE=""><br>
Password:<INPUT TYPE="password" NAME="password" VALUE=""><br>
<INPUT TYPE="submit" VALUE="Login">
</FORM>
sef4 
これだけでCookieが設定されるとは便利ですね。
では、IEの「ツール」「インターネットオプション」「全般」「設定」「ファイルの表示」の中で、Cookieを探してみます。
あれ?無いですよ?
ファイルに保存されるのは、Cookieに有効期限を付けた場合のみだ。通常は、ブラウザを閉じるとCookieは削除されるので、わざわざファイルに保存する必要はない。
 
IEの開発ツールで見てみよう。F12を押して、三角のスタートボタンを押してキャプチャをする。Cookieタブを見ると、以下にようにPHPSESSIDとして確認できる。
cookie
※http:127.0.0.1になっているのは、Webサーバ上から直接アクセスしたため。

では、パケットキャプチャを詳しく見てみよう。
PC(192.168.1.103)からWebサーバ192.168.1.102にアクセスするとする。
http://192.168.1.102/login.php
WebサーバにはPHPのプログラムにて session_start() が記載されているので、ブラウザに対してSet-Cookieにてセッション情報を渡す。(上の図の②)
このとき、②のフレームが以下である。http









Webサーバからブラウザに対し、Set-CookieにてセッションIDが渡されているのが分かる。
その後、ブラウザからWebサーバへの通信(上の図の③)へは、以下のようにCookieのセッションIDを伝えながら通信をする。これにより、セッションを維持しながらの通信が可能になる。
session2
情報セキュリティスペシャリスト試験を目指す女性SE

【ポイント!】
WebサーバはHTTPヘッダのSet-Cookie(HTTPレスポンス)、クライアントはCookie(HTTPリクエスト)にCookie情報を入れて通信

今回はPHPの場合を紹介したが、Java Servletの場合は以下。

  HttpSession session = request.getSession(true);

以下にまとめられているので参照ください。
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/303.html

参考1
過去問(H23SC春午後2問2)に、「利用者がパスワードを入力してログインすると, Set-CookieヘッダでセッションIDをブラウザに対して発行するようになっている。それ以降はセッション管理にこのセッションIDを利用するとともに, SSLによる通信の暗号化が図られている」とある。

参考2
Cookieの場所であるが、最近のIEでは「ツール」「インターネットオプション」「全般」「設定」「ファイルの表示」の中にある。他のテンポラリーファイルも混ざっているので見づらいが、よく探せばあるので、見ていただきたい。
cookie

HTTPでは、どのサイトから訪れたのかを記録するフィールドがある。これがrefererである。
これにより、ホームページのアクセス元の分析などが可能になる。どんなキーワードで検索されたかも分かるという利点もある。たとえば、Goolgeで「security」と入力して検索したとする。すると、検索結果は以下のようになる。
 https://www.google.co.jp/#q=security
 その検索結果のとあるサイトをクリックすると、Refererによって、上記のURLが通知される。このことから、Googleの「security」という検索キーワードをもとに、サイトを訪れたことが分かり、便利と言える。これは、検索エンジンがPOSTではなくGETメソッドを利用しているから、このようにURLに情報を付与する。
 しかし、セッション管理でGETメソッドを利用している場合、問題がある。URLにセッション情報が記載されるので、リンク先にセッション情報が漏えいする。

参考であるが、過去問H26年春SC午後Ⅰ問1では、以下の記述がある。
GETメソッドではなくPOSTメソッドを使用しておかないと、HTTPヘッダ内のフィールドが原因で、バナー広告に設定されたリンク先のWebサーバへセッションIDが漏えいすることが考えられるね。

★詳しくは、キャプチャを付けたり、図にして解説するつもりだ。

試験で出題されるのはここからの内容である。
きちんと理解すれば、得意分野にできるであろう。プログラミングが得意な人からすると、さほどのボリュームとは感じないだろうが、逆に未経験の人からするとハードルが高い。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html


また、以下の情報もある。
https://www.ipa.go.jp/security/vuln/websecurity.html
過去問(H25SC秋午後1問1)に以下のように記載がある。
そこで容易に検査できる方法はないかと探していたところ,基本的なXSS対策を実施しているかどうかを診断する“ウェブ健康診断仕様”(以下, Web健康診断という)が,“安全なウェブサイトの作り方”の別冊としてH)Aから公表されているとの情報を得た。

スポンサードリンク

↑このページのトップヘ