SQLインジェクションは古典的な攻撃手法でありながら、今なお多くの被害が報告されている。機密情報や個人情報を扱うWebサイトの担当者は、SQLインジェクションに対して適切な対策を講じる責任を負っている。本記事では、SQLインジェクションに関連する被害事例を紹介しながら、その対策について解説する。
SQLインジェクションによる被害とは?
デジタル全盛の時代では、あらゆる情報システムにおいてデータベースが利用されている。会員制サイトやECサイト、投稿機能を有する、さまざまなWebサービスに至るまで、多くのWebサイトに組み込まれている。例えば、ECサイトであれば顧客情報、商品情報、注文情報といった機密性が高い情報がデータベースに格納されている。Webサイト上のデータベースの検索、読み出し、書き出しは多くの場合、SQLで記述されたプログラムで処理される。
SQLインジェクションとは、このSQLと呼ばれるデータベース言語で記述したプログラムを悪用し、Webサイトのデータベースを不正に操作する攻撃方法を指す。具体的には、以下のような被害を発生させる要因となり得る。
1)情報漏えい
データベースに保存されている企業の機密情報や、クレジットカード番号を含む個人情報などが意図せず公開されてしまう可能性がある。窃取された情報は、不正利用されたり、第三者へ販売されたりするリスクもある。
2)データの改ざん、破壊
SQLインジェクションでは、データベースの内容を読み出すだけでなく、データを改ざんしたり、破壊したりする場合がある。データベースに保存された情報が不正に編集されると、業務に大きな支障が生じることになりかねない。
3)不正アクセス、システムの乗っ取り
企業のシステムやWebサービスへ不正にアクセスされると、機密情報や個人情報の窃取、新たな攻撃を招く踏み台の設置、あるいは不正な操作をされてしまう。例えば、メールアカウントにアクセスされると、送受信履歴から個人情報が窃取されたり、マルウェア拡散のほう助につながったりする恐れがある。また、金融サービスにアクセスされれば、不正な送金や商品購入が行われるリスクがある。
不正なアクセスによりサーバー自体が乗っ取られ、深刻な被害につながるケースがある。サーバーの設定が書き換えられ、バックドアが仕掛けられてしまうと、痕跡を残さずに、次なる攻撃のための踏み台にされてしまうので、そのほかのサーバーへと被害が拡大していく。
SQLインジェクション攻撃は、ユーザーからの入力を受け付けるWebサイトの検索フォームなどを介して行われる。フォームはユーザーの入力に従ってSQLを発行し、データベースから情報を呼び出す仕組みとなっている。そこで、Webサイト上でSQLインジェクションの脆弱性があれば、攻撃者は不正にデータを読み出したり、改ざん・破壊したりする攻撃が可能となる。また、適切な対策が講じられていなければ、不正な操作によって情報漏えいにつながるリスクがある。
SQLインジェクションによる被害事例
IPAによる調査「ソフトウェア等の脆弱性関連情報に関する届出状況[2020年第1四半期(1月~3月)]」では、報告されたWebサイトの脆弱性のうち、SQLインジェクションが11%を占めていた。また、同調査によると、生じた被害についても「データの改ざん、消去」が11%、「サーバ内ファイルの漏洩」が4%に上るなど、SQLインジェクションによる被害の多さを物語っている。
先述のとおり、Webサイトの運営にはさまざまなリスクが存在し、実際に多くのWebサイトで被害が発生している。個人情報や機密情報を管理しているWebサイトの運営者・開発者は、SQLインジェクションの対策を講じる責任があるのだ。以下、過去に発生した被害事例を紹介していく。
1)大手ゲーム会社での7,700万人分の個人情報流出
2011年4月、大手ゲーム会社が運営するオンラインサービスに不正アクセスがあり、7,700万件の個人情報が窃取されたと報じられた。同社による発表では、アプリケーションサーバーの脆弱性が要因の1つであったとされ、SQLインジェクションによる攻撃と推測されている。
2)Ubuntuフォーラムにおける200万アカウント情報の流出
2016年7月、LinuxベースのOSであるUbuntuのユーザーフォーラムにおいて、Webサイト上で利用していたプラグインの脆弱性を突かれ、SQLインジェクション攻撃を受けた。200万に上るアカウント情報が流出したものの、被害に遭ったのはユーザー情報に限定されると報告された。
3)大手玩具メーカーのグループ会社でのメールアドレス流出
2021年6月、大手玩具メーカーのグループ会社が運営する会員制Webサイトから、4万件を超えるメールアドレスが流出したと報道された。氏名や住所、クレジットカード情報などは流出しておらず、流出の原因はSQLインジェクションによるものと報じられた。
大規模な被害は目に付きやすいが、一方で被害は中小企業にも及んでいる。企業のブログやコーポレートサイトのCMS(コンテンツ管理システム)として、オープンソースであるWordPressを採用しているサイトは少なくないが、そのプラグインなどの脆弱性を突かれ、SQLインジェクションの標的にされるケースがある。実際、中小企業において、記事の改ざんや会員情報の漏えいにつながる事案が報じられた。
近年、Webサイトを容易に構築できる環境が整備されつつあり、個人情報を収集するキャンペーンサイトやECサイトなど、中小企業や個人事業主でも手軽に構築できるようになった。しかし、適切な対策を講じていない場合、SQLインジェクションの被害に遭うリスクがあるため、細心の注意を払う必要があるだろう。
SQLインジェクションへの5つの対策
SQLインジェクションのリスクを軽減するには、Webサイトの構築段階からネットワークに至るまで、総合的な対策を講じる必要がある。以下に、具体的な対策を解説する。
1)セキュアプログラミング
セキュリティを考慮した開発手法はセキュアプログラミング、あるいは、セキュアコーディングと呼ばれる。Webサイトの運用者がエンジニアに開発を依頼する際には、これらの手法への対応状況を確認すると良い。セキュアプログラミングには、SQLインジェクションを発生させないための対策が含まれている。
・プレースホルダーの利用
検索フォームなどにおいてユーザーからの入力を受け付ける場合に、あらかじめSQL文をプレースホルダーとして用意しておき、入力された値を適切に処理する。これにより、不正なSQL文が実行されるのを防ぐ。
・エスケープ処理
不正なSQL文が実行されないよう、特別な意味を持つ記号を普通の文字列として扱うように処理する。
・入力値の検証
悪意のある処理につながるような文字列を入力時に検証し、異常値と認められる場合はエラーを出力する。
・詳細なエラーメッセージの非表示
SQL発行時に発生したエラーメッセージをユーザーに表示したために、テーブル名やカラム名といったデータベースに関する情報が悪意のある第三者に知られてしまう恐れがある。SQLインジェクションに悪用されないよう、不要なエラーメッセージは表示させないこと。
2)サーバーやソフトウェアの更新
WordPressで運営されたWebサイトを例にとると、WordPress本体だけではなく、プラグインの脆弱性を含めてSQLインジェクションの標的になるリスクがある。同様に、データベースを使うシステムであれば、常にその脆弱性に注意する必要がある。サーバーに導入されたソフトウェアをはじめ、システムを最新の状態に維持し、脆弱性を放置しない運用が求められる。
3)サーバー、データベースの設定・監視
SQLインジェクションでは、データの一括削除のような影響の大きなSQL文が不正に実行される可能性がある。Webサイト上のユーザーの入力からは、このようなSQL文を実行させないようデータベースを設定しておき、致命的な被害を回避する。
また、データベースで発行されたSQLのログを取得し、不正な処理が実行されていないかを監視する仕組みも欠かせない。同様に、Webサーバーを介したデータのやり取りを確認するため、サーバーのログも監視対象となる。
4)WAFの導入
WAF(Web Application Firewall)は、Webサイトを保護するセキュリティ製品として知られる。一般的なファイアウォールでは防げない、SQLインジェクションなどの攻撃に対しても、WAFを用いることで検知・防御が可能となる。WAFはWebサーバーにインストールするものや、クラウド上で利用できる製品がある。
5)脆弱性診断の実施
巧妙化するサイバー攻撃から身を守るため、セキュリティ対策の情報について客観的な評価を受けるのが望ましい。簡易的に脆弱性診断を行えるツールや、セキュリティの専門家による診断を受けられるサービスが提供されている。Webサイトの更新を続けた結果、知らないうちに脆弱性が生じてしまう可能性もあるので、定期的な診断が推奨される。
SQLインジェクションは古くから存在する脆弱性ながら、今なお被害が後を絶たない。その背景には、攻撃者にとってSQLインジェクションの攻撃によって得られる利益が高まっている点が考えられる。あらゆる業界でデジタル化が進み、Webサイトの重要性が高まるにつれて影響範囲が広がり、また、窃取した情報を換金できる可能性が大きくなっている。
今後もWebサイトは企業の重要な資産であり、攻撃者が標的とし続けることは疑いようがない。適切な防御のために対策を講じるのは、企業経営にとって今後も欠かせない取り組みとなるだろう。