更新日: 2014-04-03 03:40:45

Webアプリケーションの脆弱性をチェックする方法

著者: hataka108

編集者: hataka108

閲覧数: 11591

Okgn btn gudie info favorite

1

はじめに

Photo by veritatem

「上司からウェブサイトのセキュリティチェックをしろって言われたけど、具体的に何をすれば良いかわからない!」

「趣味でウェブサイトを作っているけど、セキュリティ対策は大丈夫だろうか?」

そんな悩めるWebプログラマーの為のセキュリティ対策ガイドです。

STEP1 ウェブサイトの脆弱性の種類

情報処理推進機構が出している安全なウェブサイトの作り方(PDF)が参考になります。

上記資料によれば、ウェブサイトの脆弱性には下記のようなものがあります。

1) SQL インジェクション
2) OS コマンド・インジェクション
3) ディレクトリ・トラバーサル
4) セッション管理の不備
5) XSS(クロスサイト・スクリプティング)
6) CSRF(クロスサイト・リクエスト・フォージェリ)
7) HTTP ヘッダ・インジェクション
8) メールヘッダ・インジェクション
9) アクセス制御や認可制御の欠落

STEP2 全部チェックしなければいけないの?

上記 1) 〜 9)まで、常に全てをチェックする必要があるとは限りません。
例えば、ウェブサイトがユーザーにメールを送ることが無ければ「8) メールヘッダ・インジェクション」の心配は無いでしょう。

このガイドでは脆弱性の中でも、ほとんどのサイトに関係すると思われる下記のチェック方法を紹介します。

・SQL インジェクション
・XSS(クロスサイト・スクリプティング)
・CSRF(クロスサイト・リクエスト・フォージェリ)

STEP3 SQLインジェクションのチェック方法


Q&Aの引用を読込んでいます。

引用したQ&Aにある通り、ウェブサイトの入力欄に直接SQLの断片が入力された結果、サーバーで意図しないSQLが実行されてしまうのがSQLインジェクションです。

SQLインジェクションをチェックするには以下の手順を実施します。


(1) ウェブサイトの検索条件欄に「テスト」と入力して検索する

(2) 同じ検索条件欄に「テスト' AND 1 = 1」と入力して検索する(シングルクオートが重要です)


(1)と(2)の検索結果が同じ場合、SQLインジェクションの脆弱性が存在している可能性が高いです。

単純な文字列結合によって、SQLを作成していた場合、(2)の入力値の「テスト」の直後に ' (シングルクオート)があることで、一旦検索文字列が終わらされ、 AND 1 = 1 という開発者が意図していない新たなWHERE句の検索条件が成立します。
SQLインジェクション対策が取られていた場合、検索条件は単に「テスト' AND 1 = 1」という文字列として解釈されるため、「テスト」だけで検索するよりも検索結果の数は少なくなるはずです。

上記はあくまで脆弱性チェックのためにAND条件を追加していますが、もし、SQLインジェクションの脆弱性があるウェブサイトでANDの部分がORに変えられたら何が起こるか……わかりますよね?

SQLインジェクションには、ウェブサイト上の入力欄以外にも、GETパラメーターの値や、Cookieの値などいくつかのパターンがありますが、基本的なチェック方法は同じです。

プログラム内でSQLを作成する際、どの入力を元に条件を作っているか確認しチェックしましょう。

STEP4 XSS(クロスサイトスクリプティング)のチェック方法


Q&Aの引用を読込んでいます。

XSSという名前は良く耳にするかと思います。

XSSの直接原因は上記引用のように、ユーザーの入力値やウェブAPIなど外部サイトから取得した情報にタグが含まれていた場合に、タグがHTMLの一部として解釈されてしまうことです。

これにはページの見た目が崩れる以上の脅威があります。もし<script></script>タグがHTMLの一部として解釈された場合、読込まれたJavaScriptはページ上で動き始めます。ユーザーのキーボード入力を逐一特定のサイトに送信するようなことも出来てしまいます。

ウェブサイトにXSSの脆弱性があるかどうかを確認する方法は、プログラムで動的に表示内容出力している部分に以下の文字列を出力させてみることです。

<script>alert(1)</script>

上記文字列をウェブサイトに表示させた結果、ダイアログに「1」が表示された場合、そのサイトにはXSS脆弱性があることになります。

このチェックは、ウェブサイトのプログラムで出力している全ての表示項目に対して行うべきです。
また、PerlやPHP、Javaなどのサーバーサイドプログラムで出力している箇所だけでなく、JavaScriptによる値の書き替えをしている箇所もチェックの対象になります。
具体的には、innerHTML や jQueryの.html()で値を書き換えていた場合、チェックした方が良いでしょう。

STEP5 CSRFのチェック方法


Q&Aの引用を読込んでいます。

CSRFの脆弱性が悪用されると、攻撃者によってユーザーが意図しないデータが登録されます。
引用したQ&Aのリンク先では、mixiでCSRFの脆弱性が悪用された事件について説明されています。

CSRFの脆弱性をチェックするには、以下のような手順を実施します。


1. (ログインが必要なサイトの場合はログインした状態にする)

2. サイトに設置したフォームのPOSTリクエストの送信先のURLにフォーム以外から、必要なパラメータに任意の値が設定されたPOSTリクエストを送る(ブラウザの開発ツールや専用のツールなどを使うと便利です)


2.の結果、データが(DBなどに)登録されてしまった場合、CSRFの脆弱性があります。

CSRFのチェックには、後述する自動チェックツールを用いるのが便利です。

STEP6 自動でウェブサイトの脆弱性をチェックしてくれるツール

脆弱性のチェックは、上記のように一つ一つ人の目で確認することも重要ですが、ある程度自動でチェックしてくれるツールも存在します。

有名なところでは、ParosRatProxyなどがあります。

上記のようなツールは便利ですが、STEP1で紹介した全ての脆弱性のチェックを100%保証するものではないので過信は禁物です。また、基本的な脆弱性の知識無しに使うと、診断結果が正しいのか誤診断なのかを判断することができず悩まされることになります。

基本的には脆弱性チェックは自分でテストケース作って実施し、最終確認としてツールによる検証も行うと、より堅牢なウェブサイトになると思います。

また、ツール毎に得意な脆弱性の分野が異なるため、複数のツールによるチェックを行うことも有効です。

STEP7 脆弱性が見つかったらどうすれば良いか

各脆弱性に対する対策は、安全なウェブサイトの作り方(PDF)に詳しく書いてあります。

少し長い資料ですが、ウェブサイトの制作者であれば「1. ウェブアプリケーションのセキュリティ実装」だけでも読んでおくことを強くお勧めします。

STEP8 [参考文献]

情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方(http://www.ipa.go.jp/security/vuln/websecurity.html)

まとめ

情報処理推進機構はウェブサイトの制作者向けに、セキュリティ実装 チェックリスト(Excel形式、33KB)を配布しています。

ウェブサイトを新規に作成、またはウェブサイトに新しいページを追加する毎に、このチェックリストの内容をチェックするようにしましょう。

【PR】

このガイドは役に立ちましたか?ガイドの著者にお礼を伝えよう!

Okgn btn gudie info thunks b

18

当ガイドは作成日時点での情報です。ガイド内容の実施はご自身の責任の元、ご利用いただきますようお願いいたします。

このガイドを通報する

著者名:
hataka108

よろしくお願いします