ネタ元
調査
ながれ
- jqueryの使い方
- 脆弱性の検証について
- 事象
- どこがどう修正されている?
- どんな意味か?
- 検証
- なぜ起きる?
脆弱性の検証について
事象
「$(location.hash)」の取り扱いによるXSS
どこがどう修正されている?
修正前

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は発生した。
コメント