AppGoatを利用した集合教育補助資料-クロスサイトスクリプティング編-

独立行政法人情報処理推進機構 (IPA)
セキュリティセンター

Copyright © 2019 独立行政法人情報処理推進機構

講義内容⚫脆弱性の原理解説・基礎知識⚫脆弱性の発見方法⚫演習１：掲示板に埋め込まれるスクリプト（格納型）⚫演習解説

Copyright © 2019 独立行政法人情報処理推進機構2クロスサイトスクリプティング(XSS)とは？
⚫ XSS(Cross Site Scripting)とは、スクリプトをサイトに送り込み、スクリプトを含むHTMLを出力し、ブラウザ上で実行させる攻撃⚫ 「開発者」が最も作り込みやすい脆弱性②ウェブサイトにアクセス①scriptの埋め込み

HTML
scriptscriptscript
利用者

脆弱性のあるサイト
攻撃者

script③scriptの実行

Copyright © 2019 独立行政法人情報処理推進機構

出典：IPA・JPCERT/CC：ソフトウェア等の脆弱性関連情報に関する届出状況[2019年第3四半期（7月～9月）]

3

HTMLの基礎知識とクロスサイトスクリプティング⚫ HTMLとは？？
HTML(Hyper Text Markup Language)とは、タグ(<>)で囲まれた文字列を命令として取扱い、ブラウザで表示する言語。
ブラウザ表示イメージ

ウェブサーバから送付される
HTMLソース(テキストファイル)
エン
コーディ
ン
グ

Copyright © 2019 独立行政法人情報処理推進機構

4

HTMLの基礎知識とクロスサイトスクリプティング⚫ スクリプトタグ（<script></script>）<script>スクリプト</script>は、タグで囲まれたスクリプト（JavaScript）を実行する。
HTMLソース

ウェブブラウザ<html><script>alert(1)</script>…</html>⚫ エスタグ（

）
タグで囲まれた文字列に取り消し線を付ける。
HTMLソース<html>
IPA
…</html>
Copyright © 2019 独立行政法人情報処理推進機構

ウェブブラウザ

IPA
5クロスサイトスクリプティングとは～入力値がHTMLタグとして認識されてしまう～■入力した文字列を表示する処理の場合
通常時

検索キーワード
①

IPA

③

②

利用者

異常時

【IPA】を含む検索結果
検索キーワード
IPA
③’

利用者【IPA】を含む

検索結果
Copyright © 2019 独立行政法人情報処理推進機構

ウェブサーバ＋ウェブアプリ<html>【IPAIPA 】を含む検索結果…</html>
は、取り消し線を引くHTMLタグ①’<html>
IPA
 】を含む②’ 【
IPA

検索結果
ウェブサーバ…</html>＋ウェブアプリ“
” および “
” がHTMLタグとして認識されてしまう （取り消し線が表示される）。
6

XSS脆弱性のタイプ⚫格納型（直接攻撃するタイプ）
攻撃には、脆弱性サイトのみを悪用する。
脆弱性サイトにスクリプトを埋め込んだ後は、当該サイトにアクセスするたびにスクリプトが実行される。
影響を受けるのは、脆弱性サイトにアクセスした人すべて⚫反射型（間接的に攻撃するタイプ）
攻撃には、罠サイトと脆弱性サイトの2サイトを悪用する。
罠サイト経由で脆弱性サイトにアクセスしたときにスクリプトが実行される。
影響を受けるのは、罠サイトのリンクからアクセスした人
Copyright © 2019 独立行政法人情報処理推進機構

7

XSS脆弱性のタイプ⚫格納型（直接攻撃するタイプ）
脆弱性のあるサイト
攻撃者 ①スクリプトを挿入
scriptHTMLscript②スクリプトを含んだHTMLを生成

利用者③アクセスするとスクリプトが実行される⚫反射型（間接的に攻撃するタイプ）
掲示板サイト

①スクリプトを含む
罠リンク
罠リンクを投稿HTML

