2023年1月21日
ながれ
- 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になるのかがわからない。
js、jqueryによるhtmlの生成がよくわかってない。
jsの文法がよくわかってない。
なぜ「&&」とかで文字列が戻るのか・・・
ちなみにEdgeは発生した。