Example usage for java.util.regex Pattern toString

List of usage examples for java.util.regex Pattern toString

Introduction

In this page you can find the example usage for java.util.regex Pattern toString.

Prototype

public String toString() 

Source Link

Document

Returns the string representation of this pattern.

Usage

From source file:org.zaproxy.zap.extension.ascanrules.TestSQLInjection.java

private boolean checkSpecificErrors(RDBMS rdbms, HttpMessage msg1, String parameter, String attack) {
    if (rdbms.isGeneric()) {
        return false;
    }/*from  w  w w  . ja  v  a  2  s . c  om*/

    for (Pattern errorPattern : rdbms.getErrorPatterns()) {
        if (isStop()) {
            return false;
        }

        // if the "error message" occurs in the result of sending the modified query, but did
        // NOT occur in the original result of the original query
        // then we may may have a SQL Injection vulnerability
        StringBuilder sb = new StringBuilder();
        if (!matchBodyPattern(getBaseMsg(), errorPattern, null) && matchBodyPattern(msg1, errorPattern, sb)) {
            // Likely a SQL Injection. Raise it
            String extraInfo = Constant.messages.getString(MESSAGE_PREFIX + "alert.errorbased.extrainfo",
                    rdbms.getName(), errorPattern.toString());
            bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName() + " - " + rdbms.getName(),
                    getDescription(), null, parameter, attack, extraInfo, getSolution(), sb.toString(), msg1);

            // log it, as the RDBMS may be useful to know later (in subsequent checks, when we
            // need to determine RDBMS specific behaviour, for instance)
            getKb().add(getBaseMsg().getRequestHeader().getURI(), "sql/" + rdbms.getName(), Boolean.TRUE);

            return true;
        }
    }

    return false;
}

From source file:org.zaproxy.zap.extension.ascanrulesAlpha.LDAPInjection.java

/**
 * @param attackMessage the message used to send the LDAP attack
 * @param placeboMessage the message used to send the placebo attack
 * @param parameterName the name of the parameter which was attacked
 * @return//w  w w  .j a va  2 s.  c o m
 * @throws Exception
 */
private boolean checkResultsForLDAPAlert(HttpMessage attackMessage, HttpMessage placeboMessage,
        String parameterName) throws Exception {
    // compare the request response with each of the known error messages,
    // for each of the known LDAP implementations.
    // in order to minimise false positives, only consider a match
    // for the error message in the response if the string also
    // did NOT occur in the original (unmodified) response
    for (Pattern errorPattern : LDAP_ERRORS.keySet()) {

        // if the pattern was found in the new response,
        // but not in the original response (for the unmodified request)
        // then we have a match.. LDAP injection!
        if (responseMatches(attackMessage, errorPattern) && !responseMatches(getBaseMsg(), errorPattern)
                && !responseMatches(placeboMessage, errorPattern)) {

            // the response of the attack matches one of the known LDAP errors, but the placebo
            // does not trigger the same effect.
            // so raise the error, and move on to the next parameter

            String extraInfo = Constant.messages.getString(I18N_PREFIX + "ldapinjection.alert.extrainfo",
                    parameterName, getBaseMsg().getRequestHeader().getMethod(),
                    getBaseMsg().getRequestHeader().getURI().getURI(), errorAttack,
                    LDAP_ERRORS.get(errorPattern), errorPattern);

            String attack = Constant.messages.getString(I18N_PREFIX + "ldapinjection.alert.attack",
                    parameterName, errorAttack);
            String vulnname = Constant.messages.getString(I18N_PREFIX + "ldapinjection.name");
            String vulndesc = Constant.messages.getString(I18N_PREFIX + "ldapinjection.desc");
            String vulnsoln = Constant.messages.getString(I18N_PREFIX + "ldapinjection.soln");

            // we know the LDAP implementation, so put it in the title, where it will be
            // obvious.
            bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, vulnname + " - " + LDAP_ERRORS.get(errorPattern),
                    vulndesc, getBaseMsg().getRequestHeader().getURI().getURI(), parameterName, attack,
                    extraInfo, vulnsoln, errorPattern.toString(), attackMessage); // use the attack message, rather than the original message.

            if (log.isDebugEnabled()) {
                String logMessage = MessageFormat.format(
                        "A likely LDAP injection vulnerability has been found with [{0}] URL [{1}] "
                                + "on parameter [{2}], using an attack with LDAP meta-characters [{3}], "
                                + "yielding known [{4}] error message [{5}], which was not present in the original response.",
                        getBaseMsg().getRequestHeader().getMethod(),
                        getBaseMsg().getRequestHeader().getURI().getURI(), parameterName, errorAttack,
                        LDAP_ERRORS.get(errorPattern), errorPattern);
                log.debug(logMessage);
            }

            return true; // threw an alert
        }
    } // for each error message for the given LDAP implemention

    return false; // did not throw an alert
}

From source file:net.bashtech.geobot.Channel.java

public boolean isOffensive(String word) {
    for (Pattern reg : offensiveWordsRegex) {
        Matcher match = reg.matcher(word.toLowerCase());
        if (match.find()) {
            System.out.println("Matched: " + reg.toString());
            return true;
        }//from  ww w  .j  a v  a  2  s  .co m
    }

    int severity = ((Long) config.get("banPhraseSeverity")).intValue();
    if (BotManager.getInstance().banPhraseLists.containsKey(severity)) {
        for (Pattern reg : BotManager.getInstance().banPhraseLists.get(severity)) {
            Matcher match = reg.matcher(word.toLowerCase());
            if (match.find()) {
                System.out.println("Matched: " + reg.toString());
                return true;
            }
        }
    }

    return false;
}

From source file:org.zaproxy.zap.extension.ascanrules.TestSQLInjection.java

private boolean checkUnionErrors(RDBMS rdbms, HttpMessage msg, String response, URI uri, String parameter,
        String originalParam, String attack) {
    for (Pattern errorPattern : rdbms.getUnionErrorPatterns()) {
        if (isStop()) {
            return false;
        }/*from  w ww  . j  a  va  2s. c  o m*/

        // if the "error message" occurs in the result of sending the modified query, but did
        // NOT occur in the original result of the original query
        // then we may may have a SQL Injection vulnerability
        String sqlUnionBodyUnstripped = msg.getResponseBody().toString();
        String sqlUnionBodyStripped = stripOffOriginalAndAttackParam(sqlUnionBodyUnstripped, originalParam,
                attack);

        Matcher matcherOrig = errorPattern.matcher(response);
        Matcher matcherSQLUnion = errorPattern.matcher(sqlUnionBodyStripped);
        boolean patternInOrig = matcherOrig.find();
        boolean patternInSQLUnion = matcherSQLUnion.find();

        // if (! matchBodyPattern(getBaseMsg(), errorPattern, null) && matchBodyPattern(msg,
        // errorPattern, sb)) {
        if (!patternInOrig && patternInSQLUnion) {
            // Likely a UNION Based SQL Injection (by error message). Raise it
            String extraInfo = Constant.messages.getString(MESSAGE_PREFIX + "alert.unionbased.extrainfo",
                    rdbms.getName(), errorPattern.toString());
            bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName() + " - " + rdbms.getName(),
                    getDescription(), uri.getEscapedURI(), parameter, attack, extraInfo, getSolution(),
                    matcherSQLUnion.group(), msg);

            // log it, as the RDBMS may be useful to know later (in subsequent checks, when we
            // need to determine RDBMS specific behaviour, for instance)
            getKb().add(uri, "sql/" + rdbms.getName(), Boolean.TRUE);
            return true;
        }
    }

    return false;
}

