Date: Wed, 1 Jun 2005 17:17:57 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です、こんにちは
入力されたパラメータの値を使って、SQL文の文字列を組み立てて
その文字列をEXECUTE命令によって実行させるような場合に、
与えられたパラメータの内容を正しく検査していますか?
【続報】OZmallへの不正アクセスの手口は「SQLインジェクション」
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050531/161856/
不正アクセスというより、そのようなプログラムを構築した開発者側に
落ち度があると言えるでしょう。
「SQLインジェクション」は、
文字列を比較するときにクォートで囲む規則
や
SQL文がセミコロン等で実行単位が区切られる
などの性質を応用したものです。
これらは、実行しているデータベースのSQL文の文法によって
その方法は変わりますので、今使用しているデータベースの
SQL文の文法を十分に熟知している必要があります。
例えば、SQLServerで、
CREATE TABLE passwd (
id_name varchar(20) ,
id_pass varchar(20)
)
のようなユーザ名とパスワードを入れたテーブルがあるとします。
本来、データベースサーバーのテーブルに、生のパスワードを入れること事態、
設計が間違っているのですが、そのことは無視しておきます。
ユーザ名とパスワードが与えられて、そのレコードが存在するかどうかを調べる
場合に、わざわざ動的SQL文を構築する人は居ないと思いますが、もし、
動的SQL文にしたらどうなるでしょうか?
Create Proc IsOK
@id varchar(20) ,
@ps varchar(20)
AS
DECLARE @SQL VARCHAR(1000) --このサイズも本来は考えておく必要あり
CREATE TABLE #TMP( CHK INT )
SELECT @SQL =
'IF EXISTS( ' +
' SELECT * FROM passwd ' +
' where( ' +
' id_name=''' + @id + ''' and id_pass=''' + @ps + ''')
' +
') ' +
' BEGIN ' +
' SELECT 1 AS CHK' +
' END ' +
'ELSE ' +
' BEGIN ' +
' SELECT 0 AS CHK' +
' END '
INSERT INTO #TMP(CHK) EXEC(@SQL)
SELECT * FROM #TMP
GO
EXEC IsOk '正しいユーザ名' , '正しいパスワード'
のときは、当然、正しいと判定されます。
しかし、
EXEC IsOk '正しくないユーザ名' , '正しくないパスワード'' OR
''X''=''X'
のときも、正しいと判定されます。
SQL文を組み立てた文字列を想像すればわかりますが、与えられた文字列が
そのままSQL文になりますので、
OR ''X''=''X'
の文字列が WHERE句の最後に付加され、常に真(True)の状態が成立します。
実際のWHERE句は次のような文字列になります。
id_name=''' + @id + ''' and id_pass=''' + @ps + ''') '
id_name='正しくないユーザ名' and id_pass='正しくないパスワード' OR
'X'='X' )
論理演算子は、AND部分がORの前に評価される
このような攻撃?が成立するのは、与えられたパラメータの内容を十分検査
しないで、SQL文を組み立てることに原因があります。
SQL文を自分で組み立てる動的SQL文を使うときは、必ず、パラメータのチェックを
して下さい。
と言いつつ、私が書いた原稿では、パラメータチェックは省略していることが多いで
すね
注釈を書かないと、わかってくれない人が増えているのでしょうか。。。。
-----------------------------------
(株)日本技術ソフト開発
堀川 明 (Akira Horikawa)
06月01日(水曜日) 17時17分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|