2016-09-14 1 views
0

ユーザーがLDAPフィルタに入力した文字列を使用する必要があるLDAP呼び出しを行っています。文字列から英数字以外の文字をすべて削除してデータを消毒しました。トリック/回避策HP Fortify LDAP注入の検索

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

しかし、HP FortifyはフラグIは、LDAPインジェクション攻撃を実行することができることなど何もLDAPのメタ文字が存在しないことを確認するために私のデューデリジェンスを行っているにもかかわらず、LDAPインジェクションの脆弱性などの交換。

HP Fortifyをトリックして、この対話にフラグを立てない方法を探しています。

文字列の入力が整数の場合、int(この場合はBigInteger)として解析して文字列に使用でき、HP Fortifyで無視されることがHP Fortifyの他の用途で気付きました鍛造ログをチェックするとき:

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

を私はすでにデータを検証してきたので、LDAPインジェクションの問題を無視するにHP Fortifyはをだますために、同様の方法があるかもしれないと私には思えます。私が試した

簡単な回避策は動作しませんでした:

  • が、その後、バイト配列に各文字を入れて文字列

  • に戻し、その後、char配列に文字列を変換するバック変換します文字列

に戻った後、オブジェクトに文字列とをキャストする文字列

  • へ3210

    私はFortify調査結果を隠したり、隠したりするつもりはありません。私は彼らがまったくフラグが立てられないように、要塞/回避策を強化したい。

    アイデア?

  • 答えて

    0

    私はそれを理解しました。これは、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); 
    } 
    
    +0

    これはFortifyのバグとよく似ていますが、結局のところまだ脆弱です。なぜ脆弱性を修正するだけではないのですか? – AviD