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

  • ガイド ( How to )
  • 閲覧数:12447
  • ありがとう数:0

はじめに

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

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

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

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

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

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

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

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

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

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

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

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

SQLインジェクション

教えてください。
よろしくお願いいたします。

SELECT * FROM table WHERE user='$uid' AND password='$pass'
のエスケープ処理をしていない場合に、
ID=aaa パスワード='or'a'='a と入力されると、
SELECT * FROM table WHERE user='aaa' AND password="or 'a'='a'
が実行されてしまいますが、
「password=」と「or」の間のダブルクォーティションは、
どのような意味を持つのでしょうか。

passwordは最初の2つのクォーテーションで終わりです。つまりpasswordは空ですね。で、そのあとに「 or 'a'='a'」という「常に真」となる式が論理和で付いているので、passwordの内容とは無関係に「常に真」になります(これがSQLインジェクションになるわけです)。

引用した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を作成する際、どの入力を元に条件を作っているか確認しチェックしましょう。

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

掲示板で、テキストフィールドにHTMLタグを書かれると・・・

掲示板で、テキストフィールドにHTMLタグを書かれると、掲示板の形が壊れてしまいます・・・
誰か、対策方法を教えて頂けませんか??
今、JSPで作成しています。

テキストフィールドの書き込まれた文字をhtmlに組み込む前にチェックを行い
タグ(「<」から「>」まで)を削除するようにすれば問題ないと思います

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

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

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

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

<script>alert(1)</script>

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

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

STEP5CSRFのチェック方法

webアプリケーションの脆弱性について

最近CSRF攻撃についていろいろ勉強しています。
例として、mixiでの「ぼくはまちちゃん事件」というのが出てきましたが
いまいちこの手法の仕組みが理解できません。


誰かの日記に一度、踏みやすそうなリンクを張っておいて、リンク先のページに
埋め込まれたタイトル情報と日記の中身の情報を含んだフォームを勝手にサブミットしてしまう。
という事かな。と思ったのですが、mixiの場合って「以下の内容で書き込んでもよろしいですか?」みたいなページとかが表示されるかと思います。
そういったページというのはどうなっていたのでしょうか。

というか、攻撃者が用意したダミーのリンク内ではどのようなページが表示されていたのでしょうか。

ご存知の方がいらっしゃいましたらご教授していただけないでしょうか。

「フォームを勝手にサブミットしてしまう」その認識でだいたいあってます!たぶん!そのmixiの例だと、入力画面 → (送信1) → 確認画面 → (送信2) → 完了ってなるわけですが、いくら確認画面が間にあったところで、(送信2)の部分を「勝手にサブミット」しちゃえばいいわけです。

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)を配布しています。

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

特集


感謝指数をマイページで確認!

ピックアップ

ページ先頭へ