SQLインジェクション

    サマリーSQLインジェクションとは、Webアプリケーションに対する攻撃の一つです。この記事では、SQLインジェクションの手法や発生しうるリスク・被害について解説しています。

    目次

    SQLインジェクションとは

    SQLインジェクションとは、Webアプリケーションに対する攻撃の一つです。

    SQLを用いてデータベースの操作を行うWebアプリケーションでは、ユーザの入力から動的にSQL文を生成し、実行します。このようなシステムにおいて、悪意ある入力をすることでWebアプリケーションの作者が意図していないSQL文を発行する攻撃やその脆弱性のことをSQLインジェクションと呼びます。

    商品検索やユーザの管理など、SQLを用いてデータベースの読み込み、書き出しをしているWebアプリケーションではSQLインジェクションの被害を受ける可能性があります。

    基本的なSQLインジェクションの手法

    SQLを用いたWebアプリケーションの機能として、商品検索を例に説明します。

    ユーザは検索したいワードを入力し、その入力からSQL文が生成、実行されます。そしてユーザの入力に合った商品のデータが表示されます。

    しかし、攻撃者が「UNION」や「--」などのSQLのコマンドとして意味を持つ文字列を含んだ入力をすると、Webアプリケーションの作者が意図していないSQL文を発行されることになってしまいます。

    その結果、ユーザに公開していない情報が表示されてしまうといった被害を受けてしまいます。このように悪意ある入力をされることで、不正なデータデータベースの操作や情報漏洩、ユーザ認証の回避などの被害を受けてしまう可能性があります。

    発展的なSQLインジェクションの手法

    SQL文を発行して得られた結果の表示について2種類が考えられます。

    1つ目は商品検索のように、得られた結果が応答ページに直接表示される場合や、HTTPレスポンス中に含まれる場合です。もう1つはログイン画面のように、応答ページに直接は表示されない場合です。

    前者では基本的なSQLインジェクションで説明したような方法で情報をリークされてしまいます。一方、後者では応答ページの違いといった挙動の差や、エラーメッセージを利用した発展的な方法で情報をリークされてしまいます。

    この発展的なSQLインジェクションには「ブラインドSQLインジェクション」と「エラーベースSQLインジェクション」が挙げられます。

    ブラインドSQLインジェクション

    ブラインドSQLインジェクションとは、SQL文の真偽によるWebアプリケーションの挙動の変化から「ある条件が満たされているか」を確認し、情報のリークを目指す攻撃方法です。

    攻撃者はSQL文に確認したい条件を注入し、SQL文を実行した際の挙動からその結果を確認します。この流れを繰り返して情報のリークを目指します。

    エラーベースSQLインジェクション

    Webアプリケーションでは入力された値に異常がある場合、SQLのエラーメッセージを画面に出力する場合があります。

    この仕様を悪用することで、データをリークする攻撃をエラーベースSQLインジェクションといいます。

    発生しうるリスク・被害

    SQLインジェクションによって以下のような被害を受ける可能性があります。

    情報漏洩

    情報を取得するようなSQL文を発行されることで、機密情報が漏洩してしまう可能性があります。

    SQLインジェクションの被害を受ける脆弱性がある箇所で扱っているテーブルに限らず、他テーブルの情報も漏洩する可能性があります。

    不正なデータ操作

    SQLで管理しているデータベースを改ざん、削除されてしまう可能性があります。

    ユーザ認証の回避

    ログインページにおいてSQLインジェクションの脆弱性があると、ユーザ認証が回避されたり、アカウントが乗っ取られたりする可能性があります。

    Webアプリケーション診断の解説記事