diff --git a/lib/core/common.py b/lib/core/common.py index 36dd06f14..a05a6154d 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -83,6 +83,7 @@ from lib.core.settings import DBMS_DICT from lib.core.settings import DBMS_DIRECTORY_DICT from lib.core.settings import DESCRIPTION from lib.core.settings import DUMMY_SQL_INJECTION_CHARS +from lib.core.settings import FORMATTER from lib.core.settings import NULL from lib.core.settings import IS_WIN from lib.core.settings import PLATFORM @@ -3166,3 +3167,10 @@ def extractExpectedValue(value, expected): value = None return value + +def setFormatterPrependFlag(value=True): + """ + Sets logging formatter flag used for signaling if newline is needed before + the logging message itself (used in inference mode) + """ + FORMATTER._prepend_flag = value diff --git a/lib/core/option.py b/lib/core/option.py index be580a02c..f483d9bf4 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -81,6 +81,7 @@ from lib.core.settings import DEFAULT_GET_POST_DELIMITER from lib.core.settings import DEFAULT_PAGE_ENCODING from lib.core.settings import DEFAULT_TOR_HTTP_PORTS from lib.core.settings import DEFAULT_TOR_SOCKS_PORT +from lib.core.settings import FORMATTER from lib.core.settings import IS_WIN from lib.core.settings import NULL from lib.core.settings import PYVERSION @@ -393,6 +394,22 @@ def __setMultipleTargets(): infoMsg += "testable requests from the targets list" logger.info(infoMsg) +def __adjustFormatter(): + """ + Solves problem of line deletition caused by overlapping logging messages + and retrieved data info in inference mode + """ + + def format(record): + _ = FORMATTER._format(record) + if FORMATTER._prepend_flag: + _ = "\n%s" % _ + FORMATTER._prepend_flag = False + return _ + FORMATTER._format = FORMATTER.format + FORMATTER._prepend_flag = False + FORMATTER.format = format + def __setRequestFromFile(): """ This function checks if the way to make a HTTP request is through supplied @@ -1885,6 +1902,7 @@ def init(inputOptions=AttribDict(), overrideOptions=False): __checkDependencies() __basicOptionValidation() __setTorProxySettings() + __adjustFormatter() __setMultipleTargets() __setTamperingFunctions() __setTrafficOutputFP() diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py index eadb602ca..003c51f74 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -23,6 +23,7 @@ from lib.core.common import goGoodSamaritan from lib.core.common import getPartRun from lib.core.common import incrementCounter from lib.core.common import safeStringFormat +from lib.core.common import setFormatterPrependFlag from lib.core.common import singleTimeWarnMessage from lib.core.data import conf from lib.core.data import kb @@ -449,6 +450,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None etaProgressUpdate(time.time() - charStart, len(commonValue)) elif conf.verbose in (1, 2): dataToStdout(commonValue[index-1:]) + setFormatterPrependFlag(True) finalValue = commonValue @@ -497,6 +499,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None etaProgressUpdate(time.time() - charStart, index) elif conf.verbose in (1, 2): dataToStdout(val) + setFormatterPrependFlag(True) if len(partialValue) > INFERENCE_BLANK_BREAK and partialValue[-INFERENCE_BLANK_BREAK:].isspace(): finalValue = partialValue @@ -504,6 +507,8 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None except KeyboardInterrupt: abortedFlag = True + finally: + setFormatterPrependFlag(False) if conf.verbose in (1, 2) or showEta: dataToStdout("\n")