開閉ボタン
ユーザーメニュー
ユーザーメニューコンテンツ
ログイン

  • 会員限定
  • 2008/08/04

実践!Webセキュリティ点検術(最終回)SQLインジェクションの調査と対策

Webアプリケーションに対するペネトレーションテスト(後編)

情報漏えいの防止、内部統制をはじめ、昨今の情報システム部門に求められるセキュリティの課題は非常に多い。いかにセキュアなシステムを構築しているつもりであっても、思わぬところに落とし穴があればすべてが水泡に帰す。本特集では、守る側ではなく攻める側に立って自身のシステムをチェックする「ペネトレーションテスト(疑似侵入テスト)」のノウハウをご紹介するとともに、多角的なセキュリティに対する考え方を持つ必要性を説く。第7回はSQLインジェクションの調査と対策についてご紹介する。


執筆:田嶋 祐介


※弊社および筆者はこの記事によって引き起こされた損害賠償責任、刑事責任、一切の責任を負いません。調査を実施する場合は、調査が許可されたテスト環境に対してのみ行ってください。場合によっては「不正アクセス禁止法」などに抵触することもあるので自己責任の上で十分に注意して実施してください。

SQLインジェクション

 SQLインジェクションとは、Webアプリケーションと連動したデータベースに、サイト管理者の意図しない操作を実行させることが可能となる脆弱性である。会員情報を扱うようなWebサイトの場合、顧客から入力されたデータは、Webサーバと連携するデータベースへと格納されることが多い。データベースに格納されたデータは、必要に応じてWebアプリケーションから呼び出される。たとえば、ユーザーがログインするときには、認証情報が検索され、合致すればログインを認める、といった処理が行われる。ほかにも、サイトの要求に従い、登録、閲覧、更新、削除といったデータ処理が行われる(図3)

図3 Webアプリケーションとデータベースの相関図


 Webアプリケーションは、ユーザーから送信されたデータを取り入れ、SQLクエリとして構成し、データベースへ送信する、という処理を行う。このとき、ユーザーから入力されたデータに、SQLクエリの文法に作用してしまうような文字列が混入されていた場合、サイト管理者の意図しない形でSQLクエリが構成され、データベースに送られることになる。これにより、データベース上でサイト管理者の意図しない形でクエリが実行され、データベース内のデータが書き換わったり、本来取得されないはずの情報が取得されたりするという問題が生じる。これがSQLインジェクションである。

・調査方法
 SQLインジェクションが行われるのは、WebアプリケーションがデータベースへSQLクエリを送信する個所であるから、それが行われているであろう個所(検索フォーム、ログインフォーム、ユーザー登録フォーム、掲示板など)を調査する。
 まず基本的な調査として、フォームに「'」を入力してみよう。この文字は、SQLクエリにおいて、文字データをクォーティング(囲う)するものである。これが入力されることによってSQLクエリのクォーティングが崩れ、データベースエラーが発生する場合がある。この場合、調査対象にはSQLインジェクション脆弱性が存在する可能性がある(画面7画面8)。

画面7 データベースエラー



画面8 データベースエラー


 しかし、昨今のWebアプリケーションではこのような生のエラーを出現させることなく、あらかじめ用意されたカスタムエラー画面が出力される場合がある。このような場合、SQLインジェクション脆弱性によりエラーが発生したのか、それとも他の原因によってエラーが発生したのかが判別できない。その場合は、(図4)のように調査方法を工夫してみる。

図4 動作の比較によるSQLインジェクションの調査

※クリックで拡大

 ポイントとしては、そのフォームでどのような種類のデータが想定され、どのようにSQLクエリが構成されているかを予想して調査することである。なお、フォームから直接入力できないパラメータについては、HTMLインジェクションの項でも紹介したローカルプロキシなどのツールを用いて調査するとよい。

・攻撃手法と想定される被害
 では、実際にSQLインジェクションを用いての攻撃を想定したテストを行ってみよう。ここでは一例として、SQLインジェクションによるユーザー認証のバイパスを行ってみる。このサイトでは、以下のようなSQLクエリにより、認証情報を検索しているとする。

SELECT * FROM usertable WHERE userid='
(ユーザーIDパラメータ)' AND password='(パス
ワードパラメータ)';

 ユーザーIDには、既存のユーザーとして「test」を、パスワードには以下のテストコードを入力する。

' or 'A'='A


 すると、正しいパスワードを入力していないにも関わらず、ログインが成功した(画面9画面10)。

画面9 認証のバイパス



画面10 認証のバイパス



このとき、Webアプリケーション内部ではどのようなことが起こっているのであろうか。認証情報を検索するクエリに、先ほどログインに使用したパラメータを当てはめてみよう。




 赤枠で囲われた部分が、入力値である。これを見ると、入力値として渡した文字列がSQLクエリの文法に作用し、「password='' or 'A'='A'」という、常に真となる論理式が構成されていることがわかる。このような形で、パスワードを知らないユーザーIDであっても、認証をバイパスしてログインすることが可能となるわけである。

 もし、対象となるサイトで、名前、住所、電話番号などの個人情報を登録する機能があった場合、認証をバイパスされると、そのユーザーの個人情報が攻撃者の手に渡ってしまう危険性がある。また、攻撃者がそのユーザーになりすましている状態でもあるため、なりすまされたユーザーの意図しない形で、サイト上の機能が悪用される危険性がある。

お勧め記事

Webセキュリティ ジャンルのセミナー

Webセキュリティ ジャンルのトピックス

Webセキュリティ ジャンルのIT導入支援情報

PR

ビジネス+IT 会員登録で、会員限定コンテンツやメルマガを購読可能、スペシャルセミナーにもご招待!