¿Cómo desinfecto la entrada LDAP y prevengo los ataques de inyección? ¿Qué escenarios de inyección de LDAP son posibles?

4

En el siguiente ejemplo de C #, estoy consultando el contenedor de configuración de AD para anulaciones de Exchange. Si el nombre de dominio no está saneado, el usuario final podría hacer que LDAP lea un objeto diferente del que estaba destinado.

No estoy seguro de que sean posibles otras acciones distintas a la lectura.

    static string GetExchangeDomain(string targetDomain)
    {
        string retFoundDomain = "";

        string remoteDomainLocation = "CN=Microsoft Exchange,CN=Services,";
        string filter = string.Format("(domainName={0})", targetDomain);

        string[] props = new string[] { "targetAddress", "description" };

        using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"))
        {
            string serverName = rootDSE.Properties["dnsHostName"].Value as string;
            string domainContext = rootDSE.Properties["configurationNamingContext"].Value as string;

            using (DirectoryEntry exchOrgDE = new DirectoryEntry("LDAP://" + serverName + "/" + remoteDomainLocation + domainContext))
            {
                foreach (DirectoryEntry item in exchOrgDE.Children)
                {
                    string orgName = item.Name;

                    if (item.Properties["objectCategory"][0].ToString().StartsWith("CN=ms-Exch-Organization-Container"))
                    {
                        using (DirectoryEntry exchangeRemoteDomains = new DirectoryEntry("LDAP://" + serverName + "/CN=Internet Message Formats,CN=Global Settings," + orgName + "," + remoteDomainLocation + domainContext))
                        {
                            using (DirectorySearcher searcher = new DirectorySearcher(exchangeRemoteDomains, filter, new string[] { "cn", "domainName" }))
                            {
                                searcher.ReferralChasing = ReferralChasingOption.All;
                                SearchResult result = searcher.FindOne();

                                if (result != null)
                                {
                                    retFoundDomain = result.Properties["cn"][0].ToString().TrimEnd(("." + targetDomain).ToCharArray());
                                }
                            }
                        }
                    }
                    item.Dispose(); // not sure if this is required...
                }
            }
        }

        return retFoundDomain;
    }

Pregunta

  • ¿Hay ejemplos o herramientas que prueben la inyección de LDAP?

  • ¿Cuál es la forma correcta de limpiar la entrada de una consulta LDAP?

pregunta random65537 12.06.2012 - 17:56
fuente

2 respuestas

4

En el peor de los casos, un atacante puede ejecutar una consulta de su elección en el directorio LDAP. Los resultados pueden diferir, pero definitivamente no quieres que el atacante haga esto.

Si está utilizando .NET Framework, puede usar la biblioteca AntiXSS . Sé que la inyección LDAP no es XSS, sin embargo, XSS también es una forma de inyección y la forma correcta de prevenir este tipo de vulnerabilidades es validar la fecha de entrada y codificarla correctamente antes de pasarla a un intérprete (navegador, servidor SQL, servidor LDAP) . La biblioteca AntiXSS ofrece funciones destinadas a codificar datos potencialmente peligrosos antes de pasarlos a LDAP (LdapDistinguishedNameEncode, LdapFilterEncode). También puede echar un vistazo al proyecto OWASP ESAPI, especialmente a DefaultEncoder .encodeForLDAP function.

    
respondido por el pgolen 12.06.2012 - 19:14
fuente
1

Aquí hay un poco más de detalle.

ESAPI para Java tiene dos funciones de codificación para la protección de inyección LDAP. enlace

    /**
     * Encode data for use in LDAP queries.
     *
     * @param input the text to encode for LDAP
     *
     * @return input encoded for use in LDAP
     */
    String encodeForLDAP(String input);

    /**
     * Encode data for use in an LDAP distinguished name.
     *
     *  @param input the text to encode for an LDAP distinguished name
     *
     *  @return input encoded for use in an LDAP distinguished name
     */
    String encodeForDN(String input);

.NET AntiXSS (ahora la clase Codificador) tiene funciones similares con mejores explicaciones. Estos incluyen Encoder.LdapFilterEncode (string), Encoder.LdapDistinguishedNameEncode (string) y Encoder.LdapDistinguishedNameEncode (string, bool, bool). enlace

Encoder.LdapFilterEncode codifica la entrada de acuerdo con RFC4515 donde los valores no seguros se convierten a \ XX, donde XX es la representación del carácter no seguro.

Encoder.LdapDistinguishedNameEncode codifica la entrada de acuerdo con RFC 2253 donde los caracteres no seguros se convierten a #XX, donde XX es la representación del carácter no seguro y la coma, más, comillas, barras, menos y más los signos se escapan utilizando la notación de barra (\ X). Además de esto, un espacio u octotorpe (#) al principio de la cadena de entrada es \ escape como es un espacio al final de una cadena.

LdapDistinguishedNameEncode (string, bool, bool) también se proporciona para que pueda desactivar las reglas de escape de caracteres iniciales o finales, por ejemplo, si está concatenando el fragmento de nombre distinguido escapado en medio de un nombre distinguido completo.

    
respondido por el Manicode 08.06.2014 - 04:13
fuente

Lea otras preguntas en las etiquetas