Come posso disinfettare l'input LDAP e prevenire attacchi di iniezione? Quali scenari di iniezione LDAP sono possibili?

4

Nel seguente esempio C # sto interrogando il contenitore di configurazione di AD per le sostituzioni di Exchange. Se il nome del dominio in unsanitised l'utente finale potrebbe ottenere LDAP per leggere un oggetto diverso, quindi inteso.

Non sono sicuro che altre azioni diverse da leggere siano possibili.

    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;
    }

Domanda

  • Esistono esempi o strumenti che testano l'iniezione LDAP?

  • Qual è il modo corretto di disinfettare l'input per una query LDAP?

posta random65537 12.06.2012 - 17:56
fonte

2 risposte

4

Nel peggiore dei casi un utente malintenzionato può eseguire query di sua scelta nella directory LDAP. I risultati possono essere diversi ma sicuramente non vuoi che l'attaccante faccia questo.

Se si utilizza .NET framework, è possibile utilizzare la libreria AntiXSS . So che l'iniezione LDAP non è XSS, tuttavia XSS è anche una forma di iniezione e il modo corretto per prevenire questo tipo di vulnerabilità è di convalidare la data di input e codificarla correttamente prima di passarla a un interprete (browser, server SQL, server LDAP) . La libreria AntiXSS offre funzioni per codificare dati potenzialmente pericolosi prima di passarli a LDAP (LdapDistinguishedNameEncode, LdapFilterEncode). Puoi anche dare un'occhiata al progetto ESAPI di OWASP, in particolare in DefaultEncoder Funzione .encodeForLDAP.

    
risposta data 12.06.2012 - 19:14
fonte
1

Ecco alcuni dettagli in più.

ESAPI per Java ha due funzioni di codifica per la protezione dell'iniezione LDAP. link

    /**
     * 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 (ora la classe Encoder) ha funzioni simili con spiegazioni migliori. Questi includono Encoder.LdapFilterEncode (stringa), Encoder.LdapDistinguishedNameEncode (stringa) e Encoder.LdapDistinguishedNameEncode (string, bool, bool). link

Encoder.LdapFilterEncode codifica l'input secondo RFC4515 dove i valori non sicuri vengono convertiti in \ XX dove XX è la rappresentazione del carattere non sicuro.

Encoder.LdapDistinguishedNameEncode codifica l'input secondo RFC 2253 dove i caratteri non sicuri vengono convertiti in #XX dove XX è la rappresentazione del carattere non sicuro e la virgola, più, quota, barra, minore di e grande che i segni sono sfuggiti usando la notazione barra (\ X). Oltre a questo uno spazio o octothorpe (#) all'inizio della stringa di input è \ escaped come è uno spazio alla fine di una stringa.

LdapDistinguishedNameEncode (stringa, bool, bool) viene inoltre fornito in modo da poter disattivare le regole di escape dei caratteri iniziali o finali, ad esempio se si concatena il frammento di nome distinto di escape nel mezzo di un completo nome distinto.

    
risposta data 08.06.2014 - 04:13
fonte

Leggi altre domande sui tag