【初心者向け】SQLインジェクションの概要と対策方法
SQLインジェクションって聞いたことはあるけど、そもそもどんな攻撃なの?どう対策すればいいの?とお困りのあなたへ、この記事ではSQLインジェクションの概要や具体的な対策について、初心者の方でもわかるように簡単に解説します。
個人情報の漏洩やWEBサイトの改ざんを防ぐためにも、しっかり対策しましょう!
SQLインジェクションとは
「SQLインジェクション」の「SQL(エス・キュー・エル)」とは、データベースを操作する代表的な「データベース言語」のことです。またSQLインジェクションの「インジェクション」とは、英語で「注入」を意味します。不正な「SQL」の命令を攻撃対象のウェブサイトに「注入する(インジェクションする)」のが、SQLインジェクションというわけです。
たとえばセキュリティの対策が十分でないウェブサイトに、サイト内を任意のキーワードで検索できるフォームがあるとします。攻撃者がそのフォームへ不正な内容を盛り込んだSQL文を入力し検索を行うことで、そのSQL文の内容が実行されてしまうのです。これにより、本来は隠されているはずのデータが奪われてしまったり、ウェブサイトが改ざんされてしまったりします。
クロスサイトスクリプティングとは何が違うの?
ウェブサイトを狙った攻撃手法として、SQLインジェクションと並びよく名前があげられるのがクロスサイトスクリプティングです。どちらもウェブサイトの脆弱性を狙った攻撃である点は共通しています。
一方で違いとしてあげられるのは、それぞれの攻撃手法です。SQLインジェクションは上述のとおり、SQLによって相手のデータベースを攻撃します。クロスサイトスクリプティングでは相手のウェブサイトに罠(リンクのURLに悪意あるスクリプトを仕込むなど)をしかけ、訪問者がその罠にかかる(リンクをクリックするなど)のを待ちます。
いずれもウェブサイトを狙った代表的な攻撃手法であり、ウェブサイトの管理はその両方への対策が必要です。※対策の内容は重複する部分もあります。
なおクロスサイトスクリプティングについての詳細は、以下のコンテンツで解説しているので興味があればあわせてご覧ください。
クロスサイトスクリプティングって何?サイトのセキュリティを高めるために
SQLインジェクション攻撃で想定される被害
簡単に言うと、SQLインジェクション攻撃による主な被害として、個人情報の漏洩と改ざんがあげられます。以下、それぞれの被害内容について簡単に解説します。
秘密情報・個人情報の漏洩
ウェブサイトが利用するデータベースには、そのウェブサイトを利用者するユーザーのID・パスワード・クレジットカードの番号をはじめとした個人情報が含まれています。攻撃者がウェブサイトに対してSQLインジェクション攻撃をしかけることで、不正なSQLの命令が実行されてしまい、それら個人情報がすべて奪われてしまう可能性があるのです。
たとえば脆弱性のあるウェブサイトのウェブフォームに、「データベースに登録されている会員情報すべて表示しなさい」という内容のSQLの命令を入力するとします。対策がきちんとされていなければ、その命令がそのまま実行されてしまい、会員情報がすべて奪われてしまうというわけです。
2011年4月には、ソニーが展開するゲーム用のサービス「PlayStation Network」において、SQLインジェクション攻撃が行われ大きなニュースとなりました。この攻撃によって、約7,700万人分の個人情報が奪われてしまったのです。奪われた情報のなかには、会員の氏名・住所・メールアドレス・生年月日をはじめサービス用の会員ID・パスワードなどが含まれていました。2013年4月に判明した「エクスコムグローバル」の事件のように、約11万人分のクレジットカード情報(名義・カード番号・セキュリティコードなど)が漏洩した、という事例もあります。
最近では2019年1月に「釣りビジョン」というウェブサイトにおいて、会員のメールアドレスや氏名・住所など6万件以上もの情報が盗まれる事件が発生しました。
ウェブサイトの改ざん
またSQLインジェクション攻撃により、対象のウェブサイトを改ざんすることもできます。そのうえで改ざんされたサイトへアクセスすることによって、ウイルス感染させられるという場合もあります。
2008年には政府・自治体のサイト・商用サイトを含め数十万にものぼるウェブページが、SQLインジェクションによって改ざんされてしまう被害が発生しました。それらのサイトを訪れると、マルウェアに感染してしまう状態でした。現在でも、数多くのサイトがSQLインジェクションによって改ざん被害を受けています。
SQLインジェクション攻撃への対策3つ+α
それでは、SQLインジェクション攻撃による被害を予防するためには、どんな対策をとればよいのでしょうか。ここでは代表的な対策3つを紹介します。
1) エスケープ処理
SQLインジェクション攻撃の対策のなかでも、最も基本的なのがエスケープ処理です。エスケープ処理とは、プログラム言語を扱ううえで特別な意味をもつ文字・記号が入力された際に、別の文字列に書き換えてしまうことを指します。
SQLインジェクションを防ぐためには、データベースにとって意味があるシングルクォート(’)やセミコロン(;)などの記号を普通の文字として解釈するように設定します。これによって、仮に攻撃者が不正なSQL文をウェブサイトへ送り込もうとしても、それを無効化することができるのです。
2) WAFの導入
WAFはWeb Application Firewallの略で、ウェブサイトをアプリケーションレベルで防御するファイアーウォールのことです。
ネットワークを監視する一般的なファイアーウォールでは、外部ネットワークからネットワークレベルで不正なアクセスを検知し遮断することができます。しかしSQLインジェクション攻撃のようにウェブサイトへのアクセス自体は正常であっても、アクセスしたあとに不正なデータをサイトへ送りつけるといった攻撃を防ぐことはできません。
WAFは攻撃者がウェブサイトへアクセスしたあとに、「不正と認識されるような動きがないか」アプリケーションレベルで検知し、あやしい場合は攻撃者からの要求を防ぐことができるのです。
※カゴヤの共用サーバーサービスでは、WAFが標準搭載されております。詳細は以下URLをご覧ください。
https://www.kagoya.jp/option/security/waf.html
3) 脆弱性診断サービスでチェック
脆弱性診断サービスとは、攻撃者の立場にたってさまざまな疑似攻撃を行ってセキュリティのリスクがないか洗い出すサービスです。システムの人間ドックのようなもの、というとわかりやすいでしょうか。脆弱性診断サービスでは、今回紹介したSQLインジェクションをはじめとして、システムが幅広い攻撃を受ける危険性がないか調査します。
脆弱性診断サービスには無料・有料いずれも数多くの種類があります。そのうちの1つ「OWASP ZAP」は、よく知られる無料のウェブアプリケーション用脆弱性診断サービスで、今回紹介したSQLインジェクションやクロスサイトスクリプティングといったウェブサイトに対する代表的な攻撃に対する脆弱性の診断を行うことができます。
https://github.com/zaproxy/zaproxy/wiki/Downloads
4)そのほかの対策方法
代表的な対策方法を紹介しましたが、さらに安全性を高めるために、以下にあげるような対策も有効です。
- データベースのアカウント権限を最小限にとどめる
- エラーメッセージをそのまま表示させないようにする
データベースのアカウント権限を最小限にとどめることで、仮に攻撃者に不正なSQL文を送信されても、その被害をおさえることができます。またシステムがだしたエラーメッセージをそのまま表示すると、攻撃者に対してシステムに関するヒントを与えてしまうことになるので注意して下さい。
まとめ
ウェブサイトなどの脆弱性をついて相手のデータベースを攻撃するSQLインジェクション攻撃は、ずっと以前から知られていますが、現在でも個人情報漏洩・サイト改ざんなどの被害をもたらし続けています。
そのためウェブサイトの運営者の方は、SQLインジェクション攻撃を防ぐための対策が必要です。対策の方法としては、エスケープ処理やWAFの導入、脆弱性診断による危険性の洗い出しなどがあげられます。