【问题标题】:Trick/Workaround HP Fortify LDAP Injection Finding技巧/解决方法 HP Fortify LDAP 注入发现
【发布时间】:2017-01-22 10:54:47
【问题描述】:

我正在进行一个 LDAP 调用,其中我需要使用用户输入到 LDAP 过滤器中的字符串。我已通过从字符串中删除所有非字母数字字符来清理数据。

public static String alphanumericOnly(String input) {
    return input == null ? "" : input.replaceAll("\\W|_", "");
}

但是,HP Fortify 将交换标记为 LDAP 注入漏洞,尽管我已尽职尽责确保不存在可以执行 LDAP 注入攻击的 LDAP 元字符。

我正在寻找一种方法来欺骗 HP Fortify,使其不会标记此交互。

我注意到在 HP Fortify 的其他用途中,如果我的字符串输入是整数,我可以将其解析为 int(在本例中为 BigInteger),然后我可以在字符串中使用它,HP Fortify 将忽略它检查日志伪造:

BigInteger id = new BigInteger(ValueChecker.numericOnly(request.getID()));
logger.info(id + " - Request Received.");

在我看来,可能有类似的方法可以诱使 HP Fortify 忽略 LDAP 注入问题,因为我已经验证了数据。

我尝试的简单解决方法无效:

  • 将 String 转换为 char 数组,然后再转换回 String

  • 将每个字符放入字节数组,然后转换回字符串

  • 将字符串转换为对象,然后再转换回字符串

我不想隐藏或压制 Fortify 的发现。我想欺骗/解决 Fortify 以便它们根本不会被标记。

有什么想法吗?

【问题讨论】:

标签: java ldap code-injection fortify


【解决方案1】:

我想通了。这可以通过将 String 转换为代码点的 int 数组然后将其转换回来来完成。这提供了足够的间接性来欺骗 Fortify,并且问题不会被标记。

public static String scrub(String input) {

    // remove all non-alphanumeric characters
    String sanitized = alphanumericOnly(input);

    // trick Fortify by storing chars
    // as codepoints in an int array
    int[] codepoints = new int[sanitized.length()];

    for(int i = 0; i < sanitized.length(); ++i) {
        codepoints[i] = sanitized.codePointAt(i);
    }

    return new String(codepoints, 0, codepoints.length);
}

【讨论】:

  • 这听起来更像是 Fortify 中的一个错误,毕竟您仍然容易受到攻击。为什么不直接修复漏洞?
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多