gihyo.jp » DEVELOPER STAGE » 連載 » なぜPHPアプリにセキュリティホールが多いのか? » 第7回 いまさらながらクロスサイトスクリプティングの基礎の基礎

なぜPHPアプリにセキュリティホールが多いのか?

第7回 いまさらながらクロスサイトスクリプティングの基礎の基礎

今回はWebアプリケーションを作ったことがない方でも分かるようクロスサイトスクリプティング脆弱性を解説します。

クロスサイトスクリプティングとは?

初めてクロスサイトスクリプティングと聞いて,どのような問題なのかすぐに理解できる人はいないと思います。サイトAに記述されたJavaScriptプログラムがサイトB上で実行されるために発生することが問題とされたので,「サイト間をまたがるスクリプトの実行」問題として,クロスサイトスクリプティング(XSS)と名前が付けられました。この命名では直感的に分かりづらい,サイト間にまたがらずHTMLメールなどにJavaScriptを挿入する攻撃でも同じ効果が得られることから,「JavaScriptインジェクション」とも呼ばれるようになっています。

図1 簡単なクロスサイトスクリプティング

図1 簡単なクロスサイトスクリプティング

例1 簡単な直接攻撃

掲示板サイトに投稿されたデータをエスケープ処理なしに出力し,ユーザが送信したJavaScriptを含む投稿データがブラウザに送信され掲示板を見たユーザのセッションIDが盗まれた。

Webアプリケーションは,作り方を間違えると「インジェクション」(コードや特殊文字などの挿入)により,セキュリティ上重大な問題を簡単に作れてしまいます。クロスサイトスクリプティングはインジェクション攻撃の中でも最も防御が複雑で難しいセキュリティ上の問題です。

なぜクロスサイトスクリプティングは危険な脆弱性なのか?

Webアプリケーションプログラミングに慣れていない方は,インジェクト(挿入)されたJavaScriptコードが実行されて何が困るのか解らないかもしれません。JavaScriptはブラウザに保存されたクッキーにアクセスしたり,ブラウザに出力されるページを変更できます。「任意のJavaScriptコードを挿入できる」ことは「クッキーの取得」「ページの内容を書き換え」が可能になることを意味します。

クッキーはHTTPセッション管理に利用されるセッションIDに利用されます。「クッキーの取得」は「セッションIDの取得」が可能であることを意味します。つまり,ログイン済みの第三者のアカウントを不正に利用可能になります。詳しい説明は省略しますが,匿名性を維持しつつセッションIDの収集をするは非常に簡単です。

例えば,ログインページがクロスサイトスクリプティングに脆弱であった場合は,ユーザIDとパスワードを簡単に盗み取れます。JavaScriptはドキュメントの任意ノード(構成要素)を書き換えることができます。ログイン名,パスワードを記述したフォームを書き換えて,攻撃者のサーバに送信するページに置き換えられます。有名なサイトではあり得ないことのように思いますが,PayPalのログインページはクロスサイトスクリプティングに脆弱でした。

なぜクロスサイトスクリプティングは無くならないのか?

この連載ではSQLインジェクションは簡単に防げると書きました。SQLインジェクションはクエリ実行時にスドアドプロシージャを利用するか,すべての変数を適切な方法でエスケープするだけで完全に防げます(※1)。しかし,クロスサイトスクリプティング脆弱性は簡単には防げません。

注1)
不適切な文字エンコーディング設定を行うと,適切にエスケープをしてもSQLインジェクションが可能となる場合がある。
クロスサイトスクリプティングが無くならない理由
  1. すべての出力をエスケープできない
  2. 出力する場所によって適切なエスケープ方法が異なる
  3. どの変数がユーザからの入力を含んでいるか分かりづらい
  4. クライアント側(JavaScript)の問題でも問題が発生する

クロスサイトスクリプティングはSQLインジェクションと異なり,エスケープしてはならない場合やエスケープ方法が異なる場合があります。エスケープしてはならない場合,変数にユーザ入力が含まれているか含まれていないのか,正確に分かっていなければならないですが,システムが設定していると思いがちな変数にユーザ入力が含まれている場合もあります。REQUEST_URI, REFERER, X_FORWARDED_FORなどのWebサーバが設定する値やHTTPヘッダの値は,ユーザが自由に設定できる値なので直接出力してはならない変数です。

例2 XSSに脆弱なPHPコード

<form name="some_form" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

※$_SERVER['PHP_SELF']にはREQUEST_URI情報が含まれるので直接出力するとXSSに脆弱になる

ユーザ入力を一旦別の変数に代入すると,その変数が危険な変数であることが分かりづらくなります。ユーザ入力を含む変数名が長いからといって短い名前の変数に代入して利用するコードは,危険性が高くなります。

さらに,最近AJAXの普及により,クライアントで複雑なJavaScriptを実行するアプリケーションが増えています。JavaScriptを利用している場合,サーバ側のコードと無関係にクロスサイトスクリプティングに脆弱となる場合があります。

例3 脆弱なJavaScriptコード

document.write(window.location)

実際の脆弱性はこの例のほど単純ではありませんが,JavaScriptのコードがクロスサイトスクリプティング脆弱性を作ってしまうことが分かると思います。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

  • Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

    Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

  • [改訂版]PHPポケットリファレンス

    [改訂版]PHPポケットリファレンス

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

もっと便利に!jQueryでラクラクサイト制作(実践サンプル付き)

本連載では,実践サンプルとともに,jQueryを上手に活用してサイト制作の品質向上・効率化を実現するための実践テクニックを解説します。

サクセスストーリーに続く,快適サーバー運用管理のヒント!

サーバーを自社で運用管理するのはもう限界…。データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

続・先取り! Google Chrome Extensions

2010年1月のリリースが予定されているGoogle Chrome 4に搭載されるExtensionsについて,その詳細を先取りで解説します。最新情報から,ユーザースクリプトやテーマの作り方など関連情報もお届けします。

モダンPerlの世界へようこそ

この連載では,Perlの世代間ギャップに悩んでいる方に,いくらかの背景知識と,これだけは知っておいたほうがよいという最低限の慣用句をお届けします。

Hosting Department:ホスティングを活用するための基礎知識

本連載では,ホスティングサービスを活用する上で知っておきたい基礎知識を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント