深刻な「ブラインドSQLインジェクション」の脅威:OWASP AppSec USA 2013 レポート(前編)(2/2 ページ)
2013年11月18日から11月21日の4日間にわたり、Webアプリケーションのセキュリティに関する国際的なカンファレンス「OWASP AppSec USA 2013」がニューヨークで開催されました。その模様をお伝えします。
漏れていないようで漏れている!? ブラインドSQLインジェクションの脅威
ここからは、筆者らが受講したトレーニングの内容を紹介します。
1つ目は、「The Art Of Exploiting Injection Flaws」です。SQLインジェクションに代表されるインジェクション攻撃について、講師が用意したサーバーへの疑似攻撃を通じ、その攻撃手法を理解するのが目的です。
講師は、「SQL Injection, attacks and defense」の共著者で、ノットソーセキュア(NotSoSecure)創立者のスーミット・シッダールタ(Sumit Siddharth)氏です。
トレーニングでは、基本的なSQLインジェクションの手法から、ブラインドSQLインジェクション、インジェクションによるコマンド実行、SQL以外のインジェクション(LDAP、XPath、XQuery、XML)などについて学びました。
ブラインドSQLインジェクションとは?
ここでは、トレーニングの中からブラインドSQLインジェクションを利用した攻撃について、演習で解説された内容を再現する形で概要を紹介したいと思います。
ブラインドSQLインジェクションとは、応答ページから情報を直接盗み出すのではなく、挿入したSQLに対する応答ページの違いから、データベース管理システムに関する情報(実行ユーザーやテーブル名など)を盗み出すものです。
まず、題材として使用する、攻撃対象のWebアプリケーションについて説明します。このWebアプリケーションは、「商品ID」「商品名」「価格」の3カラムからなるテーブルを持っているものとします。
id | name | price |
---|---|---|
1 | コーヒー | 100 |
2 | 紅茶 | 120 |
3 | ウーロン茶 | 90 |
Table: items |
そして、ユーザーがブラウザーからIDを与えると、そのIDをそのままキーとして用いて以下のようなクエリを発行し、商品名と価格を表示するものとします。
SELECT name, price FROM items WHERE id=(ユーザーが与えたID)
例えば、ユーザーがIDとして「1」を与えると、以下のクエリが実行され、画面には「コーヒー 100」という具合に、商品名と価格が表示されることになります。
SELECT name, price FROM items WHERE id=1
では、ここでユーザーがIDとして「1 and 1=1」を与えるとどうなるでしょう。
SELECT name, price FROM items WHERE id=1 and 1=1
となり、and以降は真ですので、画面には先ほどと変わらず「コーヒー 100」が表示されます。では次に、ユーザーがIDとして「1 and 1=2」を与えるとどうなるでしょう。
SELECT name, price FROM items WHERE id=1 and 1=2
今度は、and以降が偽であるため、画面には商品名/価格は何も表示されません。
このように、WebアプリケーションにSQLインジェクションの脆弱性がある場合、挿入されたSQL文の真偽に応じて変化する応答結果から、ブラインドSQLインジェクションによってさまざまな情報が流出してしまう恐れがあります。
例えば、ユーザーがIDとして「1 and substring((select user()),1,1)=’A’」を与えるとどうなるでしょうか(注)。ここで実行されるクエリは以下のようになります。
注:substirng()は文字列の一部を切り出す関数、user()はデータベース管理システムを実行しているユーザーを返す関数であり、データベース管理システムによっては、使用できる関数や関数名が異なる場合があります。
SELECT name, price FROM items WHERE id=1 and substring((select user()),1,1)=’A’
user()が返す文字列の最初の文字が’A’であるならば、and以降が真であるため、画面には「コーヒー 100」が表示されます。’A’以外ならば画面には商品名・価格は何も表示されません。
応答画面にはuser()の戻り値は一切表示されないにもかかわらず、応答画面を確認することで、攻撃者はuser()の戻り値についての情報を得ることができます。これがブラインドSQLインジェクション攻撃の原理です。
上記の方法では、1バイトの情報を特定するために「文字がAかBか……」と、最悪の場合はアルファベットの数だけクエリを繰り返す必要がありますが、文字コードの大小関係を用い、バイナリサーチでクエリを発行する方法を使うと、1バイトの情報を8回のクエリで特定できます。このようなクエリの発行は、スクリプトを用いれば簡単に自動化でき、実際にそのようなツールも幾つか知られています。
このように、ブラインドSQLインジェクションは、挿入したSQLに対する応答ページの違いから情報を盗み出す攻撃であり、応答ページだけを見てもその攻撃に気付くことは困難です。
しかし、SQLインジェクション対策を確実に行うことで、ブラインドSQLインジェクションの被害も防ぐことができます。基本的なセキュリティ対策がいかに重要であるかが分かる一例です。
後編の記事では、ModSecurityに関するトレーニングと、筆者らが注目したセッションの内容をご紹介します。
【関連記事】
OWASP AppSec USA 2012 レポート:
WAFの性能を測る方法は? ソーシャルエンジニアリングを成功させやすいタイプとは?
http://www.atmarkit.co.jp/ait/articles/1302/12/news013.html
Copyright © ITmedia, Inc. All Rights Reserved.