通过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;
}
任何人都不知道该如何解决?
答案 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);