Starbuck Reflect XSS Writeup
はじめに
この記事は筆者が2019年2月にStarbucksのホームページで発見したXSSについてどのようにアプローチしたのかをまとめた記事です。
この脆弱性は既に修正されており、現在再現することはありません。
元のレポートは下記のリンクになります。
ターゲットを選択
BugBountyを行う上で最初に行うことはターゲットを選択することです。 そのためにはまずBugBountyを行っている会社を確認する必要があります。
無闇に攻撃を行ってもつかまるだけなので辞めましょうね。
BugBountyプラットフォームはいくつかあり、有名なところだとHackeroneやBugcrowdなどがあります。 当時筆者はHakceroneを使用しました。 HackeroneのページからProgram Directoryを確認します。
ここに載っているプログラムはBugBountyプログラムを行っている会社なので、攻撃を行うことが許されています。 しかし各プログラムにはポリシーが存在します。 その中にはスコープも設定されていて、対象ドメイン以外や対象外の脆弱性が記載されています。 また、行ってはいけない行為なども記載してあります。 確認しないで報告した場合は例え善意ある報告でもN/Aとしてマークされ、Reputationが下げられてしまいます。
そして、当時筆者はStarbucksに良く通っていたという単純な理由からターゲットをStarbuksに選択しました。
機能と脆弱性の選択
探す脆弱性を予め決めておくことによってそのエンドポイントに対していろいろなアプローチ案が浮かんだりしますが、これを決めていないと無鉄砲にペイロードを投げることになります。 そして、発見できるはずの脆弱性を見逃す可能性も出てきます。 当時筆者は脆弱性を一件も見つけたことがなく徳丸本を読んだ程度の知識しかなかったため最初にXSSを見つけてみようと思いました。 そして機能の選択ですが、これは探す脆弱性の種類によって異なります。 例えばCRLF Injectionを探すのに入力値がレスポンスヘッダに出力されないリクエストに対してペイロードを投げても意味がありません。 よって、まずはstarbucksで入力値が出力されてそうな場所の機能を探しました。 そして見つかったのが店舗検索機能です。
エスケープされていないかの確認
次の行ったのは基本的なXSSのエスケープが行われているかどうかです。 最初に無害なHTMLタグを挿入してみました。
検索ボタンをクリックしてレスポンスをみてもHTMLタグは挿入されていないようです。
アプローチの仕方を変える
入力フォームがあるページに戻って次に確認したことはinputタグのnameに設定されている値を確認することです。
inputタグのnameにfree_word
という値が設定されていることが確認できると思います。
starbucksのページはphpで動作しています。
phpはinputタグのnameの値を_GET["free_word"];
などで受け取ることができるため、検索フォームのページのリクエストパラメーターに?free_world=hello
を追加してみました。
その結果入力値がフォームに出力されることがわかりました。
次に入力値に">
を入力してみました。
出力結果に閉じタグが出てきました。
最後に"><script>alert(document.domain)</script>
入力すると
Tips
今回普通に検索フォームにXSSのペイロードを挿入してもXSSが発火することはありませんでした。
そして検索ボタンを押した際の遷移先のパラメーター名はkeyword
になっており、他のハンターもおそらくこのパラメーターは検証していたのではないかと思います。
これは言語によっても異なるかもしれませんが、inputタグのパラメーター名と遷移先のパラメーター名画異なる場合はinputタグのパラメーター名を使用してそのページにリクエストを送信してみてください。
もしかしたら、エスケープ漏れが見つかる可能性があり報奨金をもらえる可能性があります。
さいごに
今回僕が初めて脆弱性を発見した際のWriteup記事を描いてみました。 日本人バグハンターでBugBountyのWriteup記事を描いている人は多くないため、Tipsが日本語で降ってくることはなかなかありません。 筆者もTipsは基本的に英語のブログを読んで得ています。 最近は日本人でもバグハンターになりたいと行っている方をよくみます。 もっと日本人ハンターの人口が増えるためにも日本語の記事が増えたらなと思います。
また、今年最初に掲げた目標から最近の目標であった$1000を稼ぐことができました。
今年の目標は脆弱性を報告し、認定してもらうこと
— wa1m3im (@Wa1m3) 2019年1月11日
今年の目標$1000を稼ぐことができました。
— wa1m3im (@Wa1m3) 2019年12月20日
ギリギリで目標達成できたので良かったです。
何件も連続でDuplicateをもらいめげそうにもなりましたが、目標達成できてよかったです。
そして明日はクリスマスですね! メリークリスマス🎅