HTTP通信のGETやPOSTのデータ送信を悪用する手法としてクロスサイトスクリプティングがあります。 クロスサイトスクリプティングの概要と、実際に悪用される場合どのようになってしまうかをテストして、危険性を認識しましょう。

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

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年08月06日

HTTP通信のGETやPOSTのデータ送信を悪用する手法としてクロスサイトスクリプティングがあります。

クロスサイトスクリプティングの概要と、実際に悪用される場合どのようになってしまうかをテストして、危険性を認識しましょう。

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

クロスサイトスクリプティングとは、クロスサイト=サイトをまたいで、スクリプティング=スクリプト(プログラムの一種)の実行、を行うクラッカー(悪用するハッカー)の攻撃手法です。

GETメソッドやPOSTメソッドでのデータ送信は、文字データなどを送信できます。その文字データは基本的には入力された内容をそのまま送りつけるだけです。

入力されたデータ自体がスクリプト、つまりプログラムのコードだった場合、そのデータをそのまま次の画面に表示などを行った際にそのコードが実行されてしまう可能性があります。言葉だけでは難しいので、実際にどのように悪用されるか見てみましょう。

実際にクロスサイトスクリプティングを行ってみる

まずは簡単にHTMLをXSSで悪用

まずは簡単にHTMLをGETデータに紛れ込ませて、そのまま出力してみます。
使用する言語はPHPで行います。

xss-test.phpファイルを作成し、以下のようなデータをそのまま表示するようにしてみます。

<?php

echo $_GET["data"];

ではこのPHPファイルにGETデータを送りつけてみましょう。
http://localhost:8888/〜〜/xss-test.php?data=<h1>HTMLコードをデータとして送信</h1>というURLでアクセスしてみます。

PHPファイルではh1タグなどは利用していません。それなのに、GETデータとしてHTMLコードが入っていてそれをそのまま表示すると、なんとh1タグがそのまま利用されてしまいます。h1タグを利用するつもりや他のHTMLを利用するつもりがなくてもこのように表示されてしまいます。

まだHTMLだけであればいいですが…。

さらにスクリプトのコードを実行してみる

先程の送るデータを変更してみます。
http://localhost:8888/〜〜/xss-test.php?data=<script>while(true){alert("XSS!!");}</script>というURLでアクセスします。

Google Chromeだと、このXSSが自動で無効になってしまうので、テストをFirefoxで行っていきます。Chrome優秀ですね。

アクセスした結果は以下のようになります。

「XSS!!」というダイアログが、OKを押しても永遠に消えません。。

今回はダイアログを表示しているだけですが、悪用しようとすればかなり危険なのがわかるかと思います。

このように送るデータをそのままHTMLのコードやスクリプトコードとして送信し、クライアントに送られてきた悪意のあるコードが実行されてしまいます。

XSSの対策

XSSのそもそもの原因は、HTMLやスクリプトとして認識する<h1>などのタグが原因です。<>&"'これらのHTMLやスクリプトとして認識される記号をそのまま表示することが原因です。

HTMLにはこれらのHTMLで利用される特殊文字を、代用する記号が用意されています。

<であれば&lt>であれば&gtと決まっています。これらの代用する記号をHTMLエンティティと言います。

つまりXSSの対策としては、HTMLで通常利用される記号を、表示専用のHTMLエンティティに置き換えれば、悪意のあるコードは実行されません。

WEBで利用されるプログラミング言語には、これらのHTMLエンティティに変換するための機能が基本的には備わっているため、送られてきたデータを適切にHTMLエンティティに変換してから表示するようにしましょう。

まとめ

  • クロスサイトスクリプティングという攻撃手法がある
  • XSSの対策を適切に行わないと、ユーザーに不利益を被る
  • XSSの対策は、HTMLエンティティへの変換を行うこと

以上の3つについて説明しました。

HTMLエンティティへの変換についてはそれぞれのプログラミング言語にて改めて記事にします。