サイバー攻撃用語
SQLインジェクションはアプリケーションの脆弱性を攻撃し、個人情報漏洩事故につながる可能性があるサイバー攻撃の1つです。
有名なサイバー攻撃として、「DDoS攻撃」や「ブルートフォースアタック」がありますが、その中でも、特に悪質な攻撃がこの「SQLインジェクション」です。
今回は、この「SQLインジェクション」について解説していきたいと思います。
SQLインジェクションとは、アプリケーションの脆弱性により本来の意図ではない不当な「SQL」文が作成されてしまい、「注入」されることによって、データベース(DB)のデータを不正に操作される攻撃のことです。
SQLインジェクションのSQLとは、Structured Query Languageの略称です。
それぞれの単語を分解すると「データベースへの問合わせ(Query)命令文を」、「組立てて(Structured)」、「実行するためのコンピュータの言語(Language)」。
つまり、SQLとは「データベースサーバを操作する命令文」を指します。
そして、インジェクション(injection)とは「注入・挿入」という意味を持ちます。
SQLインジェクションは、SQLに別のSQL文が「注入 (inject)」されることから、「ダイレクトSQLコマンドインジェクション」または「SQL注入」と呼ばれることもあります。
それでは、SQLインジェクションは、具体的にどのような攻撃なのでしょうか?
データベース(DB)と連携して動作する多くのWebアプリケーションは、SQL文(データベースへの命令文)言語を使い、ユーザからの各種情報入力を元にしてサーバ側で処理し、結果をユーザに返しています。
この処理の中には、サーバやデータベースにアクセスし、情報参照・更新することも多くあります。このような処理の過程では、Webアプリケーションはユーザから想定外の情報が入力された場合、本来であればそのまま処理せず、正しくエラー処理(エスケープ)を実行する必要があります。
しかし、Webアプリケーションに脆弱性が存在すると、アプリケーションが入力値を適切に処理せず、SQL文を誤った命令文として認識してしまい、データベース(DB)の操作が可能になることで、情報漏洩やデータの悪用につながります。
「SQLの断片だと判断できるコマンドを情報に含める」という攻撃手法によって、プログラムが想定していないSQLを認識し、合成してしまうためです。
SQLインジェクションとは、このように外部からの入力を元にSQL文を作成する際に、サイトやアプリケーションの脆弱性により本来の意図ではない不当な「SQL」文が作成されてしまい、「注入」されることによって、不正にデータベース(DB)のデータが読み取られたり、データが改ざんまたは削除されたりする攻撃のことです。
上記のようにWebアプリケーションの設計上の欠陥・脆弱性を悪用して行われる攻撃手法、また、そのような攻撃を許してしまう脆弱性そのものを指して「SQLインジェクション」といいます。
この脆弱性は、脆弱性の中でも、悪用された際の影響が大きいものです。主にWebアプリケーションにおいて、SQLインジェクションの脆弱性が多く発見されています。
では、SQLインジェクションの仕組みを、具体例を見ながら詳しく解説していきます。
以下の例でSQLを表現してみましょう。
(例)userというユーザ情報が格納されているテーブルに対しデータを検索する。入力されたIDに合致するデータを検索する。
まず、アプリケーションが持っているSQLの形は以下となります。
これは、アプリケーションが’$ID’の内容に相当する入力を受けた場合、
それを代入したSQLを生成するというコマンドです。
各語句は以下を意味します。
例えば、WebサイトのID欄に入力値として文字(例として”aaa”)が入力され、SQLが実行された時
となり、userという名前のテーブルから、IDがaaaのデータだけが出力されます。
では、SQLインジェクションを受けた場合はどうなるのでしょうか。以下に一例を示します。
$IDの部分にaaaに続いて「’ or ‘A’=‘A」を注入(Injection)すると、
となります。WHERE以降の内容としては
ということになります。
この結果、全てのユーザ情報が漏洩することになります。
SQLインジェクションに対するセキュリティ実装が正しく行われている場合には、このシングルクォート「’」は、問合わせ命令文の中の”普通の文字”として処理されます。
しかし、アプリケーションにセキュリティ実装が正しく行われていないと、シングルクォート「’」に続く「全てを出力」という条件の問合わせ命令文がそのまま、データベースへの命令として実行されてしまうのです。
SQLインジェクションの脆弱性が悪用されると、外部からデータベースを操作され、その結果、データベースに記録されたデータの閲覧や盗難、変更、消去などを行われる可能性があります。
次にSQLインジェクションによる被害について解説していきます。
SQLインジェクションの被害として代表的なものが、情報漏えいです。
企業が一般公開していない機密情報や個人情報を盗み出されてしまえば情報漏えい事故になりますし、クレジットカード情報を蓄積している場合は、クレジットカード番号や名義も漏えいすることがあります。盗み出された情報をさらに悪用される二次被害も考えられます。
また、データを削除されてしまうと、ビジネスを継続できなくなってしまいます。
SQLインジェクション攻撃の被害で最近多くなっているものが、企業や政治団体などのWebサイト改ざんです。
攻撃者によってWebサイトの内容が書き換えられたり削除される被害が増えており、昨今はWebサイトにウイルスが埋め込まれ閲覧者がウイルスに感染するという被害も増加しています。
より深刻なケースでは、システムへの不正ログインによってサーバ自体を乗っ取られてしまう被害が出ます。不正ログインの手法も年々高度になり、対策を立てることが困難になってきています。
SQLインジェクションは、莫大な金額の損害賠償に発展するような、深刻な被害を受ける可能性があるのです。
SQLインジェクション攻撃はWebサイトの性質に関係なく、データベースへ個人情報などの重要情報を格納しているWebサイトは特に注意が必要です。
SQLインジェクションが発生する原因は、本来実行されるべきSQLの構文が変更されるためなので、対策としては、Webアプリケーションがユーザから想定外の情報が入力されてもそのまま処理せず、正しくエラー処理を実施することが最重要事項となります。
代表的な対策は、「プレースホルダ」の利用です。
プレースホルダを利用することで、SQLの構文が事前に確定し、ユーザーからの入力値等によって不正なSQLが実行されることを防ぐことができます。
この他にも、サイバー攻撃を防ぐために以下のような基本的なセキュリティ対策をすることが大切です。単独のセキュリティ対策よりも、いくつかの対策を併用するスタイルが安心・安全のセキュリティ対策に繋がります。
根本的なSQLインジェクション攻撃の対策としては、安全なWebアプリケーションを開発することです。セキュアプログラミングでSQLインジェクションの脆弱性が存在しないWebサイトを制作することで対策可能です。
また、独立行政法人情報処理機構(IPA)が公開している「別冊: 安全なSQLの呼び出し方」に基づいてWeb制作することで安全なWebサイト構築ができます。
なお、Webサイト制作を外注する場合は、Webアプリケーションの脆弱性の責任は発注者側にあると判断されることが多いため、発注者は要求仕様にセキュリティ要件を盛り込んでおくべきです。制作・納品までの日数に余裕を持たせておくことで、システムチェックにも十分な時間を割くことができます。
SQLインジェクション攻撃を受けないためには、OSやアプリケーションに最新のバージョンが公開されたら、最新のバージョンへ更新、またはWebアプリケーションの改修が必要です。OSやアプリケーションのバージョンアップの中身は、脆弱性対策と言っても大げさではないでしょう。実行することで現段階に起こりうるリスクを下げることができます。
脆弱性対策情報データベースでは、国内外問わず脆弱性対策情報が日々公開されていますので、脆弱性が発見された場合にはなるべく早くアップデートするようにしましょう。
このように、脆弱性にまつわる最新情報をこまめにチェックすることも大切になります。
WAF(Web Application Firewall)を導入してSQLインジェクション攻撃の対策をする方法もあります。
WAFはファイアーウォールやIPS/IDSでは防ぐことができない、Webアプリケーションの脆弱性を悪用したサイバー攻撃を防ぎます。SQLインジェクション以外の攻撃にも対応しているため、より安全にWebサイトを運用できるようになります。
リソース不足によりWebアプリケーションを最新バージョンへ更新できない場合や、すぐにセキュリティパッチを適用できない状況でも、WAFを導入することでSQLインジェクション攻撃への対応が可能です。
なかでもクラウド型WAFは初期・運用コストが小さいため、手軽に対策できます。
クラウド型WAF「攻撃遮断くん」はシステム変更不要で最短翌営業日で導入可能です。新たな脆弱性にも自動で対応するため、サイバー攻撃の被害を未然に防ぐことができます。ユーザー側での運用は一切必要ないため、低価格かつ簡単に高セキュリティを実現します。
今回は有名なサイバー攻撃であるSQLインジェクションと、その仕組み、対策方法について紹介しました。
SQLインジェクション攻撃対策後もWebサーバのログを監視し、被害を受けていないかチェックすることで、万が一の場合も被害を最小限に食い止めることができます。
個人情報漏えいなどの被害は、企業の利益損失や信用失落など経営課題に直結するため、Webサイト運営者にとってはセキュリティ対策が急務な状況です。
ぜひこの機会にWebサイトのセキュリティ対策を見直してみてください。
参考リンク:IPA「安全なウェブサイトの作り方」
安価で高セキュリティなサービスを提供するクラウド型WAF「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。
(2017/6/5 執筆、2019/11/22修正・加筆)
サイバーセキュリティクラウドが提供する「攻撃遮断くん」はWebサイト・Webサーバへのサイバー攻撃を可視化し、遮断するセキュリティサービスです。
この記事と一緒に読まれています
2020.03.08
用語集
2020.03.13
用語集
2020.03.07
用語集
2019.01.11
用語集
Webサイト改ざんで訪問者がマルウェア感染!その手口と対策方法は?
2019.12.12
セキュリティ対策
WordPressの脆弱性による被害事例と今すぐできる対策とは?
2019.06.03
セキュリティ対策