本記事は脆弱性"&'<<>\ Advent Calendar 2016の14日目の記事です。
昨年の脆弱性"&'<<>\ Advent Calendar 2015ではAmazonにXSSを2つ報告した記事を書きましたが、これの2つ目のXSSに類似したXSSを最近またAmazonに発見・報告したお話です。
概要
スクリーンショットの通り、www.amazon.co.jpの検索バーから'><script>alert(1)</script>
と検索するだけで起きる反射型XSSです。
<div data-ad-details='{"adPlacementMetaData": {"searchTerms": "<the_search_query>", ...}}'>
という風にシングルクオートで囲ったattributeに検索クエリを含むJSONを書き込んでいる箇所で、シングルクオートがエスケープされていないことが問題でした。
<div data-ad-details='{"adPlacementMetaData": {"searchTerms": "'><script>alert(1)</script>", ...}}'>
このようにJSONやJavaScriptの中に含まれる文字列では、問題を引き起こしている'
を含め検索クエリ全体をUnicode Escape Sequenceに変換して\x27\x3e\x3cscript\x3ealert\x281\x29\x3c\x2fscript\x3e
とするのが安全なエスケープ方法です。
<div data-ad-details='{"adPlacementMetaData": {"searchTerms": "\x27\x3e\x3cscript\x3ealert\x281\x29\x3c\x2fscript\x3e", ...}}'>
jjencode yet again
冒頭で以前発見したXSSに類似していると書いたのは、これも検索の結果Amazonの商品が1つ以上ヒットしないと問題の箇所が出力されず、XSSが起きないという性質のためです。今回も"High Alert Status"というレーベルの"Degree of the Streets Volume 1"というアルバムに収録されている"Script Ta Unscripted"という楽曲が仕事をしてくれたおかげで'><script>alert(1)</script>
によりXSSが確認できました。(画像1枚目)
なので、今回もjjencodeなどで検索を邪魔しないようにして<script>
タグを注入することで任意のJavaScriptを仕込むことができました。
2016/12/9に報告し、1日で修正されました。ちなみに、その修正方法が少し変わっていて、検索クエリをbase64で出力するというものでした。
% echo -n 'Jz48c2NyaXB0PmFsZXJ0KDEpPC9zY3JpcHQ+' | base64 -D
'><script>alert(1)</script>
結論・所感
Amazonにバグバウンティ来ないのか (575)