新生鳩丸掲示板♯

bakera.jp > 新生鳩丸掲示板♯ > スレッド内全記事表示 (記事 4880 からのスレッド)

スレッド内全記事表示 (記事 4880 からのスレッド)

[4880] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

りゅう (2008年5月9日 17時44分)

SQL Serverが狙われるのは複文が使えるということよりも、Transact-SQLを使えばこの種の攻撃が簡単にできるという点にあるのではないかと思います。

未知のデータベースに対して全テーブルの全カラムの値を更新するということを行う場合、まずテーブルの名前とカラム名を取得して、それを元にUPDATE文を生成し、実行するという手順が必要になります。一般的なSQLでは動的にUPDATE文を生成し実行するということはできないため、テーブルの名前とカラム名の問い合わせ結果を一度入手して、手元でUPDATE文を生成するということを行うことになります。とはいえ、任意の問い合わせ結果が取り出せる都合の良い脆弱性はなかなか存在しないため、この攻撃を成功させるのは難しいはずです。

が、Transact-SQLはストアドプロシージャを記述できるほど高機能なため、前述の手順を単一のクエリーで行うことができます。これであれば、とにかくクエリーを実行させさえすれば攻撃が成功します。攻撃用のクエリーも固定で良いため、自動化も容易です。

通常のクエリーでTransact-SQLのexecute関数のようなものが使えるシステムであれば同様の攻撃を受ける可能性が高いですが、SQL Serverのようにストアドプロシージャの定義ではない部分でそういうものが使えるシステムはそうは無いと思います。

[4881] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

徳丸浩(ockeghem) (2008年5月9日 22時49分)

Transact-SQLを使うことで攻撃が簡単になるということは確かにありますが、そのTransact-SQLを使うためにも、複文が必要になるということです。既存のSQLはSELECTとかUPDATEなどの固定のキーワードで始まっており、複文が利用できない状況で後ろの方をいじったとしても、都合よく任意のTransact-SQLの構文にはできないと思います。

一方、Transact-SQLが使えないとしても、複数のSQLインジェクション攻撃を組み合わせることにより、テーブル構造の把握→更新は可能です。テーブル構造の把握には、UNIONインジェクションやブラインドSQLインジェクションが利用可能ですので、「任意の問い合わせ結果が取り出せる都合の良い脆弱性はなかなか存在しない」ということにはなりません。

[4882] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

りゅう (2008年5月12日 22時35分)

逆に複文が使えれば件の手法の攻撃ができるという訳でもないでしょう。件の手法を使うためには、攻撃対象がクエリー内で組み立てた文字列を新たなクエリーとして実行できる機能を持っている必要があります。調べた限りでは、そのような機能を持っているのはTransact-SQLのexecute文(関数ではなく文でした)のみのようです。

もちろんexecute文に類似する機能を持たないDBMSに対しても全テーブルの全カラムの値を更新する攻撃は可能ですが、SQLインジェクションやUNION攻撃などを行うには技術と手間を必要とします。とにかくクエリーを投げて待つだけで良いのとは雲泥の差があり、そこが狙われる理由となるのではないでしょうか。

[4883] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

徳丸浩(ockeghem) (2008年5月13日 14時9分)

コメントありがとうございます。要するに、複文はMUST要件だが、T-SQLは、より攻撃を容易にするWANT要件だということです。

また、OracleにはPL/SQLがあり、PostgreSQLにはPL/pgSQLがあります。SQL ServerのT-SQLのみが「ストアドプロシージャを記述できるほど高機能」だとは思えません。もっとも、PL/SQLやPL/pgSQLが今回の攻撃の記述ができる・できないまでは検証しておりませんので、これらを検証した上で「SQLインジェクション攻撃には使えない」ということであれば、ぜひご教授ください。Oracleは複文が使えませんので難しいと思いますが、PostgreSQLはできそうに思えます。

[4885] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

りゅう (2008年5月15日 23時36分)

SQLは手続き型言語ではないので、大抵のDBMSではストアドプロシージャを定義するための手続き型言語が別途用意されています。それがPL/SQLやPL/pgSQLなどです。それらはストアドプロシージャを定義するためのものなので、ストアドプロシージャの定義以外の部分では使用できません。問い合わせに使用しているのはあくまでもSQLであって、PL/SQLやPL/pgSQLなどの手続き型言語ではないのです。

Transact-SQLではその2つを区別していないというか、問い合わせもストアドプロシージャの定義も、同じTransact-SQLを使って行います。したがって、ストアドプロシージャとして定義する必要があるような手続き的な処理も、単なる問い合わせとして実行できます。

Transact-SQLのインジェクションはもはや任意のプログラムのインジェクションに近いものであり、普通のSQLインジェクションとは異なるものと思った方が良いのかもしれません。

ちなみに複文をMUST要件としているのはUPDATE文のインジェクションの要件としてということになると思いますが(テーブル構造の取得ではMUSTではないので)、複文を使えないシステムでは情報更新系のインジェクションはできないということになるのでしょうか。

[4897] Re: 「最近の改竄事件でMicrosoft SQL Serverが狙われる理由」

徳丸浩(ockeghem) (2008年5月22日 12時8分)

りゅうさん、詳しいコメントをありがとうございます。間があいて申し訳ありません。SQL Serverが狙われやすい理由として、補強材料ができたように思います。

最後のパラグラフについてですが、

>ちなみに複文をMUST要件としているのはUPDATE文のインジェクションの要件としてということになると思いますが(テーブル構造の取得ではMUSTではないので)、複文を使えないシステムでは情報更新系のインジェクションはできないということになるのでしょうか。

私が調べた範囲ではできないか、少なくとも非常に制約があると思います。

また、ご指摘のように、情報漏えい系に関しては、複文はMUSTではありません。

最近の日記

関わった本など