(A7) Cross-Site Scripting (XSS)

2022/01/21

XSSのレッスンについて

● このレッスンで学ぶこと

○ XSSとは何か

○ 元の開発者が意図しない動作をどのように引き起こすか



2

1 2 3 4 5 6 7 8 9 10 11 12
XSSのレッスンについて

● ゴール

○ 以下を説明できること

■ XSSの基本的な内容

■ XSSがどのように動作するか

○ XSSを実際に見せて説明できる

■ リフレクテッドXSS

■ DOMベースXSS 

1 2 3 4 5 6 7 8 9 10 11 12
クロスサイトスクリプティング(XSS)と
は

● 以下のタグを用いて、開発者が意図しない動作をさせる脆弱性

○ HTMLタグ

○ Scriptタグ

● サニタイジングやエンコーディングされずにブラウザにレンダリングさ
れることにより発生する

1 2 3 4 5 6 7 8 9 10 11 12
クロスサイトスクリプティング(XSS)と
は

● 有害でかつ一般的なセキュリティの問題

○ 攻撃から守る方法はよく知られている

■ しかし、問題が残っているWebサイトもたくさんある

○ 対応箇所が多いため、修正漏れが起こりやすい

● XSSが与えるインパクト

○ JavaScript経由で呼び出される特権関数が危険にさらされる

○ 適切に保護しないと、Cookieのような機微なデータが盗まれる

1 2 3 4 5 6 7 8 9 10 11 12
XSSのサンプル

● JavaScriptコンソールに以下を入力するとXSSが発生する





● 脆弱な入力フィールドに以下の値を入力するとXSSが発生する

alert("XSS Test");

alert(document.cookie);

<script>alert("XSS Test")</script>

1 2 3 4 5 6 7 8 9 10 11 12
FirefoxでJavaScriptを実行してみよう

1. ふたつめのタブを開きます

2. WebGoatのページのURLを入力します

3. それぞれのタブのJavaScriptコンソールに以下を入力します







alert(document.cookie);

それぞれのタブのCookieは同じでしょうか

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
JavaScriptコンソールの開き方

JavaScriptコンソールは以下の流れで開きます

1. Developer Toolsを開く

– 【F12】を押下

2. コンソールタブへ移動する

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
JavaScriptコンソールの開き方

コピーしたテキストをコンソールに貼付すると上記の警告が表示されます
(初回のみ)
allow pastingとコンソールに入力後、貼付しなおしてください。
1 2 3 4 5 6 7 8 9 10 11 12
Try it!
FirefoxでJavaScriptを実行してみよう

• ふたつめのタブを開きます

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
FirefoxでJavaScriptを実行してみよう

• WebGoatのページのURLを入力します

http://localhost:8080/WebGoat/start.mvc#lesson/CrossSiteScripting.less
on/1

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
FirefoxでJavaScriptを実行してみよう

• コンソールに下記を入力します

javascript:alert(document.cookie);

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
FirefoxでJavaScriptを実行してみよう

• Cookieが表示されます。もう一つのタブでも試してみましょう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
FirefoxでJavaScriptを実行してみよう

• 二つのタブで同じ値なので、テキストボックスに

「yes」と入力します

yes

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
よくXSSが発生する箇所

● 入力した検索条件を表示するフィールド

● ユーザデータを表示する入力フィールド

● ユーザの入力値を表示するエラーメッセージ

● ユーザの入力値を保持するhiddenフィールド

● ユーザの入力値を表示するページ

○ メッセージボード

○ 自由に入力できるコメント

● HTTPヘッダー

1 2 3 4 5 6 7 8 9 10 11 12
XSSに対処しないといけない理由

● XSSにより以下のことが引き起こされる

○ セッションのCookieが盗まれる

○ 不正なリクエストが作成される

○ クレデンシャル情報(ユーザ認証に利用される情報)を収集す
る不正なフィールドが作成される

○ 不正なサイトへのリダイレクトが埋め込まれる

○ 正当な利用者になりすますリクエストを作成する

1 2 3 4 5 6 7 8 9 10 11 12
XSSに対処しないといけない理由

● XSSにより以下のことが引き起こされる

○ クレデンシャル情報が盗まれる

○ 利用者のPCで悪質なコードの実行される

○ 敵対的で不適切なコンテンツが挿入される

<img src=“http://malicious.site.com/image.jpg/>

“>GoodYear recommends buying BridgeStone tires…

1 2 3 4 5 6 7 8 9 10 11 12
XSSに対処しないといけない理由

● フィッシング攻撃に悪用されてしまう

○ ユーザが普段利用しているサイトが攻撃に利用される

1 2 3 4 5 6 7 8 9 10 11 12
XSSの事例

