XSS について
XSS とはクロスサイトスクリプティングのこと。詳しくは wiki へ。
歴史の長いサイトだとモダンなフレームワークを使っていないことが多いので、XSS対策の多くを自前でやっている (もしくはやっていない)。最近のフレームワークは勝手にいろいろ対策してくれて、新しいフレームワーク (Next.js、Nuxt) あたりを使うだけで安全になるので、webサイトを作るときは雑にこういうの使ったほうがいいと思う。
そのため、ちょっと昔からあるサイトをさがすと結構 XSS を見つけることができる。
ただ、ここではいろいろな理由で XSS できるサイトの具体例を挙げられない (脆弱性が修正されるまでは口外できない & 修正されたら XSS できることをデモできない) ので、抽象的な話になる。
たとえば、多くの中規模以上のサイトのついている検索フォームは格好の標的になる。
ここで検索ワードを入れて検索した場合に起こることとしては、大きく分けて次にわけられる
Google 検索に飛ばされる
埋め込まれてるパターンや本当に飛ばされるパターンもあるが、どちらも大きくは変わらない。これは市区町村とかのwebサイトだと結構見かけて、検索ロジックを一切作らずに検索を実装できる上にXSS対策も丸投げできるのでお手軽。欠点は若干ダサい(個人的な感想)
検索結果一覧ページに飛ばされる
大抵は `/search?q=検索ワード` みたいな感じで GET リクエストで飛ばされる。たまにぶっ飛んだサイトだと POST リクエストしてるとこもある。(まあ都合によるだろう)
特に飛ばされず、その場でヒットする検索結果がサジェストされる
検索ページに行くのかな?と思わせて、サジェストしかでないやつ。
XSS を探しやすいのは言うまでもなく2番目。なぜなら、ユーザーの入力が Web サイトに表示されることが多いから。
ユーザーが入力した「5000兆円貰う方法」がそのまま画面に表示される。
そのため、特に何も対策をしない場合、ここに HTML タグを差し込むだけで自由に描画できてしまう。
また、多くの場合、検索ワードは URL のクエリパラメータで指定され、同じURL にアクセスすれば同じ検索を行うことができるようになっている。そのため検索フォームで XSS することができれば、正規のサイトの URL だとおもってアクセスしたユーザーが攻撃者の Web サイトに誘導されたり、ログインしているアカウントの情報を抜き取られたり、いろいろされてしまう。
最初の方でも言ったように、最近のフレームワークはこんなことにならないように対策されているので、ここまで素直にアラートが表示されることは少ない。(が、現在でも存在しないわけじゃない)
XSS をみつける
React、Vue、Svelte が使われていればこんな単純な XSS はほぼできない。(もしできたらそのライブラリレベルの脆弱性になることが多いかも?)。ただ、React でもマークダウンの扱いや URL の扱いをミスると XSS になるので注意がいる。
Wappalyzer というブラウザ拡張を使うと、そのwebサイトで使われている技術スタックを確認できる。
これは sizu.me で使われている技術。Next.js が使われているのがわかる。
これでいろんなサイトを見ていくときに、WordPress を使っていない PHP や Java、Node.js だけど React も Vue も検知されない、などのちょっと普通じゃない感じの Web サイトがあったら調査する価値がある。あんまり詳しくないけど、ああいうのってなんかサーバー側で雑にテキストにしてブラウザに送ってくるイメージがあるので XSS しやすそう。
いい感じの web サイトを見つけたら、次は検索フォームにいろいろ突っ込んで挙動を見ていく。
"<img>aaaab
とかを入れていって、検索結果画面で <img> が消えていたら9割は HTML タグが一切サニタイズされずに描画されている。
もしここで普通に "<img>aaaab が表示されてもまだ可能性はある。ブラウザの開発者ツールで、aaaab で検索すると、入力したテキストが描画されている場所がわかる。
稀に、このテキストが <script> タグの中に挿入されていることがあるので、そういうときは JavaScript の表現に合うようにテキストを調整すると、アラートを表示できたりする。
この場合は、検索ワードを "};alert();_={"":" みたいにすると、
下のような感じに解釈されて無事アラート表示成功、みたいになる。
他にもいろいろパターンがあるけど、こういう雰囲気で検索ワードを差し込んで探していくとみつかる。
脆弱性を見つけたら、運営者に問い合わせるか IPA に報告しよう↓
大きい会社になると報奨金が出るかも?(私はもらったことないけど)
良い XSS ライフを!