SQLインジェクションとは?仕組みや被害事例、具体的な対策方法について詳しく解説
SQLインジェクションとは?仕組みや被害事例、具体的な対策方法について詳しく解説
SQLインジェクションはサイバー攻撃の中でも特に深刻な脅威として知られ、データベースのセキュリティにおいて最大のリスク要因のひとつです。
攻撃者がSQLインジェクションを使うことで、ウェブサイトの脆弱なポイントを悪用し機密データの不正アクセスや改ざんを実行する可能性があります。この攻撃の背景にはウェブサイトに入力されたデータが適切に処理されていない場合に発生するSQLコマンドの操作があり、これにより攻撃者が意図的に不正なクエリを埋め込むことが可能になります。
例えば、ユーザーのログイン情報や個人情報、購買履歴などが含まれるデータベースが狙われやすく、もしこれらの情報が漏洩すれば企業やユーザー双方に甚大な被害をもたらします。
本記事では、そんなSQLインジェクションの仕組みや被害事例、対策方法について解説します。
SQLインジェクションとは
SQLは、データベースを効率的に操作するためのプログラミング言語です。
SQLインジェクションは、ウェブアプリケーションの脆弱性を意図的に狙い、SQL文をアプリケーションに不正に注入し、そのSQL文によってさまざまな不正行為を実行させる攻撃手法です。データベースに保存されたデータが不正に読み取られるだけでなく、改ざんや削除されることもあります。
SQLインジェクションの発生件数
株式会社サイバーセキュリティクラウドは「ウェブアプリケーションを狙ったサイバー攻撃検知レポート」を2023年5月に公開しました。
それによると、2023年1〜3月のSQLインジェクションの攻撃総数は16,985,151件で、2022年1〜3月の5,481,900件から210%増加していることが判明しました。
SQLインジェクションで狙われやすいウェブサイトとは
SQLインジェクションの標的となりやすいサイトは、クレジットカードカード情報や顧客情報など、重要な情報をデータベースに格納しているウェブサイトです。
その中でも、脆弱性が放置されているサイトや、データベースを活用するサイトは特に狙われやすいため、セキュリティ対策の強化が大切です。
SQLインジェクションがなぜ危険なのか?
SQLインジェクションは、データベースへの不正アクセスを引き起こす攻撃手法であり、企業の機密データが危険にさらされるだけでなく、ユーザーのプライバシーにも影響を与える深刻な脅威です。以下に、SQLインジェクションが引き起こすリスクについて詳しく説明します。
データ漏えいとその影響
SQLインジェクションによるデータ漏えいは、企業にとって信頼を損ねる重大な問題です。
顧客の個人情報や取引データが漏洩することで、顧客からの信頼を失うだけでなく法的な罰則や制裁金を科せられる可能性もあります。
データの改ざんと企業の信用
データの改ざんも、SQLインジェクションによる代表的な被害のひとつです。例
えば、価格情報の書き換えや商品の在庫数の改ざんなど、企業の信用を失う事態にもなりかねません。改ざんされたデータはビジネス運営において不正確な意思決定につながるリスクをはらんでいます。
不正アクセスによる二次被害
不正アクセスによってデータが盗まれるとフィッシング詐欺やアカウント乗っ取りなどの二次被害が発生する可能性もあります。
ユーザーのIDやパスワードが漏洩しそれが別のサービスでも使用されている場合、被害がさらに拡大する恐れがあります。
SQLインジェクションの仕組み
攻撃者がデータベースを操作する言語の SQLを用いて、不正な命令を実行し、プログラムを改変します。例えば、ウェブサイトを利用するために、ユーザーIDやパスワードを入力するとします。この時、不正な文字列が入力されていないかチェックが行われます。しかし、このチェック機能に脆弱性があるとIDやパスワードなどの文字列を入力させた際、不正なSQLが実行されます。その結果、データベースの操作が可能となり、個人情報の流出につながるという仕組みです。
ここで、不正な命令文によってデータベースの操作が可能になる一例をご紹介します。
SELECT * FROM USER WHERE first_name = ‘hanako’;
これは、ユーザー表(USER)から名前(first_name)が「hanako」のデータを全て抽出するSQL文です。WHERE以降で条件を指定し、合致したデータをデータベース「USER」からすべて取り出しています。
次に、こちらの不正なSQL文が注入された文を見てみましょう。
SELECT * FROM USER WHERE first_name = ‘hanako’ OR ‘1’=‘1’;
1つ目のSQL文に「OR ‘1’=‘1’」が追加されました。この場合、探したいデータの条件が2つあり、どちらか一方でも成立していればそのデータを出力するという文になります。1つ目の条件は最初のSQL文と同じで、first_nameがhanakoであるという意味です。2つ目の条件が、‘1’=‘1’が成立しているという意味です。しかし、2番目の条件は常に成立するため、データベース上の全データが出力されてしまいます。
このように、不正なSQL文を注入し、データベースの書き換えや削除、情報漏えいを引き起こす攻撃をSQLインジェクションといいます。
SQLインジェクションによる被害
SQLインジェクションは、ウェブサイトの運営側だけでなくユーザーにも被害が及びます。ここでは、それぞれの被害例をご紹介しましょう。
ウェブサイト運営者側の被害
データベースは、企業の重要資産です。顧客の個人情報や商品の売上情報などが含まれるデータベースがSQLインジェクションによって損害を受けると、業務に多大な影響が出る恐れがあります。
ECサイトのほとんどがデータベースを利用しているため動的なサイトです。動的サイトとは、アクセスしたユーザーの条件(時間、場所など)に応じて、異なる情報を自動で表示するサイトを指します。このウェブサイトの内容が不正に書き換えられると、訪問したユーザーに偽情報が伝わってしまったり、偽サイトに誘導されてしまったりします。
ユーザー側の被害
被害には、データの破壊だけでなく、データの盗難もあります。盗み出された情報が悪用されてしまう被害です。この情報漏えいによって以下の二次被害が発生する恐れがあります。
- ID/パスワードが盗まれ、企業システムへ不正アクセスが行われたり、アカウントが乗っ取られたりする
- クレジットカード情報が盗まれ、不正送金や購入が行われる
- 氏名やログイン情報といった個人情報を、ダークウェブなどで売買される
また、改ざんされたウェブサイトにコンピューターウイルスが仕込まれ、閲覧することでウイルスに感染する被害も増加しています。
SQLインジェクションの被害事例
SQLインジェクションは、1990年代後半より存在するサイバー攻撃手法です。現在でも猛威をふるっており、被害報告が絶えることはありません。ここでは、実際に発生したSQLインジェクションの被害事例を4つご紹介します。
リサーチ会社の事例
2022年6月下旬、業界を代表するリサーチ・調査会社がSQLインジェクション攻撃を受け、合計101,988件の情報が流出してしまう恐れがあると発表しました。当該企業は、サーバーへの攻撃を受けた後、以下のような対応を行ったと報告しています。
- 会員情報流出の被害にあった会員への個別連絡
- 運営する2つのサイトを一時閉鎖
- 情報流出サイトのパスワードの初期化
- 流出対象者への問い合わせ窓口の設置
- 再発防止策として脆弱性防御/管理ツールの導入
ECサイトの事例
2020年4月に事務用品を扱うECサイトに不正アクセスが行われ、顧客情報が最大12万件流出した恐れがあるという事例が発生しました。顧客情報には、クレジットカード情報だけでなく、氏名や住所、メールアドレスなども含まれています。
不正アクセスの影響で、当該サイトは5ヶ月間の一時的な閉鎖を行います。この不正アクセスは、SQLインジェクション攻撃によるものであり、その後の対策として、脆弱性の修正や24時間監視体制の構築などが行われました。
アウトレット運営会社の事例
2018年6月、アウトレット運営会社で約27万件のメールマガジン会員情報が流出したサイバー攻撃についての調査報告が発表されています。
2017年5月から2018年1月の間に国内外の第三者より複数回、ホームページ用サーバーに対するSQLインジェクション攻撃を用いた不正アクセスが確認されました。また、ウェブアプリケーションの一部に脆弱性があり、その脆弱性を突くことにより情報流出が発生したことが報告されています。
研究機関の事例
2023年4月、国内の大規模な研究施設がSQLインジェクションの被害に遭い、研究者のメールアドレスが約5,500件流出しました。同研究施設がサーバーのログを確認したところ、2023年2月7日と2023年3月16日、17日にデータベースへの不正アクセスが確認されています。流出したのはメールアドレスのみですが、フィッシング詐欺などの二次被害につながる恐れが懸念されます。
SQLインジェクション攻撃の検出方法
SQLインジェクション攻撃の早期発見は、被害拡大を防ぐ上で極めて重要です。ここでは、SQLインジェクション攻撃を検出するための主な方法について解説します。
ログ監視による不審なアクセスの特定
ログ監視は不正なアクセスを早期に発見するための効果的な手段です。特に短時間に集中したログイン試行や大量のデータベースクエリが検出される場合、SQLインジェクションの兆候である可能性があります。
自動的にログを監視するシステムを導入すると、より迅速に異常を検出できます。
IDS/IPSの導入によるリアルタイム検出
侵入検知システム(IDS)や侵入防止システム(IPS)は、不正アクセスをリアルタイムで検出し、SQLインジェクションのような攻撃を防ぐ手段として有効です。IDSはネットワーク全体を監視し、SQLインジェクションの兆候を察知して通知する機能を持っています。
異常なSQLクエリパターンの検出
SQLインジェクション攻撃は、通常とは異なるSQLクエリを実行することで発生します。例えば、過度に長いクエリや通常では使われない構文が含まれる場合、それがSQLインジェクションの兆候であることが多いです。自動的に異常なパターンを検出する機能を設定しておくと、安全性が高まります。
SQLインジェクションへの対策方法
SQLインジェクションへの対策は、セキュリティ強化だけでなく、SQL文に不正なコマンドを注入されても実行されないようにウェブアプリケーションを作成することが大切です。ここでは、対策方法を8つご紹介します。
プレースホルダの利用
プレースホルダとは、SQL文に置く変動箇所を示す文字列や記号のことです。指定した記号の位置に対して実際の値を機械的に割り当てます。
一例として、次の文を見てみましょう。
SELECT * FROM USER WHERE first_name = ?;
この文では、「?」がプレースホルダにあたります。プレースホルダを利用すると、プレースホルダ以外の部分は固定化され、攻撃者がどのような文を入力してもSQLとして実行されなくなります。
エスケープ処理
エスケープ処理とは、ユーザーから入力された特定の文字や記号を安全な形に変換する処理です。
例えば「’」や「”」「\」といった特殊記号を「”」「””」「\\」として記号の意味を無効化する処理を行います。なお、特殊記号の取り扱いはデータベースによって異なるため、データベースに応じた対策が必要です。
Webアプリケーションを常に最新バージョンに保つ
対策の一つに、ウェブアプリケーションを常に最新の状態に保つことが挙げられます。また、アプリケーションの稼働に必要なOSの更新にも目を向けましょう。各バージョンアップには、発見された脆弱性を修正したものが含まれます。そのため、SQLインジェクション攻撃のリスク軽減につながります。
パラメータにSQL文を直接指定しない
パラメータとは、処理の内容を動的に決める目的で外側から与える値です。hiddenパラメータにSQL文を直接指定した事例がありました。hiddenは、値を画面には表示せずに保持するパラメータです。しかし、隠されたデータはソースコードからは値そのものが丸見えなため、パラメータ値が改変され、データベースの不正利用につながる恐れがあります。
データベースアカウントに適切な権限を与える
データベースでは、ユーザーごとに特定の権限を付与することが可能です。適切な権限を設定すると、不必要なユーザーによるデータベースへのアクセスを制限し、セキュリティの向上につながります。
例えば、データベースの削除操作を、サイトの運営者以外には権限を与えない設定です。もし、削除コマンドが運営者以外でも行える状態では、悪意あるユーザーが削除を行う恐れがあります。そのため、運営者以外では実行できないよう、権限を設定しておきます。ウェブアプリケーションからデータベースに渡すSQL文を洗い出し、実行に必要な最小限の権限を与えましょう。
定期的に攻撃数を検出し、攻撃内容の解析を行う
不正アクセス対策における重要な要素の一つが操作ログの分析です。操作ログとは、システムの使用履歴を記録したもので、ログイン情報やアクセスしたファイル、実行されたコマンドなどを指します。
操作ログを用いて攻撃を分析する際、以下のポイントを重点的に調査すると良いでしょう。
- ログイン試行の分析
→短時間に多数のログイン失敗がある場合、総当たり攻撃やパスワードリスト攻撃の可能性 - アクセス時間と頻度の分析
→不審なアクセス時間帯の特定 - ユーザー行動の異常パターンの特定
→特定のユーザーが普段アクセスしないファイルやデータベースに頻繁にアクセスしている
定期的に全体の脆弱性診断を行う
脆弱性診断とは、セキュリティの専門家が、ウェブサイトの脆弱性を調査するサービスです。SQLインジェクションなどサイバー攻撃に狙われる「脆弱性」の内容を洗い出すことで、効率的かつ確実に、課題への対策を打つことができます。
サイバー攻撃や標的型攻撃は、高度かつ革新的手法が使われ、攻撃対象も日々変化しています。ウェブサイトのセキュリティを守るためには、常に外部からの脅威に備えましょう。定期的に脆弱性診断を実施することで情報漏えい事故などのリスクを未然に回避できます。
WAFを導入する
WAFとは、ウェブアプリケーションの脆弱性を狙ったサイバー攻撃を防御するセキュリティ対策ツールです。SQLインジェクションはもちろん、クロスサイトスクリプティングやDoS/DDoS攻撃といったサイバー攻撃も防ぐことが可能です。
ウェブアプリケーション内に直接実装するものではなく、ウェブアプリケーションの前面やネットワークに配置し、脆弱性を悪用した攻撃を検出・低減します。WAFの形態によっては、複数のウェブアプリケーションに対する攻撃をまとめて防御することもできます。
必要な権限のみを付与とセキュリティポリシーの徹底
SQLインジェクションを防ぐための対策は多岐にわたりますが、効果的な対策を実施するためには以下の2つが重要となります。
- 必要な権限のみを付与する
データベースユーザーに与える権限は必要最低限に抑えるべきです。例えば、データベースの削除や更新といった操作権限は管理者のみに付与し、一般ユーザーには制限することで被害のリスクを軽減します。 - セキュリティポリシーの徹底
組織内でのセキュリティポリシーの徹底もSQLインジェクション対策には欠かせません。具体的なセキュリティポリシーを設定し、従業員に対する定期的な教育を行うことで不注意による脆弱性の発生を防ぎます。
まとめ
SQLインジェクションは、データベースの改ざんを行い運営への攻撃を行うと同時に、ユーザーの個人情報を盗む危険なサイバー攻撃です。SQLインジェクションによる攻撃は、年々増加傾向にあります。SQL構築の際にエスケープ処理やプレースホルダを利用したり、WAFを導入したりして安全なウェブサイトを作りましょう。