#author("2024-10-05T20:05:46+09:00","default:k1rou","k1rou") #author("2024-10-05T20:06:16+09:00","default:k1rou","k1rou") *XSS とは [#sb9aae5c] **名称 [#s45697e4] -Cross-Site Scripting -クロスサイトスクリプティング **概要 [#pa5d273a] -[[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 --コンテンツセキュリティポリシー(CSP)を設定する。 --コンテンツセキュリティポリシー([[CSP]])を設定する。 ***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