• ベストアンサー

SQLインジェクション事件について

私は一介の事務ユーザーにすぎませんが、職場で他にパソコンのことがわかる人がいないので、あれこれ頼られてしまい少々重荷の毎日です。 先般大きなニュースで一般市民にもすっかり有名?になってしまったSQLインジェクションのことについて、ちょっと教えて下さい。 他の掲示板サイトで、事件の原因はマイクロソフト製ウインドウズOSと、マイクロソフト製SQLサーバーの欠陥が相乗的に生み出したセキュリティホールだから、他社製品で組まれたシステムなら大丈夫だ、と教わりました。 私はSQLのことをよく知らないのですが、調べてみると言語としてSQLは標準化されていると解説されているので、どこのメーカーのシステムでもSQLサーバーは普遍的に対策が必要ではないかな?と思ってしまったのですが、本当にマイクロソフト製品だけの問題でしょうか? (それとも、価格.comと静岡新聞サイトで犯人が使った「あの手口」に限ってマイクロソフトの欠陥責任だったのでしょうか?) 自分なりにIT関連のWEB記事バックナンバーを色々当ってみましたが、これについてweb上で報道されている物はちょっとみつかりませんでした。 どなたかどうぞよろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

#2で言うフロントエンドとは、SQL文をデータベースに送り込むことのできるシステム(プログラム)の全体です。ですので、IISを使って構築したサーバアプリケーションであれば、「IIS+サーバアプリケーション」を指します。 そして、現在公開されている情報からは、この「IIS+Webサイトアプリケーション」のうちどの部分に瑕疵があったのかは不明のままです。IISに瑕疵があったのかもしれないし、Webサイトアプリケーションに瑕疵があったのかもしれません。両方かもしれませんが、事実がどうなのかは公開されていません。 以下は個人的な推測です。 IIS自体に、IIS単体でSQL Injectionを可能とするような瑕疵があったとは考えにくいと思っています。その理由は (1) IIS自体の管理はSQLベースではない。 (2) IISに付属のサンプルスクリプトやサンプルテンプレートは、だいぶ昔にセキュリティホールとなる欠陥(改修済み)があり、その事実は広く公開されている。(過去に多くの関心を集めたため、その時点で他の欠陥が存在すれば見つかっているに違いない。) (3) IISに付属のサンプルスクリプトやサンプルテンプレートにSQL Injectionが可能だとしても、それらが実際に稼動しているサーバアプリケーションのデータベースに接続できるようWebサイトアプリケーションやデータベースシステムが設定されていることは考えにくい。 の3点です。 (1)は文字通りです。(2)と(3)はもう少し説明が必要かと思います。 IISの付属サンプルには、過去にセキュリティ上の大きな欠陥がありました。これは大きく報じられたため、研究者・クラッカー両方の関心を集めたはずです。SQL Injectionが可能となる欠陥は発見が比較的容易なので、その時点で何か問題があれば既に見つかっているはずです。これが(2)です。 とはいえ、その後新たに追加されたサンプルやユーティリティでSQL Injectionが可能なものが現在存在しないと断言はできません。しかし仮にSQL Injectionが可能なものが現在存在したとしても、それがWebサイトアプリケーションが発行するSQL文を扱うわけではありません。 Webサイトアプリケーションに対してSQL Injectionを実行するには、そのWebサイトアプリケーションが実行するSQL文を相手にする必要があります。(そうしなければ、Webサイトアプリケーションに関する情報を(不正に)取得することができません。) つまり、SQLをInjectしたいシステム(=Webサイトアプリケーション)と同じWebサーバ(IIS)の上にあっても、独立した別のアプリケーションなので、SQL Injectionを受けてもWebサイトアプリケーション側の情報が取得できることはおよそ考えにくいということになります。これが(3)です。 同じく個人的に、どこに瑕疵があったと考えているかというと、それは上で言うところの「Webサイトアプリケーション」の側です。多分、ユーザが入力した文字列をそのままSQL文の中に組み入れて発行するような箇所があったのでしょう。これは非常によく見る、ありがちなミスです。

altosax
質問者

お礼

