コンピュータセキュリティにおいて、LDAPインジェクションとは、Webアプリケーションを悪用して機密性の高いユーザー情報を漏洩させたり、LDAP(Lightweight Directory Access Protocol)データストアに格納されている情報を改ざんしたりするコードインジェクション手法です。 [ 1 ] [ 2 ] [ 3 ] LDAPインジェクションは、内部の検索、追加、または変更機能に渡される入力パラメータを操作することで、アプリケーションのセキュリティ脆弱性を悪用します。アプリケーションがユーザー入力を適切にサニタイズできない場合、攻撃者がLDAPステートメントを改ざんする可能性があります。
LDAPインジェクションは、ユーザー入力が適切にサニタイズされず、動的に生成されたLDAPフィルタの一部として使用される場合に発生します。その結果、LDAPサーバー上で実行されるLDAPステートメントが操作され、認証情報の表示、変更、またはバイパスが行われる可能性があります。[ 1 ]
LDAPインジェクションは既知の攻撃であり、簡単な対策で防ぐことができます。クライアントからの入力はすべて、悪意のある動作を引き起こす可能性のある文字を検査/サニタイズする必要があります。入力検証では、LDAPクエリ言語に含まれる特殊文字、既知のデータ型、有効な値などの有無をチェックすることで入力を検証する必要があります。[ 2 ]ホワイトリストによる入力検証は、LDAPクエリに渡される前に不正な入力を検出するためにも使用できます。
このセクションは、ほとんどの読者にとって技術的すぎるため、理解しにくい可能性があります。(2024年9月) |
以下の例では、ログインの目的でユーザーの資格情報を検証するためのクエリが作成されます。
String filter = "(&(USER = " + user_name + ") (PASSWORD = " + user_password + "))";
典型的なユースケースでは、ユーザーはユーザー認証情報を提供し、このフィルタはこれらの認証情報を検証するために使用されます。しかし、攻撃者は変数 にuser_nameなどの細工された入力値を入力しjohnDoe)(&)、パスワードには任意の値を入力できます。その結果、クエリは になります(&(USER = johnDoe)(&))(PASSWORD = pass))。このクエリの最初の部分のみがLDAPサーバー によって処理され(&(USER = johnDoe)(&)、常に true と評価されるため、攻撃者は有効なユーザー認証情報を提供することなくシステムにアクセスできるようになります。