From source file:org.zaproxy.zap.extension.ascanrules.TestSQLInjection.java

/** scans for SQL Injection vulnerabilities */
@Override//www.  j a  va 2 s .com
public void scan(HttpMessage msg, String param, String origParamValue) {
    // Note: the "value" we are passed here is escaped. we need to unescape it before handling
    // it.
    // as soon as we find a single SQL injection on the url, skip out. Do not look for SQL
    // injection on a subsequent parameter on the same URL
    // for performance reasons.
    // reinitialise each parameter.
    sqlInjectionFoundForUrl = false;
    sqlInjectionAttack = null;
    refreshedmessage = null;
    mResBodyNormalUnstripped = null;
    mResBodyNormalStripped = null;

    try {
        // reinitialise the count for each type of request, for each parameter.  We will be
        // sticking to limits defined in the attach strength logic
        countErrorBasedRequests = 0;
        countExpressionBasedRequests = 0;
        countBooleanBasedRequests = 0;
        countUnionBasedRequests = 0;
        countOrderByBasedRequests = 0;

        // Check 1: Check for Error Based SQL Injection (actual error messages).
        // for each SQL metacharacter combination to try
        for (int sqlErrorStringIndex = 0; sqlErrorStringIndex < SQL_CHECK_ERR.length && !sqlInjectionFoundForUrl
                && doSpecificErrorBased
                && countErrorBasedRequests < doErrorMaxRequests; sqlErrorStringIndex++) {

            // work through the attack using each of the following strings as a prefix: the
            // empty string, and the original value
            // Note: this doubles the amount of work done by the scanner, but is necessary in
            // some cases
            String[] prefixStrings;
            if (origParamValue != null) {
                // ZAP: Removed getURLDecode()
                prefixStrings = new String[] { "", origParamValue };
            } else {
                prefixStrings = new String[] { "" };
            }
            for (int prefixIndex = 0; prefixIndex < prefixStrings.length
                    && !sqlInjectionFoundForUrl; prefixIndex++) {

                // new message for each value we attack with
                HttpMessage msg1 = getNewMsg();
                String sqlErrValue = prefixStrings[prefixIndex] + SQL_CHECK_ERR[sqlErrorStringIndex];
                setParameter(msg1, param, sqlErrValue);

                // System.out.println("Attacking [" + msg + "], parameter [" + param + "] with
                // value ["+ sqlErrValue + "]");

                // send the message with the modified parameters
                try {
                    sendAndReceive(msg1, false); // do not follow redirects
                } catch (SocketException ex) {
                    if (log.isDebugEnabled())
                        log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                + " when accessing: " + msg1.getRequestHeader().getURI().toString());
                    continue; // Something went wrong, continue to the next prefixString in the
                    // loop
                }
                countErrorBasedRequests++;

                // now check the results against each pattern in turn, to try to identify a
                // database, or even better: a specific database.
                // Note: do NOT check the HTTP error code just yet, as the result could come
                // back with one of various codes.
                for (RDBMS rdbms : RDBMS.values()) {
                    if (getTechSet().includes(rdbms.getTech())
                            && checkSpecificErrors(rdbms, msg1, param, sqlErrValue)) {
                        sqlInjectionFoundForUrl = true;
                        // Save the attack string for the "Authentication Bypass" alert, if
                        // necessary
                        sqlInjectionAttack = sqlErrValue;
                        break;
                    }
                    // bale out if we were asked nicely
                    if (isStop()) {
                        log.debug("Stopping the scan due to a user request");
                        return;
                    }
                } // end of the loop to check for RDBMS specific error messages

                if (this.doGenericErrorBased && !sqlInjectionFoundForUrl) {
                    Iterator<Pattern> errorPatternIterator = RDBMS.GenericRDBMS.getErrorPatterns().iterator();

                    while (errorPatternIterator.hasNext() && !sqlInjectionFoundForUrl) {
                        Pattern errorPattern = errorPatternIterator.next();
                        String errorPatternRDBMS = RDBMS.GenericRDBMS.getName();

                        // if the "error message" occurs in the result of sending the modified
                        // query, but did NOT occur in the original result of the original query
                        // then we may may have a SQL Injection vulnerability
                        StringBuilder sb = new StringBuilder();
                        if (!matchBodyPattern(getBaseMsg(), errorPattern, null)
                                && matchBodyPattern(msg1, errorPattern, sb)) {
                            // Likely a SQL Injection. Raise it
                            String extraInfo = Constant.messages.getString(
                                    MESSAGE_PREFIX + "alert.errorbased.extrainfo", errorPatternRDBMS,
                                    errorPattern.toString());
                            // raise the alert, and save the attack string for the
                            // "Authentication Bypass" alert, if necessary
                            sqlInjectionAttack = sqlErrValue;
                            bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM,
                                    getName() + " - " + errorPatternRDBMS, getDescription(), null, param,
                                    sqlInjectionAttack, extraInfo, getSolution(), sb.toString(), msg1);

                            // log it, as the RDBMS may be useful to know later (in subsequent
                            // checks, when we need to determine RDBMS specific behaviour, for
                            // instance)
                            getKb().add(getBaseMsg().getRequestHeader().getURI(), "sql/" + errorPatternRDBMS,
                                    Boolean.TRUE);

                            sqlInjectionFoundForUrl = true;
                            continue;
                        }
                        // bale out if we were asked nicely
                        if (isStop()) {
                            log.debug("Stopping the scan due to a user request");
                            return;
                        }
                    } // end of the loop to check for RDBMS specific error messages
                }
            } // for each of the SQL_CHECK_ERR values (SQL metacharacters)
        }

        // ###############################
        // Check 4
        // New!  I haven't seen this technique documented anywhere else, but it's dead simple.
        // Let me explain.
        // See if the parameter value can simply be changed to one that *evaluates* to be the
        // same value,
        // if evaluated on a database
        // the simple check is to see if parameter "1" gives the same results as for param
        // "2-1", and different results for param "2-2"
        // for now, we try this for integer values only.
        // ###############################
        // Since the previous checks are attempting SQL injection, and may have actually
        // succeeded in modifying the database (ask me how I know?!)
        // then we cannot rely on the database contents being the same as when the original
        // query was last run (could be hours ago)
        // so to work around this, simply re-run the query again now at this point.
        // Note that we are not counting this request in our max number of requests to be issued
        refreshedmessage = getNewMsg();
        try {
            sendAndReceive(refreshedmessage, false); // do not follow redirects
        } catch (SocketException ex) {
            if (log.isDebugEnabled())
                log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                        + refreshedmessage.getRequestHeader().getURI().toString());
            return; // Something went wrong, no point continuing
        }

        // String mResBodyNormal = getBaseMsg().getResponseBody().toString();
        mResBodyNormalUnstripped = refreshedmessage.getResponseBody().toString();
        mResBodyNormalStripped = this.stripOff(mResBodyNormalUnstripped, origParamValue);

        if (!sqlInjectionFoundForUrl && doExpressionBased
                && countExpressionBasedRequests < doExpressionMaxRequests) {

            // first figure out the type of the parameter..
            try {
                // is it an integer type?
                // ZAP: removed URLDecoding because on Variants
                // int paramAsInt =
                // Integer.parseInt(TestSQLInjection.getURLDecode(origParamValue));
                int paramAsInt = Integer.parseInt(origParamValue);

                if (this.debugEnabled) {
                    log.debug("The parameter value [" + origParamValue + "] is of type Integer");
                }
                // This check is implemented using two variant PLUS(+) and MULT(*)
                try {
                    // PLUS variant check the param value "3-2" gives same result as original
                    // request and param value "4-2" gives different result if original param
                    // value is 1
                    // set the parameter value to a string value like "3-2", if the original
                    // parameter value was "1"
                    int paramPlusTwo = addWithOverflowCheck(paramAsInt, 2);
                    String modifiedParamValueForAdd = String.valueOf(paramPlusTwo) + "-2";
                    // set the parameter value to a string value like "4-2", if the original
                    // parameter value was "1"
                    int paramPlusThree = addWithOverflowCheck(paramAsInt, 3);
                    String modifiedParamValueConfirmForAdd = String.valueOf(paramPlusThree) + "-2";
                    // Do the attack for ADD variant
                    expressionBasedAttack(param, origParamValue, modifiedParamValueForAdd,
                            modifiedParamValueConfirmForAdd);
                    // bale out if we were asked nicely
                    if (isStop()) {
                        log.debug("Stopping the scan due to a user request");
                        return;
                    }
                    // MULT variant check the param value "2/2" gives same result as original
                    // request and param value "4/2" gives different result if original param
                    // value is 1
                    if (!sqlInjectionFoundForUrl && countExpressionBasedRequests < doExpressionMaxRequests) {
                        // set the parameter value to a string value like "2/2", if the original
                        // parameter value was "1"
                        int paramMultTwo = multiplyWithOverflowCheck(paramAsInt, 2);
                        String modifiedParamValueForMult = String.valueOf(paramMultTwo) + "/2";
                        // set the parameter value to a string value like "4/2", if the original
                        // parameter value was "1"
                        int paramMultFour = multiplyWithOverflowCheck(paramAsInt, 4);
                        String modifiedParamValueConfirmForMult = String.valueOf(paramMultFour) + "/2";
                        // Do the attack for MULT variant
                        expressionBasedAttack(param, origParamValue, modifiedParamValueForMult,
                                modifiedParamValueConfirmForMult);
                        // bale out if we were asked nicely
                        if (isStop()) {
                            log.debug("Stopping the scan due to a user request");
                            return;
                        }
                    }
                } catch (ArithmeticException ex) {
                    if (this.debugEnabled) {
                        log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                + "When performing integer math with the parameter value [" + origParamValue
                                + "]");
                    }
                }
            } catch (Exception e) {
                if (this.debugEnabled) {
                    log.debug("The parameter value [" + origParamValue + "] is NOT of type Integer");
                }
                // TODO: implement a similar check for string types?  This probably needs to be
                // RDBMS specific (ie, it should not live in this scanner)
            }
        }

        // Check 2: boolean based checks.
        // the check goes like so:
        // append " and 1 = 1" to the param.  Send the query.  Check the results. Hopefully they
        // match the original results from the unmodified query,
        // *suggesting* (but not yet definitely) that we have successfully modified the query,
        // (hopefully not gotten an error message),
        // and have gotten the same results back, which is what you would expect if you added
        // the constraint " and 1 = 1" to most (but not every) SQL query.
        // So was it a fluke that we got the same results back from the modified query? Perhaps
        // the original query returned 0 rows, so adding any number of
        // constraints would change nothing?  It is still a possibility!
        // check to see if we can change the original parameter again to *restrict* the scope of
        // the query using an AND with an always false condition (AND_ERR)
        // (decreasing the results back to nothing), or to *broaden* the scope of the query
        // using an OR with an always true condition (AND_OR)
        // (increasing the results).
        // If we can successfully alter the results to our requirements, by one means or
        // another, we have found a SQL Injection vulnerability.
        // Some additional complications: assume there are 2 HTML parameters: username and
        // password, and the SQL constructed is like so:
        // select * from username where user = "$user" and password = "$password"
        // and lets assume we successfully know the type of the user field, via SQL_OR_TRUE
        // value '" OR "1"="1' (single quotes not part of the value)
        // we still have the problem that the actual SQL executed would look like so:
        // select * from username where user = "" OR "1"="1" and password = "whateveritis"
        // Since the password field is still taken into account (by virtue of the AND condition
        // on the password column), and we only inject one parameter at a time,
        // we are still not in control.
        // the solution is simple: add an end-of-line comment to the field added in (in this
        // example: the user field), so that the SQL becomes:
        // select * from username where user = "" OR "1"="1" -- and password = "whateveritis"
        // the result is that any additional constraints are commented out, and the last
        // condition to have any effect is the one whose
        // HTTP param we are manipulating.
        // Note also that because this comment only needs to be added to the "SQL_OR_TRUE" and
        // not to the equivalent SQL_AND_FALSE, because of the nature of the OR
        // and AND conditions in SQL.
        // Corollary: If a particular RDBMS does not offer the ability to comment out the
        // remainder of a line, we will not attempt to comment out anything in the query
        //            and we will simply hope that the *last* constraint in the SQL query is
        // constructed from a HTTP parameter under our control.

        if (this.debugEnabled) {
            log.debug("Doing Check 2, since check 1 did not match for "
                    + getBaseMsg().getRequestHeader().getURI());
        }

        // Since the previous checks are attempting SQL injection, and may have actually
        // succeeded in modifying the database (ask me how I know?!)
        // then we cannot rely on the database contents being the same as when the original
        // query was last run (could be hours ago)
        // so to work around this, simply re-run the query again now at this point.
        // Note that we are not counting this request in our max number of requests to be issued
        refreshedmessage = getNewMsg();
        try {
            sendAndReceive(refreshedmessage, false); // do not follow redirects
        } catch (SocketException ex) {
            if (log.isDebugEnabled())
                log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                        + refreshedmessage.getRequestHeader().getURI().toString());
            return; // Something went wrong, no point continuing
        }

        // String mResBodyNormal = getBaseMsg().getResponseBody().toString();
        mResBodyNormalUnstripped = refreshedmessage.getResponseBody().toString();
        mResBodyNormalStripped = this.stripOff(mResBodyNormalUnstripped, origParamValue);

        // boolean booleanBasedSqlInjectionFoundForParam = false;

        // try each of the AND syntax values in turn.
        // Which one is successful will depend on the column type of the table/view column into
        // which we are injecting the SQL.
        for (int i = 0; i < SQL_LOGIC_AND_TRUE.length && !sqlInjectionFoundForUrl && doBooleanBased
                && countBooleanBasedRequests < doBooleanMaxRequests; i++) {
            // needs a new message for each type of AND to be issued
            HttpMessage msg2 = getNewMsg();
            // ZAP: Removed getURLDecode()
            String sqlBooleanAndTrueValue = origParamValue + SQL_LOGIC_AND_TRUE[i];
            String sqlBooleanAndFalseValue = origParamValue + SQL_LOGIC_AND_FALSE[i];

            setParameter(msg2, param, sqlBooleanAndTrueValue);

            // send the AND with an additional TRUE statement tacked onto the end. Hopefully it
            // will return the same results as the original (to find a vulnerability)
            try {
                sendAndReceive(msg2, false); // do not follow redirects
            } catch (SocketException ex) {
                if (log.isDebugEnabled())
                    log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                            + msg2.getRequestHeader().getURI().toString());
                continue; // Something went wrong, continue to the next item in the loop
            }
            countBooleanBasedRequests++;

            // String resBodyAND = msg2.getResponseBody().toString();
            String resBodyANDTrueUnstripped = msg2.getResponseBody().toString();
            String resBodyANDTrueStripped = stripOffOriginalAndAttackParam(resBodyANDTrueUnstripped,
                    origParamValue, sqlBooleanAndTrueValue);

            // set up two little arrays to ease the work of checking the unstripped output, and
            // then the stripped output
            String normalBodyOutput[] = { mResBodyNormalUnstripped, mResBodyNormalStripped };
            String andTrueBodyOutput[] = { resBodyANDTrueUnstripped, resBodyANDTrueStripped };
            boolean strippedOutput[] = { false, true };

            for (int booleanStrippedUnstrippedIndex = 0; booleanStrippedUnstrippedIndex < 2; booleanStrippedUnstrippedIndex++) {
                // if the results of the "AND 1=1" match the original query (using either the
                // stipped or unstripped versions), we may be onto something.
                if (andTrueBodyOutput[booleanStrippedUnstrippedIndex]
                        .compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex]) == 0) {
                    if (this.debugEnabled) {
                        log.debug("Check 2, "
                                + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED" : "UNSTRIPPED")
                                + " html output for AND TRUE condition [" + sqlBooleanAndTrueValue
                                + "] matched (refreshed) original results for "
                                + refreshedmessage.getRequestHeader().getURI());
                    }
                    // so they match. Was it a fluke? See if we get the same result by tacking
                    // on "AND 1 = 2" to the original
                    HttpMessage msg2_and_false = getNewMsg();

                    setParameter(msg2_and_false, param, sqlBooleanAndFalseValue);

                    try {
                        sendAndReceive(msg2_and_false, false); // do not follow redirects
                    } catch (SocketException ex) {
                        if (log.isDebugEnabled())
                            log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                    + " when accessing: "
                                    + msg2_and_false.getRequestHeader().getURI().toString());
                        continue; // Something went wrong, continue on to the next item in the
                        // loop
                    }
                    countBooleanBasedRequests++;

                    // String resBodyANDFalse =
                    // stripOff(msg2_and_false.getResponseBody().toString(),
                    // SQL_LOGIC_AND_FALSE[i]);
                    // String resBodyANDFalse = msg2_and_false.getResponseBody().toString();
                    String resBodyANDFalseUnstripped = msg2_and_false.getResponseBody().toString();
                    String resBodyANDFalseStripped = stripOffOriginalAndAttackParam(resBodyANDFalseUnstripped,
                            origParamValue, sqlBooleanAndFalseValue);

                    String andFalseBodyOutput[] = { resBodyANDFalseUnstripped, resBodyANDFalseStripped };

                    // which AND False output should we compare? the stripped or the unstripped
                    // version?
                    // depends on which one we used to get to here.. use the same as that..

                    // build an always false AND query.  Result should be different to prove the
                    // SQL works.
                    if (andFalseBodyOutput[booleanStrippedUnstrippedIndex]
                            .compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex]) != 0) {
                        if (this.debugEnabled) {
                            log.debug("Check 2, "
                                    + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED"
                                            : "UNSTRIPPED")
                                    + " html output for AND FALSE condition [" + sqlBooleanAndFalseValue
                                    + "] differed from (refreshed) original results for "
                                    + refreshedmessage.getRequestHeader().getURI());
                        }

                        // it's different (suggesting that the "AND 1 = 2" appended on gave
                        // different results because it restricted the data set to nothing
                        // Likely a SQL Injection. Raise it
                        String extraInfo = null;
                        if (strippedOutput[booleanStrippedUnstrippedIndex]) {
                            extraInfo = Constant.messages.getString(
                                    MESSAGE_PREFIX + "alert.booleanbased.extrainfo", sqlBooleanAndTrueValue,
                                    sqlBooleanAndFalseValue, "");
                        } else {
                            extraInfo = Constant.messages.getString(
                                    MESSAGE_PREFIX + "alert.booleanbased.extrainfo", sqlBooleanAndTrueValue,
                                    sqlBooleanAndFalseValue, "NOT ");
                        }
                        extraInfo = extraInfo + "\n" + Constant.messages
                                .getString(MESSAGE_PREFIX + "alert.booleanbased.extrainfo.dataexists");

                        // raise the alert, and save the attack string for the "Authentication
                        // Bypass" alert, if necessary
                        sqlInjectionAttack = sqlBooleanAndTrueValue;
                        bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName(), getDescription(), null, // url
                                param, sqlInjectionAttack, extraInfo, getSolution(), "", msg2);

                        sqlInjectionFoundForUrl = true;

                        break; // No further need to loop through SQL_AND

                    } else {
                        // the results of the always false condition are the same as for the
                        // original unmodified parameter
                        // this could be because there was *no* data returned for the original
                        // unmodified parameter
                        // so consider the effect of adding comments to both the always true
                        // condition, and the always false condition
                        // the first value to try..
                        // ZAP: Removed getURLDecode()
                        String orValue = origParamValue + SQL_LOGIC_OR_TRUE[i];

                        // this is where that comment comes in handy: if the RDBMS supports
                        // one-line comments, add one in to attempt to ensure that the
                        // condition becomes one that is effectively always true, returning ALL
                        // data (or as much as possible), allowing us to pinpoint the SQL
                        // Injection
                        if (this.debugEnabled) {
                            log.debug("Check 2 , "
                                    + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED"
                                            : "UNSTRIPPED")
                                    + " html output for AND FALSE condition [" + sqlBooleanAndFalseValue
                                    + "] SAME as (refreshed) original results for "
                                    + refreshedmessage.getRequestHeader().getURI()
                                    + " ### (forcing OR TRUE check) ");
                        }
                        HttpMessage msg2_or_true = getNewMsg();
                        setParameter(msg2_or_true, param, orValue);
                        try {
                            sendAndReceive(msg2_or_true, false); // do not follow redirects
                        } catch (SocketException ex) {
                            if (log.isDebugEnabled())
                                log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                        + " when accessing: "
                                        + msg2_or_true.getRequestHeader().getURI().toString());
                            continue; // Something went wrong, continue on to the next item in
                            // the loop
                        }
                        countBooleanBasedRequests++;

                        // String resBodyORTrue =
                        // stripOff(msg2_or_true.getResponseBody().toString(), orValue);
                        // String resBodyORTrue = msg2_or_true.getResponseBody().toString();
                        String resBodyORTrueUnstripped = msg2_or_true.getResponseBody().toString();
                        String resBodyORTrueStripped = stripOffOriginalAndAttackParam(resBodyORTrueUnstripped,
                                origParamValue, orValue);

                        String orTrueBodyOutput[] = { resBodyORTrueUnstripped, resBodyORTrueStripped };

                        int compareOrToOriginal = orTrueBodyOutput[booleanStrippedUnstrippedIndex]
                                .compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex]);
                        if (compareOrToOriginal != 0) {

                            if (this.debugEnabled) {
                                log.debug("Check 2, "
                                        + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED"
                                                : "UNSTRIPPED")
                                        + " html output for OR TRUE condition [" + orValue
                                        + "] different to (refreshed) original results for "
                                        + refreshedmessage.getRequestHeader().getURI());
                            }

                            // it's different (suggesting that the "OR 1 = 1" appended on gave
                            // different results because it broadened the data set from nothing
                            // to something
                            // Likely a SQL Injection. Raise it
                            String extraInfo = null;
                            if (strippedOutput[booleanStrippedUnstrippedIndex]) {
                                extraInfo = Constant.messages.getString(
                                        MESSAGE_PREFIX + "alert.booleanbased.extrainfo", sqlBooleanAndTrueValue,
                                        orValue, "");
                            } else {
                                extraInfo = Constant.messages.getString(
                                        MESSAGE_PREFIX + "alert.booleanbased.extrainfo", sqlBooleanAndTrueValue,
                                        orValue, "NOT ");
                            }
                            extraInfo = extraInfo + "\n" + Constant.messages
                                    .getString(MESSAGE_PREFIX + "alert.booleanbased.extrainfo.datanotexists");

                            // raise the alert, and save the attack string for the
                            // "Authentication Bypass" alert, if necessary
                            sqlInjectionAttack = orValue;
                            bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName(), getDescription(), null, // url
                                    param, sqlInjectionAttack, extraInfo, getSolution(), "", msg2);

                            sqlInjectionFoundForUrl = true;
                            // booleanBasedSqlInjectionFoundForParam = true;  //causes us to
                            // skip past the other entries in SQL_AND.  Only one will expose a
                            // vuln for a given param, since the database column is of only 1
                            // type

                            break; // No further need to loop
                        }
                    }
                } // if the results of the "AND 1=1" match the original query, we may be onto
                  // something.
                else {
                    // andTrueBodyOutput[booleanStrippedUnstrippedIndex].compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex])
                    // the results of the "AND 1=1" do NOT match the original query, for
                    // whatever reason (no sql injection, or the web page is not stable)
                    if (this.debugEnabled) {
                        log.debug("Check 2, "
                                + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED" : "UNSTRIPPED")
                                + " html output for AND condition [" + sqlBooleanAndTrueValue
                                + "] does NOT match the (refreshed) original results for "
                                + refreshedmessage.getRequestHeader().getURI());
                        Patch diffpatch = DiffUtils.diff(
                                new LinkedList<String>(Arrays
                                        .asList(normalBodyOutput[booleanStrippedUnstrippedIndex].split("\\n"))),
                                new LinkedList<String>(Arrays.asList(
                                        andTrueBodyOutput[booleanStrippedUnstrippedIndex].split("\\n"))));

                        // int numberofDifferences = diffpatch.getDeltas().size();

                        // and convert the list of patches to a String, joining using a newline
                        StringBuilder tempDiff = new StringBuilder(250);
                        for (Delta delta : diffpatch.getDeltas()) {
                            String changeType = null;
                            if (delta.getType() == Delta.TYPE.CHANGE) {
                                changeType = "Changed Text";
                            } else if (delta.getType() == Delta.TYPE.DELETE) {
                                changeType = "Deleted Text";
                            } else if (delta.getType() == Delta.TYPE.INSERT) {
                                changeType = "Inserted text";
                            } else {
                                changeType = "Unknown change type [" + delta.getType() + "]";
                            }

                            tempDiff.append("\n(" + changeType + ")\n"); // blank line before
                            tempDiff.append("Output for Unmodified parameter: " + delta.getOriginal() + "\n");
                            tempDiff.append("Output for   modified parameter: " + delta.getRevised() + "\n");
                        }
                        log.debug("DIFFS: " + tempDiff);
                    }
                }
                // bale out if we were asked nicely
                if (isStop()) {
                    log.debug("Stopping the scan due to a user request");
                    return;
                }
            } // end of boolean logic output index (unstripped + stripped)
        }
        // end of check 2

        // check 2a: boolean based logic, where the original query returned *no* data. Here we
        // append " OR 1=1" in an attempt to extract *more* data
        // and then verify the results by attempting to reproduce the original results by
        // appending an " AND 1=2" condition (ie "open up first, then restrict to verify")
        // this differs from the previous logic based check since the previous check assumes
        // that the original query produced data, and tries first to restrict that data
        // (ie, it uses "restrict first, open up to verify" ).
        for (int i = 0; i < SQL_LOGIC_OR_TRUE.length && !sqlInjectionFoundForUrl && doBooleanBased
                && countBooleanBasedRequests < doBooleanMaxRequests; i++) {
            HttpMessage msg2 = getNewMsg();
            String sqlBooleanOrTrueValue = origParamValue + SQL_LOGIC_OR_TRUE[i];
            String sqlBooleanAndFalseValue = origParamValue + SQL_LOGIC_AND_FALSE[i];

            setParameter(msg2, param, sqlBooleanOrTrueValue);
            try {
                sendAndReceive(msg2, false); // do not follow redirects
            } catch (SocketException ex) {
                if (log.isDebugEnabled())
                    log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                            + msg2.getRequestHeader().getURI().toString());
                continue; // Something went wrong, continue on to the next item in the loop
            }
            countBooleanBasedRequests++;

            String resBodyORTrueUnstripped = msg2.getResponseBody().toString();

            // if the results of the "OR 1=1" exceed the original query (unstripped, by more
            // than a 20% size difference, say), we may be onto something.
            // TODO: change the percentage difference threshold based on the alert threshold
            if ((resBodyORTrueUnstripped.length() > (mResBodyNormalUnstripped.length() * 1.2))) {
                if (this.debugEnabled) {
                    log.debug("Check 2a, unstripped html output for OR TRUE condition [" + sqlBooleanOrTrueValue
                            + "] produced sufficiently larger results than the original message");
                }
                // if we can also restrict it back to the original results by appending a " and
                // 1=2", then "Winner Winner, Chicken Dinner".
                HttpMessage msg2_and_false = getNewMsg();
                setParameter(msg2_and_false, param, sqlBooleanAndFalseValue);
                try {
                    sendAndReceive(msg2_and_false, false); // do not follow redirects
                } catch (SocketException ex) {
                    if (log.isDebugEnabled())
                        log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                + " when accessing: " + msg2_and_false.getRequestHeader().getURI().toString());
                    continue; // Something went wrong, continue on to the next item in the loop
                }
                countBooleanBasedRequests++;

                String resBodyANDFalseUnstripped = msg2_and_false.getResponseBody().toString();
                String resBodyANDFalseStripped = stripOffOriginalAndAttackParam(resBodyANDFalseUnstripped,
                        origParamValue, sqlBooleanAndFalseValue);

                // does the "AND 1=2" version produce the same as the original (for
                // stripped/unstripped versions)
                boolean verificationUsingUnstripped = resBodyANDFalseUnstripped
                        .compareTo(mResBodyNormalUnstripped) == 0;
                boolean verificationUsingStripped = resBodyANDFalseStripped
                        .compareTo(mResBodyNormalStripped) == 0;
                if (verificationUsingUnstripped || verificationUsingStripped) {
                    if (this.debugEnabled) {
                        log.debug("Check 2, " + (verificationUsingStripped ? "STRIPPED" : "UNSTRIPPED")
                                + " html output for AND FALSE condition [" + sqlBooleanAndFalseValue
                                + "] matches the (refreshed) original results");
                    }
                    // Likely a SQL Injection. Raise it
                    String extraInfo = null;
                    if (verificationUsingStripped) {
                        extraInfo = Constant.messages.getString(MESSAGE_PREFIX + "alert.booleanbased.extrainfo",
                                sqlBooleanOrTrueValue, sqlBooleanAndFalseValue, "");
                    } else {
                        extraInfo = Constant.messages.getString(MESSAGE_PREFIX + "alert.booleanbased.extrainfo",
                                sqlBooleanOrTrueValue, sqlBooleanAndFalseValue, "NOT ");
                    }
                    extraInfo = extraInfo + "\n" + Constant.messages
                            .getString(MESSAGE_PREFIX + "alert.booleanbased.extrainfo.datanotexists");

                    // raise the alert, and save the attack string for the "Authentication
                    // Bypass" alert, if necessary
                    sqlInjectionAttack = sqlBooleanOrTrueValue;
                    bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName(), getDescription(), null, // url
                            param, sqlInjectionAttack, extraInfo, getSolution(), "", msg2);

                    sqlInjectionFoundForUrl = true;

                    break; // No further need to loop
                }
            }
        }
        // end of check 2a

        // Check 3: UNION based
        // for each SQL UNION combination to try
        for (int sqlUnionStringIndex = 0; sqlUnionStringIndex < SQL_UNION_APPENDAGES.length
                && !sqlInjectionFoundForUrl && doUnionBased
                && countUnionBasedRequests < doUnionMaxRequests; sqlUnionStringIndex++) {

            // new message for each value we attack with
            HttpMessage msg3 = getNewMsg();
            String sqlUnionValue = origParamValue + SQL_UNION_APPENDAGES[sqlUnionStringIndex];
            setParameter(msg3, param, sqlUnionValue);
            // send the message with the modified parameters
            try {
                sendAndReceive(msg3, false); // do not follow redirects
            } catch (SocketException ex) {
                if (log.isDebugEnabled())
                    log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                            + msg3.getRequestHeader().getURI().toString());
                continue; // Something went wrong, continue on to the next item in the loop
            }
            countUnionBasedRequests++;

            // now check the results.. look first for UNION specific error messages in the
            // output that were not there in the original output
            // and failing that, look for generic RDBMS specific error messages
            // TODO: maybe also try looking at a differentiation based approach?? Prone to false
            // positives though.
            for (RDBMS rdbms : RDBMS.values()) {
                if (getTechSet().includes(rdbms.getTech()) && checkUnionErrors(rdbms, msg3,
                        mResBodyNormalStripped, refreshedmessage.getRequestHeader().getURI(), param,
                        origParamValue, sqlUnionValue)) {
                    sqlInjectionFoundForUrl = true;
                    // Save the attack string for the "Authentication Bypass" alert, if
                    // necessary
                    sqlInjectionAttack = sqlUnionValue;
                    break;
                }
                // bale out if we were asked nicely
                if (isStop()) {
                    log.debug("Stopping the scan due to a user request");
                    return;
                }
            } // end of the loop to check for RDBMS specific UNION error messages
        } //// for each SQL UNION combination to try
          // end of check 3

        // ###############################

        // check for columns used in the "order by" clause of a SQL statement. earlier tests
        // will likely not catch these

        // append on " ASC -- " to the end of the original parameter. Grab the results.
        // if the results are different to the original (unmodified parameter) results, then
        // bale
        // if the results are the same as for the original parameter value, then the parameter
        // *might* be influencing the order by
        //   try again for "DESC": append on " DESC -- " to the end of the original parameter.
        // Grab the results.
        //   if the results are the same as the original (unmodified parameter) results, then bale
        //   (the results are not under our control, or there is no difference in the ordering,
        // for some reason: 0 or 1 rows only, or ordering
        //   by the first column alone is not sufficient to change the ordering of the data.)
        //   if the results were different to the original (unmodified parameter) results, then
        //      SQL injection!!

        // Since the previous checks are attempting SQL injection, and may have actually
        // succeeded in modifying the database (ask me how I know?!)
        // then we cannot rely on the database contents being the same as when the original
        // query was last run (could be hours ago)
        // so to work around this, simply re-run the query again now at this point.
        // Note that we are not counting this request in our max number of requests to be issued
        refreshedmessage = getNewMsg();
        try {
            sendAndReceive(refreshedmessage, false); // do not follow redirects
        } catch (SocketException ex) {
            if (log.isDebugEnabled())
                log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                        + refreshedmessage.getRequestHeader().getURI().toString());
            return; // Something went wrong, no point continuing
        }

        // String mResBodyNormal = getBaseMsg().getResponseBody().toString();
        mResBodyNormalUnstripped = refreshedmessage.getResponseBody().toString();
        mResBodyNormalStripped = this.stripOff(mResBodyNormalUnstripped, origParamValue);

        if (!sqlInjectionFoundForUrl && doOrderByBased && countOrderByBasedRequests < doOrderByMaxRequests) {

            // ZAP: Removed getURLDecode()
            String modifiedParamValue = origParamValue + " ASC " + SQL_ONE_LINE_COMMENT;

            HttpMessage msg5 = getNewMsg();
            setParameter(msg5, param, modifiedParamValue);

            try {
                sendAndReceive(msg5, false); // do not follow redirects
            } catch (SocketException ex) {
                if (log.isDebugEnabled())
                    log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage() + " when accessing: "
                            + msg5.getRequestHeader().getURI().toString());
                return; // Something went wrong, no point continuing
            }
            countOrderByBasedRequests++;

            String modifiedAscendingOutputUnstripped = msg5.getResponseBody().toString();
            String modifiedAscendingOutputStripped = stripOffOriginalAndAttackParam(
                    modifiedAscendingOutputUnstripped, origParamValue, modifiedParamValue);

            // set up two little arrays to ease the work of checking the unstripped output, and
            // then the stripped output
            String normalBodyOutput[] = { mResBodyNormalUnstripped, mResBodyNormalStripped };
            String ascendingBodyOutput[] = { modifiedAscendingOutputUnstripped,
                    modifiedAscendingOutputStripped };
            boolean strippedOutput[] = { false, true };

            for (int booleanStrippedUnstrippedIndex = 0; booleanStrippedUnstrippedIndex < 2; booleanStrippedUnstrippedIndex++) {
                // if the results of the modified request match the original query, we may be
                // onto something.
                if (ascendingBodyOutput[booleanStrippedUnstrippedIndex]
                        .compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex]) == 0) {
                    if (this.debugEnabled) {
                        log.debug("Check X, "
                                + (strippedOutput[booleanStrippedUnstrippedIndex] ? "STRIPPED" : "UNSTRIPPED")
                                + " html output for modified Order By parameter [" + modifiedParamValue
                                + "] matched (refreshed) original results for "
                                + refreshedmessage.getRequestHeader().getURI());
                    }
                    // confirm that a different parameter value generates different output, to
                    // minimise false positives

                    // use the descending order this time
                    // ZAP: Removed getURLDecode()
                    String modifiedParamValueConfirm = origParamValue + " DESC " + SQL_ONE_LINE_COMMENT;

                    HttpMessage msg5Confirm = getNewMsg();
                    setParameter(msg5Confirm, param, modifiedParamValueConfirm);

                    try {
                        sendAndReceive(msg5Confirm, false); // do not follow redirects
                    } catch (SocketException ex) {
                        if (log.isDebugEnabled())
                            log.debug("Caught " + ex.getClass().getName() + " " + ex.getMessage()
                                    + " when accessing: " + msg5Confirm.getRequestHeader().getURI().toString());
                        continue; // Something went wrong, continue on to the next item in the
                        // loop
                    }
                    countOrderByBasedRequests++;

                    String confirmOrderByOutputUnstripped = msg5Confirm.getResponseBody().toString();
                    String confirmOrderByOutputStripped = stripOffOriginalAndAttackParam(
                            confirmOrderByOutputUnstripped, origParamValue, modifiedParamValueConfirm);

                    // set up two little arrays to ease the work of checking the unstripped
                    // output or the stripped output
                    String confirmOrderByBodyOutput[] = { confirmOrderByOutputUnstripped,
                            confirmOrderByOutputStripped };

                    if (confirmOrderByBodyOutput[booleanStrippedUnstrippedIndex]
                            .compareTo(normalBodyOutput[booleanStrippedUnstrippedIndex]) != 0) {
                        // the confirm query did not return the same results.  This means that
                        // arbitrary queries are not all producing the same page output.
                        // this means the fact we earlier reproduced the original page output
                        // with a modified parameter was not a coincidence

                        // Likely a SQL Injection. Raise it
                        String extraInfo = null;
                        if (strippedOutput[booleanStrippedUnstrippedIndex]) {
                            extraInfo = Constant.messages.getString(
                                    MESSAGE_PREFIX + "alert.orderbybased.extrainfo", modifiedParamValue, "");
                        } else {
                            extraInfo = Constant.messages.getString(
                                    MESSAGE_PREFIX + "alert.orderbybased.extrainfo", modifiedParamValue,
                                    "NOT ");
                        }

                        // raise the alert, and save the attack string for the "Authentication
                        // Bypass" alert, if necessary
                        sqlInjectionAttack = modifiedParamValue;
                        bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, getName(), getDescription(), null, // url
                                param, sqlInjectionAttack, extraInfo, getSolution(), "", msg5);

                        sqlInjectionFoundForUrl = true;
                        break; // No further need to loop
                    }
                }
                // bale out if we were asked nicely
                if (isStop()) {
                    log.debug("Stopping the scan due to a user request");
                    return;
                }
            }
        }

        // ###############################

        // if a sql injection was found, we should check if the page is flagged as a login page
        // in any of the contexts.  if it is, raise an "SQL Injection - Authentication Bypass"
        // alert in addition to the alerts already raised
        if (sqlInjectionFoundForUrl) {
            boolean loginUrl = false;
            // log.debug("### A SQL Injection may lead to auth bypass..");

            // are we dealing with a login url in any of the contexts?
            ExtensionAuthentication extAuth = (ExtensionAuthentication) Control.getSingleton()
                    .getExtensionLoader().getExtension(ExtensionAuthentication.NAME);
            if (extAuth != null) {
                URI requestUri = getBaseMsg().getRequestHeader().getURI();

                // using the session, get the list of contexts for the url
                List<Context> contextList = extAuth.getModel().getSession()
                        .getContextsForUrl(requestUri.getURI());

                // now loop, and see if the url is a login url in each of the contexts in turn..
                for (Context context : contextList) {
                    URI loginUri = extAuth.getLoginRequestURIForContext(context);
                    if (loginUri != null) {
                        if (requestUri.getScheme().equals(loginUri.getScheme())
                                && requestUri.getHost().equals(loginUri.getHost())
                                && requestUri.getPort() == loginUri.getPort()
                                && requestUri.getPath().equals(loginUri.getPath())) {
                            // we got this far.. only the method (GET/POST), user details, query
                            // params, fragment, and POST params
                            // are possibly different from the login page.
                            loginUrl = true;
                            // DEBUG only
                            // log.debug("##### The right login page was found");
                            break;
                        } else {
                            // log.debug("#### This is not the login page you're looking for");
                        }
                    } else {
                        // log.debug("### This context has no login page set");
                    }
                }
            }
            if (loginUrl) {
                // log.debug("##### Raising auth bypass");
                // raise the alert, using the custom name and description
                String vulnname = Constant.messages.getString(MESSAGE_PREFIX + "authbypass.name");
                String vulndesc = Constant.messages.getString(MESSAGE_PREFIX + "authbypass.desc");

                // raise the alert, using the attack string stored earlier for this purpose
                bingo(Alert.RISK_HIGH, Alert.CONFIDENCE_MEDIUM, vulnname, vulndesc,
                        refreshedmessage.getRequestHeader().getURI().getURI(), // url
                        param, sqlInjectionAttack, "", getSolution(), "", getBaseMsg());
            } // not a login page
        } // no sql Injection Found For Url

    } catch (InvalidRedirectLocationException e) {
        // Not an error, just means we probably attacked the redirect location
    } catch (Exception e) {
        // Do not try to internationalise this.. we need an error message in any event..
        // if it's in English, it's still better than not having it at all.
        log.error("An error occurred checking a url for SQL Injection vulnerabilities", e);
    }
}

