他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。
また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。
今回は本連載の最終回ということで、まとめとしてこれまでに説明してきたWebアプリケーションの脆弱性1つずつ簡単に説明していくことにする。一部、サンプルコードを示している個所もあるので開発を行っている読者は参考にしてほしい。
攻撃者が作成したスクリプトを脆弱なWebサイトを介して、ほかのユーザーのブラウザ上で実行させる攻撃のことである。これにより正規ユーザーのセッション情報が盗まれてなりすまし攻撃を受けたり、偽のページを表示させてフィッシング詐欺に利用されたりする。
クロスサイトスクリプティングは以下のような個所で発生する。
(1)ユーザー入力が次の画面に出力される個所
GETで渡したパラメータ値がそのまま表示されるような個所では、以下のようなリンクを作成できる。
http://www.example.com/bbs.cgi?text="><script>alert('xss')</script>
これは、近年被害が増加してきているフィッシング詐欺に利用できるパターンである。上の例ではアラートボックスを表示するだけであるが、任意のページを表示できるため「本物そっくりのページ」を「本物のサイト」上に表示できる。
(2)掲示板やメールのように任意の文字列を別ユーザーに見せることができる個所
この方法は(1)のように攻撃用のリンクを作成することはできないが、攻撃用のスクリプトをサーバ上のアプリケーション機能を介してほかのユーザーに送りつけられるため攻撃が成功する可能性がある。
ユーザーからパラメータを受け取ったら、まずは入力チェックを行い想定している文字列であるかどうかチェックすることが先決である。この対策でWebアプリケーションへの攻撃はほぼ防げる場合が多い。ただし、クロスサイトスクリプティングへの対策はサニタイジングを行うことなので、入力値を表示する際は必ずサニタイジングを実施するようにしてほしい。
以下に、サニタイジングを行うコードを言語別に紹介しておく。ただし、これが唯一の書き方ではなく、ほかの方法で同様の機能が実施できるのであればそれでも構わない。
perl
$text =~ s/&/\&/g; $text =~ s/</</g; $text =~ s/>/>/g; $text =~ s/"/"/g;
PHP
$safe_text = htmlspecialchars($text);
ASP
Dim writer As New StringWriter Server.HtmlEncode(text, writer) Dim safe_text As String = writer.ToString()
アプリケーションがURLパラメータやhidden、Cookieなどに入れた値を書き換えてサーバに送り返す攻撃である。これにより価格改ざんや他人へのなりすまし攻撃を受ける可能性がある。
パラメータ改ざんは以下のような個所で発生する。ここでは「存在する可能性がある機能」を示す。
パラメータ改ざんが起こるのは、サイト全体では正しいセッション管理を行っているのに、ある一部分だけ改ざん可能なパラメータに依存してしまっている場合が多い。それ故セッション管理方法に問題がないからといって油断してはいけない。
個人情報表示
hiddenにユーザー識別番号が入っていて、そのIDに依存してしまっていることがある。IDの生成方法が単純であれば全ユーザーの個人情報を抜くことが可能となる。
ショッピング
URLパラメータやhidden内に価格が入っていることがある。商品発送に人間を介するのであれば、ある程度は運用でカバーできるかもしれない。しかし、音楽データや画像データなどのダウンロード販売では、価格改ざんが即被害につながってしまうため、改ざんされないようにすべきである。
問い合わせ
問い合わせの送信先のメールアドレスが入っていることがある。これにより任意のあて先にメールが送信できてしまうことになる。
ファイルのダウンロード
バンキングシステムの取引明細のようなデータをPDF化してダウンロードできる機能がたまにある。このとき、生成するファイル名が推測可能であると、これを書き換えることにより他人のファイルをダウンロードできることがある。
この例は、パラメータ改ざんだけの問題ではなく「ファイル名の生成アルゴリズム」や「サーバ上のファイルの有効期間」などの問題も絡んでいる。しかし、パラメータ改ざんにも関連があるため、このカテゴリーに含めた。
改ざんされてしまうことが問題であるため、改ざんできない個所で値を管理する方法を取ればよい。以下のような方法が有効である。
ハッシュ値を使う方法だけ簡単に説明しておこう。
(1)サーバ側で秘密の文字列を保持しておく。
(2)hiddenの中に「改ざんされたくない文字列」(A)と「『A+秘密の文字列』のハッシュ値」(B)を入れておく。
(3)AとBがサーバに送られてくる。
(4)サーバ側ではAと秘密の文字列のハッシュ値を取りBと比較する。改ざんされていなければ結果は同じになる。
この方法による安全性を維持するためには、サーバ側で管理する秘密の文字列を定期的に更新することが望ましい。更新はサーバとクライアント間のセッションを切らずに行う必要があるが、詳しい実装方法には触れないことにする。
PHP、Java(JSP/Servlet)、ASP、ASP.NETではセッション管理機能を持っている。セッション変数も使えるのでそれを使用するとよい。使用方法についてはここでは割愛させていただく。
←「第13回」へ
Copyright © ITmedia, Inc. All Rights Reserved.