私たちのソフトウェアは、ユーザー入力からユーザー名を取得し、次のように LDAP リクエストに入れます。
(& () (sAMAccountName=userinput))
私には非常に怪しいように見えますが、これまでのところ、不足している衛生状態を悪用してそれを破ることはできませんでした. 特殊文字を試すとすぐに、常に「等号がありません」と表示されます。com.sun.jndi.ldap.Filter.encodeFilter がそれを処理しているのでしょうか?
私たちのソフトウェアは、ユーザー入力からユーザー名を取得し、次のように LDAP リクエストに入れます。
(& () (sAMAccountName=userinput))
私には非常に怪しいように見えますが、これまでのところ、不足している衛生状態を悪用してそれを破ることはできませんでした. 特殊文字を試すとすぐに、常に「等号がありません」と表示されます。com.sun.jndi.ldap.Filter.encodeFilter がそれを処理しているのでしょうか?
LDAP インジェクションで注意すべきことの 1 つは、ユーザー入力の末尾にあるワイルドカード文字 ('*') です。これは検索クエリに対して完全に有効な文字ですが、一意のユーザー名が必要な場合は、フィルターを作成して渡す前に、これを確実にサニタイズする必要があります。これには通常、正規表現が使用されます。
Java のFilter
クラスのコードは次の場所にあります。
http://www.docjar.com/html/api/com/sun/jndi/ldap/Filter.java.html
関数がMissing 'equals'例外encodeSimpleFilter
をスローするように見えます。
AD に渡される最終的な LDAP フィルターを確認したい場合は、暗号化されていない接続に WireShark を簡単に使用するか、この serverfault スレッドからの情報を使用してクエリを表示できます。