From source file:de.saly.elasticsearch.mailsource.ParallelPollingIMAPMailSource.java

protected void fetch(final Pattern pattern, final String folderName) throws MessagingException, IOException {

    logger.debug("fetch() - pattern: {}, folderName: {}", pattern, folderName);

    final Store store = Session.getInstance(props).getStore();
    store.connect(user, password);/*from   w  w  w  .  ja v  a 2 s  .c o  m*/

    try {
        for (final String fol : mailDestination.getFolderNames()) {
            if (store.getFolder(fol).exists()) {
                logger.debug("{} exists", fol);
            } else {
                logger.info(
                        "Folder {} does not exist on the server, will remove it (and its content) also locally",
                        fol);
                final RiverState riverState = stateManager.getRiverState(store.getFolder(fol));
                riverState.setExists(false);
                stateManager.setRiverState(riverState);

                try {
                    mailDestination.clearDataForFolder(fol);
                } catch (final Exception e) {
                    stateManager.onError("Unable to clean data for stale folder", store.getFolder(fol), e);
                }
            }
        }
    } catch (final IndexMissingException ime) {
        logger.debug(ime.toString());

    } catch (final Exception e) {
        logger.error("Error checking for stale folders", e);
    }

    final boolean isRoot = StringUtils.isEmpty(folderName);
    final Folder folder = isRoot ? store.getDefaultFolder() : store.getFolder(folderName);

    try {

        if (!folder.exists()) {
            logger.error("Folder {} does not exist on the server", folder.getFullName());
            return;
        }

        logger.debug("folderName: {} is root: {}", folderName, isRoot);

        /*if (logger.isDebugEnabled() && store instanceof IMAPStore) {
                
           IMAPStore imapStore = (IMAPStore) store;
           logger.debug("IMAP server capability info");
           logger.debug("IMAP4rev1: "
             + imapStore.hasCapability("IMAP4rev1"));
           logger.debug("IDLE: " + imapStore.hasCapability("IDLE"));
           logger.debug("ID: " + imapStore.hasCapability("ID"));
           logger.debug("UIDPLUS: " + imapStore.hasCapability("UIDPLUS"));
           logger.debug("CHILDREN: " + imapStore.hasCapability("CHILDREN"));
           logger.debug("NAMESPACE: "
             + imapStore.hasCapability("NAMESPACE"));
           logger.debug("NOTIFY: " + imapStore.hasCapability("NOTIFY"));
           logger.debug("CONDSTORE: "
             + imapStore.hasCapability("CONDSTORE"));
           logger.debug("QRESYNC: " + imapStore.hasCapability("QRESYNC"));
           logger.debug("STATUS: " + imapStore.hasCapability("STATUS"));
        }*/

        if (pattern != null && !isRoot && !pattern.matcher(folder.getFullName()).matches()) {
            logger.info(folder.getFullName() + " does not match pattern " + pattern.toString());
            return;
        }

        IMAPUtils.open(folder);

        recurseFolders(folder, pattern);

    } finally {

        IMAPUtils.close(folder);
        IMAPUtils.close(store);

    }
}

