SQLインジェクションとは?攻撃の仕組み、対策、被害事例を解説!

記事サムネイル

現在のWebアプリケーションは、ユーザの情報を扱うデータベースと密接に結びついています。認証情報を入力するログインフォームや、欲しい商品を絞り込む検索バーなど、私たちが日常的に利用する機能の裏側では、データベースとのやり取りが頻繁に行われています。

しかし、代表的なサイバー攻撃の一つであり、この仕組みを悪用する「SQLインジェクション」によって、データベースに保存されているデータが改ざんされたり、流出する危険性があります。

本記事では、このSQLインジェクションとは何か、攻撃のパターンと仕組み、私たちが取るべき対策方法、国内・国外の被害事例について、セキュリティ初心者の方に分かりやすく解説します。

「未経験からでもホワイトハッカーになれる!」実践的セキュリティスクール「セキュ塾」

セキュ塾コース診断

SQLインジェクションとは

SQLインジェクション攻撃ののイメージ図

SQLインジェクションとは、Webサイトの設置された入力フォームなどに「SQL文と呼ばれるデータベースへの命令を含む文字列」を入力することで、設計者が想定していない形でSQL文を実行させて、データベースの情報を盗んだり、不正に操作したりする、Webサイトを狙った代表的なサイバー攻撃の一種です。

SQLインジェクションの簡単な流れのまとめです。

  1. 攻撃のターゲットになる、脆弱性を持ったWebサイトやWebアプリケーションを探す。
  2. SQLインジェクションへの対策がされていないWebサイトに対して、サイバー攻撃者が入力フォームに「SQL文と呼ばれるデータベースへの命令を含む文字列」を入力する。
  3. サイバー攻撃者によって不正に書き換えられた「SQL文」が実行される。
  4. 不正に書き換えられたSQL文がデータベースに働きかけ、情報を盗まれたり、改ざんされたりする。

対策がされていないと簡単にできてしまう攻撃でもありますので、
Webアプリケーションの開発をされている方は要注意です!

代表的なSQLインジェクション攻撃の仕組み

SQL文に馴染みのない方には少し難しく感じるかもしれませんが、SQLインジェクションの具体的な攻撃の手法について解説していきましょう。

SQLとは

SQLは、データベースを操作するための言語です。データベースは、多くのデータを整理して保存し、必要な情報を効率よく取り出すための仕組みのこと。SQLを使えば、データの追加、取得、更新、削除といった操作を簡単に行うことができます。

とあるショッピングサイトのログインページにおいて、「ID」「パスワード」の二つの認証項目があるとします。

「ID」と「パスワード」欄のある入力フォーム

ユーザによって入力された値がWebアプリケーションに送信され、下記のSQL文に変換されるとします。(usersテーブルから、「入力したIDの値」と「入力したパスワードの値」が合致したレコード情報を取得して表示する)

通常想定されるSQLクエリ

SELECT * FROM users WHERE id = ‘入力したIDの値‘ AND pw = ‘入力したパスワードの値‘;

使用されているSQL簡単な意味
SELECTデータベースからデータを抽出する
テーブルに存在する全ての項目
FROM user対象に「user」という名称のテーブルを指定
WHERE <条件>対象となるデータの条件を指定

ユーザがログイン操作した場合は、下記のようなSQL文が実行されます。(IDに「keitaro」、パスワードに「mokomoko3」を入力)

SELECT * FROM users WHERE id = ‘keitaro‘ AND pw = ‘mokomoko3‘;

入力情報からSQLクエリを作成する過程図

サイバー攻撃者がIDに「keitaro」、パスワードに「 ‘ OR ‘1’ = ‘1」 を入力すると、下記のようなSQLクエリが実行されてしまいます。

サイバー攻撃者によって、想定しない形で書き換えられたSQLクエリ

SELECT * FROM users WHERE id = ‘keitaro‘ AND pw = ‘‘ OR ‘1’ = ‘1‘;

不正なSQL文を入力して、パスワード認証を無効化する様子の図

ORに続く、'1' = '1'という条件は当然ですが真なので、

攻撃者は不正な形で「keitaro」としてログイン認証をすり抜けてしまいます。

このショッピングサイトのログインページは、usersというテーブルから、下記の二つの条件に合致したレコードの情報を取得します。

  • IDがユーザの入力した値と一致する
  • パスワードが入力した値と一致する

