SQLインジェクションとは?
SQLインジェクションとは、アプリケーションの脆弱性により本来の意図ではない不当な「SQL」文が作成されてしまい、「注入(injection)」されることによって、データベースのデータを不正に操作される攻撃のことです。「SQL」とは、Structured Query Languageの略称で、「データベースサーバを操作する命令文」で、WebサイトやECサイトのデータベースに利用者からの入力情報を送信する際に利用されます。
データベースと連携して動作する多くのWebアプリケーションは、このSQL文(データベースへの命令文)を使い、ユーザからの各種情報入力を元にしてサーバ側で処理し、結果をユーザに返しています。
この処理の中には、サーバやデータベースにアクセスし、情報を参照・更新することも多くあります。このような処理の過程では、Webアプリケーションはユーザから想定外の情報が入力された場合、本来であればそのまま処理せず、正しくエラー処理(エスケープ)を実行する必要があります。
しかし、Webアプリケーションに脆弱性が存在すると、アプリケーションが入力値を適切に処理せず、SQL文を誤った命令文として認識してしまい、データベースの操作が可能になることで、情報漏えいやデータの悪用につながります。
SQLインジェクションとは、このように外部からの入力を元にSQL文を作成する際に、サイトやアプリケーションの脆弱性により本来の意図ではない不当な「SQL」文が作成されてしまい、「注入」されることによって、不正にデータベースのデータが読み取られたり、データが改ざんまたは削除されたりする攻撃のことです。
SQLインジェクションの仕組み
さらに詳しくSQLインジェクションの仕組みについて説明します。
例として、下記のSQL文を考えます。
(例)userというユーザ情報が格納されているデータベースのテーブルに対し、入力されたIDに合致するデータを検索する。
まず、アプリケーションが持っているSQLの形は以下となります。
SELECT * FROM user WHERE id=‘$ID’
これは、アプリケーションが’$ID’の内容に相当する入力を受けた場合、
それを代入したSQLを生成するというコマンドです。
各語句は以下を意味します。
SELECT |
データを抽出する |
* |
テーブルに含まれる項目全て |
FROM user |
userという名前のテーブルから |
WHERE <条件> |
抽出条件を指定 |
例えば、WebサイトのID欄に入力値として文字(例として”taro”)が入力され、SQLが実行された時
SELECT * FROM user WHERE id=‘taro’
となり、userという名前のテーブルから、IDがtaroのデータだけが出力されます。
では、SQLインジェクションを受けた場合はどうなるのでしょうか。以下に一例を示します。
$IDの部分にtaroに続いて「’ or ‘A’=‘A」を注入(Injection)すると、
SELECT * FROM user WHERE id=‘taro’ or ‘A’=‘A’
となります。WHERE以降の内容としては
①id=‘taro’が成り立つ
”または” (or)
②‘A’=‘A’が成り立つ(’1’=‘1’でも成り立っていれば何でもよい)
→②は必ず成り立つので、①、②トータルとして全て成り立つ
→userの全ての情報を出力する
ということになります。
この結果、全てのユーザ情報が漏えいすることになります。
SQLインジェクションに対するセキュリティ実装が正しく行われている場合には、このシングルクォート「’」は、問合わせ命令文の中の”普通の文字”として処理されます。
しかし、アプリケーションにセキュリティ実装が正しく行われていないと、シングルクォート「’」に続く「全てを出力」という条件の問合わせ命令文がそのまま、データベースへの命令として実行されてしまうのです。
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インジェクションの対策方法
SQLインジェクション攻撃はWebサイト・Webサービスの内容に関係なく、データベースに個人情報などの重要情報を格納している場合は特に注意が必要です。具体的な対策方法は、下記の通りです。
安全なWebサイト・Webアプリケーションを制作する
根本的なSQLインジェクション攻撃の対策としては、安全なWebサイト・Webアプリケーションを開発することです。セキュアプログラミングでSQLインジェクションの脆弱性が存在しないWebサイトを制作することで対策可能です。
SQLインジェクションが発生する原因は、本来実行されるべきSQLの構文が変更されるためなので、対策としては、Webアプリケーションがユーザから想定外の情報が入力されてもそのまま処理せず、正しくエラー処理を実施することが最重要事項となります。
代表的な対策方法は、「プレースホルダの利用」「エスケープ処理」「アプリケーションに渡されるパラメータにSQL文を直接指定しない」ことが挙げられます。
▼プレースホルダの利用
プレースホルダを利用することで、SQLの構文が事前に確定し、ユーザーからの入力値等によって不正なSQLが実行されることを防ぐことができます。
▼エスケープ処理
エスケープ処理とは、検索バーや入力フォームなどユーザーが入力できる機能を実装しているWebサイトに対して、特定の文字が普通の文字として解釈されるように処理することを指します。エスケープ処理を行うことで、SQLインジェクションを受けても、攻撃コードの中の特定の文字列や記号を削除したり置き換えたりして、攻撃を無効化できます。
▼アプリケーションに渡されるパラメータにSQL文を直接指定しない
Webアプリケーションに渡されるパラメータにSQL文を直接指定する実装は、そのパラメータ値の改変により、データベースの不正利用につながる可能性があります。IPA(独立行政法人情報処理機構)が提供する「安全なウェブサイトの作り方 – 1.1 SQLインジェクション」では避けるべき実装として挙げられています。
Webサイト・Webアプリケーションを制作する際は、IPA(独立行政法人情報処理機構)が公開している「別冊: 安全なSQLの呼び出し方」が非常に参考になりますので、ぜひご覧ください。
なお、Webサイト制作を外注する場合は、Webアプリケーションの脆弱性の責任は発注者側にあると判断されることが多いため、発注者は要求仕様にセキュリティ要件を盛り込んでおくべきです。制作・納品までの日数に余裕を持たせておくことで、システムチェックにも十分な時間を割くことができます。
Webアプリケーションを常に最新バージョンに保つ
SQLインジェクション攻撃を受けないためには、OSやアプリケーションに最新のバージョンが公開されたら、最新のバージョンへ更新、またはWebアプリケーションの改修が必要です。OSやアプリケーションのバージョンアップの中身は、ほとんどが脆弱性対策です。実行することで現段階に起こりうるリスクを下げることができます。
JPCERT コーディネーションセンターとIPA(独立行政法人情報処理推進機構)によって運営されているJVNの JVN iPedia(脆弱性対策情報データベース)では、国内外問わず脆弱性対策情報が日々公開されているので、脆弱性が発見された場合にはなるべく早くアップデートするようにしましょう。
このように、脆弱性にまつわる最新情報をこまめにチェックすることも大切になります。
クラウド型WAFでのセキュリティ対策
WAF(ワフ/Web Application Firewall)を導入してSQLインジェクション攻撃の対策をする方法もあります。
WAFはファイアーウォールやIPS/IDSでは防ぐことができない、Webアプリケーションの脆弱性を悪用したサイバー攻撃を防ぎます。SQLインジェクション以外の攻撃にも対応しているため、より安全にWebサイトを運用できるようになります。
リソース不足によりWebアプリケーションを最新バージョンへ更新できない場合や、すぐにセキュリティパッチを適用できない状況でも、WAFを導入することでSQLインジェクション攻撃への対応が可能です。
なかでもクラウド型WAFは初期・運用コストが小さいため、手軽に対策できます。
クラウド型WAF「攻撃遮断くん」はシステム変更不要で最短翌営業日で導入可能です。新たな脆弱性にも自動で対応するため、サイバー攻撃の被害を未然に防ぐことができます。ユーザー側での運用は一切必要ないため、低価格かつ簡単に高セキュリティを実現します。
SQLインジェクションまとめ
今回は有名なサイバー攻撃であるSQLインジェクションと、その仕組み、対策方法について紹介しました。
SQLインジェクション攻撃対策後もWebサーバのログを監視し、被害を受けていないかチェックすることで、万が一の場合も被害を最小限に食い止めることができます。
個人情報漏えいなどの被害は、企業の利益損失や信用失落など経営課題に直結するため、Webサイト運営者にとってはセキュリティ対策が急務な状況です。
ぜひこの機会にWebサイトのセキュリティ対策を見直してみてください。
参考リンク:IPA「安全なウェブサイトの作り方」
安価で高セキュリティなサービスを提供するクラウド型WAF「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。