いつも親身に御解説いただき、本当にありがとうございます! >どこに瑕疵があったと考えているかというと、それは上で言うところの「Webサイトアプリケーション」の側です。 なるほど、「Webサイトアプリケーション」だとカスタムで作られることが多いでしょうから、それを請け負ったシステム会社の瑕疵、という線が確率的には濃厚、ということになりそうですね。 質問投稿の動機となったのは、MacOSXserverを採用していればこういう被害に遭う事は皆無である、という事を教わったからなのですが、もしそうであれば無傷で済むシステムというものはSQL言語の処理を仕様通りに正直に遂行しないで、どこかに標準仕様から外れたトリックを設けていることになりますものね。 (もしかしたら、本当にそういう特殊仕様なのかもしれないので、今度又聞いてみたいと思います) 参考サイトにご紹介くださった情報処理推進機構はとても助かりました。 今の私のレベルではなかなか理解しきれない所が大半ですが、このサイト解説がわかることを目標に他の参考書や、またこちらでの質問等で助けて頂きながら正しい理解を深めていきたいと思います!!

その他の回答 (3)

  • hoihence
  • ベストアンサー率20% (438/2093)
回答No.4

こんにちは。 あのですね、SQLに関しては、ほとんど素人なんですが、今回の件というのは、WEBアプリないしはCGIが動的に生成するSQL文構築の段階での問題だと認識してます。 例えばなんですが、 1 マルチプルステートメントの扱いに問題があった。 2 単純に、サニタイジングされてない特殊文字があった。 3 入力データチェックがされない箇所が残ってた。 4 hiddenフィールドでチェックされてない箇所があった。 5 タグの属性値としてのイベントハンドラが機能できるようになっていた。 等々いろいろありますが、実際に、「何がどうだったのか」というのは知らないです。 まあ、今回の事で個人的に思ったのは、「サイト運営者」、「検挙された攻撃者」双方ともに「情けないなァ」と感じました。 まず、攻撃者の方なんですが、検挙された中国籍の学生は自宅から行ってたんでしょ。それじゃあ、簡単に足が付いちゃうに決まってるじゃないですか。ツールは強力だったけど、使用者がアホだったという、典型的なスクリプトキディーだったということです。 次に、サイト運営者の方なんですが、ちゃんとAUDITINGやってたんですかねぇ。実用に耐えうるかどうかを真摯に精査するということであれば、PENETRATION TESTとかやるはずなんですが。コンサルにソースコードレビューを依頼したりとか。 まあ、上記はあくまで個人的な雑感に過ぎません。

altosax
質問者

お礼

どうもありがとうございます! 専門用語が私にはまだまだ敷居が高いのですが、かなめはマルチステートメントなどにもともとSQL言語の不備というか、制定時点ではそこまで考えて無かった脆弱性があった、 けれど、もうSQLは標準言語として「制定」されてしまっているから、そう安易に改訂するわけにも行かない、 だからカスタムでアプリを作る技術者はSQLの弱点を補う工夫が必要なのが今の技術者に求められる常識的鉄則だ、 ∴Windowsに立脚した基本システムの問題とは別物 ということですね^^? >検挙された中国籍の学生は自宅から行ってたんでしょ。 なあんと、そうだったんですか^^; こんどの終戦記念日には中国じゅうのネットカフェから総攻撃の注意、などとニュースに出ているのを先ほど見ました。 自分でパソコンがなかなか買えない人もまだいるでしょうけど、身元を隠すための中国ネットカフェ繁昌かと思っていました^^; マック系の先輩が「これはWindowsの問題が露呈した」と言ったのは、もしかすると中国で出回った「SQL注入工具」がWindows版のツールだ、ということを言いたかったのかな?ですね。 >運営者の方なんですが、ちゃんとAUDITINGやってたんですかねぇ 運営者は基本的に物品販売業だったり新聞社だったりですから、監査関係のことは門外漢で外注技術者の能力にゆだねられてしまわざるを得なかったのかと私は新聞を見て思いました。 価格.comの社長さんの記者会見では「現在時点で最高の安全策を導入しているにも関わらず・・・」と冒頭に言ってたのが印象的でした。 大金を外注システム業者に払って安全を任せたつもりが騙された、という悔しい気持ちを感じました。 システム業者側の言い分は、「もっと払ってくれないとそこまでは出来ません」なんだろうなあ、と・・・ その後の顛末が非公開のままですので勝手な憶測ですが、非公開を貫かざるを得ない理由としてはこういう線も濃厚だろうなと薄々感じています。 どうもありがとうございました!

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

