Rules / C#
SHIELD-CSHARP-017
LDAP injection via DirectorySearcher filter
What it detects
A DirectorySearcher filter is built by concatenating untrusted input into the LDAP query.
How to fix
Escape LDAP special characters in user input before building the search filter.
Vulnerable — Shield flags thisUserDirectorySearch.cs
using System.DirectoryServices;
public class UserDirectorySearch
{
public SearchResult FindUser(string userName)
{
var searcher = new DirectorySearcher();
searcher.Filter = $"(&(objectClass=user)(uid={userName}))"; // LDAP injection
return searcher.FindOne();
}
}
Fixed — scans cleanUserDirectorySearch.cs
using System.DirectoryServices;
public class UserDirectorySearch
{
public SearchResult FindUser(string userName)
{
string safe = userName.Replace(@"\", @"\5c").Replace("*", @"\2a")
.Replace("(", @"\28").Replace(")", @"\29");
var searcher = new DirectorySearcher();
searcher.Filter = string.Format("(&(objectClass=user)(uid={0}))", safe);
return searcher.FindOne();
}
}
Both snippets are verified against the shipped scanner: the vulnerable one triggers SHIELD-CSHARP-017, the fixed one does not.