● 米オークションサイトの「eBay」でXSSの脆弱性を悪用され、アカ
ウント情報が盗まれた

○ 出品リストに悪質なJavascriptを埋め込まれた

○ 出品リストを利用者が表示するとコードが実行され、偽装され
たログインフォームにリダイレクトされた

https://news.netcraft.com/archives/2017/02/17/hackers-still-exploiting
-ebays-stored-xss-vulnerabilities-in-2017.html

XSSの種類

● リフレクテッドXSS

○ ユーザのリクエストを元に以下が実行される

■ ユーザのブラウザに悪意のあるコンテンツを表示する

■ サーバーからのレスポンスに悪意のあるコンテンツを追加
する

■ ブラウザユーザの権限で任意の処理を実行する

○ 悪用するためにソーシャルエンジニアリングが必要

1 2 3 4 5 6 7 8 9 10 11 12
XSSの種類

● DOMベースXSS

○ ユーザのリクエストを元に以下が実行される

■ クライアントサイドスクリプトによって、悪意のあるコンテン
ツを書き込む

■ ブラウザユーザの権限で任意の処理を実行する

○ リフレクテッド型と似ている

1 2 3 4 5 6 7 8 9 10 11 12
XSSの種類

● ストアドXSS

○ 悪意のあるコンテンツがサーバに蓄積される

■ 蓄積される場所の例

● データベース

● ファイルシステム

○ 蓄積されたコンテンツがユーザのブラウザに表示される

○ 悪用するためにソーシャルエンジニアリングが必要ない

1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSのシナリオ

● 攻撃者は被害者に悪意あるURLを送る

● 被害者はリンクをクリックしてしまう

● URLに不正なスクリプトが埋め込まれており、被害者のブラウザで
悪意あるスクリプトが実行される

○ スクリプトでセッションIDなどの機微な情報が盗まれ、攻撃者に
送信される

1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSのシナリオ

1 2 3 4 5 6 7 8 9 10 11 12
1)XSSの脆弱性を見つける

2)悪意あるURLを送る
 3)URLをクリックする

4)攻撃がサイトへ送られる

5)攻撃が被害者へ反射する

6)攻撃が実行される

7)被害者のブラウザから機
微な情報が送信される

リフレクテッドXSSに挑戦してみよう

● すべての入力について検証するのがよいプラクティスです

○ XSSはユーザの入力が検証されていない時に発生します

● リフレクテッドXSSでは攻撃者は悪意あるスクリプトを含んだURLを
作成し、クリックさせるため次のようなことをします

○ そのURLを他のWebサイトに投稿する

○ メールで送る 

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

● XSSの影響を受けるフィールドを特定してみましょう

● alert()かconsole.log()を利用して、入力フィールドがXSSに脆弱かを
確認できます

○ この方法を利用して脆弱なフィールドを見つけましょう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

● ヒント1

○ 入力がどのように処理されるかを考えてください

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

● ヒント1

○ 入力がどのように処理されるかを考えてください

● ヒント2

○ Quantityの入力はおそらく数字として処理されています

○ テキストを入力できる箇所はあるでしょうか

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

● ヒント1

○ 入力がどのように処理されるかを考えてください

● ヒント2

○ Quantityの入力はおそらく数字として処理されます

○ テキストを入力できる箇所はあるでしょうか

● ヒント3

○ ボタンを押した後に、入力した情報は画面に表示されているで
しょうか

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

● ヒント2

○ Quantityの入力はおそらく数字として処理されます

○ テキストを入力することはできるでしょうか

● ヒント3

○ ボタンを押した後に、入力した情報は画面に表示されているで
しょうか

● ヒント4

○ 「Purchase」ボタンを押してみましょう。購入後の確認メッセージ
でJavascriptを実行してみてください

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
<script>alert(1);</script>

(答え)

リフレクテッドXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
入力後に「Purchase」ボタンを押す

(答え)

リフレクテッドXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
入力したjavascriptが実行されます

(答え)

脆弱性のあるJavaコード

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
fild1を出力用文字列
にそのまま結合
(答え)

Self XSS or リフレクテッドXSS

● lesson7でスクリプトを実行できたはずです。ただし、この時
点では、"Self XSS”と見なされます。

● なぜでしょうか?

● XSSを引き起こすためのリンクがないからです。以下を試し
て、何が起こるかを確認してください。

localhost:8080/WebGoat/CrossSiteScripting/attack5a?QTY1=1&QTY2=1&QTY3=1&
QTY4=1&field1=<script>alert('my%20javascript%20here')</script>4128+3214+0002+1
999&field2=111

1 2 3 4 5 6 7 8 9 10 11 12
Self XSS or リフレクテッドXSS

