diff --git a/lib/core/option.py b/lib/core/option.py index 8282f5ca7..17a6d76a9 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -1463,6 +1463,7 @@ def __setKnowledgeBaseAttributes(flushAll=True): kb.matchRatio = None kb.mergeCookies = None kb.multiThreadMode = False + kb.negativeLogic = False kb.nullConnection = None kb.pageTemplate = None kb.pageTemplates = dict() diff --git a/lib/request/comparison.py b/lib/request/comparison.py index 44c76d114..e0329bea0 100644 --- a/lib/request/comparison.py +++ b/lib/request/comparison.py @@ -35,21 +35,24 @@ def comparison(page, headers, code=None, getRatioValue=False, pageLength=None): seqMatcher = getCurrentThreadData().seqMatcher seqMatcher.set_seq1(kb.pageTemplate) + def _(condition): + #condition = not condition if kb.negativeLogic else condition + return condition if not getRatioValue else (MAX_RATIO if condition else MIN_RATIO) + if any([conf.string, conf.regexp]): rawResponse = "%s%s" % (listToStrValue(headers.headers if headers else ""), page) # String to match in page when the query is valid if conf.string: - condition = conf.string in rawResponse - return condition if not getRatioValue else (MAX_RATIO if condition else MIN_RATIO) + return _(conf.string in rawResponse) # Regular expression to match in page when the query is valid if conf.regexp: - condition = re.search(conf.regexp, rawResponse, re.I | re.M) is not None - return condition if not getRatioValue else (MAX_RATIO if condition else MIN_RATIO) + return _(re.search(conf.regexp, rawResponse, re.I | re.M) is not None) + # HTTP code to match when the query is valid if isinstance(code, int) and conf.code: - return code == conf.code + return _(conf.code == code) if page: # In case of an DBMS error page return None diff --git a/lib/request/inject.py b/lib/request/inject.py index c376866d8..83f8bf9e1 100644 --- a/lib/request/inject.py +++ b/lib/request/inject.py @@ -414,6 +414,9 @@ def getValue(expression, blind=True, inband=True, error=True, time=True, fromUse if blind and isTechniqueAvailable(PAYLOAD.TECHNIQUE.BOOLEAN) and not found: kb.technique = PAYLOAD.TECHNIQUE.BOOLEAN + pushValue(kb.negativeLogic) + kb.negativeLogic = "OR NOT" in kb.injection.data[kb.technique].vector + if expected == EXPECTED.BOOL: value = __goBooleanProxy(booleanExpression) else: @@ -422,6 +425,8 @@ def getValue(expression, blind=True, inband=True, error=True, time=True, fromUse count += 1 found = (value is not None) or (value is None and expectingNone) or count >= MAX_TECHNIQUES_PER_VALUE + kb.negativeLogic = popValue() + if time and (isTechniqueAvailable(PAYLOAD.TECHNIQUE.TIME) or isTechniqueAvailable(PAYLOAD.TECHNIQUE.STACKED)) and not found: if isTechniqueAvailable(PAYLOAD.TECHNIQUE.TIME): kb.technique = PAYLOAD.TECHNIQUE.TIME