From source file:de.saly.elasticsearch.importer.imap.mailsource.ParallelPollingIMAPMailSource.java

protected void fetch(final Pattern pattern, final String folderName) throws MessagingException, IOException {
    logger.debug("fetch() - pattern: {}, folderName: {}, user: {}", pattern, folderName, user);

    final Store store = Session.getInstance(props).getStore();
    store.connect(user, password);/*w  w w .j a v  a2  s .co m*/

    if (deleteExpungedMessages) {

        try {
            for (final String fol : mailDestination.getFolderNames()) {
                if (store.getFolder(fol).exists()) {
                    logger.debug("{} exists for {}", fol, user);
                } else {
                    logger.info(
                            "Folder {} does not exist for {} on the server, will remove it (and its content) also locally",
                            user, fol);
                    final State riverState = stateManager.getRiverState(store.getFolder(fol));
                    riverState.setExists(false);
                    stateManager.setRiverState(riverState);

                    try {
                        mailDestination.clearDataForFolder(store.getFolder(fol));
                    } catch (final Exception e) {
                        stateManager.onError("Unable to clean data for stale folder for " + user,
                                store.getFolder(fol), e);
                    }
                }
            }
        } /*catch (final IndexMissingException ime) {
          logger.debug(ime.toString());
          //TODO 2.0 check
          } */ catch (final Exception e) {
            logger.error("Error checking for stale folders", e);
        }

    }

    final boolean isRoot = StringUtils.isEmpty(folderName);
    final Folder folder = isRoot ? store.getDefaultFolder() : store.getFolder(folderName);

    try {

        if (!folder.exists()) {
            logger.error("Folder {} does not exist on the server", folder.getFullName());
            return;
        }

        logger.debug("folderName: {} is root: {}", folderName, isRoot);

        /*if (logger.isDebugEnabled() && store instanceof IMAPStore) {
                
           IMAPStore imapStore = (IMAPStore) store;
           logger.debug("IMAP server capability info");
           logger.debug("IMAP4rev1: "
             + imapStore.hasCapability("IMAP4rev1"));
           logger.debug("IDLE: " + imapStore.hasCapability("IDLE"));
           logger.debug("ID: " + imapStore.hasCapability("ID"));
           logger.debug("UIDPLUS: " + imapStore.hasCapability("UIDPLUS"));
           logger.debug("CHILDREN: " + imapStore.hasCapability("CHILDREN"));
           logger.debug("NAMESPACE: "
             + imapStore.hasCapability("NAMESPACE"));
           logger.debug("NOTIFY: " + imapStore.hasCapability("NOTIFY"));
           logger.debug("CONDSTORE: "
             + imapStore.hasCapability("CONDSTORE"));
           logger.debug("QRESYNC: " + imapStore.hasCapability("QRESYNC"));
           logger.debug("STATUS: " + imapStore.hasCapability("STATUS"));
        }*/

        if (pattern != null && !isRoot && !pattern.matcher(folder.getFullName()).matches()) {
            logger.debug(folder.getFullName() + " does not match pattern " + pattern.toString());
            return;
        }

        IMAPUtils.open(folder);

        recurseFolders(folder, pattern);

    } finally {

        IMAPUtils.close(folder);
        IMAPUtils.close(store);

    }
}

From source file:net.bashtech.geobot.ReceiverBot.java

public boolean isGlobalBannedWord(String message) {
    for (Pattern reg : BotManager.getInstance().globalBannedWords) {
        Matcher match = reg.matcher(message.toLowerCase());
        if (match.matches()) {
            log("RB: Global banned word matched: " + reg.toString());
            return true;
        }//from   w w w.  j  a v a2 s . c  om
    }
    return false;
}