1 2 3 4 5 6 7 8 9 10 11 12
● XSSが含まれるテキストが"output"に返ってくる。(本リンク
押下ではポップアップは発生しない)

● このoutputの値を用いて攻撃をレンダリングするとalertが実
行される。

(実行結果)

リフレクテッド XSS、DOMベース XSS

● DOMベースのXSSは、リフレクテッドXSSのもう1つの形式で
す。どちらも、ブラウザで反射する(ブラウザに表示される)入
力を持つリンクにより発動されます。 

● DOMと”従来の”リフレクテッドXSSの違いは、DOMでは、ペイ
ロードがサーバーに送信されないことです。クライアント側の
みで処理されます。

1 2 3 4 5 6 7 8 9 10 11 12
リフレクテッドXSS、DOMベース XSS

● 攻撃者は悪意のあるURLを被害者に送信

● 被害者がリンクをクリック

● リンク先は「悪意のあるWebページ」、または「脆弱な遷移先
のWebページ」の可能性

● 悪意のあるWebページの場合、自身のJavaScriptを使用し
て、別のページ/ URLを攻撃する可能性がある

1 2 3 4 5 6 7 8 9 10 11 12
(攻撃シナリオ例 1/2)

● 脆弱なページはペイロードをレンダリングし、ページ/サイト
のコンテキストで攻撃を実行

● 悪意のあるスクリプトは、ローカルアカウントの特権でコマン
ドを実行する可能性がある



被害者は攻撃が発生したことに気づかない。。。

攻撃者は、”<script>alert('xss')</ script>”は使用しません。

1 2 3 4 5 6 7 8 9 10 11 12
(攻撃シナリオ例 2/2)

リフレクテッドXSS、DOMベース XSS

DOMベース XSSの可能性を特定

● DOMベースのXSSは通常、クライアント側のコードでルート
構成を探すことで見つけることができます。ページに反射さ
れている入力を受け取るルートを探します。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(問題文の日本語訳)

DOMベース XSSの可能性を特定

● この例では、ルートハンドラーで「test」コードを探します。
WebGoatでは、主要なJavaScriptライブラリとして
backbone.jsを使用します。

● テストコードが実稼働環境に残る場合があります。多くの場
合、テストコードは非常に単純であり、セキュリティや品質管
理に欠けています!

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(問題文の日本語訳)

DOMベース XSSの可能性を特定

● あなたの目的は、ルートを見つけてエクスプロイトすることで
す。最初に…基本ルートは何ですか?例として、このレッス
ンのURLを見てください。

/WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9

のようになります。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(問題文の日本語訳)

DOMベース XSSの可能性を特定

● この例のベースルートは、start.mvc#lesson/ です。

その後の CrossSiteScripting.lesson/9は、JavaScriptの
ルートハンドラーによって処理されるパラメータです。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(問題文の日本語訳)

DOMベース XSSの可能性を特定

● 開発中アプリに残ったテストコードのルートは何ですか?こ
の問題に答えるには、JavaScriptソースを確認する必要が
あります。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(問題文の日本語訳)

テストコードのベース
ルートを探して、入力
します。
DOMベース XSSの可能性を特定

● クライアント側のコードを検索するには、ブラウザの開発者
ツールを使用します。

(使用方法がわからない場合は、〔WebGoat〕-〔General〕の開発者ツー
ルのレッスンを確認してください。)

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(ヒント1)

ヒントが表示され
ます。
DOMベース XSSの可能性を特定

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(右クリック)

●Firefox:開発ツール
 ●Chrome:開発ツール

DOMベース XSSの可能性を特定

● アプリケーションコードを探しているので、
WebGoat/js/goatAppフォルダのroutesを処理するファイル
を確認します。





1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(ヒント2)

(参考)

デバッガーの”Ctrl + Shift + F”で
javaScriptから任意の文字が検索で
きます。

DOMベース XSSの可能性を特定

● 回答は、ベースルートを送信してください。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(ヒント3)

(参考)

このlessonのベースルートは、start.mvc#lesson/ です。

DOMベース XSSの可能性を特定

● まだ見つかりませんでしたか? GoatRouter.jsファイルを確
認します。簡単に判別できるはずです。

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(ヒント4)

DOMベース XSSの可能性を特定

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(答え)

‘lessonRoute’とは
別に、’testRoute’が
あります。
DOMベース XSSの可能性を特定

1 2 3 4 5 6 7 8 9 10 11 12
Try it!
(答え)

start.mvc#test/

● この例のベースルートは、start.mvc#lesson/ なので、
lessonをtestに変えたルートが答えです。

⇒ start.mvc#test/

