@@ -3142,59 +3142,65 @@ def removeReflectiveValues(content, payload, suppressWarning=False):
31423142
31433143 retVal = content
31443144
3145- if all ([content , payload ]) and isinstance (content , unicode ) and kb .reflectiveMechanism and not kb .heuristicMode :
3146- def _ (value ):
3147- while 2 * REFLECTED_REPLACEMENT_REGEX in value :
3148- value = value .replace (2 * REFLECTED_REPLACEMENT_REGEX , REFLECTED_REPLACEMENT_REGEX )
3149- return value
3150-
3151- payload = getUnicode (urldecode (payload .replace (PAYLOAD_DELIMITER , '' ), convall = True ))
3152- regex = _ (filterStringValue (payload , r"[A-Za-z0-9]" , REFLECTED_REPLACEMENT_REGEX .encode ("string-escape" )))
3145+ try :
3146+ if all ([content , payload ]) and isinstance (content , unicode ) and kb .reflectiveMechanism and not kb .heuristicMode :
3147+ def _ (value ):
3148+ while 2 * REFLECTED_REPLACEMENT_REGEX in value :
3149+ value = value .replace (2 * REFLECTED_REPLACEMENT_REGEX , REFLECTED_REPLACEMENT_REGEX )
3150+ return value
31533151
3154- if regex != payload :
3155- if all (part .lower () in content .lower () for part in filter (None , regex .split (REFLECTED_REPLACEMENT_REGEX ))[1 :]): # fast optimization check
3156- parts = regex .split (REFLECTED_REPLACEMENT_REGEX )
3157- retVal = content .replace (payload , REFLECTED_VALUE_MARKER ) # dummy approach
3152+ payload = getUnicode (urldecode (payload .replace (PAYLOAD_DELIMITER , '' ), convall = True ))
3153+ regex = _ (filterStringValue (payload , r"[A-Za-z0-9]" , REFLECTED_REPLACEMENT_REGEX .encode ("string-escape" )))
31583154
3159- if len (parts ) > REFLECTED_MAX_REGEX_PARTS : # preventing CPU hogs
3160- regex = _ ("%s%s%s" % (REFLECTED_REPLACEMENT_REGEX .join (parts [:REFLECTED_MAX_REGEX_PARTS / 2 ]), REFLECTED_REPLACEMENT_REGEX , REFLECTED_REPLACEMENT_REGEX .join (parts [- REFLECTED_MAX_REGEX_PARTS / 2 :])))
3155+ if regex != payload :
3156+ if all (part .lower () in content .lower () for part in filter (None , regex .split (REFLECTED_REPLACEMENT_REGEX ))[1 :]): # fast optimization check
3157+ parts = regex .split (REFLECTED_REPLACEMENT_REGEX )
3158+ retVal = content .replace (payload , REFLECTED_VALUE_MARKER ) # dummy approach
31613159
3162- parts = filter (None , regex .split (REFLECTED_REPLACEMENT_REGEX ))
3160+ if len (parts ) > REFLECTED_MAX_REGEX_PARTS : # preventing CPU hogs
3161+ regex = _ ("%s%s%s" % (REFLECTED_REPLACEMENT_REGEX .join (parts [:REFLECTED_MAX_REGEX_PARTS / 2 ]), REFLECTED_REPLACEMENT_REGEX , REFLECTED_REPLACEMENT_REGEX .join (parts [- REFLECTED_MAX_REGEX_PARTS / 2 :])))
31633162
3164- if regex .startswith (REFLECTED_REPLACEMENT_REGEX ):
3165- regex = r"%s%s" % (REFLECTED_BORDER_REGEX , regex [len (REFLECTED_REPLACEMENT_REGEX ):])
3166- else :
3167- regex = r"\b%s" % regex
3168-
3169- if regex .endswith (REFLECTED_REPLACEMENT_REGEX ):
3170- regex = r"%s%s" % (regex [:- len (REFLECTED_REPLACEMENT_REGEX )], REFLECTED_BORDER_REGEX )
3171- else :
3172- regex = r"%s\b" % regex
3163+ parts = filter (None , regex .split (REFLECTED_REPLACEMENT_REGEX ))
31733164
3174- retVal = re .sub (r"(?i)%s" % regex , REFLECTED_VALUE_MARKER , retVal )
3165+ if regex .startswith (REFLECTED_REPLACEMENT_REGEX ):
3166+ regex = r"%s%s" % (REFLECTED_BORDER_REGEX , regex [len (REFLECTED_REPLACEMENT_REGEX ):])
3167+ else :
3168+ regex = r"\b%s" % regex
31753169
3176- if len (parts ) > 2 :
3177- regex = REFLECTED_REPLACEMENT_REGEX .join (parts [1 :])
3178- retVal = re .sub (r"(?i)\b%s\b" % regex , REFLECTED_VALUE_MARKER , retVal )
3170+ if regex .endswith (REFLECTED_REPLACEMENT_REGEX ):
3171+ regex = r"%s%s" % (regex [:- len (REFLECTED_REPLACEMENT_REGEX )], REFLECTED_BORDER_REGEX )
3172+ else :
3173+ regex = r"%s\b" % regex
31793174
3180- if retVal != content :
3181- kb .reflectiveCounters [REFLECTIVE_COUNTER .HIT ] += 1
3182- if not suppressWarning :
3183- warnMsg = "reflective value(s) found and filtering out"
3184- singleTimeWarnMessage (warnMsg )
3175+ retVal = re .sub (r"(?i)%s" % regex , REFLECTED_VALUE_MARKER , retVal )
31853176
3186- if re .search (r"FRAME[^>]+src=[^>]*%s" % REFLECTED_VALUE_MARKER , retVal , re .I ):
3187- warnMsg = "frames detected containing attacked parameter values. Please be sure to "
3188- warnMsg += "test those separately in case that attack on this page fails"
3189- singleTimeWarnMessage (warnMsg )
3177+ if len (parts ) > 2 :
3178+ regex = REFLECTED_REPLACEMENT_REGEX .join (parts [1 :])
3179+ retVal = re .sub (r"(?i)\b%s\b" % regex , REFLECTED_VALUE_MARKER , retVal )
31903180
3191- elif not kb .testMode and not kb .reflectiveCounters [REFLECTIVE_COUNTER .HIT ]:
3192- kb .reflectiveCounters [REFLECTIVE_COUNTER .MISS ] += 1
3193- if kb .reflectiveCounters [REFLECTIVE_COUNTER .MISS ] > REFLECTIVE_MISS_THRESHOLD :
3194- kb .reflectiveMechanism = False
3181+ if retVal != content :
3182+ kb .reflectiveCounters [REFLECTIVE_COUNTER .HIT ] += 1
31953183 if not suppressWarning :
3196- debugMsg = "turning off reflection removal mechanism (for optimization purposes)"
3197- logger .debug (debugMsg )
3184+ warnMsg = "reflective value(s) found and filtering out"
3185+ singleTimeWarnMessage (warnMsg )
3186+
3187+ if re .search (r"FRAME[^>]+src=[^>]*%s" % REFLECTED_VALUE_MARKER , retVal , re .I ):
3188+ warnMsg = "frames detected containing attacked parameter values. Please be sure to "
3189+ warnMsg += "test those separately in case that attack on this page fails"
3190+ singleTimeWarnMessage (warnMsg )
3191+
3192+ elif not kb .testMode and not kb .reflectiveCounters [REFLECTIVE_COUNTER .HIT ]:
3193+ kb .reflectiveCounters [REFLECTIVE_COUNTER .MISS ] += 1
3194+ if kb .reflectiveCounters [REFLECTIVE_COUNTER .MISS ] > REFLECTIVE_MISS_THRESHOLD :
3195+ kb .reflectiveMechanism = False
3196+ if not suppressWarning :
3197+ debugMsg = "turning off reflection removal mechanism (for optimization purposes)"
3198+ logger .debug (debugMsg )
3199+ except MemoryError :
3200+ kb .reflectiveMechanism = False
3201+ if not suppressWarning :
3202+ debugMsg = "turning off reflection removal mechanism (because of low memory issues)"
3203+ logger .debug (debugMsg )
31983204
31993205 return retVal
32003206
0 commit comments