「’1’ = ‘1’」の条件は必ず成立するため、正しいパスワード知らなくても認証を通過できる状態になっています。

SQLインジェクションの対策方法

セキュリティ対策を行うホワイトハッカー

Webサイト・Webアプリケーション開発者にとって対策必須のサイバー攻撃「SQLインジェクション」について対策方法をご紹介していきます。

【対策方法1】エスケープ処理を行う

エスケープ処理は、検索バーや入力フォームといった外部からの入力を受け付ける機能があるWebサイトで、SQLインジェクションのリスクを軽減するための効果的な対策です。

この処理では、特定の文字や記号を安全な形に変換することで、それらがSQL文の一部として解釈され、不正にSQL文が書き換えられることを防ぎます。たとえば、攻撃者が意図的に挿入する「シングルクォート(’)」や「セミコロン(;)」などの特殊文字を、通常の文字として扱われるように変換するなどです。

また、最新のフレームワークやライブラリには、この処理が自動的に組み込まれている場合もあるため、それらを活用することも効果的です。

SQLインジェクションとセットで語られることの多い代表的な対策方法一つです。

【対策方法2】Webアプリケーションに渡されるパラメータにSQL文を直接指定しない

「Webアプリケーションに渡されるパラメータにSQL文を直接指定しない」ことは、SQLインジェクションを防ぐための基本的なセキュリティ対策です。ユーザからの入力を直接SQL文に組み込む実装では、攻撃者がSQLコードを含む入力を行うことで、不正にデータベースを操作される可能性が生じます。

この方法は、IPAの「安全なウェブサイトの作り方」でも推奨されている

Webサイト作成の際の基本的なセキュリティ対策です。

【対策方法3】プレースホルダの使用権限の設定

プレースホルダの使用は、SQLインジェクションを防ぐために効果的な方法の一つで、SQL文を安全に組み立てる仕組みです。この方法では、SQL文の中に直接値を埋め込むのではなく、変数の代わりに「プレースホルダ」と呼ばれる記号を使います。そして、実際の値は後から安全に割り当てられます。

例を挙げると、

SELECT * FROM users WHERE username = ? AND password = ?;

この?がプレースホルダです。値の割り当てはプログラム側で行われ、SQL文と入力値が分離されて処理されます。これにより、悪意のある入力がSQL文の構造を壊すことがなくなり、SQLインジェクションの脆弱性を回避できます。

直接SQL文を文字列として組み立てる方法は、

攻撃者に悪用される可能性が高いので注意しましょう!

【対策方法4】DBへのアクセス権限の設定

SQLインジェクションへの対策として、「データベース(DB)へのアクセス権限を適切に設定すること」は非常に効果的です。この方法は、万が一攻撃を受けた場合でも、その被害を最小限に抑えるためのものです。

Webアプリケーションがデータベースにアクセスする際には、特定のアカウントを通じて接続します。このアカウントに与える権限を必要最低限に制限しておくことで、一部の不正な操作を防ぐことができます。

たとえば、通常のWebアプリケーションでユーザーがデータを閲覧や登録する機能しか利用しない場合には、データの削除やテーブル構造を変更する操作(例: DROPTRUNCATE)は不要です。これらの操作権限を事前に除外しておけば、攻撃者がSQLインジェクションを試みたとしても、大きな被害を与えるような操作を実行できなくなります。

アクセス権限の制限はセキュリティ対策の基本です。
攻撃者は、自由に何でもできる権限を取得したいわけですからね!

【対策方法5】エラーメッセージに詳細を表示させない

SQLインジェクション対策のひとつとして、「エラーメッセージに詳細を表示させない」ことは重要です。Webアプリケーションでエラーが発生した際に、データベースの名前やテーブルの構造、カラム名などの詳細情報がそのまま表示されてしまうと、攻撃者に大きなヒントを与えることになり、さらなる攻撃を仕掛けるための手がかりを与えてしまいます。

たとえば、エラーメッセージに「Unknown column ‘password’ in ‘users’」のような情報が含まれていると、攻撃者は「users」というテーブルに「password」というカラムがあることを知り、その情報を使って攻撃の方法を工夫する可能性があります。

これを防ぐためには、エラーメッセージをユーザーに対して表示する際、詳細な情報を含めず、一般的なメッセージ(例: 「システムエラーが発生しました。後ほど再度お試しください」)に置き換えることが推奨されます。

エラーメッセージで、テーブル名やカラムが表示される仕様は、

