SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

OWASPでビルトイン・セキュリティ

クロスサイトスクリプティング対策 ホンキのキホン

OWASPでビルトイン・セキュリティ 第3回


  • X ポスト
  • このエントリーをはてなブックマークに追加

 クロスサイトスクリプティング(XSS)は、古くから存在し開発者にもっともよく知られたセキュリティ上の問題の一つでありながら、OWASP Top 10でも2010年に引き続き2013年でも3位と、いまだに根絶できていない脆弱性です。本稿では、Webアプリケーションの開発においてXSSを根絶するために必要な対策の基本を本気でお伝えします。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 OWASPでは、開発者に向けたセキュリティ対策のためのドキュメントやチートシートを多数用意しており、XSSへの対策としても「XSS (Cross Site Scripting) Prevention Cheat Sheet」というドキュメントが用意されています。

 ただし、このXSS Prevention Cheat Sheetはシンプルなルールを定めたチートシートであるとうたいつつも、開発者が直面するあらゆる場面で包括的に適用できる抜けのないものを目指しているために、多岐にわたる条件のもとでの詳細なルールが定められており、残念ながら決して誰しもが簡単にすぐ適用できるものではないというのが現状です。

 そこで、本稿では、より一般的で頻繁に遭遇する共通的な状況下に限定することで、XSSへの対策方法を簡潔に説明したいと思います。

 本稿では物足りない方、本稿だけでは自身の開発しているWebアプリケーションへの対策として不十分だと感じた方はぜひXSS Prevention Cheat Sheetのほうにも目を通してみてください。

復習:そもそもXSSとは

 XSSへの対策方法を解説する前に、あらためてXSSとはどのような脆弱性であるのかを振り返っておきましょう。

 例えば、http://shop.example.jp/search?item=OWASPというURLでアクセスすると、商品名に「OWASP」を含む商品の一覧を表示するショッピングサイトがあったとします。

fig 1

 レスポンスとして返されるHTMLの一部には、URLのitemパラメータで指定された文字列「OWASP」が含まれています。

<div>
    <span>OWASP</span>に関する検索結果:20件
</div>

 ここで、http://shop.example.jp/search?item=<s>OWASP</s>のように「OWASP」という文字列のかわりに「<s>OWASP</s>」という文字列を与えてアクセスした場合に、サーバ側がそのまま「<s>OWASP</s>」という文字列をHTML内に含めて返したとします。

<div>
    <span><s>OWASP</s></span>に関する検索結果:0件
</div>
fig 2

 ブラウザ上に文字列として「<s>OWASP</s>」と表示させるには、HTML内には「&lt;s&gt;OWASP&lt;/s&gt;」と生成されなければいけないのですが、サーバ上でHTMLを生成する際に「<」や「>」をエスケープせずにそのまま出力しているために、ブラウザ内ではそのままHTMLタグとして取り扱われてしまいます。

 このように、HTMLを生成する段階でのエスケープに漏れのある状態で、攻撃者が「<script>alert("hacked!")</script>」のような文字列を与え、そのときのURL http://shop.example.jp/search?item=<script>alert("hacked!")</script> (注1)をSNSなどを通じて多数の人に拡散したとします。

 このURLにアクセスした一般の利用者は、ブラウザ上でいきなり表示される「hacked!」のメッセージに、このショッピングサイトが攻撃者に改ざんされてしまったのではないかと強い不安を感じてしまうでしょう。

注1

 実際にはURLのitemパラメータはitem=%3Cscript%3E……のようになりますが、ここでは可読性を優先して便宜上URLエンコーディングを解いた状態で表記します。以降のURLに対する例も同様です。

fig 3

 この例では、攻撃者はalert関数によってメッセージを表示させるという単純で実質的には無害なことしか行っていませんが、攻撃者の作成したJavaScriptが利用者のブラウザ上で動くということは、より悪質な攻撃が行えるということを意味しています。

 例えば、攻撃者はJavaScriptによってHTMLに自由にメッセージを書き込む見かけ上の改ざんを行うこともできますし、このショッピングサイトに利用者自身が登録している氏名や住所、メールアドレスなどを盗み見ることもできます。また、偽のクレジットカード番号入力画面を作成し、そこに入力されたカード番号を搾取することや、セッションCookieにhttponly属性が付与されていない場合にはdocument.cookieを通じて利用者のセッションを攻撃者がまるまる乗っ取ってしまうこともできます。

 このように、HTMLを生成する際に文字列がエスケープされておらず、攻撃者によって作成されたHTMLタグやJavaScriptが利用者のブラウザ上で表示、実行される脆弱性をXSSと呼びます。

次のページ
XSSの発生する原因

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
OWASPでビルトイン・セキュリティ連載記事一覧

もっと読む

この記事の著者

はせがわようすけ(OWASP Kansai)(ハセガワ ヨウスケ)

OWASP Kansai Chapter Leader、OWASP Japan Technical Board Member として国内でのOWASPの活動に寄与。 Internet Explorer、Mozilla FirefoxをはじめWebアプリケーションに関する多数の脆弱性を発見。 Blac...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9149 2015/12/28 20:41

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング