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?