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?