システムやサービスがデータを管理するうえで、今やデータベースが欠かせません。
データベースを扱ううえで脅威となるのが「SQLインジェクション」です。SQLインジェクションの対策が不十分なために、多大な損害を受けた企業の事例も数多く存在します。
そこで今回は、SQLインジェクションの手口や、被害を防ぐための対策、診断サービスを紹介します。
- もくじ
1.対策すべきSQLインジェクションとは
SQLインジェクションとは、データベースの操作に用いる「SQL」を悪用したサイバー攻撃の一種です。ソフトウェア開発に詳しくない場合、そもそもSQLを知らないケースも多いでしょう。まずはSQLインジェクションの意味と手口を解説します。
1-1 SQLインジェクションの意味
SQLインジェクションとは、システムやサービスに悪意のあるSQL文を注入(インジェクション)して、不正なデータベース操作を行う攻撃手法のことです。
一般的なシステム・サービスでは、データベース管理システム(DBMS)というソフトウェアで構築したデータベースを用いて、データを管理します。このとき、DBMSにデータベース操作の命令を送るための言語がSQLです。
システム・サービスがデータの検索や登録などを行う際、ユーザーの入力情報も含めてSQL文を組み立てます。しかしSQLインジェクションでは、悪意のある入力情報を送ることで不正なSQL文を作成・実行させて、データベースの不正な操作を図るのです。
1-2 SQLインジェクションの手口
SQLやデータベースの利用経験が少ない方は、SQLインジェクションがどのような手口で行われるのか、イメージしづらいでしょう。
ここでは、具体例を用いてSQLインジェクションの手口を解説します。
分かりやすい例は、ユーザー名とパスワードを用いたログイン認証です。ログイン認証では、下記のSQL文でユーザー名とパスワードが一致するデータを検索することがあります。該当データが見つかった場合のみ、ログインが成功する仕組みです。
SELECT * FROM users WHERE name = 'ユーザー名' AND password = 'パスワード';
'ユーザー名'と'パスワード'には、それぞれユーザーが画面上で入力したデータを入れます。
例としてユーザー名「valtes」、パスワード「12345678」とした場合のSQL文は、下記のとおりです。なお、実際のパスワードは、より安全な形に変換したうえで登録されます。
SELECT * FROM users WHERE name = 'valtes' AND password = '12345678';
しかしSQLインジェクションの場合、パスワードに「' OR '1'='1」といった文字列を入力します。このときに作成されるSQL文は、下記のとおりです。
SELECT * FROM users WHERE name = 'valtes' AND password = '' OR '1'='1';
ここで、SQLで条件判定に用いられるANDとORの意味を整理しておきましょう。
- 条件1 AND 条件2:条件1と条件2の両方を満たしていれば成立
- 条件1 OR 条件2:条件1と条件2のいずれかを満たしていれば成立
SQLのルール上、ORよりも先にANDがチェックされます。つまり、下記の( )部分が先にチェックされたうえで「'1'='1'」の条件がチェックされるのです。
SELECT * FROM users WHERE (name = 'valtes' AND password = '') OR '1'='1';
'1'と'1'は当然ながら常に等しいため、ORの条件2は常に正しいと判定されます。するとORの性質上、全体の条件判定も正しいと見なされてしまいます。その結果、ユーザー名やパスワードの妥当性に関係なく、すべてのデータが取得できてしまうのです。
このように、悪意のある入力情報を与えて不正なSQL文を実行させるのがSQLインジェクションです。
なお、上記の手口は主に画面の入力欄を悪用して行われますが、URLに不正なパラメータを付加して送る手口もあります。URLに付加された検索キーワードなどの情報をサーバー側で処理し、データベース操作に用いるケースが標的となります。
2.代表的なSQLインジェクション対策方法
SQLインジェクションによる被害を防ぐためには、適切な対策方法を知ることが大切です。ここでは、代表的なSQLインジェクション対策方法を 2つ紹介します。
2-1 プレースホルダ
まずは、システムやサービス内でSQL文を組み立てる際、「プレースホルダ」を取り入れることを検討してみてください。プレースホルダとは、SQL文のパラメータ部分(ユーザー名やパスワードなど)に仮の文字を設置しておき、後からデータをセットする仕組みです。
ユーザー名とパスワードを用いたログイン認証の例に、SQL文をプレースホルダで扱う場合は下記のとおりです。
SELECT * FROM users WHERE name = ? AND password = ?;
「?」の部分にプログラム内部でユーザー名やパスワードを埋め込みます。データを埋め込む際に 不正な文字の無害化が行われるため、不正なSQL文が組み立てられる事態を防げるのです。
大半のプログラミング言語は、プレースホルダでSQL文を扱うための機能をサポートしています。手動でプレースホルダを取り入れるよりも、こうした機能を利用するほうが確実です。
2-2 エスケープ処理
ユーザーの入力内容に「エスケープ処理」を施すことで、不正なSQL文としての実行を防げます。エスケープ処理とは、特別な意味を持つ文字を無害な文字に置き換える処理のことです。
たとえばSQLのエスケープ処理では、シングルクォート「'」を2つ分の「''」に置き換えます。これにより、シングルクォートは単なる文字列の一部として扱われ、想定外のSQL文が実行されることを防げるのです。
システムやサービスの開発言語によっては、エスケープ処理を施せるライブラリが提供されている場合があります。なお前述のプレースホルダでも、内部的にエスケープ処理は行われます。プレースホルダの適用が難しい場合は、個別にエスケープ処理を施すことも考えましょう。
3.SQLインジェクション対策の不足で懸念される被害【事例付き】
SQLインジェクションは、SQLを扱うあらゆるシステムやサービスにとっての脅威となります。実際のところ、SQLインジェクションによる被害は少なくありません。ここでは、SQLインジェクションで懸念される被害を、事例を交えて紹介します。
3-1 情報漏えい
SQLインジェクションによって、情報漏えいが強く懸念されます。先ほどの例(ユーザー名とパスワードを用いたログイン認証の例)では、すべてのユーザー情報を不正なSQL文により取得できてしまいました。攻撃者は、自分以外の企業や個人の情報をSQLインジェクションで取得できる場合があるのです。
ある調査会社の事例では、SQLインジェクションによって10万件を超える会員情報が漏えいしたと見られています。このような情報漏えいがあれば、ユーザーに迷惑がかかるのはもちろん、企業の信頼失墜も避けられません。
3-2 不正アクセス
SQLインジェクション対策が不十分だと、本来のログイン情報を入力せずにログインできてしまうので、不正アクセスのリスクが高まります。不正アクセスされると、攻撃者が内部で活動しやすくなり、他人のアカウントで危険な操作をされかねません。
あるハウスメーカーの事例では、運用が終了したWebページがSQLインジェクションにより不正アクセスされ、顧客や従業員の情報が流出しました。このように、利用していないWebページがSQLインジェクション攻撃を受けるケースも少なくありません。
3-3 データの改ざん
SQLインジェクションによる不正アクセスから、データを改ざんされるケースも少なくありません。 SQLインジェクション対策が不十分な場合、データの更新や削除を不正に実行される可能性があります。
あるECサイトの事例では、SQLインジェクションによって不正アクセスされたうえに、内部のプログラムを不正に書き換えられました。このように、重要なデータを改ざんされると、ビジネスの運営にも支障をきたす恐れがあります。
3-4 システムの乗っ取り
SQLインジェクションによって、最悪の場合システムを乗っ取られてしまいます。たとえば、データベースから管理者の認証情報を抜き取られると、管理者権限で自由な操作を行えるでしょう。攻撃者の活動が容易となり、さらなる被害の拡大が懸念されます。
ある行政機関の事例では、社内システムがSQLインジェクション攻撃を受けて管理者情報を抜き取られました。その結果、管理者として不正 アクセスされ、職員になりすまして外部へ悪質なメールを送信されてしまいました。
4.SQLインジェクション対策に有効なサービス
既存のシステムやサービスにSQLインジェクション対策を施す場合、まずは脆弱性(セキュリティ上の弱み)を特定しなければなりません。とはいえ、大規模なソフトウェアの中から、SQLインジェクションの脆弱性を漏れなく探し出す作業は大変です。
効率的にSQLインジェクション対策を施したい場合は、脆弱性診断サービスの活用がおすすめです。
セキュリティのプロに脆弱性をチェックしてもらうことで、労力をかけず高精度にSQLインジェクションを含む、さまざまな脆弱性を検出できるでしょう。
なお、当サイトを運営するバルテスでも、Web・モバイル・IoTデバイスなどの幅広いIT資産の脆弱性診断サービスを提供しています。ツールによる効率性の高い診断と、プロによる確実性の高い手動診断を組み合わせたサービスです。
「自社で脆弱性診断を行えるか不安がある」「労力をかけずに高品質な診断結果を得たい」という方は、ぜひご利用ください。
また、継続的にSQLインジェクション等の攻撃を防ぐためにはWAFの導入もおすすめです。
WAFとは、ネットワークを介した攻撃を防ぐ、Webアプリケーションに特化したセキュリティ対策です。ファイアウォールやIPSでは防ぎきれなかった不正アクセスを判別し、Webアプリケーションを保護できる強みがあります。
WAFは通信の中身までチェックすることができるため、Webアプリケーションの脆弱性を狙った攻撃に最も効果があると言われてます。
バルテスでもクラウド型のWAFサービスを提供しています。良心価格で使いやすいツールとなっていますので、まずはトライアルからお試しください!
まとめ
SQLインジェクションとは、システムやサービスに悪意のあるSQL文を注入し、不正なデータベース操作を行う攻撃手法のことです。
SQLインジェクション攻撃を受けると情報漏えいやデータの改ざんなど、さまざまな被害が懸念されます。
SQLインジェクションによる被害を防ぐためには、確実なセキュリティ対策が不可欠です。システムやサービスにSQLインジェクション対策を施す際は、今回の内容をぜひ参考にしてください。