SQLインジェクション

シェアする

  • このエントリーをはてなブックマークに追加

SQLインジェクションは今日頻繁に発生する攻撃のひとつです。重要で膨大な量の情報を抱える企業にとって、情報の搾取や改ざんなど被害は計り知れません。SQLインジェクションはとても奥が深く、そのすべてを書くと膨大な量になってしまうので、SQLインジェクションによってどのような事が可能なのか、その一例を書きます。検証環境は次の通りです。

  • OS: Ubuntu14.04 LTS
  • DB: mysql 5.5.46
  • PHP: 5.5.9

SQLインジェクションは、DBの種類やバージョンによってSQL文の組み立てや攻撃方法が変わってきます。この攻撃は、プログラマの不注意や知識不足により、攻撃者の意図したSQL文を実行してしまうものです。

SQLインジェクション

以下のスクリプトはSQLインジェクションの脆弱性があります。IDとNAMEを入力すると該当するメールアドレスを表示するという何の意味もないものですが、サンプルなので気にしないでください。

例としてIDに”1″、NAMEに”taro”と入力すると次のようにブラウザに表示されます。

すべての情報を引き出す

このスクリプトはIDとNAMEが一致しないと該当するメールアドレスを表示しません。しかし、次のようにパラメータを渡すとすべての情報が表示されます。

IDが123、NAMEが空のデータはありませんが「1=1」は常にTRUEなので、すべて表示してしまいます。「 — 」はこれ以降コメントという意味なので、これ以降にSQL文があっても無視されます。

この攻撃を仕掛けると、ブラウザには次のように表示されます。

この手法は情報を引き出すだけでなく、認証突破にも使われます。たとえばユーザー名がadminだと知っていれば、パスワード無しでadminとしてログインする事ができます。

テーブル名とカラム名を調べる

一般的に広く配布されているプログラムや製品でない場合、攻撃者にはテーブル構造がわかりません。しかし攻撃者はテーブル構造を調べて他のカラムに格納されている情報を引き出します。

比較的簡単にテーブル構造を調べる事ができます。たとえば次のようにします。

このように攻撃を仕掛けると、次のようにブラウザに表示されます。興味深いテーブル名が見えますが、これは後で触れます。

UNION句を利用すると問い合わせ結果を結合します。テーブル構造が判らないため、この攻撃は1度で成功させることは中々できません。というのも、UNION句はカラム数を合わせる必要があるためです。そのため、0でパディングしています。また、0の位置も重要です。NAMEとEMAILが何番目のカラムかわからないため、何度か試して正しい場所を導き出す必要があります。

これでテーブル名とカラム名が判りました。passwordという興味深いカラム名があるので、これを引き出します。もう判ると思いますが、次のようにします。

結果は次のようになります。

データベース名を調べる

テーブル名と同じくデータベース名も攻撃者にはわかりません。しかし、これも攻撃者は知ることができます。

たとえば次のようにします。

結果は次のようになります。

他のテーブルから情報を引き出す

これは最悪のシナリオのひとつですが、別のテーブルに重要なデータが格納されている場合があります。個人情報やアカウント情報、クレジットカード番号など。

先ほどの例で”customer_card”というテーブル名が見えましたが、もしも攻撃者がこのようなテーブル名を見れば間違いなく情報を引き出します。これまでと同じ手順で次のようにします。

一度に引き出す事のできるカラム数はふたつなので、複数回に分けて情報を引き出す必要がありますが、いずれにせよすべてのデータが引き出されます。

sqlmapを使った検査

これまでは手動でテーブルやデータベースの一覧を取得しましたが、これらは一般的に公開されているツールで自動化することができます。たとえばsqlmapのようなツールを使って。

sqlmapはSQLインジェクションの脆弱性について調査することのできる、使いやすいツールです。実際に使ってみましょう。

テーブル一覧を取得する

テーブル一覧を取得するためには「–tables」オプションを指定します。

データベース一覧を取得する

データベース一覧を取得するためには「–dbs」オプションを指定します。

sqlmapは他にもいくつかオプションがあるので、使いこなせば誰でも簡単にSQLインジェクション攻撃が可能になる事でしょう。できれば、アプリケーション開発者やシステム管理者がこのツールを利用して自サイトのセキュリティを検査して頂きたいと思います。

対策

WEBアプリケーションでは基本中の基本である、ユーザーが入力するパラメータのサニタイズを行う事はもちろんのこと、併せてプレースホルダを使う事が重要です。ただし、プレースホルダはデータベースのバージョンによっては使えないので、自分が使うデータベースのバージョンがプレースホルダに対応しているのか確認する必要があります。

詳細な対策方法についてはIPAのサイトを参照する事を強くおすすめします。

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構

シェアする

  • このエントリーをはてなブックマークに追加

フォローする