インジェクション(Injection)は、Webアプリケーションやデータベースなどにおいて、システムが予期していない不正なコードやコマンドを注入することで、システムの正常な動作を妨害したり、機密情報の窃取や不正操作を行う攻撃手法です。インジェクション攻撃は、特にWebアプリケーションやデータベースがユーザーからの入力を適切に検証せず直接処理している場合に発生しやすく、情報漏洩やデータの改ざん、サービス停止といった重大なセキュリティリスクにつながることが多いです。
代表的なインジェクション攻撃には、SQLインジェクション、OSコマンドインジェクション、コードインジェクション、LDAPインジェクションなどがあり、それぞれの攻撃手法において特有のリスクと影響が伴います。
インジェクション攻撃の種類
1. SQLインジェクション
SQLインジェクションは、データベースに対する不正なSQLクエリを注入する攻撃手法で、Webアプリケーションがユーザーからの入力を通じて直接SQLクエリを実行する際に発生します。攻撃者は、通常のクエリ文の一部として入力フォームに特定のSQL文を注入し、データベース内の情報を窃取したり、データを改ざんすることが可能になります。
例:
SELECT * FROM users WHERE username = 'ユーザー名' AND password = 'パスワード';
上記のSQL文に、ユーザー名
の部分に admin' --
と入力すると以下のクエリが実行され、パスワードチェックがバイパスされます。
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'パスワード';
2. OSコマンドインジェクション
OSコマンドインジェクションは、Webアプリケーションがサーバー上でシェルコマンドを実行する際に、外部から不正なコマンドを注入する攻撃です。攻撃者は、コマンドの追加や変更を行うことで、サーバー上でファイル操作やシステム情報の取得などを行います。OSコマンドインジェクションが成功すると、サーバーの制御を乗っ取られたり、内部ネットワークへの侵入に利用される可能性があります。
例:
<?php
$filename = $_GET['file'];
system("cat " . $filename);
?>
http://example.com/script.php?file=/etc/passwd;
といったURLでアクセスすると、/etc/passwd
の内容を取得できてしまいます。
3. コードインジェクション
コードインジェクションは、Webアプリケーションにおいて、攻撃者がアプリケーションのプログラムコードを直接注入し、サーバー側で実行させる攻撃手法です。攻撃者のコードが実行されることで、システム操作や情報窃取、データの改ざんなどが可能になります。
例:
PHPでのeval()
関数などに不正なコードが注入された場合、サーバー上で意図しない操作が実行される可能性があります。
4. LDAPインジェクション
LDAPインジェクションは、ディレクトリサービスにクエリを投げる際、LDAP(Lightweight Directory Access Protocol)フィルタに対して不正な入力を行うことで、情報窃取やデータの改ざんを行う攻撃手法です。主に、LDAPベースの認証システムやユーザー検索機能が対象となります。
例: LDAP検索フィルタで(&(uid=ユーザー名)(password=パスワード))
を利用している場合、ユーザー名
に admin)(password=*)
と入力することで、任意のユーザー情報を取得できることがあります。
5. XSS(クロスサイトスクリプティング)
XSSは、ユーザーのブラウザ上で不正なスクリプトを実行させるインジェクション攻撃の一種です。JavaScriptコードがユーザーのブラウザで実行され、情報の窃取や偽装ページの表示、セッションの乗っ取りなどの被害が発生します。
インジェクションの影響とリスク
- 情報漏洩
データベースやファイルシステムに保存されている機密情報が攻撃者に漏洩し、顧客情報や取引先情報の不正入手による信用失墜や法的リスクが発生します。 - データ改ざん
データの一部が改ざんされ、業務上の混乱やデータ不整合が発生するリスクがあります。特に金融系データの改ざんは、大きな経済的被害につながる可能性があります。 - サーバー制御の乗っ取り
OSコマンドインジェクションやコードインジェクションを利用されると、サーバーが不正操作され、内部システムへの侵入や感染拡大、悪用に使われる恐れがあります。 - セキュリティの信頼低下
インジェクション攻撃を受けることで、顧客や取引先の信頼が失われ、企業ブランドに悪影響を及ぼすリスクも高まります。
インジェクション対策
- 入力バリデーションの徹底
ユーザー入力に対して、特定の文字列(例えば、シングルクオートやダブルクオート、セミコロンなど)を無効化し、許可された形式にのみ制限します。特殊文字のエスケープ処理も重要です。 - パラメータ化クエリの使用
SQLインジェクション対策として、SQLクエリにはパラメータ化クエリ(Prepared Statements)を使用することが推奨されます。これにより、ユーザー入力がSQL文に直接結合されることなく、安全にデータベースへの操作が行えます。 - エラーメッセージの制御
エラーの内容をユーザーに詳細表示しないようにし、エラーメッセージに情報漏洩が含まれないよう制御します。詳細なエラーメッセージは内部でのみ記録し、外部ユーザーには公開しない設計が推奨されます。 - 入力のエンコード
XSS対策として、ユーザーが入力したデータをHTMLに埋め込む際に適切にエンコード処理を行い、スクリプトコードの実行を防ぎます。 - Webアプリケーションファイアウォール(WAF)の導入
WAFを導入することで、インジェクション攻撃の特徴を持つリクエストをブロックすることができます。WAFは、インジェクションやXSSなど、Webアプリケーションに対する一般的な攻撃に対して、追加の防御層を提供します。 - 最小権限の原則
データベースやファイルシステムへのアクセス権限を最小限に抑え、インジェクション攻撃が発生しても被害を限定できるようにします。例えば、読み取り専用の権限を与えることで、データ改ざんを防ぎます。
まとめ
インジェクション(Injection)は、システムに予期しないコマンドやコードを注入することで、データベースやサーバーに不正アクセスする攻撃手法です。SQLインジェクションやOSコマンドインジェクション、コードインジェクションなど、さまざまな種類が存在し、情報漏洩やサーバー乗っ取り、データ改ざんなど重大なリスクを引き起こします。対策として、パラメータ化クエリの使用や入力バリデーション、WAFの導入などが重要で、これらの対策を組み合わせることで、インジェクション攻撃からシステムを守ることが可能です。