2008-05-02 2008-05-02 複文が利用できるデータベースの調査
●SQL Serverが狙われるには理由がある
SQLインジェクションを利用したWebサイトの改ざん事件が頻発している。標的となったサイトの多くがIIS(ASP)とSQL Serverの組み合わせを利用していることから、今回の攻撃がIISやSQL Serverの脆弱性を利用したものだと言う報道があるらしい。
これに対して、マイクロソフトが反論している。
「SQLインジェクション攻撃とIISは無関係」とMicrosoft
しかしMicrosoftはセキュリティ対策センター(MSRC)のブログで、今回のWebサーバ攻撃では「未知の脆弱性や新しい脆弱性は悪用されていないことが当社の調査で分かった」と説明。攻撃はIISやSQL Serverの脆弱性を突いたものではなく、アドバイザリー951306の脆弱性とも無関係だとした。
これはまぁ、もっともな内容だと思う。しかし、疑問は残る。なぜ、IISとSQL Serverの組み合わせが狙われるのか。これに対する理由は色々と憶測できるが、私はSQLインジェクションによるデータ改ざんを行う上で重要となる「SQLの複文」に注目している。 SQLインジェクションによるサイト改竄 2008-03-20 - T.Teradaの日記によると、 Neil Carpenter’s Blog : Anatomy of a SQL Injection Incident, Part 2: Meatを引用する形で、今回の攻撃を以下のように説明している。
非常におおざっぱに言うと、以下のような感じです。
1. リクエストを送ってみて、SQLインジェクション脆弱性があるか調べる。
2. 脆弱性がある場合、それを突いて、全テーブルの、全カラムの、全レコードの値を改竄する*1。具体的には、DB格納値の末尾に「<script src=http://www.211796...(省略)」のような攻撃コードを追加する。
3. DBのデータをエスケープせずにHTMLに出力している箇所があると、挿入されたJavaScriptがユーザのブラウザ上で動作して、これが悪さをする。
この2番目のフェーズでは、T-SQL(Transact-SQL)というSQL Serverの拡張SQLが利用されているのだが、SQLインジェクションにより以下のようなリクエストでこれを実行している。
d=z';DECLARE%20@S%20NVARCHAR(4000);SET%20【略】
すなわち、セミコロンにより複数のSQLを記述する「複文」が利用されている。
ところで、SQL Injection Cheat Sheetという文書によると、言語とデータベースの組み合わせにより、この複文が利用できるか否かが異なっている。
| SQL Server | MySQL | PostgreSQL | Oracle | |
| ASP | ○ | |||
| ASP.NET | ○ | |||
| PHP | ○ | × | ○ | |
| Java | × |
○:複文に対応
×:複文に非対応
ごらんのように非常に不完全な表であるので、手元の環境で補完してみることにした。ただし、自宅のPCがWindowsXP Home Editionなので、IISを実行することができない。そのため、ASPとASP.NETは調査から除外し、代わりににPerlを追加して、SQL Server、MySQL、PostgreSQl、Oracleについて、調査を行った。
| SQL Server | MySQL | PostgreSQL | Oracle | |
| PHP | ○ | × | ○ | × |
| Java | ○ | × | △ | × |
| Perl | ○ | × | ○ | × |
○:複文に対応
△:更新系のSQLであれば複文に対応
×:複文に非対応
事前の予想では、言語依存もあるのかなと思っていたのだが、確認してみると言語依存はほとんどなく、データベースの種類によって決まるようだ。
SQLインジェクションによって複雑なことを行う(とくに更新系)ためには、複文が利用できるかどうかが問題となる。広く利用されているデータベースでは、SQL ServerとPostgreSQLで複文が利用できることは、攻撃者の立場から考えると、ターゲットにしやすいプラットフォームということになる。PostgreSQLは日本では人気があるが、世界的には他の三種のデータベースほど普及していない。このように考えると、SQL Serverが狙われる背景には、(Microsoftの責任とは言えないにしても)、それなりの理由があるのだと考える。
昨今の改ざん事件で MS-SQLサーバが狙われているのは、マルチステートメント(複文; multiple SQL statements) がサポートされているからだというご指摘。 マルチステートメントは、Microsoft SQL Server と PostgreSQL と Sybase がサポートしていて、Oracle と MySQL ..
SQLインジェクションによって複雑なことを行う(とくに更新系)ためには、複文が利用できるかどうかが問題となる。広く利用されているデータベースでは、SQL ServerとPostgreSQLで複文が利用できることは、攻撃者の立場から考えると、ターゲットにしやすいプラットフォームと
複文を記述するには、セミコロン「;」で複数のSQL文を区切ると説明していたが、マイクロソフトの公表している文書によると、SQL Serverにおいては、複文の区切りにセミコロンは必要ないことが分かったので報告する
PostgreSQLでは、複文が利用可能かどうかはAPIによって(というかプロトコルによって)決まります。拡張問い合わせでは複文を使うことはできません。 PQexecと異なり、PQexecParamsは、文字列内