No.1回答者さんの指摘のとおり、"SQL Injection"という手口自体はどのデータベースシステムを使っていても起こり得るものです。実際に、SQL Server以外でも過去に何度も発生しています。 SQL Injectionを行うには「SQL文を処理(実行)するデータベースシステム」のほかに「SQL文をデータベースに送り込むフロントエンド」が必要で、このフロントエンドに脆弱性があると実行可能となります。 (参考: http://www.ipa.go.jp/security/awareness/vendor/programming/a02_01.html) ですから「Windows/SQL Server/IISでなければSQL Injectionに対して安全だ」などということはありません。

altosax
質問者

補足

大変お世話になります! >ほかに「SQL文をデータベースに送り込むフロントエンド」が必要で、このフロントエンドに脆弱性があると実行可能となります。 なるほど! あながち私が聞いた話は100%嘘ではなさそうですね。 ちょっと#1の回答者さんへのお礼で早合点してしまい、不適切なことを書いてしまったかと反省しました。 「Windows/SQL Server/IISでなければSQL Injectionに対して安全だ」 ということではないけれど、連続した発生したインジェクション事件については、 噛ませてあるマイクロソフト製のフロントエンドに瑕疵があった、という結論になりますでしょうか? (この事件に関して、マイクロソフトが修正パッチを出したというニュースも無い様子ですが、フロントエンドの瑕疵、という意味では、他社製システム(フロントエンド)なら被害を受けずに済んだ可能性はやはり否定し切れない、と思ってよいでしょうか?)

回答No.1

実は、SQLで組まれているものであれば、どのようなのでも同じ事になりえることがあるはずです。 例えば・・・・(あくまでも例です) select * from a b c where c=$FORM{query} とか、文字列で入力します。(perlを仮定しています) もし、この$FORM{query}の中身が・・・ abc; select * from password とか abc(\x0d\x\a =いわゆる改行)select * from password とか、なっていたら、どうでしょう? このような場合は、個人情報抜き出しの場合ですが、ウィルスを配布するようなのであれば もっと複雑な工程がとられることでしょう。 あくまで、ご参考までに・・・

altosax
質問者

お礼

どうもまた大変お世話になります! SQLの構文を仕様どおりに正しく処理するシステムだったら、全部が該当してしまう訳ですよね。 この話しを聞いた時に最初から懸念していたのですが、やはり困り者の宗教学者たちに私が騙されていたことがはっきりわかってすっきりしました! どうもありがとうございました。

関連するQ&A

  • XSS、CSRF、SQLインジェクションについて

    XSS、CSRF、SQLインジェクションをそれぞれ簡単に説明すると、 XSS・・・動的なWebサイトにおける入力フォームの脆弱性 CSRF・・・ユーザーになりすましてWebサーバーにリクエストすること SQLインジェクション・・・アプリケーションが実行するSQL文に変なものを注入して、意図しない 動作をさせる攻撃のこと で正しいですか?

  • SQLインジェクションについて質問です

    よくSQLインジェクションの攻撃で、改竄されたWEBページからウイルスを仕込まれた。 等という話を耳にしますが、この攻撃でどうやって改竄するのですか? 私が知ってる範囲だと、この攻撃では入力フォームに必ず条件マッチするようなSQLを入れて 情報を取り出したり、DBの情報を書き換えたり、情報を消したりくらいしか出来ない気がするのですが・・ あと、SQLインジェクションの紹介でよく見る、ログイン画面で「' 1=1;--」みたいな入力は誰でも思いつくと思うのですが、DBの情報を書き換えたり消したりするのって そのDBのカラム名とかが分からないとできないですよね。 攻撃者はこれらを推測して行っているのですか。 それともカラム名とかを知り得る攻撃手法があるのでしょうか。 また、SQLインジェクションとは関係ないのですがXSSという攻撃手法もありますよね。 こっちはクッキー情報を盗まれるのが一番大きな被害とありますが クッキー情報を盗まれると具体的に何がまずいのでしょうか。 サーバー側でクッキーに個人の名前とかメアドとかを入れてる場合があるという事ですか?

  • SQLインジェクション

    SQLインジェクション対策の為、DB(postgresql8.0.4)登録の際に今まではaddslashesを使用し実装していたのですが、それではwebサイトの脆弱性の為使われないと言う事で、pg_escape_stringを使い変更したのですが、pg_escape_stringは基本的にDBとconnectしていない限り使えないのでしょうか?

    • ベストアンサー
    • PHP
  • PERLでXSSやSQLインジェクションを防ぐためのCPANライブラリ

    Perlで、SQLiteからデータを取ってきてブラウザへJSONを返したりするwebアプリを書いています。 クロスサイトスクリプティングやSQLインジェクションを防ぐためにうまくエスケープしてくれるようなcpanライブラリありましたら教えてください!

    • ベストアンサー
    • Perl
  • SQLインジェクション攻撃調査ツール Scrawlrについて

    カテゴリがウイルス対策なのは微妙に間違いなんですが・・・ SQLインジェクション攻撃調査ツール、「HP Scrawlr」について教えてください。 マイクロソフトのホームページに紹介されていた、 HPの「Scrawlr」というツールについて、 インストールまではできたのですが、うまく使うことができません。 接続設定がおかしいらしく、 「Connectivity Error Either couldn't connect or webpage returned a 4xx status code... please check your connectivity settings」 というメッセージが表示されます。 はじめプロキシホスト設定をプロキシサーバのIPにして、 上記エラーになったので、 「Allowed Hosts」にプロキシサーバ名を追加してみたりしたんですが、 エラー解消されません。 ちなみに、インストールしたPCはWEBサーバなどではなく、 インターネットに接続できるだけのPC(WindowsXP)です。 そこから外部サイトのURLを調査しようとしています。 そもそもが使い方を間違えてるのかもしれないのですが、 Scrawlrのサポートやインストールサイトが全て英語のため、 情けないことに 詳細な使い方が見つけられない・サポートを読んでもイマイチ理解できない状態です。 「Scrawlr 使い方」でWEB検索しても詳しい記述が見つけられませんでした。 わかるかたいらっしゃったら、ご教授お願いいたします。

  • IIS7.0におけるSQLインジェクション対抗策について教えてください

    IIS7.0におけるSQLインジェクション対抗策について教えてください 1ヶ月ほど前からデータベースに悪質なスクリプトが書き込まれるようになりました。 そこで、DBユーザー名もパスワードも変更しましたがそれでも書き込まれるので、データベースにUPDATEもしくはinsertしているファイルにエスケープ処理をしようとしていますが、ファイル数が多いので 一旦、それらのファイルに外部からアクセスできないようにIISで設定してしまいました。 ほとんどすべてのIPアドレスからのアクセスを拒否するようにマスクは0.0.0.0に設定しています。 アクセスしようとすると403エラーになります。 ところがそれでもスクリプトが書き込まれるのです。 こういう攻撃って可能なのでしょうか? ファイルアクセス不可にも関わらず、テーブルに書き込みされるということは、ファイルにエスケイプ処理を施しても無駄だと思い、 とりあえずDBのすべてのユーザーにテーブル」への挿入・更新権限を拒否しました。 これでやっと書き込みがなくなりましたが、この設定ではWEB上から何らかのデータ操作をしようとする毎にWEBサーバーにリモートデスクトップ等でアクセスして、SQLサーバーのユーザーに権限付与しなければならず、WEBアプリケーションとしての意味がなくなります。 対応策はあるのでしょうか 大変困っています。 サーバーへの解放ポートはport80のみで、当然、SQLポート1433どは閉じています

  • SQL Server 2005の動作環境

    Windows Storage Server 2003 環境でSQL Server 2005について マイクロソフトは動作サポートするのでしょうか? また、そのようなサイトがあれば教えて下さい。

  • マイクロソフトのSQL Serverって何?

    マイクロソフトのSQL Serverって、どんなソフトなんですか? 名前からしてサーバー用ですけど・・・

  • SQLインジェクションの例

    Webページのフォームを使い,MySQLデータベースにSQLインジェクションを実行しようとしています. 環境はもちろんローカル環境です. テーブルはこのようになっています. mysql> DESC member; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | no | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | | | +-------+--------------+------+-----+---------+----------------+ JSPページのソースの一部はこのようになっています. PreparedStatement ps = db.prepareStatement("INSERT INTO member(no, name) VALUES(" + no + ",'" + name + "')"); noに 12 nameに name'); DELETE FROM member; -- という入力を与えると INSERT INTO member(no, name) VALUES(12,'name'); DELETE FROM member; --') となり,テーブルのデータを全て消去できると考えましたが,文法エラーとなるらしく,消去されません. com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; DELETE FROM member; --')' at line 1 この場合,ソース・フォーム入力内容・データベースなどのどの箇所をどのように修正すれば良いでしょうか?

    • ベストアンサー
    • MySQL
  • Microsoft SQL Server 2005 の重複キー

    長年マイクロソフトのAccessを使っていました。 最近マイクロソフトのSQL Server 2005を使うようになりましたが Accessにあった、重複キーの設定がわかりません。 どう設定すればできるのか教えて頂けませんでしょうか? またはSQL Server 2005の方に重複キーといったものはないでしょうか? よろしくお願い致します。