2016-09-14 63 views
0

我正在進行LDAP調用,在該調用中,我需要使用由用戶輸入到LDAP過濾器中的字符串。我通過從字符串中刪除所有非字母數字字符來清理數據。Trick /解決方法HP Fortify 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

  • 將每個字符轉換爲字節數組,然後轉換回一個String

  • 鑄造的String Object,然後回字符串

我並不想隱藏或壓制Fortify的發現。我想欺騙/解決方法Fortify,以便他們根本沒有被標記。

任何想法?

回答

0

我想通了。這可以通過將字符串轉換爲代碼點的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); 
} 
+0

這聽起來更像是一個Fortify中的錯誤,畢竟你還是脆弱的。爲什麼不修復漏洞? – AviD