🐦

Web開発におけるセキュリティーについて XSS編

2024/10/27に公開

はじめに

XSSやCSRF、ペネトレーションテストなど開発をしているとよく聞きますが、なんとなくでしか理解出来てなかったので、この場で言語化をしてみます。
今回はXSS(クロスサイトスクリプティング)です。

XSS(クロスサイトスクリプティング)とは

攻撃者がWebサービスやWebアプリケーションの脆弱性を突くスクリプトを含むWebサイトを構築し、ユーザーに遷移させることなどでスクリプトが実行されユーザーの個人情報やセッションIDを取得する攻撃手法です。

例1

攻撃者がセッションIDを盗み取るスクリプトを攻撃者自身が作成したWebサイトなどに仕掛け、ユーザーがそのWebサイトに遷移またはボタンなどを押下することで、脆弱性があるWebサイトにスクリプトが送り込まれクッキーからセッションIDを取得し攻撃者に通知されます。セッションIDを持つことで攻撃者はユーザーになりすまして脆弱性があるWebサイトを利用することが可能になります。

例2

脆弱性のあるWebサイトは問合せ入力フォームで名前と問合せ内容を入力するだけの作りになっています。
攻撃者が罠となるWebサイトを作り、ボタンを押下すると脆弱性のあるWebサイトに遷移する様になっています。ボタンを押下して遷移する際に脆弱性のあるWebサイトには存在しない電話番号やメールアドレスなどの入力フォーム、向き先が入力した電話番号などを攻撃者に送るプログラムになっているformタグが定義されたHTMLやCSSを脆弱性のあるWebサイトに送り込み、元々表示されていた問合せ入力フォームを上書く形で電話番号やメールアドレスの入力フォーム、入力した情報を攻撃者に送るボタンなどが表示させます。ユーザーは画面が上書かれていることに気づかずに自身の電話番号やメールアドレスを入力し攻撃者に送信してしまいます。

XSSの種類

XSSには「反射型XSS」と「持続型XSS」があります。両者の違いは前者は攻撃者がスクリプト実行用のWebサイトを用意し、後者はDBや検索エンジンなどにスクリプトを管理させている点です。

反射型XSS

攻撃者が作成してWebサイトにユーザーが訪問することで脆弱性のあるWebサイトに攻撃用のスクリプトが送られ個人情報を不正入手します。

持続型XSS

クチコミ投稿やプロフィールなどに攻撃者がスクリプトを入力し、DBや検索エンジンなどに保存されます。
ユーザーがクチコミなどを画面表示した際にDBに保存されていたスクリプトが画面上で実行されユーザーに攻撃を行います。

XSSを防ぐには

アプリケーション開発の視点でXSSを防ぐには以下の3点を実施する必要があります。

エスケープ(サニタイズ)処理の実装

「<」、「>」、「&」などのスクリプトに含まれるメタ文字を「<」や「>」に置換します。
置換することでスクリプトは画面上で機能することができなくなります。

バリデーションの実装

フロントエンドやバックエンドで入力された値にメタ文字が含まれている場合は入力エラーとすることで、スクリプトがDBに管理されることを防ぎます。

HttpOnlyの設定

クッキーの属性にHttpOnlyがあります。HttpOnlyが適用されることで、そのクッキーはJavaScriptから参照、操作がされることがなくセッションIDが攻撃者に知られることを防ぎます。

参考資料

Discussion