脆弱性についてまとめてみるぼっちアドベントカレンダーの二日目の記事です。バグバウンティやCTFへの応用がしやすいようなまとめ方をしています。またアドカレを追っていない人向けに過去記事からのコピペも一部含まれます。
XSSについて
まずはXSSについて簡単の説明ですがXSSとはCross-site Scriptingの略で悪意のあるスクリプトをWebサイトに注入する攻撃の一種です。
XSSは大きく分けて3つの種類があります。
- Reflected XSS
- Stored XSS
- DOM-Base XSS
それぞれXSSの1種とはいえすこし攻撃方法が異なってくるため今回はそれぞれ分けてまとめていきたいと思います。
Stored XSSについて
Stored XSSは掲示板などでよく使われる手法です。
投稿内容にXSSを含め、閲覧した人に悪意あるスクリプトを実行させます。
名前の通りDBなどにXSSのスクリプトが保存されることが特徴で不特定多数の人に攻撃を仕掛けられます。
悪用方法について
XSSはかなり強力です。任意のスクリプトを実行できてしまうためうまくいけばセッションハイジャックすることが可能になりアカウント乗っ取りまで行けてしまいます。
Stored XSSは場合によっては閲覧するだけで攻撃が成功してしまいます。
Webサイト側の対策について
まず基本的な対策は出力する際にエスケープ処理を施すことです。
エスケープ処理を行うことで<が<のように置換され記号等が無効化されます。
またContent-Security-Policyヘッダーによるスクリプトの制限でもある程度対策することが可能です。
下記のようにscript-srcをselfにすることでスクリプトを同じオリジンのものに限定することができます。またscript-srcを指定することでインラインJavaScriptが無効化されXSSに対する対策に大いに役立ちます。
Content-Security-Policy: script-src 'self'
ただ同じオリジンであれば良いのでファイルアップロードの脆弱性があればXSSに成功する場合があります。そのため様々な対策を併用するようにしましょう。
間違った対策について
XSSの代表的な間違った対策として'script'という文字を消す実装がありますがこれは脆弱です。
<scrscriptipt>print()</scrscriptipt>
このようなスクリプトが挿入された場合'script'という文字が削除された場合に正しいスクリプトになってしまいます。'script'という文字を削除するだけでは対策としては足りませんがもしこのような実装をしたい場合'script-replaced'などと別の文字に置換するようにしましょう。
また下記のようなHTMLを挿入することでもスクリプトを実行することが可能です。
<img src=x onerror=javascript:print()>
<body onload=javascript:print()>
このようにscriptタグ以外でもいくらでもスクリプトを書けてしまうのでscriptタグを置換するのではなく入力文字をエスケープし万が一エスケーブがバイパスされた際でもインラインのjavascriptをSCPヘッダーで無効化しておきましょう。
HackerOneレポート
1. Stored XSS in Wiki pages
リンク: https://hackerone.com/reports/526325
これはGitLabのwikiページに存在していた脆弱性です。
タイトルをjavascript:に内容のリンクの部分に.alert(1);と指定することで相対パスの処理の際にタイトルと結合され結果的にjavascript:alert(1);となりリンクをクリックした人に対してスクリプトを実行できてしまいます。
URLのスキームがhttp:だけでないことを留意することの重要性を再認識させられますね。
2. Stored XSS Vulnerability
リンク: https://hackerone.com/reports/643908
これはWordpress.orgのサポートチケットの発行サイトに存在した脆弱性です。
keywordのところにXSSの脆弱性がありました。ペイロードは"><svg/onload=alert(1)>でかなり単純です。
レポートを見ていると全体的にできていても一部分だけがサニタイズされていないことが多いのでいろんな項目を試すことが大事だと感じさせれらます。
PcC動画
よりStored XSSを具体的に知るためYoutubeに公開されているPoC動画をいくつか見てみました。
PoC動画は実際の脆弱性をどのようにして利用するのかわかりやすいのでXSSに関わらずおすすめです。
1. 3,000$ Bug Bounty Rewards from Microsoft Forms: Reflected XSS Vulnerability
リンク: https://www.youtube.com/watch?v=pjbaZYEYQV8
この動画ではmicrosoft formにあったStored XSSのPoC動画です。
URLをクリックするだけでXSSできてしまうため動画自体は単純ですがMS Formに存在したというのがほんとすごいなと思いました。やはりどのようなソフトウェアにも脆弱性は存在と言うことを感じられますね。しかも$3000の報奨金が出たのがほんとすごいなぁって感じました。