script罠リンク

脆弱性のあるサイト③スクリプトが脆弱性のあるサイトで実行されるHTML
scriptCopyright © 2019 独立行政法人情報処理推進機構

リクエスト
レスポンス

②利用者が罠リンクをクリック

script④スクリプトが実行されたレスポンスが表示される

8

脆弱箇所の発見
ポイント： HTMLタグが解釈される箇所を発見する⚫ 入力フォームに以下の値を入力します✓ ‘>”><hr>⇒脆弱な箇所は水平な罫線が引かれる⚫ 別の値を入力することでも発見できます✓ <script>alert(“alert test”)</script>⇒脆弱な箇所はポップアップが表示される

Copyright © 2019 独立行政法人情報処理推進機構

9[演習]AppGoatの準備①AppGoatを起動します②以下の遷移で演習画面に移動します１.「実習環境へ」クリック
３. 「掲示板に埋め込まれるスクリプト(格納型)」クリック

４.「演習(発見)」クリック

2.「はい」クリック
Copyright © 2019 独立行政法人情報処理推進機構

10

[演習]AppGoatを用いた疑似攻撃体験⚫演習テーマ：「掲示板に埋め込まれるスクリプト（格納型）」⚫ミッション：スクリプトを埋め込んでみましょう！

Copyright © 2019 独立行政法人情報処理推進機構

11

[演習]演習の進め方
Step1：脆弱性となる箇所を見つける
手順1：掲示板の入力フィールドに様々な値を入力して、動作を確認する。
演習の手順

HTMLタグを入力して、脆弱な箇所を発見してみましょう

Step2：スクリプトを含むコメントを投稿する
手順2：スクリプトを掲示板サイトに投稿する。
演習の手順

攻撃者の立場で、罠の設置に必要な手順を考えてみましょう

Step3：掲示板サイトにアクセスする
手順3：掲示板サイトにアクセスして、スクリプトが実行されることを確認する。
演習の手順

利用者の立場になり、罠サイトにアクセスした後の影響を考えてみましょう
12
Copyright © 2019 独立行政法人情報処理推進機構

[演習]演習の進め方⚫ 演習を円滑に進めるために
AppGoatのヒント機能を使い、攻撃用スクリプトをコピーして使用ください。
Click!!
Click!!
ヒントをコピー
ダイアログが表示されるスクリプト<script>alert('Dialog by XSS')</script>

下記の手順で、HTMLソースを確認できます。
Internet Explorer

掲示板上で右クリックし、「ソースを表示」でHTMLソースを表示する。
Firefox

掲示板上で右クリックし、「このフレーム」⇒「フレームのソースを表示」でHTMLソースを表示する。
Copyright © 2019 独立行政法人情報処理推進機構

13

演習

演習はじめてください。
※演習が終わったら次のページで解説を行います。

Copyright © 2019 独立行政法人情報処理推進機構

14

[手順1]
入力フィールドに様々な値を入力する
演習の手順
HTMLタグを入力して、脆弱な箇所を発見してみましょう⚫ 掲示板の複数の入力欄に「’>”><hr>」を入れて、水平の罫線が引かれているところを探しましょう。
ウェブブラウザ上の表示⚫ 「本文」を入力する箇所で、入力した値がそのまま使われていることが確認できます。
HTMLソース
Copyright © 2019 独立行政法人情報処理推進機構

15

[演習]演習の進め方
Step1：脆弱性となる箇所を見つける
手順1：掲示板の入力フィールドに様々な値を入力して、動作を確認する。
演習の手順

HTMLタグを入力して、脆弱な箇所を発見してみましょう

Step2：スクリプトを含むコメントを投稿する
手順2：スクリプトを掲示板サイトに投稿する。
演習の手順

攻撃者の立場で、罠の設置に必要な手順を考えてみましょう

Step3：掲示板サイトにアクセスする
手順3：掲示板サイトにアクセスして、スクリプトが実行されることを確認する。
演習の手順

