webセキュリティについて勉強中なので、学習内容を公開します
スカスカ記事ですがお許しください
#演習環境
- Ubuntu 18.04.4
- Ruby (2.6.6)
- Rails (5.2.4.3)
- database adapter mysql2 (0.5.3)
- mysql (5.7.30)
記事投稿、コメント投稿、ブックマークなどが出来る演習用アプリ「TARGET」
GitHubリポジトリ https://github.com/Fumitaka1/target
#XSS脆弱性とは
XSSには反射型、持続型、DOMベースの3タイプに分類され、単にXSSというと反射型XSSを指すことが多いようです。
上記の3タイプに共通する性質として「外部からのパラメータを用いてwebページを出力しているアプリケーションにおいて、任意のhtml要素や属性が挿入出来てしまう」所がXSS脆弱性の肝です。
挿入されたスクリプトによってセッションや入力データが流出したり、有害な操作やリダイレクトが可能になるなど多くの被害が発生します。
スクリプトタグを含む不正なコメントを投稿すると、ブラウザはスクリプトタグとして解釈します。
演習用アプリではRailsの機能によりcookieのHttponly属性が付与されているので、Javascriptでセッションを取得することはできません。
しかし任意のページにリダイレクトしたり、不正なフォームをもとのページに重ねて表示することが出来ます。
#なぜ発生するのか
上記の例では外部からのパラメータを用いてHTML要素内容を出力する際に、特殊文字[" ' & < >]をエスケープしていないことが原因。
等号記号が2つのERB式<%== @comment.content %>
で意図的にエスケープを回避している。
XSS脆弱性が発生しうる箇所には①HTML属性値②HTML要素内容③リンク④イベントハンドラなどがあり、それぞれエスケープの方法が異なるので場所にあったエスケープを行う必要がある。
各々のエスケープ方法については後日記事にします。