web-dev-qa-db-ja.com

これはdocument.location.toString()の使用法をDOMベースのXSS脆弱性ですか?

複数のWebアプリケーションで次のJSコードに遭遇しました。このコードスニペットの人気の理由は この受け入れられた回答 だと思います。開発者は、このコードを使用してメニュータブを切り替えているようです。

_var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
}
_

基本的には、_document.location_から読み取り、_#_の後のすべてを、サニテーションなしで$()に渡します。

Burp Suiteのアクティブスキャナーでさえ、True Positiveとして報告されます。

enter image description here

私はそれを悪用しようとしましたが、それは私にとって偽陽性のようです。私の仮説は、JSがURLをストリングとして変換しているため、ペイロード(特殊文字を含む)はすべてストリングとして扱われるというものです。

これをここに投稿して、DOMベースのXSSを引き起こすために他の方法を利用できるかどうかを確認できますか?

5
Rahil Arora

このコードスニペットは、1.9より前のjQuery(およびjQuery Migrateプラグインと組み合わせた場合)のXSSに対して脆弱です。今でも、それは少なくとも悪い習慣です。

$()jQuery()のショートカット)への文字列引数は、CSSセレクターまたはHTMLコードとして解析できます。文字列をHTMLとして解析すると、document.write()と同様に、XSSの脆弱性が含まれます。一方、CSSセレクターへの挿入は、現在のブラウザーでは直接利用できません。

V1.9の changelog は、解析動作をどのように変更したかを説明しています。

1.9より前は、文字列内にHTMLタグがある場合、その文字列はHTML文字列と見なされていました。これにより、コードが誤って実行され、有効なセレクター文字列が拒否される可能性があります。 1.9以降、文字列は、小なり( "<")文字で始まる場合にのみHTMLと見なされます。 Migrateプラグインを使用して、1.9より前の動作に戻すことができます。

スニペットの文字列('.nav-tabs a[href="#' + <payload> + '"]')は<で始まっていないため、ページでjQueryの現在のバージョンが実行されている場合は、独自のコードを挿入できません。

ただし、出力をサニタイズする必要があります。場合によっては、異なるモジュール(Wordpressプラグインなど)に独自のjQueryライブラリが付属しており、誤って新しいバージョンをオーバーライドしてレガシー動作を再導入する可能性があります。 簡単な修正は、location.hashが英数字でないか、事前定義されたリンクのリストに含まれていない場合、文字列を拒否します。

4
Arminius

これはjQueryでかなり一般的なXSS攻撃ベクトルであり、古いバージョンのjQueryを使用しているサイトにも影響を与える可能性があります。

https://bugs.jquery.com/ticket/9521

基本的に、文字列が無効なセレクターである場合、jQueryはそれをHTMLであると想定し、HTMLとして解析します。 jQueryバージョン1.9 では、<で始まっている場合、jQueryは文字列をHTMLとして解析するだけでこのリスクを軽減しました。最新のjQuery。

残念ながら、多くのサイトはまだ古いバージョンのjQuery(Stack Exchangeを含む)を使用しており、これにより 半最新のWordPress XSS攻撃 が原因でフォントアイコンライブラリのHTMLファイルの間違い。

1