攻撃者にとってのイージーモードとも言えるでしょう!

SQLインジェクションの被害事例

ハッキングの被害に遭い、途方に暮れる男性

SQLインジェクション攻撃の被害に遭った国内企業の事例を紹介していきます。公式からの発表があったページも載せていますので、興味が湧いた方はチェックしてみてください。

【調査会社】株式会社 矢野経済研究所

2022年6月24日、調査会社の矢野経済研究所は、同社Webサイトのサーバに外部から不正にデータベースを操作する「SQLインジェクション攻撃」による不正アクセスがあったことを発表しました。この攻撃により、最大10万1988件のメールアドレスなどの情報が漏洩した可能性があるとのことです。

被害を受けたサーバは「www.yano.co.jp」と「www.yanoresearch.com」で、漏洩が疑われるのは、会員向けサービス「YRI WEBメンバー」と「YDB会員」のメールアドレスおよび暗号化されたパスワードです。重要な機密情報やクレジットカード情報は別のシステムで管理されており、漏洩していないことが確認されています。

この事態を受けて、同社は関連するWebサイトを一時的に閉鎖し、影響を受けたパスワードの初期化などの対策を実施しました。

※参照:不正アクセスによる個人情報漏えいに関するお詫びとお知らせ(株式会社 矢野経済研究所)

【オンラインクリーニングサービス運営会社】株式会社 ヨシハラシステムズ

2021年4月5日、株式会社ヨシハラシステムズは4月5日、不正アクセスを受けた結果、同社が運営する「せんたく便」の利用者のクレジットカード情報が流出した可能性があることを発表しました。

事態の発端は2020年10月30日、一部クレジットカード会社から同社へ、カード情報流出の疑いに関する連絡が入ったことです。同日、カード決済を停止し、P.C.F.FRONTEO株式会社を通じて調査を実施。その結果、SQLインジェクションによる不正アクセスが原因であることが判明しました。この攻撃により、新規にカード情報を登録した顧客や登録内容を更新した顧客、旧システムからデータを移行した顧客のカード情報が影響を受けた可能性があります。

流出した可能性のある情報は、2020年11月16日までに「せんたく便」で登録された58,813件のカード情報(名義、番号、有効期限)に及びます。影響を受けた顧客は特定されていますが、システム改修以前の利用開始日は特定されていません。調査によると、個人情報が保存されていたサーバーへの不正アクセスは確認されましたが、正確な流出件数の特定は困難でした。

対象顧客には個別にメールで連絡を行い、カード会社との連携により流出した可能性のあるカードの監視を継続。不正利用を防ぐ対策を講じています。また、利用者にもカード明細の確認を呼びかけています。

同社は1月26日に警察、1月30日に個人情報保護委員会に報告を済ませ、再発防止に向けて現行システムの改善や監視体制の強化に取り組む方針です。

※参照:弊社が運営する「せんたく便」への不正アクセスによる個人情報流出に関するお詫びとお知らせ

まとめ

SQLインジェクションは、WebサイトやWebアプリケーションの脆弱性を狙う代表的なサイバー攻撃であり、開発者は必ず対策を取る必要のある攻撃です。

この攻撃は、攻撃者がデータベースが不正操作し、情報漏洩やデータ改ざんといった深刻な被害を招く可能性があり、SQL文のパラメータ化や入力値の検証などの対策をすることで、多くの場合で未然に防ぐことが可能です。

被害事例も多数報告されている危険な攻撃なので、Web開発の際にはぜひ対策をしてみてください。

実践的セキュリティ特化スクール「セキュ塾」では、仮想環境でSQLインジェクションをはじめとするサイバー攻撃を仮想環境で実践し、対策方法まで学習することができます!

「未経験からでもホワイトハッカーになれる!」実践的セキュリティスクール「セキュ塾」

セキュ塾コース診断

【セキュ塾主催】CTF コンテスト 2025/03/22

2025年開催!セキュ塾CTFコンテストの案内

【セキュ塾】が主催するCTFコンテスト大会が、2025年3月22日(土)に開催決定しました!

このイベントは、セキュ塾の受講生(卒業生も含む)を対象とした、ホワイトハッキングやサイバーセキュリティの技術を競い合う大会で、日ごろの学習の実践や、モチベーションアップを目的として開催しております。

参加費も無料なので、ぜひご参加ください!賞品には、Amazonギフトカードや記念コインをご用意する予定です。

コメント