バグハンターに憧れた人間の日記

バグハンターに憧れた学生がバグハンターになるためにやってきたことについて、書いていくブログです。もし、筆者がバグを見つけれるようになった時にこれからバグハンターになってみたいと思う人の道導になればと思います。

Starbuck Reflect XSS Writeup

はじめに

この記事は筆者が2019年2月にStarbucksのホームページで発見したXSSについてどのようにアプローチしたのかをまとめた記事です。

この脆弱性は既に修正されており、現在再現することはありません。

元のレポートは下記のリンクになります。

hackerone.com

ターゲットを選択

BugBountyを行う上で最初に行うことはターゲットを選択することです。 そのためにはまずBugBountyを行っている会社を確認する必要があります。

無闇に攻撃を行ってもつかまるだけなので辞めましょうね。

BugBountyプラットフォームはいくつかあり、有名なところだとHackeroneやBugcrowdなどがあります。 当時筆者はHakceroneを使用しました。 HackeroneのページからProgram Directoryを確認します。

hackerone.com f:id:wa1m3im:20191224170922p:plain

ここに載っているプログラムはBugBountyプログラムを行っている会社なので、攻撃を行うことが許されています。 しかし各プログラムにはポリシーが存在します。 その中にはスコープも設定されていて、対象ドメイン以外や対象外の脆弱性が記載されています。 また、行ってはいけない行為なども記載してあります。 確認しないで報告した場合は例え善意ある報告でもN/Aとしてマークされ、Reputationが下げられてしまいます。 f:id:wa1m3im:20191224171539p:plain

そして、当時筆者はStarbucksに良く通っていたという単純な理由からターゲットをStarbuksに選択しました。

f:id:wa1m3im:20191224171749p:plain

機能と脆弱性の選択

探す脆弱性を予め決めておくことによってそのエンドポイントに対していろいろなアプローチ案が浮かんだりしますが、これを決めていないと無鉄砲にペイロードを投げることになります。 そして、発見できるはずの脆弱性を見逃す可能性も出てきます。 当時筆者は脆弱性を一件も見つけたことがなく徳丸本を読んだ程度の知識しかなかったため最初にXSSを見つけてみようと思いました。 そして機能の選択ですが、これは探す脆弱性の種類によって異なります。 例えばCRLF Injectionを探すのに入力値がレスポンスヘッダに出力されないリクエストに対してペイロードを投げても意味がありません。 よって、まずはstarbucksで入力値が出力されてそうな場所の機能を探しました。 そして見つかったのが店舗検索機能です。

f:id:wa1m3im:20191224173104p:plain

エスケープされていないかの確認

次の行ったのは基本的なXSSエスケープが行われているかどうかです。 最初に無害なHTMLタグを挿入してみました。 f:id:wa1m3im:20191224173233p:plain

検索ボタンをクリックしてレスポンスをみてもHTMLタグは挿入されていないようです。

f:id:wa1m3im:20191224173446p:plain

f:id:wa1m3im:20191224173514p:plain

f:id:wa1m3im:20191224180447g:plain

アプローチの仕方を変える

入力フォームがあるページに戻って次に確認したことはinputタグのnameに設定されている値を確認することです。

f:id:wa1m3im:20191224173835p:plain

inputタグのnameにfree_wordという値が設定されていることが確認できると思います。 starbucksのページはphpで動作しています。 phpはinputタグのnameの値を_GET["free_word"];などで受け取ることができるため、検索フォームのページのリクエストパラメーターに?free_world=helloを追加してみました。 その結果入力値がフォームに出力されることがわかりました。 f:id:wa1m3im:20191224180714g:plain f:id:wa1m3im:20191224174601p:plain

次に入力値に">を入力してみました。 f:id:wa1m3im:20191224174959p:plain

出力結果に閉じタグが出てきました。 最後に"><script>alert(document.domain)</script>入力すると f:id:wa1m3im:20191224175227p:plain

f:id:wa1m3im:20191224180319g:plain

Tips

今回普通に検索フォームにXSSペイロードを挿入してもXSSが発火することはありませんでした。 そして検索ボタンを押した際の遷移先のパラメーター名はkeywordになっており、他のハンターもおそらくこのパラメーターは検証していたのではないかと思います。 これは言語によっても異なるかもしれませんが、inputタグのパラメーター名と遷移先のパラメーター名画異なる場合はinputタグのパラメーター名を使用してそのページにリクエストを送信してみてください。 もしかしたら、エスケープ漏れが見つかる可能性があり報奨金をもらえる可能性があります。 f:id:wa1m3im:20191224182927g:plain

さいごに

今回僕が初めて脆弱性を発見した際のWriteup記事を描いてみました。 日本人バグハンターでBugBountyのWriteup記事を描いている人は多くないため、Tipsが日本語で降ってくることはなかなかありません。 筆者もTipsは基本的に英語のブログを読んで得ています。 最近は日本人でもバグハンターになりたいと行っている方をよくみます。 もっと日本人ハンターの人口が増えるためにも日本語の記事が増えたらなと思います。

また、今年最初に掲げた目標から最近の目標であった$1000を稼ぐことができました。

何件も連続でDuplicateをもらいめげそうにもなりましたが、目標達成できてよかったです。

そして明日はクリスマスですね! メリークリスマス🎅 f:id:wa1m3im:20191224181917g:plain