事件の概要
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)