めざせソースコード解析 Master その1【jQuery CVE-2011-4969】

ネタ元

CVE

www.cvedetails.com





github

github.com





調査

ながれ

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



jqueryの使い方

qiita.com



脆弱性の検証について

事象

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

bugs.jquery.com



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

修正前 f:id:NickShadows:20190922152537p:plain





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





修正後
f:id:NickShadows:20190922152733p:plain





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





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





どんな意味か?

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

方法
match後をコンソールログに表示させる。
検証ソース
f:id:NickShadows:20190922152820p:plain f:id:NickShadows:20190922152950p:plain





①#<test>
f:id:NickShadows:20190922153104p:plain



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


②#test
f:id:NickShadows:20190922153145p:plain



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


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

方法
match後をコンソールログに表示させる。
検証ソース
f:id:NickShadows:20190922153542p:plain f:id:NickShadows:20190922153224p:plain





①#<test>
f:id:NickShadows:20190922153614p:plain



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


②#test
f:id:NickShadows:20190922153725p:plain



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


検証

ペイロード

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

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




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


IE11で実施。
f:id:NickShadows:20190922154506p:plain


出た。


検証ソースを修正後のものに変更。
f:id:NickShadows:20190922154718p:plain

f:id:NickShadows:20190922154735p:plain

f:id:NickShadows:20190922154807p:plain



出ない。


なぜ起こるか?

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

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





課題

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

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


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

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

ちなみにEdgeは発生した。