我在扫描Fortify工具时遇到了以下严重风险。
方法getUserLDAPNameFromAD()使用未经验证的输入调用动态生成的LDAP过滤器,这可能允许攻击者修改语句的含义。
在课堂上:ConsoleService
public class ConsoleService implements IConsoleService {
public char[] readPassword() throws IOError {
return System.console().readPassword();
}
and
public final class ConsoleUtils {
public static final String TERMINATION_CHARACTER = ".";
private static Scanner in = new Scanner(System.in);
在LDAPservice.java类中使用我收到LDAP注入错误。在下面的代码行中:
public Attribute getUserLDAPNameFromAD(LDAPUserAttribute attribute)throws NamingException {
String accountName = attribute.constructName(Constants.DOT, true);
EqualsFilter equalsFilter = new EqualsFilter("sAMAccountName", accountName);
String FILTER = "(&(objectClass=user)(objectCategory=person)(" + equalsFilter.toString() + "))";
SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> answer = ctx.search(base, FILTER, ctls);
if (answer.hasMore()) {
SearchResult result = answer.next();
return result.getAttributes().get("distinguishedName");
}
return null;
}
任何人都知道如何解决这个问题?
为了解决您在静态分析工具中遇到的错误,您应该使用参数化的LDAP过滤器,而不是像您一样进行字符串连接。字符串连接的风险是恶意用户可能会滥用LDAP过滤器语法,以便始终匹配或始终不匹配,这通常会对您的应用程序产生安全隐患。
看起来你正在使用Spring的EqualsFilter,它可以正确地逃避字符串。但静态分析工具并没有承认它。
要使用参数化LDAP过滤器,您可以执行以下操作(as described in the JNDI tutorial):
ctx.search(base,
"(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
new Object[] { accountName },
ctls);