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

时间:2018-09-18 12:57:16

标签: java fortify

通过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注入错误。 在以下代码行中:

公共属性getUserLDAPNameFromAD(LDAPUserAttribute属性)抛出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;
}

任何人都不知道该如何解决?

1 个答案:

答案 0 :(得分: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);