方法使用未经验证的i / p调用动态生成的LDAP过滤器

问题描述 投票:0回答:1

我在扫描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;
}

任何人都知道如何解决这个问题?

java fortify
1个回答
0
投票

为了解决您在静态分析工具中遇到的错误,您应该使用参数化的LDAP过滤器,而不是像您一样进行字符串连接。字符串连接的风险是恶意用户可能会滥用LDAP过滤器语法,以便始终匹配或始终不匹配,这通常会对您的应用程序产生安全隐患。

看起来你正在使用Spring的EqualsFilter,它可以正确地逃避字符串。但静态分析工具并没有承认它。

要使用参数化LDAP过滤器,您可以执行以下操作(as described in the JNDI tutorial):

ctx.search(base,
    "(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
    new Object[] { accountName },
    ctls);
© www.soinside.com 2019 - 2024. All rights reserved.