Akamai dots background

SQL インジェクションのチュートリアル

この SQL インジェクションのチュートリアルでは、企業や公的機関のウェブセキュリティに対する最も一般的な脅威の 1 つについて簡単に説明します。 この SQL インジェクションのチュートリアルでは 4 つのトピックを扱います。

  • SQL インジェクション攻撃のコンテキスト
  • SQL インジェクション攻撃の目的
  • SQL インジェクションの仕組み
  • SQL インジェクション攻撃の防御方法

SQL インジェクションのチュートリアル トピック 1: SQL インジェクション攻撃のコンテキスト

現在のウェブアプリケーションのほとんどは、同じ基本構造と論理フローを使用しています。ウェブクライアント(通常はブラウザ)が、ウェブサーバーでホストされているウェブアプリケーションと通信し、ウェブアプリケーションは 1 つ以上のバックエンドデータベースと通信します。 データベースには、ユーザー名/パスワードの組み合わせやユーザー・アカウント・データなど、アプリケーションに関連するさまざまな情報が保存されています。 エンドユーザーは、ログインフォームや検索フォームなどのウェブページフォームに入力することでこの情報へのアクセスおよび変更を行います。 このユーザー入力に基づいて、ウェブアプリケーションはデータベースにコマンドを送信します。ほとんどの場合、現在の大部分のリレーショナルデータベースのコマンド言語である Structured Query Language(構造化紹介言語、SQL)が使用されます。 データベースが応答し、ウェブアプリケーションがユーザーに応答します。

SQL インジェクションのチュートリアル トピック 2: SQL インジェクション攻撃の目的

SQL インジェクション攻撃では、SQL 構文に精通したハッカーが、ウェブアプリケーションで意図されているよりも直接かつ広範囲のアクセス権を得ることを目的としてウェブページフォームで偽のエントリを送信します。 こうした攻撃の多くは、ユーザー名/パスワードの組み合わせ、重要な財務データや企業データなどの価値ある情報の取得を試みます。 また、預金残高などのデータの改ざんや、悪意あるデータ削除を試みるSQL インジェクション攻撃もあります。 これらの方法により、SQL インジェクション攻撃は大規模なサイバーセキュリティ侵害を引き起こす可能性があります。

SQL インジェクションのチュートリアル トピック 3: SQL インジェクションの仕組み

SQL インジェクションは、ハッカーが特殊な SQL 語句および文字をウェブフォームの入力フィールドに入力して、アプリケーションが通常とは異なるコマンドをデータベースに送信するよう仕向けることで機能します。 簡単な例として(OWASP(Open Web Application Security Project)のウェブサイトからの例)、アプリケーションコードがデータベースに対して次のコマンドを実行するよう記述されているケースを見てみましょう。

---------------

SELECT * FROM accounts

WHERE owner =

AND accountname = ;

---------------

このコマンドは "accounts" テーブルからアカウント情報を取得しますが、指定された所有者名とアカウント名の両方がテーブル内の同じエントリに存在する場合にのみ情報が取得されます。 確認のための特定の所有者名およびアカウント名は、エンドユーザーがウェブ・ページ・フォームから指定します。

攻撃者が、このウェブフォームに偽の所有者名と "‘name' OR ‘x'='x'" というアカウント名を入力したとします。 アプリケーションで適切なインジェクション防御策がとられていない場合、一重引用符と OR 句の使用によって次のように変更された SQL コマンドが作成され、データベースに送信されます。

---------------

SELECT * FROM accounts

WHERE owner = ‘smith'

AND accountname = ‘name' OR ‘x' = ‘x';

---------------

通常は限定的である WHERE 句が、"accounts" テーブルのすべてのレコードで満たされるようになりました。なぜなら、"smith/name" という所有者/アカウント名の組み合わせが見つからない場合は句の OR 部分(‘x'='x')が常に真となるからです。 したがって、テーブルのすべてのレコードをアプリケーションおよびエンドユーザーに返すことができます。

SQL インジェクションのチュートリアル トピック 4: SQL インジェクション攻撃の防御方法

この SQL インジェクションのチュートリアルでは、SQL インジェクション攻撃の目的と基本テクニックについて簡単に説明しました。 ウェブアプリケーション所有者にとって重要なのは、このような攻撃を阻止する方法です。 方法は大きく分けて 2 つあります。

  • アプリケーションを慎重にコーディングする。 プログラミング上のさまざまなベストプラクティスによって、SQL インジェクションに対するウェブアプリケーションの脆弱性を大幅に軽減できます。 これには、パラメータ化クエリやストアドプロシージャの使用、ウェブフォームへのユーザーの入力をフィルタリングおよびサニタイズする文字のブラックリスト/ホワイトリストの使用などがあります。 しかし、優れたプログラミングに頼ることがウェブ・サービス・セキュリティデータ保護を確実にする最適な方法であることは稀です。 なぜなら、ほとんどのウェブアプリケーションは多数の異なるプログラマが長い時間をかけて作ったものであり、また脆弱性が判明しているウェブアプリケーションを遡って修正することは莫大なコストがかかる可能性があるからです。
  • ウェブアプリケーションの前面に、受信 HTTP トラフィックを検査およびフィルタリングする Web Application Firewall(WAF)を配置する。 WAF は SQL インジェクションに対する効果的な防御になり得ますが、従来の社内 WAF はすぐにパフォーマンスのボトルネックになる可能性があります。

アカマイのクラウドベースのウェブ・セキュリティ・ソリューションでは、WAF がアカマイのグローバルなウェブ・コンテンツ・デリバリー・ネットワークに統合されます。 このソリューションは、ウェブアプリケーションのパフォーマンスを低下させることなく、SQL インジェクション攻撃に対する広域に分散されて前面に配置された防御を提供します。 また、最近一般的になりつつある、SQL インジェクションでウェブ資産を攻撃すると同時にサービス妨害攻撃を仕掛けるという戦術も防御します。

アカマイの拡張性の高いクラウドベースのクラウド・セキュリティ・ソリューションの詳細をご覧ください