インジェクション攻撃(インジェクションコウゲキ)とは | 意味や読み方など丁寧でわかりやすい用語解説

インジェクション攻撃(インジェクションコウゲキ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

インジェクションこうげき (インジェクションコウゲキ)

英語表記

Injection attack (インジェクションアタック)

用語解説

インジェクション攻撃とは、外部からの入力データを処理するアプリケーションに対し、攻撃者が不正な命令やコードを「注入(インジェクション)」することで、開発者が意図しない動作を引き起こさせるサイバー攻撃の総称である。この攻撃は、アプリケーションがユーザーからの入力値を適切に検証、あるいは無害化する処理を怠ったまま、データベースへの命令文やOSへのコマンドといった、システム内部で特別な意味を持つ文字列の一部として組み込んでしまうことに起因する。結果として、データベースに格納された機密情報の漏洩、データの改ざんや破壊、サーバーの乗っ取り、サービス停止といった深刻な被害につながる可能性がある。現代のWebアプリケーション開発において、最も警戒すべき脆弱性の一つとして認識されている。

インジェクション攻撃には、注入するコードの種類や攻撃対象によって様々なバリエーションが存在する。その中で最も代表的かつ古典的なものが「SQLインジェクション」である。これは、Webアプリケーションの背後で動作するデータベース管理システムを標的とする攻撃である。多くのWebアプリケーションでは、ユーザーがログインフォームに入力したIDやパスワードといった情報を基に、SQLと呼ばれるデータベース操作言語の命令文を動的に生成し、データベースに問い合わせて認証の可否を判断する。攻撃者はこの仕組みを悪用し、入力フォームにSQL文の構文を破壊したり、あるいは意図的に操作したりするような特殊な文字列を入力する。例えば、パスワード入力欄に ' OR 'A'='A というような文字列が入力された場合、もしアプリケーション側の対策が不十分だと、生成されるSQL文が改変され、パスワードが何であっても認証条件が真と評価されてしまう可能性がある。これにより、正規のユーザーになりすましてログインされたり、データベースに保存されている全ユーザーの個人情報が盗み出されたり、データが不正に書き換えられたりする危険性がある。

次に、サーバー自体に深刻な被害を及ぼす攻撃として「OSコマンドインジェクション」が挙げられる。これは、Webアプリケーションがその内部処理の一部として、OSのコマンドを実行する機能を持っている場合に発生する脆弱性を突く攻撃である。アプリケーションがユーザーからの入力値をファイル名などの引数としてOSコマンドに渡す際、攻撃者がセミコロン(;)やアンパサンド(&&)といった、複数のコマンドを連結させる特殊な文字と共に、悪意のあるOSコマンドを注入する。これにより、アプリケーションが本来実行するはずだったコマンドに続けて、攻撃者が注入した任意のコマンドがサーバー上で実行されてしまう。結果として、サーバー内のファイルを不正に閲覧・改ざん・削除されたり、悪意のあるプログラムをダウンロードおよび実行されたり、さらにはサーバー自体が乗っ取られて他のシステムへの攻撃の踏み台にされるなど、極めて甚大な被害につながる。

また、「クロスサイトスクリプティング(XSS)」も、広義のインジェクション攻撃の一種として分類されることがある。この攻撃は、SQLインジェクションやOSコマンドインジェクションがサーバー側を直接の標的とするのとは異なり、脆弱性のあるWebサイトを閲覧している一般ユーザーのWebブラウザを主な標的とする。攻撃者は、脆弱なWebサイトの掲示板やコメント欄などに、悪意のあるスクリプト(主にJavaScript)を埋め込んだ投稿を行う。その投稿を他のユーザーが閲覧すると、埋め込まれたスクリプトがそのユーザーのブラウザ上で実行されてしまう。結果として、ユーザーが利用中のサービスのセッション情報(Cookie)が盗まれてアカウントが乗っ取られたり、偽の入力フォームが表示されて個人情報を詐取されたり、表示されているWebページが改ざんされたりといった被害が発生する。

これらのインジェクション攻撃を防ぐための対策は、システムを安全に開発する上で極めて重要である。基本原則は「ユーザーからの入力はすべて信頼しない」という考え方に基づき、受け取ったデータをシステムが解釈する前に必ず無害化することである。SQLインジェクションに対する最も効果的かつ推奨される対策は、「プレースホルダ」あるいは「バインド機構」と呼ばれる仕組みを利用することである。これは、SQL文のテンプレートとなる「骨格」と、そこに埋め込む「値」を明確に分離してデータベースに渡す手法である。この方法を用いると、入力値は単なるデータとして扱われ、SQL文の構文として解釈されることがなくなるため、攻撃を根本的に防ぐことが可能となる。

プレースホルダが利用できない特殊な事情がある場合には、「エスケープ処理」が有効な対策となる。これは、入力値に含まれるシングルクォート(')やセミコロン(;)といった、プログラムにとって特別な意味を持つ文字を、単なる文字列として扱われるように別の無害な文字シーケンスに置き換える処理である。また、アプリケーションに渡される入力値が、そもそも想定されたデータ形式、文字種、長さに収まっているかを確認する「バリデーション」も基本的な対策として重要である。例えば、電話番号の入力欄に数字以外の文字が含まれていないかをチェックすることで、不正な文字列の注入を未然に防ぐことができる。特に、許可する文字やパターンを明示的に指定する「ホワイトリスト方式」によるバリデーションは、未知の攻撃パターンにも対応しやすいため、禁止するものを指定する「ブラックリスト方式」よりも安全性が高いとされる。これらの対策を多層的に実装することが、堅牢なシステムを構築する上で不可欠であり、インジェクション攻撃への深い理解と適切な対策の実装は、すべてのシステムエンジニアが習得すべき必須の知識と言える。

インジェクション攻撃(インジェクションコウゲキ)とは | 意味や読み方など丁寧でわかりやすい用語解説 | いっしー@Webエンジニア