XSS の変更点


#author("2023-02-26T11:04:08+09:00","default:k1rou","k1rou")
#author("2023-02-26T11:13:55+09:00","default:k1rou","k1rou")
*XSS とは [#sb9aae5c]
**名称 [#s45697e4]
-Cross-Site Scripting
-クロスサイトスクリプティング

**概要 [#pa5d273a]
-[[Webアプリ]]の[[脆弱性]]を利用して、ブラウザに対して攻撃する手法。
--Webページの入力データを[[サニタイズ]]しないで表示させている[[脆弱性]]を悪用した攻撃。
--Webページの入力データに含まれるスクリプトを[[サニタイズ]]せずに表示させているWebサイトの[[脆弱性]]を悪用した攻撃。
-不正な処理は、クライアント側で実行される。(サーバ側で実行されるのは、[[CSRF]])
-攻撃者は不正なスクリプトを含むページを表示させることで、利用者の個人情報等の盗難を試みる。
++攻撃者が用意したWebサイト上に、攻撃対象の脆弱性を持ったWebサイトへのリンク(スクリプトを仕込んだURL)を埋め込んでおく。
---リンクは攻撃者のWebサイトだけでなく、掲示板やSNS、メール本文等に埋め込んで誘導することも可能。
++攻撃者のWebサイト上のリンクをクリックすると、攻撃対象となったWebサイトが[[Cookie]]を発行されると同時に攻撃者が仕込んだスクリプトが表示される。
---スクリプトによって表示されるのは、入力欄やボタンなど。
++攻撃者が仕込んだスクリプトのリンクをクリックすると、閲覧者向けに発行された[[Cookie]]が攻撃者のWebサイトに転送される。

-攻撃により発生し得る被害
--利用者の個人情報等の盗難
--利用者のPC上のファイルの破壊、PCに[[バックドア]]が仕掛けられる等

-Cross-Site とは
--「[[Origin]]」参照

*XSSの分類 ([[CWE]]における分類) [#b267969c]
**Webページの出力処理の不備による脆弱性 [#f3cd2d72]
***反射型 (非持続型) [#c77ed70d]
--Reflected XSS Attacks
--[[フィッシング]]などで偽装した罠サイトに誘導してから、罠サイト経由でXSSの[[脆弱性]]がある正規のWebサイトを書き換える。
--攻撃者のJavaScriptの配置場所
---JavaScriptが攻撃対象のWebサイトとは別のWebサイトにある。
---攻撃対象のWebサイトの作りが、入力値を表示する箇所の[[脆弱性]]が攻撃箇所になる。

***格納型 (持続型) [#n6136a98]
--Stored XSS Attacks
--Persistent XSS Attacks
--攻撃対象のWebサイト([[SNS]]、[[Webメール]]等)に投稿により、攻撃用のJavaScriptを仕込まれる。
--攻撃者のJavaScriptの配置場所
---JavaScriptが攻撃対象のデータベース等に保存される。

**JavaScriptを用いたWebページの出力処理([[DOM]]操作)の不備による脆弱性 [#b89b0f58]
***Dom Based XSS [#o1d3f3bb]

*攻撃の内容 [#mfef26a0]
**直接的な攻撃方法 [#za1b7f14]
-[[Cookie]]を盗む
-偽の[[JavaScript]]を実行する
-偽情報や偽装した入力フォームを表示する

**偽装したWebページの特徴 [#j5458d03]
-URLが正規のWebサイトと同じ
--URLでWebページの表示内容が正規のものであるか(偽装されていないか)判断できない。
-[[HTTPS]]の場合、[[SSL]]証明書が正規のWebサイトと同じ
--[[SSL]]証明書を確認してもWebページの内容が正規のものであるか(偽装されているか)できない。

*対策 [#h4d2a4e6]
**対策(Webアプリケーション) [#y14d0fa9]
***エスケープ処理 [#b518e46f]
-エスケープの種類
--[[HTML]]の[[特殊文字]]のエスケープ (Output Escaping)
---出力する値に含まれる[[HTML]]の[[メタ文字]]を通常の文字として扱うよう変換することで、[[メタ文字]]が持つ効果を無効にする処理のこと。
--JavaScriptの[[特殊文字]]のエスケープ (JavaScript Escaping)
---出力する値に含まれる[[JavaScript]]の[[特殊文字]]を通常の文字として扱うように変換することで、[[特殊文字]]が持つ効果を無効にする処理のこと。
--イベントハンドラの値のエスケープ (Event handler Escaping)

-[[HTML]]の[[特殊文字]]のエスケープ 
--HTMLの要素に含まれる文字に対するエスケープ
---「<」->「&lt;」 ※必須
---「&」->「&amp;」 ※必須
---「>」->「&gt;」
--HTMLの属性値に含まれる文字に対するエスケープ
---「<」->「&lt;」 ※必須
---「&」->「&amp;」 ※必須
---「>」->「&gt;」
---「"」->「&quot;」 ※必須
---「'」->「&#39;」

-[[JavaScript]]の[[特殊文字]]のエスケープ
--イベントハンドラの引数に含まれる文字に対するエスケープ
---「\」->「\\」
---「'」->「\'」
---「"」->「\"」
---「改行」->「\n」

-script要素内にあるスクリプトに対する対策
--そもそもscript要素内のスクリプトの文字列リテラルを動的に生成しない。
--カスタムデータ属性を利用して取得して設定する。

-スクリプトのスキームを不許可にする
--属性値にURLを指定する属性にスクリプトのスキームが指定された場合、スクリプトが実行されないようにする対応。
--JavaScriptスキーム(javascript:)、VBScriptスキーム(vbscript:)

-HTMLの属性値(URL)に対する対策
--対象となるHTMLタグと属性
---aタグのhref属性
---imgタグのsrc属性
--対策の内容
---HTTPスキーム(http:)とHTTPSスキーム(https:)であることをチェックする。
---URLがHTTPや[[HTTPS]]で始まるもののみ許可する。
---HTMLエスケープによるURLのパーセントエンコードをする。

-エスケープ処理の関数 (PHP)
--htmlspecialchars()

***[[HTTP]]レスポンスヘッダの指定 [#rfb6589d]
-Content-typeのcharset
--文字エンコーディングを正しく指定する。

-X-XSS-Protection
--[[Webブラウザ]]のXSSフィルタ機能(反射型XSSを無効にする機能)を有効にする。
--[[Webサーバ]]で出力するようにすると便利。

-Content-Security-Policy

***HTMLタグの属性値 [#p6294776]
-属性値をダブルコート「"」で囲み必ず文字列として扱われるようにする。

***参考情報 [#b457528d]
-第三者が提供するスクリプトファイルを使わない。
--任意のサイトが提供するJavaScriptファイルを自サイトに埋め込んだ場合、攻撃を受ける危険性が高くなる。
--提供元が信用できない場合は、使うべきではない。(そもそもが悪意のあるスクリプト、サーバの脆弱性でスクリプトが差し替えられる)

**対策(その他) [#v8ccd529]
-[[Cookie]]にHttpOnly属性を指定する。
--[[HTTP]]ヘッダからしか[[Cookie]]にアクセスできなくなる
--[[JavaScript]](document.cookie)を使って[[Cookie]]にアクセスできなくなる。
--古いブラウザはHttpOnly属性に対応していないものがある

***参考情報 [#c0738a02]
-[[Cookie]]にdomain属性を指定(Cookieの有効範囲を自身のウェブサイトのドメインに限定)しても、XSSの攻撃を防ぐことはできない。

*関連サイト [#w79ca460]
-CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')~
https://cwe.mitre.org/data/definitions/79.html

-CWE-79 クロスサイトスクリプティング - [[JVN]]~
https://jvndb.jvn.jp/ja/cwe/CWE-79.html

-DOM Based XSSに関する脆弱性の届出が急増 (2013.1.29) - [[IPA]]~
https://www.ipa.go.jp/about/technicalwatch/20130129.html

*関連用語 [#sbcd1a7c]
-[[セキュリティ]]
-[[セッション・ハイジャック]]
-[[サニタイズ]]
-[[ヌルバイト攻撃]]
-[[フィッシング]]
-[[SOP]] -Same Origin Policy(同一生成元ポリシー)
-[[WAF]]
-[[CSRF]] -クロスサイトリクエストフォージェリ
-[[XST]] -Cross-site Tracing