TOP設計・移行・活用> マルチプルステートメント
脆弱なWebアプリケーション
脆弱なWebアプリケーション

第5回:インジェクション攻撃
著者:セントラル・コンピュータ・サービス  長谷川 武
2005/5/25
前のページ  1  2   3  4  次のページ
マルチプルステートメント

   データベースエンジンによっては、次のようにセミコロン「;」でSQL文を区切って並べることで、一度に複数のSQL文を投入できる「マルチプルステートメント機能」を持つものがある。
SQL文; SQL文; SQL文…

   PostgreSQL、Microsoft SQL Serverなどがこれをサポートしている。

   マルチプルステートメントをサポートするデータベースの場合は、もっと困ったことが起こり得る。攻撃者は「;」記号を用いて、まったく自由にSQL文を混入できるからである。

   次の攻撃例は、管理者アカウントadminのパスワードを勝手に書き換えてしまうものだ。

攻撃入力:'; update account_table set pw='foo' where uid='admin'--

   次の攻撃例は、テーブルの特定のカラムを同一の値で塗りつぶしてしまう。

攻撃入力:'; update account_table set pw='bar'--

   テーブルの全データを削除したり、テーブルそのものを消去したりすることも可能だ。

攻撃入力:'; delete from account_table--
攻撃入力:'; drop table account_table--

   なお、最後の2つの攻撃例が成功するには、データベース接続アカウントに削除オペレーションやテーブル消去オペレーションのパーミッションが与えられていることが前提となる。


UNION攻撃で情報が流出

   マルチプルステートメントが使えないデータベースエンジンでも、既存のSELECT句にまったく新たなSELECT句を追加することが可能である。それはUNION演算子を使う方法だ。UNION演算子は、次のように複数のSELECT句を結合し、各SELECT句の検索結果が「縦に」結合されたものを結果として返す。

SELECT カラム, カラム, カラム, … FROM テーブル1 WHERE 条件1
UNION SELECT カラム, カラム, カラム, … FROM テーブル2 WHERE 条件2
UNION SELECT カラム, カラム, カラム, … FROM テーブル3 WHERE 条件3
UNION …

   UNIONを使う上での制約事項は、結合されるSELECT句間で呼び出すカラムの個数とデータ型が一致している必要があるということである。この条件さえ満たしていれば、まったく異なるテーブルから情報を引き出して結果に結合することができる。

   UNIONを利用して、攻撃者は勝手に別のテーブルの内容を呼び出し、Webページに表示させることができる。次の攻撃例は、商品検索ページを悪用して、ユーザアカウントテーブルaccount_tableのユーザIDとパスワードを全部読み出してしまうものだ。まずは標的となるSQL文を見てみよう。

標的となるSQL文
SELECT name, price FROM product_table WHERE category='ユーザ入力'

   このSQL文を使って、検索条件に該当する商品名と価格がWebページに一覧表示されると仮定する。たとえば次のような感じである。

商品一覧
りんご 360
バナナ 120
みかん 100
レモン 240

   このSQL文に対して、下記の攻撃入力を行う。

攻撃入力:' UNION SELECT uid, pw FROM account_table--

干渉されてできたSQL文
SELECT name, price FROM product_table WHERE category='' UNION SELECT uid, pw FROM account_table--'

   攻撃が成功すると商品の情報は表示されず、account_tableのユーザIDとパスワードがWebページに一覧表示される。たとえば次のようになる。

商品一覧
admin alpha
hasegawa bravo
kato charlie
suzuki delta
tanaka echo

   この攻撃を成功させるには、攻撃者は標的のテーブル名やカラム名を知っておく必要がある。ところがUNION攻撃では、アプリケーションのテーブルだけでなくシステムテーブルからの読み出しも可能だ。どのようなテーブルやカラムが定義されているかの情報についても読み出せるのである。

攻撃入力(ORACLE):' UNION SELECT table_name, column_name FROM user_tab_columns--
攻撃入力(Microsoft SQL Server):' UNION SELECT t.name, c.name FROM sysobjects t, syscolumns c WHERE t.id=c.id--

   攻撃者は最初にアプリケーションが使っているテーブル名とカラム名を突き止め、次にアプリケーションのテーブルから情報を読み出す。

前のページ  1  2   3  4  次のページ


セントラル・コンピュータ・サービス株式会社
著者プロフィール
セントラル・コンピュータ・サービス株式会社  長谷川 武
シニア・セキュリティ・スペシャリスト、IPA 非常勤研究員。2002年にはIPA ISEC『セキュア・プログラミング講座』の制作ディレクターをつとめた。これを契機に、現在は勤務先とそのパートナー企業を通じてセキュアプログラミングセミナー/実習/スキル評価テストといった教育サービスを「TRUSNET(R)アカデミー」として提供している。問い合わせE-mail:info@trusnet.com


INDEX
第5回:インジェクション攻撃
  はじめに
マルチプルステートメント
  シングルクォートのエスケープ
  OSコマンドインジェクション