Expression Language注入は、ウェブページ内に動的コンテンツを埋め込むためのスクリプト言語であるExpression Language(EL)を利用するウェブアプリケーションを標的とするサイバー攻撃です。ELインタープリタの脆弱性を突くことで、攻撃者は任意のコマンドを実行したり、機密データに不正アクセスしたりするための悪意あるコードを注入することができます。
識別: 攻撃者はまず、動的ウェブコンテンツを生成するためにExpression Languageに依存しているウェブアプリケーションを特定します。
コード注入: 標的とするウェブアプリケーションの入力フィールドやパラメータに悪意あるコードを注入します。これは、ユーザー入力フォーム、HTTPリクエストパラメータ、クッキーなど、さまざまな手段で行うことができます。
悪用: 注入されたコードは、システム変数、ファイルアクセスコマンド、その他のシステムレベルの操作を参照する指令や式を含む場合があります。ウェブサーバーが注入されたExpression Languageを処理するときに、攻撃者のコマンドを実行することになるようにコードを解釈し評価します。
不正アクセス: 注入されたコードの性質に応じて、攻撃者は機密データに不正アクセスしたり、アプリケーションの動作を変更したり、さらにはシステム全体を侵害したりすることがあります。
Expression Language注入攻撃のリスクを軽減するため、次の予防策の実施を検討してください:
入力検証: 厳格な入力検証とサニタイゼーション技術をユーザー入力に適用します。これにより、任意のコマンドの実行を防ぎ、アプリケーションが有効で予期される入力のみを処理するようにします。
セキュアな構成: システムリソースへのアクセス制限など、安全対策を強制するためにウェブアプリケーションサーバーを構成します。これにより、攻撃の範囲が制限され、機密ファイルや機能への不正アクセスを防ぐことができます。
最小特権の原則: ウェブアプリケーションに対して必要なリソースにのみ権限とアクセス権を付与する最小特権の原則に従います。アプリケーションに付与する特権を最小限に抑えることで、攻撃が成功した場合の影響を大幅に軽減できます。
java
${'Operating System: ' + java.lang.System.getProperty('os.name') }
この例では、攻撃者がjava.lang.System.getProperty
関数を使用してオペレーティングシステム名を取得する式を注入しています。この注入を実行することで、攻撃者は機密のシステム情報を収集することができます。
java
${ T(java.lang.Runtime).getRuntime().exec('cat /etc/passwd') }
この例は、Unix系システムのパスワードファイルの内容を表示するcat /etc/passwd
コマンドを実行しようとするコード注入を示しています。成功すれば、攻撃者はファイルに格納されている機密のユーザー情報にアクセスすることができます。
注意: ここで提供される予防策と例は、Expression Language注入の理解を深めるための一般的なガイドラインです。これらの手段だけでは、この攻撃のすべてのバリエーションからの保護を保証できない場合があります。定期的なセキュリティテスト、監視、および最新のセキュリティプラクティスの情報に精通することが、ウェブアプリケーションのセキュリティを維持するために重要です。