Command Injection
Command Injection(コマンドインジェクション)は、OWASP TOP 10 の1位であるインジェクションの一種であり、
脆弱なアプリケーションを通じてホストOS上でシステムコマンドを実行することを目的とした攻撃です。
system()
や exec()
のようなOSシステムコマンドを実行する関数において、ユーザー入力値のフィルタリングが適切に行われない場合、
攻撃者はこの脆弱性を悪用してシステムコマンドを呼び出すことが可能になります。
特に、アプリケーションがフォーム、クッキー、HTTPヘッダーなどの安全でないユーザーデータをシステムシェルに渡す際に
Command Injection攻撃が発生する可能性があります。
Command Injectionによって以下のような被害が生じる可能性があります:
- 内部データの窃取および破損
- システムアカウント情報の漏洩
- バックドアの設置
- 管理者権限の奪取
結果として、サーバー全体が攻撃者に制御される危険な状況が発生します。[1][2]
DVWAを利用したCommand Injectionの模擬ハッキング
上の画面は、特定のIPアドレスに対してPingテストを行うアプリケーションの例です。
8.8.8.8
を入力すると正常にPingの結果が表示されます。
シェルコマンドを利用した脆弱性の悪用
8.8.8.8 | ls
を入力した結果、ls
コマンドが実行されていることを確認できます。
これはLinuxシェルコマンドのパイプライン(|
)を利用してコマンドを接続し、OSコマンドを実行した例です。
サーバーの機密情報へのアクセス
上記のようにCommand Injectionを通じて /etc/passwd
ファイルにアクセスできることが分かります。[3]
Command Injectionの防止方法
Command Injectionを防ぐためには以下の対策が必要です:
-
入力値の検証およびパラメータ化
ユーザー入力値にOSコマンドを実行できる文字が含まれているかを適切にフィルタリングし、ブロックします。 -
PHPの組み込み関数を使用
escapeshellarg()
やescapeshellcmd()
のような関数を使用してコマンドインジェクションを防止します。 -
ホワイトリストの設定
OSコマンドの使用が避けられない場合、許可されたコマンドのリスト(ホワイトリスト)を作成し、指定されたコマンドのみ実行できるように制限します。
PLURAによる検出事例
PLURAのML検出機能によりCommand Injection攻撃を自動検出した結果です。