In this article
SQLインジェクションを解説:Webアプリケーションを守るための戦略
SQLインジェクションは、25年以上前に初めて発見されて以来、Web開発者を悩ませ続けています。長年にわたって存在するにもかかわらず、OWASPによると、今なお最も深刻なWeb脆弱性の上位に挙げられています。簡単に防げる一方で、この単純な攻撃は影響も大きく、データベースと連携するあらゆるWebアプリケーションのデータ完全性を脅かします。
SQLインジェクションとは
SQLインジェクション攻撃はインジェクション攻撃の一種で、攻撃者がWebアプリケーションをだまして、SQLコマンドをその攻撃者に代わってデータベースへ直接渡させます。これにより、攻撃者は入力データを通じて有害なSQLクエリを注入し、アプリケーションと同じレベルのアクセス権を得て、内部からデータベースを検索・操作できるようになります。
これらはWebアプリケーションへの攻撃とされていますが、実際の標的はWebサイトを支える基盤となるデータベースです。データベース内のすべてのデータが漏えい、改ざん、削除される危険にさらされ、データのセキュリティと運用が損なわれます。
SQLインジェクションの仕組み
この攻撃は、Webアプリケーションの脆弱な入力箇所を悪用します。一般に、Webアプリケーションはフォームを通じてユーザー入力を受け取ります。ユーザーがデータを入力してボタンをクリックすると、アプリケーションがその入力を処理します。入力されるのは通常、文字や数字だけなので、一般的なユーザーの利用で問題が起きることはありません。
問題が起きるのは、入力検証が不十分なために、SQLコマンドを含む文字列をユーザーが入力できてしまう場合です。通常の入力とは異なり、特殊文字によって、アプリケーションは標準の入力処理を中断し、追加されたコマンドの実行を開始します。実行結果のクエリが画面に直接表示されることもあれば、裏側で処理されることもあります。こうしたケースはブラインドSQLインジェクション攻撃と呼ばれます。画面上に反応が表示されない場合でも、データベースの変更が行われることがあり、被害は深刻になり得ます。
ただし、攻撃対象となるのはフォームフィールドだけではありません。URLパラメーターや直接のAPI呼び出しなど、データベースとのやり取りにつながるあらゆる入力手段は、攻撃を防ぐ適切な制御がなければ、同じように悪用される可能性があります。
SQLインジェクション攻撃の例
SQLを悪用する攻撃は複雑ではなく、攻撃者の常套手段の一つです。
攻撃は、次のようなバックエンドでの単純なSQLクエリから始まります。
SELECT * FROM products WHERE name LIKE '%$searchTerm%';このクエリでは、ユーザーの入力が$searchTermに置き換えられます。通常、ユーザーが「phone」と入力すると、サーバーで実行されるクエリは次のようになります。
SELECT * FROM products WHERE name LIKE '%phone%';このクエリは、名前に「phone」という単語を含むすべての商品を返します。
SQLインジェクションを使って攻撃者がこれをどのように悪用できるか見てみましょう。攻撃者が‘; DROP TABLE products; –と入力したとします。すると、クエリは次のようになります。
SELECT * FROM products WHERE name LIKE '%'; DROP TABLE products; --%'この場合、インジェクションによって次のことが起こります。
元のクエリを終了する:
‘;の部分が、元のLIKEクエリ条件を閉じます。新しいクエリを注入する:
DROP TABLE products;は新しいSQL文であり、実行されるとproductsテーブル全体が削除されます。残りの部分をコメントアウトする:–によってクエリの残りがコメントアウトされ、元のクエリの残りの部分(
%’;)による構文エラーを防ぎます。
その結果、攻撃者はデータベースへの正規のアクセス権がなくても、productsテーブルの内容をすべて削除できます。これは、この脆弱性を悪用する方法の一例にすぎません。より複雑な手法では、この仕組みを利用して権限を昇格したり、テーブルからデータを窃取したりできます。
SQLインジェクションの危険性
SQLインジェクション攻撃の最も明白なリスクは、ブラウザーを通じて機密情報が漏えいすることです。ほとんどのアプリケーションには、ユーザーがアクセスできるデータを制限する制御があります。SQLインジェクション攻撃を使うと、攻撃者はこうした制御を回避し、アプリケーションと同じようにデータベースを検索できます。漏えいする機密データの種類によっては、データ侵害によって法的責任やコンプライアンス違反の罰則が生じる可能性があります。
しかし、こうした攻撃のリスクはデータの損失にとどまりません。昇格した権限を使って、データベースサーバー上のデータを変更・削除することもできます。巧妙な攻撃者は、ユーザーテーブルの情報を変更して、ユーザーのユーザー名やパスワードを変更できます。これにより、正規のアプリケーションユーザーになりすまし、より高い権限を使ってアラートを発生させずに攻撃を実行できます。また、この手法によってデータベース内部の権限を標的にし、既存のデータベースユーザーやその権限を作成・変更して、データベースへ直接ログインすることも可能です。
SQLインジェクションを防ぐ方法
Webアプリケーションのセキュリティに対する脅威としてSQLインジェクションが長く残り続けているのは、防止に多層的な対策が必要だからです。まず、入力の検証とサニタイズを行い、SQLの構文を抜け出したり、別のインジェクション攻撃を可能にしたりする文字を取り除きます。すべてのユーザー入力を徹底的にチェックし、有害な可能性のあるデータを除去することで、インジェクションのリスクを大幅に低減できます。
さらに、パラメーター化クエリやプリペアドステートメントを使用します。こうした安全なコーディング手法は、SQLのロジックとユーザー入力を効果的に分離し、動的に生成されるクエリに伴うリスクをなくします。
最後に、定期的なセキュリティ監査とテストを実施し、既存の制御で攻撃を十分に防げることを確認します。自動化ツールを活用すれば、アプリケーションの脆弱性を評価して、攻撃を防ぐためのサニタイズが不十分な箇所を特定できます。
SnykでSQLインジェクションをプロアクティブに防止
安全なアプリケーションの開発には、脆弱性を正確に特定できるツールが欠かせません。Snyk API & Webは、クロスサイトスクリプティング(XSS)やSQLインジェクションなど、30,000件を超える潜在的な脆弱性を検出できます。
Snyk API & Webは、開発ワークフローにシームレスに統合され、潜在的なセキュリティ問題をプロアクティブに発見して対処できるよう設計されています。統合によってプロセスが効率化され、自動かつ継続的なセキュリティ評価を実施できます。Snyk API & Webを導入することで、開発者は開発ライフサイクルのあらゆる段階でアプリケーションを強化し、組織の最も機密性の高いデータを安全に扱える堅牢なアプリケーションを実現できます。
Snyk API & Webでアプリケーションを保護する方法について、ライブデモを予約して詳しくご覧ください。
Snyk API & Webに登録
開発者ファーストのDASTエンジンを今すぐ使い始めましょう
SnykのAI駆動型DASTエンジンで、脆弱性を大規模に自動で検出・可視化。自動化と修正ガイダンスにより、SDLCにシームレスに統合し、開発の早い段階からセキュリティを確保できます。
よくある質問
SQLインジェクションの防止において、Webアプリケーションファイアウォール(WAF)はどのような役割を果たしますか?
WAFはSQLインジェクションの試みを監視・フィルタリングし、Webアプリに追加のセキュリティレイヤーを提供します。
SQLインジェクションはNoSQLデータベースにも影響しますか?
構文は異なりますが、NoSQLデータベースもインジェクション攻撃に対して脆弱な場合があります。特に、入力値のサニタイズが不十分な場合は注意が必要です。
SQLインジェクションのリスクがあるのは、ログインページのあるWebサイトだけですか?
いいえ。ログインページに限らず、データベースとやり取りするWebサイトのあらゆる部分が、SQLインジェクションの脆弱性を抱える可能性があります。