利用者の立場になり、罠サイトにアクセスした後の影響を考えてみましょう
16
Copyright © 2019 独立行政法人情報処理推進機構

[手順2]
スクリプトを掲示板サイトに投稿する
1. 攻撃者の立場になり、掲示板にスクリプトを埋め込みます。メッセージダイアログを表示させるスクリプトを使います。

2. 「投稿」ボタンを押下します。これでスクリプトの埋め込みが完了しました。

Copyright © 2019 独立行政法人情報処理推進機構

17

[手順3]
スクリプトが実行されることを確認する
1. 利用者の立場になり、掲示板サイトにアクセスします。
2. その結果、利用者のウェブブラウザ上でスクリプトが実行されます。

Copyright © 2019 独立行政法人情報処理推進機構

18

内容(演習2)⚫脆弱性の原理解説・基礎知識⚫演習2：アンケートページの改ざん（反射型）
⚫演習解説
⚫対策方法

Copyright © 2019 独立行政法人情報処理推進機構

19

[演習]AppGoatの準備①以下の遷移で演習画面に移動します１.「アンケートページの改ざん(反射型)」クリック
２.「演習(発見)」クリック

Copyright © 2019 独立行政法人情報処理推進機構

20

[演習]AppGoatを用いた疑似攻撃体験⚫演習テーマ：「アンケートページの改ざん（反射型）」⚫ミッション：
アンケートページを改ざんしてみましょう

Copyright © 2019 独立行政法人情報処理推進機構

21

[演習]疑似攻撃のイメージ
攻撃者

掲示板サイトClick

XSS脆弱性のあるアンケートサイト
スクリプト実行

利用者

Copyright © 2019 独立行政法人情報処理推進機構

22

[演習]演習の進め方
Step1：脆弱性となる箇所を見つける
手順1：アンケートページの入力フィールドに様々な値を入力して、動作を確認する。
演習の手順

HTMLタグを入力して、脆弱な箇所を発見してみましょう

Step2：罠リンクを設置する
手順2：「ヒント」などを参考に、スクリプトを実行させるURLを考える。
手順3：罠リンクを設置するため、Step2のURLを掲示板サイトに投稿する。
演習の手順

攻撃者の立場で、罠リンクの作成や設置に必要な手順を考えてみましょう

Step3：罠リンク経由でアンケートサイトにアクセスする
手順4：罠リンクをクリックして、スクリプトが実行されることを確認する。
演習の手順

利用者の立場になり、罠リンクをクリックした後の影響を考えてみましょう
23
Copyright © 2019 独立行政法人情報処理推進機構

[演習]演習の進め方⚫ 演習を円滑に進めるためにAppGoatのヒント機能を使い、攻撃用スクリプトをコピーして使用ください。
Click!!

Click!!

ヒントをコピー

下記の手順で、HTMLソースを確認できます。
Internet Explorer

アンケートページ上で右クリックし、「ソースを表示」でHTMLソースを表示する。
Firefox

アンケートページ上で右クリックし、「このフレーム」⇒「フレームのソースを表示」でHTMLソースを表示する。

Copyright © 2019 独立行政法人情報処理推進機構

24

演習

演習はじめてください。
※演習が終わったら次のページで解説を行います。

Copyright © 2019 独立行政法人情報処理推進機構

25

[Step1]
入力フィールドに様々な値を入力する
演習の手順
HTMLタグを入力して、脆弱な箇所を発見してみましょう⚫ アンケートサイトの複数の入力欄に「’>”><hr>」を入れて、アンケート内容に関するエラーページを表示してみましょう。
ウェブブラウザ上の表示⚫ アンケートページに送ったリクエスト(URL)のnameパラメータに脆弱性の存在する箇所と推測
URL
http://lPアドレス/Users/ログインID/Web/Scenario1121/VulSoft/enquete.php?
page=2&name=’>”><hr>&sex=0&old=50&company=’>”><hr>&xss=1&
trouble=1&content=’>”><hr>
Copyright © 2019 独立行政法人情報処理推進機構

