- 会員限定
- 2008/08/04 掲載
実践!Webセキュリティ点検術(最終回)SQLインジェクションの調査と対策
Webアプリケーションに対するペネトレーションテスト(後編)
執筆:田嶋 祐介 |
SQLインジェクションとは、Webアプリケーションと連動したデータベースに、サイト管理者の意図しない操作を実行させることが可能となる脆弱性である。会員情報を扱うようなWebサイトの場合、顧客から入力されたデータは、Webサーバと連携するデータベースへと格納されることが多い。データベースに格納されたデータは、必要に応じてWebアプリケーションから呼び出される。たとえば、ユーザーがログインするときには、認証情報が検索され、合致すればログインを認める、といった処理が行われる。ほかにも、サイトの要求に従い、登録、閲覧、更新、削除といったデータ処理が行われる(図3)。
図3 Webアプリケーションとデータベースの相関図 |
---|
・調査方法
SQLインジェクションが行われるのは、WebアプリケーションがデータベースへSQLクエリを送信する個所であるから、それが行われているであろう個所(検索フォーム、ログインフォーム、ユーザー登録フォーム、掲示板など)を調査する。
まず基本的な調査として、フォームに「'」を入力してみよう。この文字は、SQLクエリにおいて、文字データをクォーティング(囲う)するものである。これが入力されることによってSQLクエリのクォーティングが崩れ、データベースエラーが発生する場合がある。この場合、調査対象にはSQLインジェクション脆弱性が存在する可能性がある(画面7、画面8)。
画面7 データベースエラー |
---|
画面8 データベースエラー |
---|
しかし、昨今のWebアプリケーションではこのような生のエラーを出現させることなく、あらかじめ用意されたカスタムエラー画面が出力される場合がある。このような場合、SQLインジェクション脆弱性によりエラーが発生したのか、それとも他の原因によってエラーが発生したのかが判別できない。その場合は、(図4)のように調査方法を工夫してみる。
図4 動作の比較によるSQLインジェクションの調査 |
---|
※クリックで拡大 |
ポイントとしては、そのフォームでどのような種類のデータが想定され、どのようにSQLクエリが構成されているかを予想して調査することである。なお、フォームから直接入力できないパラメータについては、HTMLインジェクションの項でも紹介したローカルプロキシなどのツールを用いて調査するとよい。
・攻撃手法と想定される被害
では、実際にSQLインジェクションを用いての攻撃を想定したテストを行ってみよう。ここでは一例として、SQLインジェクションによるユーザー認証のバイパスを行ってみる。このサイトでは、以下のようなSQLクエリにより、認証情報を検索しているとする。
(ユーザーIDパラメータ)' AND password='(パス
ワードパラメータ)';
ユーザーIDには、既存のユーザーとして「test」を、パスワードには以下のテストコードを入力する。
すると、正しいパスワードを入力していないにも関わらず、ログインが成功した(画面9、画面10)。
画面9 認証のバイパス |
---|
画面10 認証のバイパス |
---|
このとき、Webアプリケーション内部ではどのようなことが起こっているのであろうか。認証情報を検索するクエリに、先ほどログインに使用したパラメータを当てはめてみよう。
赤枠で囲われた部分が、入力値である。これを見ると、入力値として渡した文字列がSQLクエリの文法に作用し、「password='' or 'A'='A'」という、常に真となる論理式が構成されていることがわかる。このような形で、パスワードを知らないユーザーIDであっても、認証をバイパスしてログインすることが可能となるわけである。
もし、対象となるサイトで、名前、住所、電話番号などの個人情報を登録する機能があった場合、認証をバイパスされると、そのユーザーの個人情報が攻撃者の手に渡ってしまう危険性がある。また、攻撃者がそのユーザーになりすましている状態でもあるため、なりすまされたユーザーの意図しない形で、サイト上の機能が悪用される危険性がある。
関連コンテンツ
PR
PR
PR