jQueryの脆弱性 CVE-2011-4969(XSS) 再現してみた

ネタ元

CVE-2011-4969

github

調査

ながれ

  • jqueryの使い方
  • 脆弱性の検証について
    • 事象
    • どこがどう修正されている?
    • どんな意味か?
    • 検証
    • なぜ起きる?

jqueryの使い方

脆弱性の検証について

事象

「$(location.hash)」の取り扱いによるXSS

bugs.jquery.com

どこがどう修正されている?

修正前

quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,

修正後

quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
修正前:quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
修正後:quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,  
どんな意味か?

修正前
検証
①#<test>
②#test

方法
match後をコンソールログに表示させる。
検証ソース


①#<test>

「#<test>」がデータとして取得されている。

②#test

「#test」がデータとして取得されている。

修正後
検証
①#<test>
②#test

方法
match後をコンソールログに表示させる。
検証ソース


①#<test>

「#<test>」がデータとして取得されていない。

②#test

「#test」がデータとして取得されている。

検証

ペイロード

#<img src=/ onerror=alert(1)>

検証ソース
上記正規表現の時に使用したソースと同じ。

手順
ペイロードを仕込んだリンクをクリックする。

IE11で実施。

出た。

検証ソースを修正後のものに変更。

出ない。

なぜ起こるか?

正規表現によるチェックにおいて、location.hash経由でタグを指定されると正しくタグを排除できずに処理が進んでしまうため。
なぜタグを排除できずに処理が進むとXSSになるかはわからんかった。。。

「jQuery.buildFragment」の「args」にタグが格納されていることはわかったが、どう処理したらXSSになるのかがわからない。

課題

なぜ正しくチェックできないとXSSになるのか?

js、jqueryによるhtmlの生成がよくわかってない。
jsの文法がよくわかってない。

なぜ「&&」とかで文字列が戻るのか・・・

なぜfirefoxとchromeは起きなかったのか?

ちなみにEdgeは発生した。

コメント

タイトルとURLをコピーしました