セキュリティ対策について語ります!(SQLインジェクション編)
前回の「XSS編」に引き続き、セキュリティ対策の説明を続けていきます。
今回はSQLを利用した攻撃手段、「SQLインジェクション」に関するお話です。
「XSS編」はこちら⬇️
前回のおさらい
まず、「セキュリティが破られてしまう理由」として、悪意を持った者がWebサービスやソフトウェアの弱点である「脆弱性(ぜいじゃくせい)」を狙った攻撃を仕掛けることが原因であることをお話ししました。
その脆弱性を狙った手口には様々な方法があります。前回説明した「XSS」もその一つです。
⑴SQLインジェクションの定義
試しにWikipediaで調べて見ます。
SQLインジェクションとは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のことである。
参考元:Wikipedia「SQLインジェクション」https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
つまり、その名の通りにSQLの不正利用による攻撃手段です。ちなみにインジェクションは英語表記では「injection」で、意味は「(名詞)注入する」です。直訳しますと、「SQLを注入する」。これがそのままこの攻撃手段の特徴を表しています。
⑵SQLインジェクションによる攻撃手段
具体的な攻撃手段を説明します。
1.脆弱性が見られるWebサイトに対して、悪意を持った人が「文字列を入力するフォーム」や「URL」に対して自作したSQLを入力して実行する。
2.それによりWebサイトの内部でSQL文が実行され、Webサイトが利用しているデータベースサーバへの操作を可能としてしまう。
3.悪意を持った人がデータベースの内容を改ざんしたり、内部の情報を漏洩させてしまう。
つまり、個人情報や企業秘密の詰まったデータベースに対して攻撃を仕掛けることで、個人情報の盗み取り、Webサイトの改ざん、企業秘密の漏洩など様々な被害が生じる訳ですね・・これも恐ろしい。
⑶SQLインジェクションに対する対策方法
では、このSQLを用いてデータベースに対して攻撃を仕掛ける「SQLインジェクション」にはどの様な対策方法が適切なのか?
ここで前回の「XSS」攻撃への対策方法について振り返って見ます。XSS攻撃への対策方法とは大まかに言えば「主な原因であるHTMLの生成を、文字参照という方法を用いてHTML構成に必要な文字(<や>など)を、別の文字に変換させて使用不可能な状態にさせる」ことでした。
今回の場合も同様です。「SQL文の構成に必要な文字を強引に変換させて、SQL文が認証されない状況に追いやる」こと(エスケープ処理と言います)が対策方法の1つです。
他にも脆弱性を改めるために、「あらかじめ、より厳格なSQL文を生成してSQL文の構造を確定させる」方法もございます(バインド機構と呼ばれる仕組みを利用します)。これを行うことにより、後からユーザーがどの様な値を入力しても、ユーザーが用意したSQL文は実行されない状況を作り出せるため、結果としてSQLインジェクションを防げるという訳です。
つまり、先にSQL文の構造の確定してしまっているため、後から不正なSQL文が差し込まれようが、それは受け入れられない状況にされてしまっている訳です。セキュリティ対策には本当に様々な手法がございますね・・(脱帽。
⑷SQLインジェクションによる過去の被害の事例
1.Webサイト会員の個人情報が大量に流出
2.PlayStationサイト「PSN」にて史上最大規模の個人情報漏洩事件
個人的には2の2011年4月に起きたPSNに対する攻撃が記憶に新しいです(当時、これが原因で復旧作業が難航し、友達とオンライン通信プレイが出来ない状況に悩まされた方々も数多くいました。そして個人情報を抜き取られてしまった方々にとっては更に深刻な問題になりました)。データベースを直接攻撃されて操作をされてしまうSQLインジェクション。データベースに登録された大量の個人情報を狙って攻撃されるだけに、被害の規模も恐ろしいですね・・。
以上、今回はセキュリティ攻撃の手段の一つ「SQLインジェクション」の概要と対策方法について説明しました。次回の記事では引き続き、別のセキュリティ攻撃手段である「セッションハイジャック」⬇️について説明いたします。