私は主にサイバーセキュリティの初心者です。先日、JQuery 1.3.2がCSSセレクターとロケーションハッシュ( source )に対して脆弱であることを知りました。
XSSの仕組みを理解し、CSSセレクターとは何かを知っています。しかし、CSSクラスセレクターの脆弱性が何を意味するのか本当に理解できません。サイトがJQuery 1.3.2を使用している場合に、XSS攻撃を実行することが可能である場合とはどういう意味ですか?もしそうなら、それはどのような方法で可能でしょうか?
これが実際のシナリオでどのように機能するかを誰かが説明できたら、本当に感謝します。
JQueryでは、CSSセレクターとHTMLコードを同じ省略形で指定できます。
これはセレクタです:
_$('#some-thing')
_
これはすぐに評価されるHTMLです。
_$('<svg onload=alert(1)>')
_
これは、ロケーションハッシュ(_#
_の後のURL部分)からセレクターを解析するための実際のコードサンプルです。
_var x = $('#' + window.location.hash.substr(1));
x.addClass('highlighted').find('div').show();
_
これは this question から取得され、同様のアプローチが(危険な) this SO thread で推奨されています。
それで問題を参照してください?著者の意図は、ユーザーが制御するCSSセレクターを許可することでしたが、影響を受けるサイトをhttps://example.com/#<svg onload=alert(1)>
として開くと、次のあいまいなセレクターになります。
_$('#<svg onload=alert(1)>');
_
古いバージョンのjQueryはこれをHTMLコードとして実行し、DOMノードが作成されるとすぐにJSイベントハンドラーが実行されるため、XSSの問題が発生します。ただし、新しいバージョンでは、山かっこで始まっていない文字列はセレクターとして解析する必要があると判断して、問題を軽減しています。
the docs から:
文字列がパラメータとして
$()
に渡される場合、jQueryは文字列を調べて、HTMLのように見えるかどうかを確認します(つまり、_<tag ... >
_で始まります)。そうでない場合、上記で説明したように、文字列はセレクタ式として解釈されます。ただし、文字列がHTMLスニペットのように見える場合、jQueryはHTMLで記述されているように新しいDOM要素を作成しようとします。
この動作がどのように変更されたかについては、ディスカッションで bug#9521 を参照してください。
リンクしたページは、各バージョンが脆弱であるセレクタの種類をメモしているだけです。