近年急増しているSQLインジェクション。弊社の独自調査によると2023年1~3月において、SQLインジェクションの攻撃数が前年同期に比べ約150%増加したことがわかりました。
SQLインジェクションを受けるとデータベースに保存されている個人情報や機密情報が、攻撃者に窃取されてしまう恐れがあります。顧客の個人情報の漏えいにより法的責任が問われる可能性があるので充分な対策が求められます。
この記事では、SQLインジェクションの基礎知識やその仕組みについてわかりやすく解説します。対策方法も紹介するので、必ず最後までご覧ください。
SQLインジェクションとは?
SQLインジェクションとは、Webアプリケーションの脆弱性を意図的に利用し、断片的なSQL文をアプリケーションに不正に注入(インジェクション)し実行させる攻撃手法です。SQLインジェクションによってデータベースに保存されたデータが、不正に読み取られたり改ざんや削除されたりします。
SQLとは、Structured Query Languageの略称で、データベースを操作する言語のひとつです。国際標準化がされているため、SQLはさまざまなWebアプリケーションに使われています。
データベースを操作するための命令文はSQL文といい、クエリとも呼ばれます。ユーザーがWebアプリケーションに入力した情報に基づいて生成されます。生成されたSQL文がデータベースで処理されて、その結果をユーザーに返します。
一方、SQLインジェクションの場合、攻撃者がWebアプリケーションの脆弱性を悪用して不正な入力をします。不正入力によって誤ったSQL文が生成され、データベースに送信されます。それによって攻撃者がデータベースを操作することができ、データベース内に格納された情報を読み取ったり改ざんしたりすることができます。
SQLインジェクションの仕組み
ここではSQLインジェクションの仕組みについてさらに詳しく説明します。SQL文の基本構成とSQLインジェクションを受けた場合について順を追って解説します。
SQL文の基本の動き
まずは、SQL文の基本の動きについて解説します。
(例)userというユーザ情報が格納されているデータベースのテーブルから、入力されたIDに合致するデータを抽出する。
この場合、アプリケーションが持っているSQL文の形は下記となります。
SELECT * FROM user WHERE id = ‘$ID’
それぞれの語句の意味は下記の通りです。
SELECT |
データを抽出する |
* |
テーブルに含まれる項目全て |
FROM user |
userという名前のテーブルからデータを選択する |
WHERE <条件> |
抽出条件を指定 |
‘$ID’の部分は「データを抽出する条件」となります。ユーザーがWebサイトのID欄に入力された内容がこちらの箇所に反映されるので、変動箇所とも呼ばれます。「taro」がID欄に入力された場合、下記のSQL文が生成されます。このSQL文によってIDが「taro」と合致した関連情報が出力されます。
SELECT * FROM user WHERE id = ‘taro’ ””
SQLインジェクションを受けた場合の動き
では、SQLインジェクションを受けた場合はどうなるのでしょうか。ここでは一例を示します。
仮に‘$ID’の部分に「taro」に続いて「’ or ‘1’=‘1」が注入(Injection)されたとします。生成されたSQL文が下記となります。
SELECT * FROM user WHERE id = ‘taro’ or ‘1’=‘1’
上記のSQL文にはデータを抽出する条件が2つあります。
1つ目はIDが「taro」と合致した場合です。この場合は「taro」の情報が出力されます。ここまでは前述した基本の動きと同じです。
2つ目は‘1’=‘1’が成立した場合です。ただし、‘1’=‘1’は当然なことなのですべての場合においても成立してしまいます。そのため、この部分によってデータベースに格納されているすべてのデータが出力されます。すなわち情報の漏えいです。
SQLインジェクションによる被害
SQLインジェクションの脆弱性が悪用されると、外部からデータベースを操作され、その結果、データベースに記録されたデータの閲覧や盗難、変更、消去などを行われる可能性があります。
次にSQLインジェクションによる被害について解説します。
情報漏えい
SQLインジェクションの被害として代表的なものが、情報漏えいです。
企業が一般公開していない機密情報や個人情報を盗み出されてしまえば情報漏えい事故になりますし、クレジットカード情報を蓄積している場合は、クレジットカード番号や名義も漏えいすることがあります。盗み出された情報をさらに悪用される二次被害も考えられます。
また、データを削除されてしまうと、ビジネスを継続できなくなってしまいます。
Webサイトの改ざん
SQLインジェクション攻撃の被害で最近多くなっているものが、企業や政治団体などのWebサイト改ざんです。
攻撃者によってWebサイトの内容が書き換えられたり削除されたりする被害が増えており、昨今はWebサイトにコンピュータウイルスが埋め込まれ閲覧者がコンピュータウイルスに感染するという被害も増加しています。
SQLインジェクションの被害事例
SQLインジェクションを受けた場合、実際にはどのような被害があるのでしょうか。ここではSQLインジェクションの事例を交えながら解説を行います。
リサーチ会社から約10万件の情報流出
2022年6月に、業界を代表するリサーチ・調査会社がSQLインジェクションというサイバー攻撃を受けて合計101,988件の情報が流出してしまう可能性があるという発表をしました。
再発防止のため企業ホームページを5日間ほど閉鎖したうえ、提供している一部のWebサービスも一時中断しました。
ECサイトから個人情報最大12万件流出の可能性
2020年4月に事務用品を扱うECサイトに不正アクセスがあり、クレジットカード情報を含む顧客情報が94件、それ以外に最大で12万件の顧客情報が流出した可能性があるという事例が発生しました。
この不正アクセスは、SQLインジェクション攻撃によるものであると報告されており、対策としてサイトが一時閉鎖されました。
Webサイトから約6万件の個人情報流出
某メディアサイトが、2019年1月にSQLインジェクションによる不正アクセスが発生し、データベースに保管していた個人情報63,656件が流出した可能性があると公表しています。
アウトレットのメールマガジン会員の個人情報合計約27万件流出
某アウトレット運営会社が、2018年6月、メールマガジン会員の情報の一部合計約27万件が流出したサイバー攻撃についての調査報告を発表しました。
調査報告の中で「2017年5月から2018年1月の間に国内外の第三者より複数回にわたり、ホームページ用サーバーに対する『SQLインジェクション攻撃』を用いた不正アクセスがあったことが確認され、ウェブアプリケーションの一部にSQLインジェクションに対する脆弱性があり、その脆弱性を突く不正な攻撃により情報流出が発生したと推測される」とあります。
SQLインジェクションの対策方法4つ
SQLインジェクションの被害に遭わないために、適切な対策が必要です。ここではSQLインジェクションへの具体的な対策を紹介します。
1.プレースホルダの利用
プレースホルダというのは、SQL文に置く変動箇所を示す記号のことです。例えば下記の例ですと、疑問符(?)がプレースホルダに該当します。
SELECT * FROM user WHERE id = ?
プレースホルダを入れることで、変動箇所に入力された文字がSQL文の一部でなく、普通の値として処理されます。それによって、不正SQL文の実行を防ぐことができます。
プレースホルダの組み立て方については、IPAが作成した「安全なSQLの呼び出し方」の第3章をご参照ください。
2.エスケープ処理
エスケープ処理とは、ユーザーから入力された特定の文字や記号を安全な形に変換する処理です。例えば、SQL文において特別な意味を持つシングルクォート「’」をダブルクォート「”」に変更することなどがあります。
エスケープ処理を行うことで、SQLインジェクションを受けても、攻撃コードの中の特定の文字列や記号を削除したり置き換えたりするので、攻撃を無効化することができます。
エスケープ処理の手順について詳しく知りたい方はIPAが作成した「安全なSQLの呼び出し方」の第4章をご参照ください。
3.Webアプリケーションを常に最新バージョンに保つ
SQLインジェクションを受けるリスクを抑えるためには、OSやアプリケーションを常に最新の状態に保つことが重要です。OSやアプリケーションのバージョンアップには、発見された脆弱性を修正したものが含まれることが多いので、常に最新のバージョンにしておくことで攻撃を受けるリスクを軽減できます。
また、脆弱性情報をキャッチアップすることも大事です。JPCERTコーディネーションセンターとIPA(独立行政法人情報処理推進機構)によって運営されているJVNの JVN iPedia(脆弱性対策情報データベース)などを常にチェックし、最新の脆弱性情報を入手しておくようにしましょう。
自社環境のOSやアプリケーションに関わる新たな脆弱性情報がリリースされたら、バージョンアップやアプリケーションの改修などの対応策を速やかに実施することが必要です。
4.WAFの導入で本格的なセキュリティ対策
上記の3つの対策を完璧に実施することで、SQLインジェクションを受けるリスクを大きく抑えることはできますが、実際にはそんなに簡単ではありません。新しい脆弱性情報の収集やアプリケーションの改修には膨大な工数がかかるからです。そのため、アプリケーションをSQLインジェクションから守るにはWAFの導入をしておくと安心できます。
WAFとは、Web Application Firewall(ウェブアプリケーションファイアウォール)の略称で、Webサイトを含めたWebアプリケーションの脆弱性を狙ったサイバー攻撃を防御する、セキュリティ対策ツールのひとつです。
アプリケーションへの通信の内容を一つひとつチェックし、不正とみられる通信を遮断します。そのため、通信にSQLインジェクションに使われる不正なSQL文が含まれた場合、WAFがそれを検知・遮断しWebアプリケーションを守ります。
また、SQLインジェクションだけでなく、クロスサイトスクリプティング(XSS)を初めとするWebアプリケーションの脆弱性を突くほかの攻撃もWAFで防御することができます。
WAFの仕組みや導入メリットについてこちらの資料にまとめているので、詳しく知りたい方はぜひダウンロードしてください。
まとめ
Webサイトの脆弱性を悪用するSQLインジェクション。適切な対策を取らず放置した場合、SQLインジェクションによって情報の漏えいや改ざんなどの被害をもたらす可能性があります。
SQLインジェクションの被害を最小限に食い止めるために、WAFの導入をおすすめします。WAFとは、Web Application Firewallの略称で、SQLインジェクションなどのWebアプリケーションの脆弱性を狙ったサイバー攻撃からWebサイト、Webサービスを防御します。
クラウド型WAFを導入するなら国内シェアNo.1※の「攻撃遮断くん」がおすすめです。「攻撃遮断くん」は月額10,000円〜導入可能かつ、システム変更不要のため最短1日で導入できる日本国内で開発・運用されているWAFです。ユーザー側での運用は一切必要ないため、低価格かつ簡単に高セキュリティを実現できます!
攻撃遮断くんについて詳しく知りたいならこちらの資料をダウンロードしてください。
デロイト トーマツ ミック経済研究所「外部脅威対策ソリューション市場の現状と将来展望 2023年度」