エンジニアリング部システムソリューション課のひよっこエンジニアKと申します。エンジニアになってまだ2ヶ月強の私は、課題や仕事に取り組む中でわからないことにぶち当たることが多いです。この記事では、わからないところについて調べた結果などをまとめています。
今回のテーマはセキュリティ対策の中でも、XSS(クロスサイトスクリプティング)の対策についてです。
そもそも(XSS)クロスサイトスクリプティングってなんだ?
トレンドマイクロによると、ユーザのアクセス時に表示内容が生成される「動的Webページ」の脆弱性、もしくはその脆弱性を利用した攻撃方法ということです。また、『安全なWebアプリケーションの作り方(第2版)』によると、XSS攻撃には「反射型XSS」と「持続型XSS」の2種類あります。それぞれ具体的に見ていきましょう。
1.反射型XSS
①攻撃者が掲示板などに罠のスクリプトを仕掛ける
まず攻撃者が罠をしかけるところからです。攻撃者はXSSの脆弱性のあるサイトを発見したとき、そのサイト自体ではなく、そのサイトのユーザーがよく使う脆弱性のある掲示板に罠をしかけます。ここでポイントなのは、そのサイト自体ではなく、掲示板に罠をしかけるところです。罠をしかけられる場所が掲示板=自由にユーザーが書き込める場所ということが大事です。
②ユーザーが罠のスクリプトが含まれたリンクをクリックする
罠のスクリプトが含まれたものには、HTMLのリンクだけでなく、JavaScriptのポップアップ表示などもあります。例えば、掲示板にアクセスしたとき、「今すぐ海外旅行に行きたいですか?」というような文字と、YES/NOのボタンがポップアップ表示される場合もあります。
③罠のスクリプトを実行させる
リンクを押すまたは表示されたポップアップのボタンを押すことにより、標的サイトに移動させます。
④罠サイトに遷移後、攻撃対象サイトに遷移
まず罠サイトに遷移します。その後、攻撃対象サイトに遷移する場合もあれば、罠サイト上のiframe内で攻撃対象サイトが表示される場合もあります。攻撃対象サイトから偽のサイトにすぐリダイレクトされる場合もあります。
⑤悪意のある第三者によってセッションIDなどのクッキー値が盗まれる
攻撃対象サイトはXSS攻撃を受け、情報収集ページに遷移するようになっていたりします。その時、攻撃対象サイトでのセッションIDなどのクッキー値は情報収集ページに送られています。情報収集ページはクッキー値を攻撃者のメールに送信するなどして、攻撃者に情報を受け渡しています。
また、偽のサイトにすぐ遷移した場合は、その偽サイトで個人情報などの情報をユーザーに書き込ませ、その個人情報を攻撃者が得る、ということもあります。
2.持続型XSS
①攻撃者がXSSの脆弱性のあるサイトを発見し、そのサイトのユーザーがよく使うような掲示板などに罠のスクリプトを仕掛ける
今回の場合は攻撃対象サイト自体が攻撃者によって書き換えられているパターンです。まずコメント欄などに罠のスクリプトを仕掛けます。
②ユーザーは攻撃対象サイトを閲覧、正規のサイトだと思って個人情報などの入力を行う
ユーザーは罠のスクリプトから書き換えられた攻撃対象サイトを閲覧します。攻撃対象サイトには、正規のサイトを装って、例えば個人情報(口座番号など)を入力する画面が用意されています。ユーザーがそこに入力してフォームを送信すると、攻撃者に入力情報が渡ってしまいます。
③悪意のある第三者によって個人情報が盗まれたり、マルウェアに感染したりする
これで攻撃者に個人情報がバレてしまったので、後はもうやりたい放題です。ちなみにマルウェアというのは「悪意があるソフトウェア」のことで、ウイルスもその一種です。マルウェアとウイルスについては後日また調べてまとめます。
XSS対策ってどうしたらいいの?
上記の流れを見ると、罠のスクリプトを仕掛けられたところから惨事が始まっています。ということは、罠のスクリプトを仕掛けられなければよいのです。でもどうやって?
上記の流れを詳しく見てみると、掲示板などユーザーが自由に書き込めるところにHTMLやJavaScriptなどのスクリプトが仕掛けられていることがわかります。つまり、HTMLやJavaScriptなどのスクリプトを書けないようにしてしまえばいいんです!そのためには、下記の3つの方法があります。
①入力値を制限する
まず、フォームに何のテキストも入れられる状態を避けましょう。例えば、郵便番号や電話番号のフォームには、数字しか入れられないように入力値を制限しましょう。PHPなら、preg_match関数を使うと便利です。
また、入れられる文字数を制限する事により、長いコードは入れられないので、ある程度悪意のあるスクリプトの入力を防ぐことが出来ます。PHPならmb_strlen関数やstrlen関数を使うと良いでしょう。しかし、これだけではまだ不十分です!
②エスケープ処理を行う(サニタイジング)
HTMLやJavaScriptのコードを書くとき、<>&’”などの記号を使うと思います。その記号をそのまま読み取って処理してしまうのが問題なので、このまま文字列として画面に表示されるようにエスケープ処理(別の文字への置換)を行いましょう。そうすれば、たとえ攻撃者がHTMLやJavaScriptのコードを書いたとしても、画面上に表示されるだけで、実際に実行はされないことになります。しかし、この対策では攻撃されたとき攻撃をかわすことは出来ますが、攻撃を入力されること自体は防げていません。そのためには、第三の対策が必要になります。
③WAF(Web Application Firewall)を利用する
まずWAFが何かというと、Webアプリケーションに特化しているファイアウォールです。ファイアウォールとはネットワークレベルでのセキュリティ対策なのですが、そのWebアプリケーション版ということになります。Webアプリケーション内で本来流出しないはずのデータがレスポンスとして含まれていないか等をチェックしているので、もし上記2つの対策で不十分な点があったとしても防御してくれます。
今回のまとめ
①クロスサイトスクリプティングは、フォームなどの自由にユーザーが入力できる場所にJavaScriptやHTMLなどの罠をしかけ、罠のスクリプトを実行したユーザーの個人情報などを盗んだりマルウェアに感染させたりするしくみである。
②XSS対策ではユーザーが自由に入力できる場所にHTMLやJavaScriptなどのスクリプトを書けないようにすれば良い。
③攻撃をかわす方法として、入力値を制限する方法や、エスケープ処理を行う方法がある
④攻撃を入力されること自体を防ぐ方法として、WAFを利用する方法がある。
参考サイト:
クロスサイトスクリプティングって何?サイトのセキュリティを高めるために | カゴヤのサーバー研究室
クロスサイトスクリプティング(XSS)のセキュリティ対策とは?|CyberSecurityTIMES
クロスサイトスクリプティングとは?仕組みと事例から考える対策|サイバーセキュリティ.com
参考図書:
『安全なWebアプリケーションの作り方(第2版)』(徳丸浩著) p.120-150