• 検索結果がありません。

: カカクコムのケース

ドキュメント内 かんたんな自己紹介 (ページ 72-91)

事件の概要

76

事件の経緯 (1)

アンチウイルスソフト

NOD32

のユーザがサ イトにアクセスすると、ウイルス警告が表示さ れた

サイトトップページがひそかに改竄され、ウイ ルスが仕込まれていたことが判明

のちに、ユーザのメールアドレス約

25000

件 が漏洩していたことも判明

事件の経緯 (2)

中国からの留学生が逮捕され、カカクコムへの不正 アクセスを認める

ただし、この留学生は閉鎖の直接原因ではない

閉鎖の原因となった攻撃の犯人は不明

以前から大量の不正アクセスが行われていた模様

「実際には単一の犯人ではなく、入れ替わり立ち代わり異 なる犯人による小規模のハッキングを受けてきたことが 明らかになってきた」

「備える心」が大事――カカクコムのインシデントから得られた教訓

78

その後

カカクコムは事件の詳細を 公表していない

報道、インタビューその他 の情報によれば、

SQLインジェクション」

によるものだったと言われ ている

手法の解説

SQL

インジェクション」

80

SQL インジェクションとは

• SQL = Structured Query Language

データベースに問い合わせを行うための言語

• Injection =

注射、注入

• SQL

文の中に悪意あるデータを「注入」するこ

とで、

SQL

文の内容を改竄する手法

起きることの例

不正なログイン

本来は取得できないはずのデータを取得

データの消去

データの改竄

サーバ上で任意のコマンドを実行

– xp_cmdshell 拡張ストアドプロシージャ

危険

SQL インジェクションの原理

SQL 文の例

SELECT * FROM user

WHERE user=‘admin’ AND pass=‘root’

• SELECT * FROM user

user」という名前のテーブルから全データを取得

• WHERE user=‘admin’ AND pass=‘root’

– user, pass の値が特定の条件を満たすものに絞り込む

結果、 user admin pass root になってい

84

ところで ……

SELECT * FROM user WHERE user=‘admin’ AND pass=‘root’

ユーザがフォームから入力した値は、

(

単引用符、シングルクォート

)

で括られた状態で

SQL

文に入ってくる

単引用符を入れてみると ……

SELECT * FROM user

WHERE user=‘Let’s Note’ AND pass=‘’

入力されたのが引用符だったため、引用符の 対応関係がおかしくなっている

ちなみに「’Let’’s Note’」とする必要があります

結果、不正な

SQL

文となってエラー

86

さらに ……

SELECT * FROM user

WHERE user=‘’ OR 1==1--’ AND pass=‘’

--

」の後ろはコメントとみなされて無視される ため、以下の

SQL

文と等価になる

SELECT * FROM user

WHERE user=‘’ OR 1==1

その結果

SELECT * FROM user

WHERE user=‘’ OR 1==1

これは、

user=‘’

が成立するか、あるいは

1==1

が成立するレコードを取ってくる

• 1==1

は常に成立するので、全てのレコード が取得できる

非常にまずい感じの誤動作

注意点

注意点

プログラム中で

SQL

文を組み立てたりしな いのがベスト

– Prepared Statement によるバインドメカニズム を使用する

それが無理なら、確実にエスケープする

」→「’’」 「¥」→「¥¥

– DB に応じてさまざまな変換関数がある

たとえば mysql_real_escape_string()

90

Dreamweaver の場合

ドキュメント内 かんたんな自己紹介 (ページ 72-91)

関連したドキュメント