XSS(弊研究室の某課題について考える17日目)
はじめに
この記事は弊研究室の某課題について考えるの17日目の記事です。
いよいよWeb編です
XSS
XSS(Corss Site Scripting)とは任意のJavaScriptを実行できる脆弱性です。Cross Site ScriptingなのにXSSなのはCascading Style Sheet(CSS)と紛らわしいためです。基本的にはXSSです。
サンプル
今回ですがdockerでサンプルを用意しました。
サンプルはこちら
$ docker-compose up -d
してlocalhost:3333/index.php
にアクセスしてください。
サンプルですが入力した文字をpostで受け取り、それを表示するといったものとなります。
ソースコード
index.php
<html> <meta charset="utf-8"> <title>XSS sample</title> <body> <form method="POST" action="post.php"> <input type="text" name="data"> <input type="submit" value="Submit"> </form> </body> </html>
post.php
<html> <meta charset="utf-8"> <title>XSS Sample</title> <body> Your input : <?php echo $_POST["data"];?><br> <a href="./index.php">back</a> </body> </html>
脆弱性
post.phpのほうに脆弱性が存在します。<?php echo $_POST["data"];?>
です。index.phpのほうで<script>alert('1');</script>
と実行すると下のようになります
XSSの危険性
XSS脆弱性があると、どういった攻撃をされるかといったことが以下になります(Wikipediaより)
- 標的サイトの変数値やcookieなどからの情報漏洩
- セッションハイジャック
- 機能の不正実行
- ウェブサイトの改竄(ただし攻撃者が準備したURLからアクセスした場合のみ)
- 悪意のあるスクリプトによりWebページを改ざんする事でパスワードやクレジットカード番号を入力するフォームをWebページに追加し、ユーザからこれらの情報を盗む(フィッシング 詐欺)
- 悪意のあるスクリプトを使ってブラウザの脆弱性を突き、ユーザ端末を乗っ取る
- ワームの実行
ということで対策が必要です。
XSSの対策
さてXSSの対策ですが以下のようなものがあります
- エスケープ
- CSP
- IDSで監視する
エスケープとCSPについて解説します。
エスケープ
エスケープとは攻撃者が送り込むコードを実行されないような形に変化させることです。たとえば<
を<
に変えるとかですね。
こういった関数は言語によっては用意されていることがあり、例えばPHPではhtmlspecialchars($str)
関数を利用することでエスケープできます。
基本的に文字列の出力時にエスケープ処理を欠かさないようにしておく意識を持ったほうがいいと個人的には思います。
エスケープのサンプル
今回あげたサンプルにはエスケープの効果を実感してもらうためのページも用意してあります。
localhost:3333/escape/index.php
にアクセスしてscriptを埋め込んでみてください。下のようになるはずです。
CSP
Content Security PolicyもXSSを防ぐ機構です。これは結構強力で正しく設定すればXSSを防げます。
設定方法はHTTPレスポンスヘッダかにContent-Security-Policyを設定し、コンテンツとしてCSPの設定内容を書きます。
CSPですが開発者が許可しないJavaScript全てを実行しないといったことができます。
CSPのサンプル
<?php header("Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self';"); ?> <html> <meta charset="utf-8"> <title>XSS Sample</title> <body> Your input : <?php echo $_POST["data"];?><br> <a href="./index.php">back</a> </body> </html>
このscript-srcがJavaScriptの制御を行います。self
というのは自ホストからのJSの読み込みを許可すると言う意味です(localhostにあるJavaScriptファイルは読み込める)。それ以外に何も書いてないので他のJSファイルは動作しません。
物は試し、localhost:3333/csp/index.php
にアクセスしてスクリプトを入れてみてください。
おわりに
とまぁこんな感じです。Web開発するなら気をつけなければ行けない攻撃でした。Web開発しない人でも覚えておきましょう。