26

[演習]演習の進め方
Step1：脆弱性となる箇所を見つける
手順1：アンケートページの入力フィールドに様々な値を入力して、動作を確認する。
演習の手順

HTMLタグを入力して、脆弱な箇所を発見してみましょう

Step2：罠リンクを設置する
手順2：「ヒント」などを参考に、スクリプトを実行させるURLを考える。
手順3：罠リンクを設置するため、手順2のURLを掲示板サイトに投稿する。
演習の手順

攻撃者の立場で、罠リンクの作成や設置に必要な手順を考えてみましょう

Step3：罠リンク経由でアンケートサイトにアクセスする
手順4：罠リンクをクリックして、スクリプトが実行されることを確認する。
演習の手順

利用者の立場になり、罠リンクをクリックした後の影響を考えてみましょう
Copyright © 2019 独立行政法人情報処理推進機構

27

[Step2]
スクリプトを実行させるURLを考える⚫ アンケートサイトのXSS脆弱性を突いて、ヒントで表示されたスクリプトを実行させるURLを考えましょう。
1. アンケートに答えて「アンケート投稿」ボタンを押下し、アクセスするURLを確認します。
アクセスするURL

http://IPアドレス/Users/ログインID/Web/Scenario1121/VulSoft/enquete.php?page=2&name=test&sex=0&old=30&company=&xss=1&t
rouble=1&content=

2. 脆弱性となる箇所（nameパラメータ）に、スクリプトに相当する文字列を入れます。
スクリプトを実行させるURL

http://IPアドレス/Users/ログインID/Web/Scenario1121/Vulsoft/enquete.php?page=2&sex=0&old=1&company=&xss=1&trouble=1&co
ntent=&name=<script>document.getElementById("account").innerHTML= '<font color="blue" size="3">もれなく一万円をプレゼントいたします。名前、住所、口座番号を入力してくださ い。</font>';</script>
Copyright © 2019 独立行政法人情報処理推進機構

28

[Step２]
手順2のURLを掲示板サイトに投稿する
1. 攻撃者の立場になり、掲示板に罠のリンクを作成します。罠のリンクには、先ほど作成したスクリプトを実行させるURLを入力します。

2. 「投稿」ボタンを押下します。これで罠リンクの設置が完了しました。

Copyright © 2019 独立行政法人情報処理推進機構

29

[Step３]
スクリプトが実行されることを確認する
1. 利用者の立場になり、罠のリンクをクリックし、アンケートページにアクセスします。

2. その結果、利用者のウェブブラウザ上でスクリプトが実行され、アンケートの内容が書きかえられることが確認できます。

Copyright © 2019 独立行政法人情報処理推進機構

30

対策方法の解説

対策の解説

Copyright © 2019 独立行政法人情報処理推進機構

31

対策のポイント⚫ ユーザが入力した文字列をHTMLタグとして解釈しないように処理する
検索キーワード
IPA
③

利用者【
IPA
】
は、取り消し線を引くHTMLタグ①②
ウェブサーバ＋ウェブアプリ<html>【 &lt;s&gt;IPA&lt;/s&gt;&lt;s&gt;IPA&lt;/s&gt;】

を含む検索結果…</html>を含む検索結果

Copyright © 2019 独立行政法人情報処理推進機構

32正しい対策の例⚫ HTMLにおける特別な意味を持つ「記号文字」をエスケープ処理する（文字参照に置換）例：< → &lt;> → &gt;" → &quot; & → &amp;' → &#039;

入力値：<script>alert("a");</script>
置換後：&lt;script&gt;alert(&quot;a&quot;);&lt;/script&gt;⚫ プログラム言語に用意されているエスケープ用の関数✓ Perl⇒escapeHTML()✓ PHP⇒ htmlspecialchars()
Copyright © 2019 独立行政法人情報処理推進機構

33以上で、クロスサイトスクリプティングの解説は終了です。

Copyright © 2019 独立行政法人情報処理推進機構

34