Facebook x

ジャンル

SQLインジェクションを防ぐための対策とは?手口と被害のリスクを解説
セキュリティ 2024.10.30
x hatenabookmark
0

SQLインジェクションを防ぐための対策とは?手口と被害のリスクを解説

監修: 加賀谷 知宏

バルテス株式会社 R&D事業部 セキュリティソリューション開発部 部長

システムやサービスがデータを管理するうえで、今やデータベースが欠かせません。

データベースを扱ううえで脅威となるのが「SQLインジェクション」です。SQLインジェクションの対策が不十分なために、多大な損害を受けた企業の事例も数多く存在します。

そこで今回は、SQLインジェクションの手口や、被害を防ぐための対策、診断サービスを紹介します。

もくじ
  1. 対策すべきSQLインジェクションとは
    1. SQLインジェクションの意味
    2. SQLインジェクションの手口
  2. 代表的なSQLインジェクション対策方法
    1. プレースホルダ
    2. エスケープ処理
  3. SQLインジェクション対策の不足で懸念される被害【事例付き】
    1. 情報漏えい
    2. 不正アクセス
    3. データの改ざん
    4. システムの乗っ取り
  4. SQLインジェクション対策に有効な診断サービス
  5. まとめ

1.対策すべきSQLインジェクションとは

SQLインジェクションとは、データベースの操作に用いる「SQL」を悪用したサイバー攻撃の一種です。ソフトウェア開発に詳しくない場合、そもそもSQLを知らないケースも多いでしょう。まずはSQLインジェクションの意味と手口を解説します。

1-1 SQLインジェクションの意味

SQLインジェクションとは、システムやサービスに悪意のあるSQL文を注入(インジェクション)して、不正なデータベース操作を行う攻撃手法のことです。

一般的なシステム・サービスでは、データベース管理システム(DBMS)というソフトウェアで構築したデータベースを用いて、データを管理します。このとき、DBMSにデータベース操作の命令を送るための言語がSQLです。

システム・サービスがデータの検索や登録などを行う際、ユーザーの入力情報も含めてSQL文を組み立てます。しかしSQLインジェクションでは、悪意のある入力情報を送ることで不正なSQL文を作成・実行させて、データベースの不正な操作を図るのです。

sqlインジェクション.png

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インジェクション対策を施す際は、今回の内容をぜひ参考にしてください。

セキュリティ
x hatenabookmark
0

監修: 加賀谷 知宏

バルテス株式会社 R&D事業部 セキュリティソリューション開発部 部長

IT業界歴20年。高度なネットワーク技術を活用した製品・サービス開発に始まり 、ハードウェア、アプリケーションソフトウェアの開発を幅広く経験。その後、セキュリティ分野へ興味を持ち、転職。バルテス入社後は、「PrimeWAF」「サイバーセキュリティ自動診断」などの開発に携わる。