diff --git a/lib/controller/checks.py b/lib/controller/checks.py index 3b00dcdea..910085357 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -739,7 +739,7 @@ def checkSqlInjection(place, parameter, value): logger.warn(warnMsg) msg = "how do you want to proceed? [(S)kip current test/(e)nd detection phase/(n)ext parameter/(c)hange verbosity/(q)uit]" - choice = readInput(msg, default='S', checkBatch=False).strip().upper() + choice = readInput(msg, default='S', checkBatch=False).upper() if choice == 'C': choice = None @@ -747,7 +747,7 @@ def checkSqlInjection(place, parameter, value): if choice: logger.warn("invalid value") msg = "enter new verbosity level: [0-6] " - choice = readInput(msg, default=str(conf.verbose), checkBatch=False).strip() + choice = readInput(msg, default=str(conf.verbose), checkBatch=False) conf.verbose = int(choice) setVerbosity() tests.insert(0, test) @@ -998,7 +998,7 @@ def heuristicCheckSqlInjection(place, parameter): if kb.ignoreCasted is None: message = "do you want to skip those kind of cases (and save scanning time)? %s " % ("[Y/n]" if conf.multipleTargets else "[y/N]") - kb.ignoreCasted = readInput(message, default='Y' if conf.multipleTargets else 'N').upper() != 'N' + kb.ignoreCasted = readInput(message, default='Y' if conf.multipleTargets else 'N', boolean=True) elif result: infoMsg += "be injectable" @@ -1176,7 +1176,7 @@ def checkStability(): logger.warn(warnMsg) message = "how do you want to proceed? [(C)ontinue/(s)tring/(r)egex/(q)uit] " - choice = readInput(message, default='C').strip().upper() + choice = readInput(message, default='C').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -1306,9 +1306,8 @@ def checkWaf(): if not conf.identifyWaf: message = "do you want sqlmap to try to detect backend " message += "WAF/IPS/IDS? [y/N] " - output = readInput(message, default="N") - if output and output[0] in ("Y", "y"): + if readInput(message, default='N', boolean=True): conf.identifyWaf = True if conf.timeout == defaults.timeout: diff --git a/lib/controller/controller.py b/lib/controller/controller.py index 716032719..1159ccb0d 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -116,11 +116,11 @@ def _selectInjection(): message += "\n" message += "[q] Quit" - select = readInput(message, default="0") + choice = readInput(message, default='0').upper() - if select.isdigit() and int(select) < len(kb.injections) and int(select) >= 0: - index = int(select) - elif select[0] in ("Q", "q"): + if choice.isdigit() and int(choice) < len(kb.injections) and int(choice) >= 0: + index = int(choice) + elif choice == 'Q': raise SqlmapUserQuitException else: errMsg = "invalid choice" @@ -184,7 +184,7 @@ def _randomFillBlankFields(value): if extractRegexResult(EMPTY_FORM_FIELDS_REGEX, value): message = "do you want to fill blank fields with random values? [Y/n] " - if readInput(message, default="Y", boolean=True): + if readInput(message, default='Y', boolean=True): for match in re.finditer(EMPTY_FORM_FIELDS_REGEX, retVal): item = match.group("result") if not any(_ in item for _ in IGNORE_PARAMETERS) and not re.search(ASP_NET_CONTROL_REGEX, item): @@ -306,7 +306,7 @@ def start(): message += "against '%s'. Do you want to skip " % conf.hostname message += "further tests involving it? [Y/n]" - kb.skipVulnHost = readInput(message, default="Y", boolean=True) + kb.skipVulnHost = readInput(message, default='Y', boolean=True) testSqlInj = not kb.skipVulnHost @@ -334,7 +334,7 @@ def start(): continue message += "\ndo you want to test this form? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'N': continue @@ -360,7 +360,7 @@ def start(): else: message += "\ndo you want to test this URL? [Y/n/q]" - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'N': dataToStdout(os.linesep) @@ -640,7 +640,7 @@ def start(): logger.warn(warnMsg) message = "do you want to skip to the next target in list? [Y/n/q]" - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'N': return False diff --git a/lib/core/common.py b/lib/core/common.py index 61f078bd6..24496b513 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -322,14 +322,14 @@ class Backend: msg += "correct [%s (default)/%s] " % (kb.dbms, dbms) while True: - _ = readInput(msg, default=kb.dbms) + choice = readInput(msg, default=kb.dbms) - if aliasToDbmsEnum(_) == kb.dbms: + if aliasToDbmsEnum(choice) == kb.dbms: kb.dbmsVersion = [] kb.resolutionDbms = kb.dbms break - elif aliasToDbmsEnum(_) == dbms: - kb.dbms = aliasToDbmsEnum(_) + elif aliasToDbmsEnum(choice) == dbms: + kb.dbms = aliasToDbmsEnum(choice) break else: warnMsg = "invalid value" @@ -382,12 +382,12 @@ class Backend: msg += "correct [%s (default)/%s] " % (kb.os, os) while True: - _ = readInput(msg, default=kb.os) + choice = readInput(msg, default=kb.os) - if _ == kb.os: + if choice == kb.os: break - elif _ == os: - kb.os = _.capitalize() + elif choice == os: + kb.os = choice.capitalize() break else: warnMsg = "invalid value" @@ -421,10 +421,10 @@ class Backend: msg += "\n[2] 64-bit" while True: - _ = readInput(msg, default='1') + choice = readInput(msg, default='1') - if isinstance(_, basestring) and _.isdigit() and int(_) in (1, 2): - kb.arch = 32 if int(_) == 1 else 64 + if isinstance(choice, basestring) and choice.isdigit() and int(choice) in (1, 2): + kb.arch = 32 if int(choice) == 1 else 64 break else: warnMsg = "invalid value. Valid values are 1 and 2" @@ -754,17 +754,17 @@ def getManualDirectories(): message += "[2] custom location(s)\n" message += "[3] custom directory list file\n" message += "[4] brute force search" - choice = readInput(message, default="1").strip() + choice = readInput(message, default='1') - if choice == "2": + if choice == '2': message = "please provide a comma separate list of absolute directory paths: " directories = readInput(message, default="").split(',') - elif choice == "3": + elif choice == '3': message = "what's the list file location?\n" listPath = readInput(message, default="") checkFile(listPath) directories = getFileItems(listPath) - elif choice == "4": + elif choice == '4': targets = set([conf.hostname]) _ = conf.hostname.split('.') @@ -1038,8 +1038,11 @@ def readInput(message, default=None, checkBatch=True, boolean=False): finally: logging._releaseLock() + if retVal and default and isinstance(default, basestring) and len(default) == 1: + retVal = retVal.strip() + if boolean: - retVal = retVal.strip().upper == 'Y' + retVal = retVal.strip().upper() == 'Y' return retVal diff --git a/lib/core/option.py b/lib/core/option.py index cca37b2b6..99b13218f 100755 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -944,7 +944,7 @@ def _setTamperingFunctions(): message = "it appears that you might have mixed " message += "the order of tamper scripts. " message += "Do you want to auto resolve this? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'N': resolve_priorities = False diff --git a/lib/core/settings.py b/lib/core/settings.py index 93c45b1f3..d86fa6f9b 100755 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from lib.core.enums import DBMS_DIRECTORY_NAME from lib.core.enums import OS # sqlmap version (...) -VERSION = "1.1.4.37" +VERSION = "1.1.4.38" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/target.py b/lib/core/target.py index 0e183ffe4..43d70b707 100644 --- a/lib/core/target.py +++ b/lib/core/target.py @@ -152,7 +152,7 @@ def _setRequestParams(): elif re.search(JSON_LIKE_RECOGNITION_REGEX, conf.data): message = "JSON-like data found in %s data. " % conf.method message += "Do you want to process it? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -166,7 +166,7 @@ def _setRequestParams(): elif re.search(ARRAY_LIKE_RECOGNITION_REGEX, conf.data): message = "Array-like data found in %s data. " % conf.method message += "Do you want to process it? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -178,7 +178,7 @@ def _setRequestParams(): elif re.search(XML_RECOGNITION_REGEX, conf.data): message = "SOAP/XML data found in %s data. " % conf.method message += "Do you want to process it? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -191,7 +191,7 @@ def _setRequestParams(): elif re.search(MULTIPART_RECOGNITION_REGEX, conf.data): message = "Multipart-like data found in %s data. " % conf.method message += "Do you want to process it? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -228,7 +228,7 @@ def _setRequestParams(): message = "do you want to try URI injections " message += "in the target URL itself? [Y/n/q] " - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException @@ -243,7 +243,7 @@ def _setRequestParams(): lut = {PLACE.URI: '-u', PLACE.CUSTOM_POST: '--data', PLACE.CUSTOM_HEADER: '--headers/--user-agent/--referer/--cookie'} message = "custom injection marking character ('%s') found in option " % CUSTOM_INJECTION_MARK_CHAR message += "'%s'. Do you want to process it? [Y/n/q] " % lut[place] - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'Q': raise SqlmapUserQuitException diff --git a/lib/request/inject.py b/lib/request/inject.py index bc221fb97..c51cdb735 100644 --- a/lib/request/inject.py +++ b/lib/request/inject.py @@ -208,7 +208,7 @@ def _goInferenceProxy(expression, fromUser=False, batch=False, unpack=True, char message += "entries do you want to retrieve?\n" message += "[a] All (default)\n[#] Specific number\n" message += "[q] Quit" - choice = readInput(message, default='A').strip().upper() + choice = readInput(message, default='A').upper() if choice == 'A': stopLimit = count diff --git a/lib/request/redirecthandler.py b/lib/request/redirecthandler.py index ce22fb14f..a6e560bcf 100644 --- a/lib/request/redirecthandler.py +++ b/lib/request/redirecthandler.py @@ -59,7 +59,7 @@ class SmartRedirectHandler(urllib2.HTTPRedirectHandler): msg += "resend original POST data to a new " msg += "location? [%s] " % ("Y/n" if not kb.originalPage else "y/N") - kb.resendPostOnRedirect = readInput(msg, default=("Y" if not kb.originalPage else "N"), boolean=True) + kb.resendPostOnRedirect = readInput(msg, default=('Y' if not kb.originalPage else 'N'), boolean=True) if kb.resendPostOnRedirect: self.redirect_request = self._redirect_request diff --git a/lib/takeover/udf.py b/lib/takeover/udf.py index b5c67bda9..b57d2c81e 100644 --- a/lib/takeover/udf.py +++ b/lib/takeover/udf.py @@ -154,9 +154,8 @@ class UDF: message = "do you want to proceed anyway? Beware that the " message += "operating system takeover will fail [y/N] " - choice = readInput(message, default="N") - if choice and choice.lower() == "y": + if readInput(message, default='N', boolean=True): written = True else: return False @@ -237,9 +236,9 @@ class UDF: msg += "from the shared library? " while True: - udfCount = readInput(msg, default=1) + udfCount = readInput(msg, default='1') - if isinstance(udfCount, basestring) and udfCount.isdigit(): + if udfCount.isdigit(): udfCount = int(udfCount) if udfCount <= 0: @@ -247,10 +246,6 @@ class UDF: return else: break - - elif isinstance(udfCount, int): - break - else: logger.warn("invalid value, only digits are allowed") @@ -272,20 +267,16 @@ class UDF: self.udfs[udfName]["input"] = [] - default = 1 msg = "how many input parameters takes UDF " - msg += "'%s'? (default: %d) " % (udfName, default) + msg += "'%s'? (default: 1) " % udfName while True: - parCount = readInput(msg, default=default) + parCount = readInput(msg, default='1') - if isinstance(parCount, basestring) and parCount.isdigit() and int(parCount) >= 0: + if parCount.isdigit() and int(parCount) >= 0: parCount = int(parCount) break - elif isinstance(parCount, int): - break - else: logger.warn("invalid value, only digits >= 0 are allowed") @@ -294,9 +285,9 @@ class UDF: msg += "number %d? (default: %s) " % ((y + 1), defaultType) while True: - parType = readInput(msg, default=defaultType) + parType = readInput(msg, default=defaultType).strip() - if isinstance(parType, basestring) and parType.isdigit(): + if parType.isdigit(): logger.warn("you need to specify the data-type of the parameter") else: @@ -323,7 +314,7 @@ class UDF: msg = "do you want to call your injected user-defined " msg += "functions now? [Y/n/q] " - choice = readInput(msg, default='Y').strip().upper() + choice = readInput(msg, default='Y').upper() if choice == 'N': self.cleanup(udfDict=self.udfs) @@ -343,7 +334,7 @@ class UDF: msg += "\n[q] Quit" while True: - choice = readInput(msg).strip().upper() + choice = readInput(msg).upper() if choice == 'Q': break diff --git a/lib/utils/hash.py b/lib/utils/hash.py index 065f835a3..c0b47e9c9 100644 --- a/lib/utils/hash.py +++ b/lib/utils/hash.py @@ -482,7 +482,7 @@ def attackDumpedTable(): storeHashesToFile(attack_dict) message = "do you want to crack them via a dictionary-based attack? %s" % ("[y/N/q]" if conf.multipleTargets else "[Y/n/q]") - choice = readInput(message, default='N' if conf.multipleTargets else 'Y').strip().upper() + choice = readInput(message, default='N' if conf.multipleTargets else 'Y').upper() if choice == 'N': return diff --git a/lib/utils/search.py b/lib/utils/search.py index 98dba4b50..ee8fd76f9 100644 --- a/lib/utils/search.py +++ b/lib/utils/search.py @@ -111,11 +111,11 @@ def _search(dork): message += "\n[1] (re)try with DuckDuckGo (default)" message += "\n[2] (re)try with Disconnect Search" message += "\n[3] quit" - choice = readInput(message, default="1").strip().upper() + choice = readInput(message, default='1') - if choice == "Q": + if choice == '3': raise SqlmapUserQuitException - elif choice == "2": + elif choice == '2': url = "https://search.disconnect.me/searchTerms/search?" url += "start=nav&option=Web" url += "&query=%s" % urlencode(dork, convall=True) diff --git a/plugins/dbms/maxdb/enumeration.py b/plugins/dbms/maxdb/enumeration.py index 5152495ab..81b450154 100644 --- a/plugins/dbms/maxdb/enumeration.py +++ b/plugins/dbms/maxdb/enumeration.py @@ -172,7 +172,7 @@ class Enumeration(GenericEnumeration): return kb.data.cachedColumns message = "do you want to use common column existence check? [y/N/q] " - choice = readInput(message, default='Y' if 'Y' in message else 'N').strip().upper() + choice = readInput(message, default='Y' if 'Y' in message else 'N').upper() if choice == 'N': return diff --git a/plugins/dbms/sybase/enumeration.py b/plugins/dbms/sybase/enumeration.py index caad0d2bc..98c025932 100644 --- a/plugins/dbms/sybase/enumeration.py +++ b/plugins/dbms/sybase/enumeration.py @@ -240,7 +240,7 @@ class Enumeration(GenericEnumeration): return kb.data.cachedColumns message = "do you want to use common column existence check? [y/N/q] " - choice = readInput(message, default='Y' if 'Y' in message else 'N').strip().upper() + choice = readInput(message, default='Y' if 'Y' in message else 'N').upper() if choice == 'N': return diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index 4404589f8..ddea7215b 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -243,7 +243,7 @@ class Databases: return kb.data.cachedTables message = "do you want to use common table existence check? %s " % ("[Y/n/q]" if Backend.getIdentifiedDbms() in (DBMS.ACCESS,) else "[y/N/q]") - choice = readInput(message, default='Y' if 'Y' in message else 'N').strip().upper() + choice = readInput(message, default='Y' if 'Y' in message else 'N').upper() if choice == 'N': return @@ -486,7 +486,7 @@ class Databases: return kb.data.cachedColumns message = "do you want to use common column existence check? %s" % ("[Y/n/q]" if Backend.getIdentifiedDbms() in (DBMS.ACCESS,) else "[y/N/q]") - choice = readInput(message, default='Y' if 'Y' in message else 'N').strip().upper() + choice = readInput(message, default='Y' if 'Y' in message else 'N').upper() if choice == 'N': return diff --git a/plugins/generic/fingerprint.py b/plugins/generic/fingerprint.py index 43451f47c..3147b503a 100644 --- a/plugins/generic/fingerprint.py +++ b/plugins/generic/fingerprint.py @@ -45,12 +45,12 @@ class Fingerprint: msg = "do you want to provide the OS? [(W)indows/(l)inux]" while True: - os = readInput(msg, default="W") + os = readInput(msg, default='W').upper() - if os[0].lower() == "w": + if os == 'W': Backend.setOs(OS.WINDOWS) break - elif os[0].lower() == "l": + elif os == 'L': Backend.setOs(OS.LINUX) break else: diff --git a/plugins/generic/search.py b/plugins/generic/search.py index c1570ccd7..69f57d3b1 100644 --- a/plugins/generic/search.py +++ b/plugins/generic/search.py @@ -146,7 +146,7 @@ class Search: if bruteForce: message = "do you want to use common table existence check? %s" % ("[Y/n/q]" if Backend.getIdentifiedDbms() in (DBMS.ACCESS,) else "[y/N/q]") - choice = readInput(message, default='Y' if 'Y' in message else 'N').strip().upper() + choice = readInput(message, default='Y' if 'Y' in message else 'N').upper() if choice == 'N': return diff --git a/plugins/generic/takeover.py b/plugins/generic/takeover.py index 00761cc1a..6d3106862 100644 --- a/plugins/generic/takeover.py +++ b/plugins/generic/takeover.py @@ -96,20 +96,16 @@ class Takeover(Abstraction, Metasploit, ICMPsh, Registry, Miscellaneous): msg = "how do you want to establish the tunnel?" msg += "\n[1] TCP: Metasploit Framework (default)" msg += "\n[2] ICMP: icmpsh - ICMP tunneling" - valids = (1, 2) while True: - tunnel = readInput(msg, default=1) + tunnel = readInput(msg, default='1') - if isinstance(tunnel, basestring) and tunnel.isdigit() and int(tunnel) in valids: + if tunnel.isdigit() and int(tunnel) in (1, 2): tunnel = int(tunnel) break - elif isinstance(tunnel, int) and tunnel in valids: - break - else: - warnMsg = "invalid value, valid values are 1 and 2" + warnMsg = "invalid value, valid values are '1' and '2'" logger.warn(warnMsg) else: tunnel = 1 @@ -170,17 +166,14 @@ class Takeover(Abstraction, Metasploit, ICMPsh, Registry, Miscellaneous): msg += "\n[2] Via shellcodeexec (file system way, preferred on 64-bit systems)" while True: - choice = readInput(msg, default=1) + choice = readInput(msg, default='1') - if isinstance(choice, basestring) and choice.isdigit() and int(choice) in (1, 2): + if choice.isdigit() and int(choice) in (1, 2): choice = int(choice) break - elif isinstance(choice, int) and choice in (1, 2): - break - else: - warnMsg = "invalid value, valid values are 1 and 2" + warnMsg = "invalid value, valid values are '1' and '2'" logger.warn(warnMsg) if choice == 1: @@ -457,9 +450,8 @@ class Takeover(Abstraction, Metasploit, ICMPsh, Registry, Miscellaneous): message = "are you sure that you want to delete the Windows " message += "registry path '%s\%s? [y/N] " % (regKey, regVal) - output = readInput(message, default="N") - if output and output[0] not in ("Y", "y"): + if not readInput(message, default='N', boolean=True): return infoMsg = "deleting Windows registry path '%s\%s'. " % (regKey, regVal) diff --git a/plugins/generic/users.py b/plugins/generic/users.py index 8bbde1648..4ef609b6f 100644 --- a/plugins/generic/users.py +++ b/plugins/generic/users.py @@ -319,7 +319,7 @@ class Users: message = "do you want to perform a dictionary-based attack " message += "against retrieved password hashes? [Y/n/q]" - choice = readInput(message, default='Y').strip().upper() + choice = readInput(message, default='Y').upper() if choice == 'N': pass diff --git a/txt/checksum.md5 b/txt/checksum.md5 index b88270ca6..89523e470 100644 --- a/txt/checksum.md5 +++ b/txt/checksum.md5 @@ -21,13 +21,13 @@ c55b400b72acc43e0e59c87dd8bb8d75 extra/shellcodeexec/windows/shellcodeexec.x32. 310efc965c862cfbd7b0da5150a5ad36 extra/sqlharvest/__init__.py 7713aa366c983cdf1f3dbaa7383ea9e1 extra/sqlharvest/sqlharvest.py 7afe836fd97271ccba67b4c0da2482ff lib/controller/action.py -21c79cf1a79b61c6d90f9bd249f71584 lib/controller/checks.py -adf62498f7f8c8f9af48350d3591e404 lib/controller/controller.py +95fda7f284e0a882634cf5e94cbb73e1 lib/controller/checks.py +df647d57cf02cc0e4bda6b8ccc9d8138 lib/controller/controller.py 52a3969f57170e935e3fc0156335bf2c lib/controller/handler.py 310efc965c862cfbd7b0da5150a5ad36 lib/controller/__init__.py d3b4e1139bf117fe4cf6451d43d8253c lib/core/agent.py 6cc95a117fbd34ef31b9aa25520f0e31 lib/core/bigarray.py -dd39007e2dd0da81c712995a16775d0f lib/core/common.py +d114fe95801c88816fa2eec493c39f01 lib/core/common.py 5065a4242a8cccf72f91e22e1007ae63 lib/core/convert.py a8143dab9d3a27490f7d49b6b29ea530 lib/core/data.py 7936d78b1a7f1f008ff92bf2f88574ba lib/core/datatype.py @@ -40,16 +40,16 @@ b9ff4e622c416116bee6024c0f050349 lib/core/enums.py 310efc965c862cfbd7b0da5150a5ad36 lib/core/__init__.py 9ba39bf66e9ecd469446bdbbeda906c3 lib/core/log.py ebb778c2d26eba8b34d7d8658e4105a6 lib/core/optiondict.py -ede9841e7cbbe841f41588f149e85789 lib/core/option.py +5c8f5d4abbe68fd33e2cd0a5e18eb783 lib/core/option.py 5f2f56e6c5f274408df61943f1e080c0 lib/core/profiling.py 40be71cd774662a7b420caeb7051e7d5 lib/core/readlineng.py d8e9250f3775119df07e9070eddccd16 lib/core/replication.py 785f86e3f963fa3798f84286a4e83ff2 lib/core/revision.py 40c80b28b3a5819b737a5a17d4565ae9 lib/core/session.py -73759e4a4c8395f11e8323a1c6f8dd11 lib/core/settings.py +4f82edf6827d8ee3da5079f40aff8875 lib/core/settings.py d91291997d2bd2f6028aaf371bf1d3b6 lib/core/shell.py 2ad85c130cc5f2b3701ea85c2f6bbf20 lib/core/subprocessng.py -92e35ddfdf0e9676dd51565bcf4fa5cf lib/core/target.py +4edc215f120af6ad352401527ad9e4b3 lib/core/target.py 8970b88627902239d695280b1160e16c lib/core/testing.py 40881e63d516d8304fc19971049cded0 lib/core/threads.py ad74fc58fc7214802fd27067bce18dd2 lib/core/unescaper.py @@ -73,18 +73,18 @@ fb6b788d0016ab4ec5e5f661f0f702ad lib/request/direct.py cc1163d38e9b7ee5db2adac6784c02bb lib/request/dns.py 5dcdb37823a0b5eff65cd1018bcf09e4 lib/request/httpshandler.py 310efc965c862cfbd7b0da5150a5ad36 lib/request/__init__.py -27abed3fa36e256508eeeea0b0bf4458 lib/request/inject.py +70ec3f5bce37cdd7bf085ba2ddda30ac lib/request/inject.py dc1e0af84ee8eb421797d61c8cb8f172 lib/request/methodrequest.py bb9c165b050f7696b089b96b5947fac3 lib/request/pkihandler.py 602d4338a9fceaaee40c601410d8ac0b lib/request/rangehandler.py -40719fa09d3d82b36badf981a8dc175c lib/request/redirecthandler.py +111b3ee936f23167b5654a5f72e9731b lib/request/redirecthandler.py 20a0e6dac2edcf98fa8c47ee9a332c28 lib/request/templates.py 992a02767d12254784f15501a7ab8dd8 lib/takeover/abstraction.py c6bc7961a186baabe0a9f5b7e0d8974b lib/takeover/icmpsh.py 310efc965c862cfbd7b0da5150a5ad36 lib/takeover/__init__.py c90c993b020a6ae0f0e497fd84f37466 lib/takeover/metasploit.py ac541a0d38e4ecb4e41e97799a7235f4 lib/takeover/registry.py -6574edede6a96bbfa281e99dce3fecf9 lib/takeover/udf.py +d466eab3ff82dbe29dc820e303eb4cff lib/takeover/udf.py e7f3012f4f9e822d39eabd934d050b0e lib/takeover/web.py 604b087dc52dbcb4c3938ad1bf63829c lib/takeover/xp_cmdshell.py 9f03972ea5ce2df74d43be5f30f068eb lib/techniques/blind/inference.py @@ -104,13 +104,13 @@ d3da4c7ceaf57c4687a052d58722f6bb lib/techniques/dns/use.py ba12c69a90061aa14d848b8396e79191 lib/utils/deps.py 3b9fd519164e0bf275d5fd361c3f11ff lib/utils/getch.py ccfdad414ce2ec0c394c3deaa39a82bf lib/utils/hashdb.py -7559c3cbfbaaf4812e72c4c7454e31d2 lib/utils/hash.py +ff3b7796590db894a3686b3b67037b37 lib/utils/hash.py e76a08237ee6a4cd6855af79610ea8a5 lib/utils/htmlentities.py 310efc965c862cfbd7b0da5150a5ad36 lib/utils/__init__.py 9d8c858417d356e49e1959ba253aede4 lib/utils/pivotdumptable.py 8520a745c9b4db3814fe46f4c34c6fbc lib/utils/progress.py 2c3638d499f3c01c34187e531f77d004 lib/utils/purge.py -2da1b35339667646e51101adaa1dfc32 lib/utils/search.py +4bd7dd4fc8f299f1566a26ed6c2cefb5 lib/utils/search.py 569521a83b2b6c62497879267b963b21 lib/utils/sqlalchemy.py caeea96ec9c9d489f615f282259b32ca lib/utils/timeout.py 6fa36b9742293756b226cddee11b7d52 lib/utils/versioncheck.py @@ -152,7 +152,7 @@ f06d263b2c9b52ea7a120593eb5806c4 plugins/dbms/informix/fingerprint.py 744fb5044f2b9f9d5ebda6e3f08e3be7 plugins/dbms/informix/takeover.py 310efc965c862cfbd7b0da5150a5ad36 plugins/dbms/__init__.py e50b624ff23c3e180d80e065deb1763f plugins/dbms/maxdb/connector.py -d2d178a98a84a819c3bbb777f8dd0788 plugins/dbms/maxdb/enumeration.py +affabeab69a2c5d4fc66f84b5aeaf24a plugins/dbms/maxdb/enumeration.py 815ea8e7b9bd714d73d9d6c454aff774 plugins/dbms/maxdb/filesystem.py 017c723354eff28188773670d3837c01 plugins/dbms/maxdb/fingerprint.py c03001c1f70e76de39d26241dfcbd033 plugins/dbms/maxdb/__init__.py @@ -194,7 +194,7 @@ ee430d142fa8f9ee571578d0a0916679 plugins/dbms/sqlite/fingerprint.py 4827722159a89652005f49265bb55c43 plugins/dbms/sqlite/syntax.py 02ab8ff465da9dd31ffe6a963c676180 plugins/dbms/sqlite/takeover.py e3e78fab9b5eb97867699f0b20e59b62 plugins/dbms/sybase/connector.py -a9d4bff10fdd2efedc4b35fd2b279eb8 plugins/dbms/sybase/enumeration.py +e98b82180be4fc5bbf4dfe7247afcbfe plugins/dbms/sybase/enumeration.py 62d772c7cd08275e3503304ba90c4e8a plugins/dbms/sybase/filesystem.py deed74334b637767fc9de8f74b37647a plugins/dbms/sybase/fingerprint.py 45436a42c2bb8075e1482a950d993d55 plugins/dbms/sybase/__init__.py @@ -202,17 +202,17 @@ deed74334b637767fc9de8f74b37647a plugins/dbms/sybase/fingerprint.py 654cd5e69cf5e5c644bfa5d284e61206 plugins/dbms/sybase/takeover.py be7481a96214220bcd8f51ca00239bed plugins/generic/connector.py 5390591ca955036d492de11355b52e8f plugins/generic/custom.py -3d6a7dce69bf4df8e3d5790076ba2190 plugins/generic/databases.py +4ad4bccc03256b8f3d21ba4f8f759404 plugins/generic/databases.py 5eae2e0992a719bfce9cf78ed0a0ea2f plugins/generic/entries.py 55802d1d5d65938414c77ccc27731cab plugins/generic/enumeration.py 0d10a0410c416fece51c26a935e68568 plugins/generic/filesystem.py -feca57a968c528a2fe3ccafbc83a17f8 plugins/generic/fingerprint.py +2e397afd83939889d1a7a07893b19ae7 plugins/generic/fingerprint.py 310efc965c862cfbd7b0da5150a5ad36 plugins/generic/__init__.py 84c16ffdf7047831355d1ecc09060e59 plugins/generic/misc.py -7a0b472f3413c28d491a7b2c4bcfd063 plugins/generic/search.py +070f58c52e2a04e7a9896b42b2d17dc2 plugins/generic/search.py 562cfa80a15d5f7f1d52e10c5736d7e2 plugins/generic/syntax.py -3f520f49811197f24a3f223fc995028a plugins/generic/takeover.py -ee2a108effa7737b18c3930a8b9edf5b plugins/generic/users.py +fca9946e960942cc9b22ef26e12b8b3a plugins/generic/takeover.py +156ea264f3f1c7fc18faa251cc1f1a4b plugins/generic/users.py 310efc965c862cfbd7b0da5150a5ad36 plugins/__init__.py b04db3e861edde1f9dd0a3850d5b96c8 shell/backdoor.asp_ 158bfa168128393dde8d6ed11fe9a1b8 shell/backdoor.aspx_