DOMベースXSSに挑戦してみよう

● webgoat.customjs.phoneHome()を実行してみましょう

○ 前レッスンのTry Itで見つけたテストルートを利用します

■ 渡したパラメータがそのまま画面に表示されています

■ エンコードされずに内部関数が実行されています

○ 新しいTabを開き、URL経由で関数を実行しましょう

○ 関数を実行するとランダムの値がコンソールに表示されます

■ 表示された値をテキストボックスに入力してください

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント1

○ 新しいタブを開き、前回のレッスンで発見したテストルートをURL
に入力します

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント1

○ 新しいタブを開き、前回のレッスンで発見したテストルートをURL
に入力します

● ヒント2

○ URLは以下のような形になります

■ http://localhost:8080/WebGoat/start.mvc#テストルート/パ
ラメータ

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント2

○ URLは以下のような形になります

■ http://localhost:8080/WebGoat/start.mvc#テストルート/パラメー
タ

● ヒント3

○ テストルートに送ったパラメータは画面に表示されます

■ パラメータにJavaScriptを加えてみましょう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント2

○ URLは以下の形になります

■ http://localhost:8080/WebGoat/start.mvc#テストルート/パラメー
タ

● ヒント3

○ テストルートに送ったパラメータは画面に表示されます

■ パラメータにJavaScriptを加えてみましょう

● ヒント4

○ Scriptタグを使う必要があります

○ JavaScriptはレンダリングされたときに実行されます

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント3

○ テストルートに送ったパラメータは反射されます

■ それを利用してJavaScriptを実行してみましょう

● ヒント4

○ Scriptタグを使う必要があります

○ JavaScriptはレンダリングされたときに実行されます

● ヒント5

○ URLバーを利用するので、パラメータに対しURLエンコードする必要が
あります

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

● ヒント4

○ Scriptタグを使う必要があります

○ JavaScriptはDOMにレンダリングされたときに実行されます

● ヒント5

○ URLバー利用するので、パラメータに対しURLエンコードする必要があ
ります

● ヒント6

○ 「/」を「%2F」に置き換える必要があります

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
DOMベースXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• ふたつめのタブを開きます

(答え)

DOMベースXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• アドレスバーに以下を入力します

http://localhost:8080/WebGoat/start.mvc#test/<script>webgo
at.customjs.phoneHome()<%2fscript>



(答え)

DOMベースXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• F12を押して、phoneHome Responseを確認します

(答え)

DOMベースXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• F12を押して、phoneHome Responseを確認します

(答え)

DOMベースXSSに挑戦してみよう

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• 確認した値を入力し、「submit」ボタンを押します

(答え)

DOMベースXSSに挑戦してみよう(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストからXSSまでの流れ

http://localhost:8080/WebGoat/start.mvc#test/パラメータで
は、testRouteメソッドが呼ばれる



DOMベースXSSに挑戦してみよう(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストからXSSまでの流れ

testRouteメソッドでは、lessonController.testHandlerにパラメー
タを渡している

DOMベースXSSに挑戦してみよう(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストからXSSまでの流れ

testHandlerでは、lessonContentView.showTestParamにパラ
メータを渡している

DOMベースXSSに挑戦してみよう(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストからXSSまでの流れ

showTestParamでは、パラメータをエンコードせずにHTMLに
セットしている

参考資料 A7:2017(XSS)

# 資料名 カテゴリ URL
1 OWASP Top 10
-2017
A7 クロスサイトスクリプティング (XSS) https://owasp.org/www-pdf-archive/OWASP_Top
_10-2017(ja).pdf
2 OWASP Web
Security Testing
Guide v5.0
Reflected Cross Site Scripting https://owasp.org/www-project-web-security-testing-g
uide/latest/4-Web_Application_Security_Testing/07-I
nput_Validation_Testing/01-Testing_for_Reflected_C
ross_Site_Scripting
3 Stored Cross Site Scripting https://owasp.org/www-project-web-security-testing-g
uide/latest/4-Web_Application_Security_Testing/07-I
nput_Validation_Testing/02-Testing_for_Stored_Cro
ss_Site_Scripting
4 OWASP Cheat
Sheet
Cross Site Scripting Prevention https://cheatsheetseries.owasp.org/cheatsheets/Cros
s_Site_Scripting_Prevention_Cheat_Sheet.html
5 DOM based XSS Prevention https://cheatsheetseries.owasp.org/cheatsheets/DO
M_based_XSS_Prevention_Cheat_Sheet.html
以下、補足

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ

画面描画の流れ(補足)

Try it!
1 2 3 4 5 6 7 8 9 10 11 12
• リクエストから画面描画までの流れ


(A7)cross site scripting