gihyo.jp » DEVELOPER STAGE » 連載 » なぜPHPアプリにセキュリティホールが多いのか? » 第6回 意外に知られていないブラインドSQLインジェクション

なぜPHPアプリにセキュリティホールが多いのか?

第6回 意外に知られていないブラインドSQLインジェクション

前回の記事でSQLインジェクションの話は終わりにして,クロスサイトスクリプティングの話を書かせて頂こうと思っていました。しかし,6月5日に東京にて開催されたPostgreSQLカンファレンス2007でセキュリティをテーマに講演させて頂き,意外にブラインドSQLインジェクションをご存じでない方が沢山いらっしゃいました。40名ほどの聴講者の皆様にSQLインジェクションをご存じの方?とお聞きするとほぼ全ての方が知っていると答えたのですが,ブラインドSQLインジェクションをご存じの方は数名でした。

SQLインジェクションの常識

ブラインドSQLインジェクションの話をする前に,SQLインジェクションとその対策の常識について確認します。

SQLインジェクション対策として間違ってはいないが不十分な対策
  • エラーメッセージを表示しない(特にSQLエラー)
  • ユーザ入力文字列をエスケープする

これらはSQLインジェクション対策として有用な対策ですが,十分な対策ではありません。この連載でも解説済みですが,SQLインジェクションを確実に防ぐには,全てのクエリにバインドメカニズム(ストアドプロシージャ)を利用する,すべての変数を文字列として処理しエスケープするの2種類の対策があります。

これらの対策を行っても,1ヶ所でもブラインドSQLインジェクションによって攻撃可能である場合,データベース全体のデータを盗まれたり,改ざんされる危険性があります。

以下はよくあるSQLインジェクションの脅威に対する誤解です。

  • データベースの構造を知られていなければ攻撃できない
  • エラーメッセージを表示しなければSQLインジェクションによって攻撃されない
  • SQLインジェクションを成功させるには高度な攻撃スキルが必要である

これらは全てとても危険な誤った認識です。

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

PostgreSQLカンファレンスの私のセッションをお聞きになられた方は,デモによりいかに簡単にブラインドSQLインジェクションが可能か理解いただけたと思います。

ブラインドSQLインジェクションを利用した攻撃手順
  1. SQLインジェクションに脆弱な箇所を見つける
  2. フィンガープリンティングによりSQLデータベースサーバの種類を判別する
  3. ブラインドSQLインジェクションを行い,データベースの構造を解析する
  4. 攻撃用のSQL文を実行させ,情報の不正取得や改ざんを行う

まず,SQLインジェクションに脆弱な部分を発見するのは比較的簡単です。例えば,レコードIDの入力が可能な箇所を探すには,ID番号の代わりに

1 AND 1 = 1

1 OR 1 = 1

のような文字列を送信してアプリケーションの動作がどのように変化するか観察するとSQLインジェクションに脆弱か判別できます。これ以外にもSQLインジェクションに脆弱かチェックするために便利な文字列はいくつもあります。エラーメッセージが表示されなくてもプログラムの動作はSQL文の実行結果によって変化します。プログラムが予期していない入力を与えることによって発生するアプリケーションの動作の違いによって攻撃者が簡単にSQLインジェクションに脆弱か判別できます。

データベースサーバの種類もフィンガープリンティングによって簡単に判別できます。ステップ1でSQLインジェクションに脆弱な箇所がわかっているので,その脆弱性を利用してDBMS特有の関数が利用できるか調査します。例えば,MySQLを利用している場合はbenchmark()関数が利用でき,PostgreSQLの場合はpg_sleep()関数が利用できるかチェックすることによりデータベースサーバの種類が判別できます。

次にブラインドSQLインジェクションを行ってデータベースを解析します。ブラインドSQLインジェクションにはデータベースシステムのシステムカタログ(テーブル定義などを保存したシステムデータベース)をクエリしてテーブル名やフィールド名を解析します。

SQL Serverのフィールド名を取得

SELECT name FROM syscolumns
WHERE id =(SELECT id FROM sysobjects
           WHERE name = 'tablenameforcolumnnames')

PostgreSQLのテーブル名を取得

SELECT tablename FROM pg_tables WHERE schemaname= 'public'

詳しい解説は省略しますが,ブラインドSQLインジェクションが可能な場合,テーブル名,フィールド名,データ型などデータベース定義全体を解析できます。

最後に解析したデータベースの設計情報とSQLインジェクション脆弱性を利用して,目的のデータを盗んだり,改ざんします。データベース構造がわかっているので,SQLインジェクション攻撃を成功させるのはそれほど難しいことではありません。

SQLインジェクション脆弱性は非常に危険

すべてのSQLインジェクション脆弱性がブラインドSQLインジェクションに利用できるわけではありませんが,SQLインジェクション脆弱性の多くがブラインドSQLインジェクションを許してしまいます。SQLインジェクション対策は非常に簡単ですが,作ってしまうと非常に危険な脆弱性であることを,Webサイト運営者と開発者は理解していなければなりません。

参考URL

SQL Injection Cheatsheet
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/
Blind SQL Injection (PDF)
http://www.spidynamics.com/whitepapers/Blind_SQLInjection.pdf

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

  • Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

    Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

  • [改訂版]PHPポケットリファレンス

    [改訂版]PHPポケットリファレンス

トラックバック

  • SQL Injection

    [PR] ږ Web Application SQLインジェクション 不正なSQL文を注入して重要情報の取得や改竄(かいざん)を行うことが可能となる脆弱性、または攻撃のことです。 検証 ウェブアプリケーションのログイン画面において、以下のような実装(Java)がされていると...

    Tracked : #1  情報セキュリティ ポータルサイト (PukiWiki/TrackBack 0.4) (2008/03/23, 03:17)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

Ruby Freaks Lounge

Rubyに関わる,執筆者自身の旬なテーマを扱った,リレー形式の連載です。

これでできる! クロスブラウザJavaScript入門

JavaScriptはウェブ制作において避けては通れない重要な言語ですが,JavaScriptに苦手意識を持たれている方は少なくないようです。 その最大の原因がクロスブラウザ対応という課題であり,本連載ではクロスブラウザ対応のテクニックを詳細に解説します。

ビジネスで成功するためのシステム運用管理のポイント

システムの多様化,技術進歩に伴い,ITシステムの運用管理の必要性が年々高まっています。本連載では,システムの運用管理とは何かについて,現場のニーズと具体的な指針を押さえながらを解説します。

2010年版SEO体得講座

本連載では,いまや企業サイトの戦略の1つとして欠かすことのできないSEOについて,最新トレンドからすぐに使えるTipsまでを紹介します。

小型Linuxサーバの最高峰 OpenBlockS 600活用指南

搭載メモリの増加,CPUクロックの向上など,あらゆる面が強化された期待の新モデルOpenBlockS 600。この記事ではOpenBlockS 600の紹介から,活用するためのさまざまなノウハウを紹介していきます。

はじめMath! Javaでコンピュータ数学

プログラミング言語入門者向けに,知っていると役立つ数学的トピックスを紹介します。簡単な演習問題と解説で,即活用できる知識を目指します。

教科書には載っていない ネットワークエンジニアの実践技術

ネットワークエンジニア,インフラエンジニアのトラブル対応には,時には「教科書通りにいかない」テクニックが必要となります。資格試験では得られないこうした実践的な技術について,実例を元に紹介します。

Googleケータイ,世に現る

2008年9月,Googleが中心となって開発されている「Android」を採用した携帯電話「T-Mobile G1」が発表されました。本連載ではT-Mobile G1を中心にGoogleケータイに迫ります。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント