From 862959f27a2e4075c066a4061a78b0feba80a195 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 25 Nov 2019 22:57:44 +0100
Subject: [PATCH 001/159] Minor check
---
lib/core/option.py | 7 +++++++
lib/core/settings.py | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index 526693768..02d740314 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1524,6 +1524,13 @@ def _cleanupOptions():
Cleanup configuration attributes.
"""
+ if conf.encoding:
+ try:
+ codecs.lookup(conf.encoding)
+ except Exception as ex:
+ errMsg = "unknown encoding '%s'" % conf.encoding
+ raise SqlmapValueException(errMsg)
+
debugMsg = "cleaning up configuration parameters"
logger.debug(debugMsg)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 3f4794336..96883a969 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.98"
+VERSION = "1.3.11.99"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 d8e4eede6efa9b37083d7650027eef6f25f5e0c4 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 25 Nov 2019 22:59:22 +0100
Subject: [PATCH 002/159] Minor patch
---
lib/core/option.py | 3 ++-
lib/core/settings.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index 02d740314..7d11c809f 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -7,6 +7,7 @@ See the file 'LICENSE' for copying permission
from __future__ import division
+import codecs
import functools
import glob
import inspect
@@ -1527,7 +1528,7 @@ def _cleanupOptions():
if conf.encoding:
try:
codecs.lookup(conf.encoding)
- except Exception as ex:
+ except LookupError:
errMsg = "unknown encoding '%s'" % conf.encoding
raise SqlmapValueException(errMsg)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 96883a969..8db6b6300 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.99"
+VERSION = "1.3.11.100"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 adf713d18c41ca6677d38f03e9b2c0363bf48a0f Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 25 Nov 2019 23:47:29 +0100
Subject: [PATCH 003/159] Minor update
---
lib/core/settings.py | 2 +-
lib/core/testing.py | 5 +++--
lib/techniques/blind/inference.py | 5 +++++
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 8db6b6300..1c0bc4198 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.100"
+VERSION = "1.3.11.101"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 99a280dce..7ef9e72de 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -65,14 +65,15 @@ def vulnTest():
TESTS = (
("-r --flush-session", ("CloudFlare",)),
- ("-u --flush-session --forms --crawl=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3")),
+ ("-u --flush-session --encoding=ascii --forms --crawl=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3")),
("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3")),
("-u --flush-session --data='' --union-char=1 --mobile --banner --smart", ("might be injectable", "Payload: --flush-session --method=PUT --data='a=1&b=2&c=3&id=1' --skip-static --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
("-u --flush-session -H 'id: 1*' --tables", ("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 --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", ("NULL connection is supported with HEAD method", "banner: '3")),
- ("-u --flush-session --parse-errors --test-filter=\"subquery\" --eval=\"id2=2\" --referer=\"localhost\"", ("might be injectable", ": syntax error", "back-end DBMS: SQLite", "WHERE or HAVING clause (subquery")),
+ ("-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 --flush-session --all", ("5 entries", "Type: boolean-based blind", "Type: time-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")),
diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py
index cd6289b88..28eb23511 100644
--- a/lib/techniques/blind/inference.py
+++ b/lib/techniques/blind/inference.py
@@ -37,6 +37,7 @@ from lib.core.enums import CHARSET_TYPE
from lib.core.enums import DBMS
from lib.core.enums import PAYLOAD
from lib.core.exception import SqlmapThreadException
+from lib.core.exception import SqlmapUnsupportedFeatureException
from lib.core.settings import CHAR_INFERENCE_MARK
from lib.core.settings import INFERENCE_BLANK_BREAK
from lib.core.settings import INFERENCE_EQUALS_CHAR
@@ -425,6 +426,10 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None
else:
return None
else:
+ if "'%s'" % CHAR_INFERENCE_MARK in payload and conf.charset:
+ errMsg = "option '--charset' is not supported on '%s'" % Backend.getIdentifiedDbms()
+ raise SqlmapUnsupportedFeatureException(errMsg)
+
candidates = list(originalTbl)
bit = 0
while len(candidates) > 1:
From 6823971442a24e85e5dcb348c0319d7f3b34c4a0 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 26 Nov 2019 13:18:21 +0100
Subject: [PATCH 004/159] Minor patch
---
lib/core/settings.py | 2 +-
lib/request/redirecthandler.py | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 1c0bc4198..27e05ec7c 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.101"
+VERSION = "1.3.11.102"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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/redirecthandler.py b/lib/request/redirecthandler.py
index e7889941f..daf27fbd5 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -74,10 +74,8 @@ class SmartRedirectHandler(_urllib.request.HTTPRedirectHandler):
try:
content = fp.read(MAX_CONNECTION_TOTAL_SIZE)
- except Exception as ex:
- dbgMsg = "there was a problem while retrieving "
- dbgMsg += "redirect response content ('%s')" % getSafeExString(ex)
- logger.debug(dbgMsg)
+ except: # e.g. IncompleteRead
+ content = ""
finally:
if content:
try: # try to write it back to the read buffer so we could reuse it in further steps
From 04708c6d1aa1b3eff55728c8778d010023486d2a Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 26 Nov 2019 13:36:06 +0100
Subject: [PATCH 005/159] Minor improvement
---
lib/controller/action.py | 5 ++++-
lib/core/settings.py | 2 +-
lib/core/testing.py | 2 +-
plugins/generic/custom.py | 9 +++------
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib/controller/action.py b/lib/controller/action.py
index 6ae232373..40ea3f26e 100644
--- a/lib/controller/action.py
+++ b/lib/controller/action.py
@@ -181,7 +181,10 @@ def action():
raise
if conf.sqlQuery:
- conf.dumper.sqlQuery(conf.sqlQuery, conf.dbmsHandler.sqlQuery(conf.sqlQuery))
+ for query in conf.sqlQuery.strip(';').split(';'):
+ query = query.strip()
+ if query:
+ conf.dumper.sqlQuery(query, conf.dbmsHandler.sqlQuery(query))
if conf.sqlShell:
conf.dbmsHandler.sqlShell()
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 27e05ec7c..6c8c5eb85 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.102"
+VERSION = "1.3.11.103"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 7ef9e72de..65e2b037c 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -80,7 +80,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 users --binary-fields=name --where \"id=3\"", ("7775", "179ad45c6ce2cb97cf1029e212046e81 (testpass)",)),
- ("-d --flush-session --banner --schema --sql-query=\"SELECT 987654321\"", ("banner: '3", "INTEGER", "TEXT", "id", "name", "surname", "[*] 987654321",)),
+ ("-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",)),
)
retVal = True
diff --git a/plugins/generic/custom.py b/plugins/generic/custom.py
index 7fb200d30..41860b569 100644
--- a/plugins/generic/custom.py
+++ b/plugins/generic/custom.py
@@ -61,16 +61,13 @@ class Custom(object):
return None
else:
if sqlType:
- debugMsg = "executing %s query: '%s'" % (sqlType if sqlType is not None else "SQL", query)
+ infoMsg = "executing %s statement: '%s'" % (sqlType if sqlType is not None else "SQL", query)
else:
- debugMsg = "executing unknown SQL type query: '%s'" % query
- logger.debug(debugMsg)
+ infoMsg = "executing unknown SQL command: '%s'" % query
+ logger.info(infoMsg)
inject.goStacked(query)
- debugMsg = "done"
- logger.debug(debugMsg)
-
output = NULL
except SqlmapNoneDataException as ex:
From db2e74a81026355f25f895369f207bdf37d51a3b Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 26 Nov 2019 13:51:08 +0100
Subject: [PATCH 006/159] Minor patch
---
lib/controller/checks.py | 2 +-
lib/core/settings.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/controller/checks.py b/lib/controller/checks.py
index f0630ec89..e61b7ae06 100644
--- a/lib/controller/checks.py
+++ b/lib/controller/checks.py
@@ -600,7 +600,7 @@ def checkSqlInjection(place, parameter, value):
if candidates:
candidates = sorted(candidates, key=len)
for candidate in candidates:
- if re.match(r"\A\w+\Z", candidate):
+ if re.match(r"\A\w{2,}\Z", candidate): # Note: length of 1 (e.g. --string=5) could cause trouble, especially in error message pages with partially reflected payload content
break
conf.string = candidate
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 6c8c5eb85..1bf19c488 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.103"
+VERSION = "1.3.11.104"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 78a557356344d7f2469bd3f1fd192c789a56a210 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 26 Nov 2019 14:03:22 +0100
Subject: [PATCH 007/159] Just in case patch
---
lib/controller/checks.py | 3 +++
lib/core/settings.py | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/controller/checks.py b/lib/controller/checks.py
index e61b7ae06..02d8989ed 100644
--- a/lib/controller/checks.py
+++ b/lib/controller/checks.py
@@ -930,6 +930,9 @@ def checkFalsePositives(injection):
randInt1 = min(randInt1, randInt2, randInt3)
randInt3 = max(randInt1, randInt2, randInt3)
+ if conf.string and any(conf.string in getUnicode(_) for _ in (randInt1, randInt2, randInt3)):
+ continue
+
if randInt3 > randInt2 > randInt1:
break
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 1bf19c488..15526e2cf 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.104"
+VERSION = "1.3.11.105"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 6ab1cf8caae829d02e3d42101f77e5b4d4c8d1de Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 26 Nov 2019 16:22:23 +0100
Subject: [PATCH 008/159] Minor cleanup
---
extra/vulnserver/vulnserver.py | 2 --
lib/core/settings.py | 2 +-
lib/request/httpshandler.py | 1 -
lib/request/redirecthandler.py | 1 -
lib/utils/crawler.py | 1 -
5 files changed, 1 insertion(+), 6 deletions(-)
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index d70f52f17..401d77c47 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -17,7 +17,6 @@ import threading
import traceback
if sys.version_info >= (3, 0):
- from http.client import FOUND
from http.client import INTERNAL_SERVER_ERROR
from http.client import NOT_FOUND
from http.client import OK
@@ -29,7 +28,6 @@ if sys.version_info >= (3, 0):
else:
from BaseHTTPServer import BaseHTTPRequestHandler
from BaseHTTPServer import HTTPServer
- from httplib import FOUND
from httplib import INTERNAL_SERVER_ERROR
from httplib import NOT_FOUND
from httplib import OK
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 15526e2cf..aa62de0ca 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.105"
+VERSION = "1.3.11.106"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 ff08ea3a2..dd12c13db 100644
--- a/lib/request/httpshandler.py
+++ b/lib/request/httpshandler.py
@@ -11,7 +11,6 @@ import socket
from lib.core.common import filterNone
from lib.core.common import getSafeExString
-from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.exception import SqlmapConnectionException
diff --git a/lib/request/redirecthandler.py b/lib/request/redirecthandler.py
index daf27fbd5..b74665108 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -10,7 +10,6 @@ import time
import types
from lib.core.common import getHostHeader
-from lib.core.common import getSafeExString
from lib.core.common import logHTTPTraffic
from lib.core.common import readInput
from lib.core.convert import getUnicode
diff --git a/lib/utils/crawler.py b/lib/utils/crawler.py
index d99b51fcb..f88e33bef 100644
--- a/lib/utils/crawler.py
+++ b/lib/utils/crawler.py
@@ -28,7 +28,6 @@ from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.datatype import OrderedSet
-from lib.core.enums import HTTPMETHOD
from lib.core.enums import MKSTEMP_PREFIX
from lib.core.exception import SqlmapConnectionException
from lib.core.exception import SqlmapSyntaxException
From ce6573304357fbd887b732f2b0e7262dd0f630ca Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 27 Nov 2019 12:09:51 +0100
Subject: [PATCH 009/159] Minor patch (problem reported via email)
---
lib/core/settings.py | 5 ++++-
lib/techniques/union/test.py | 4 ++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index aa62de0ca..03664d18f 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.106"
+VERSION = "1.3.11.107"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
@@ -601,6 +601,9 @@ PARSE_HEADERS_LIMIT = 3
# Step used in ORDER BY technique used for finding the right number of columns in UNION query injections
ORDER_BY_STEP = 10
+# Maximum value used in ORDER BY technique used for finding the right number of columns in UNION query injections
+ORDER_BY_MAX = 1000
+
# Maximum number of times for revalidation of a character in inference (as required)
MAX_REVALIDATION_STEPS = 5
diff --git a/lib/techniques/union/test.py b/lib/techniques/union/test.py
index 5e223575d..30b58c94b 100644
--- a/lib/techniques/union/test.py
+++ b/lib/techniques/union/test.py
@@ -38,6 +38,7 @@ from lib.core.settings import MIN_RATIO
from lib.core.settings import MIN_STATISTICAL_RANGE
from lib.core.settings import MIN_UNION_RESPONSES
from lib.core.settings import NULL
+from lib.core.settings import ORDER_BY_MAX
from lib.core.settings import ORDER_BY_STEP
from lib.core.settings import UNION_MIN_RESPONSE_CHARS
from lib.core.settings import UNION_STDEV_COEFF
@@ -74,6 +75,9 @@ def _findUnionCharCount(comment, place, parameter, value, prefix, suffix, where=
if not conf.uCols and _orderByTest(highCols):
lowCols = highCols
highCols += ORDER_BY_STEP
+
+ if highCols > ORDER_BY_MAX:
+ break
else:
while not found:
mid = highCols - (highCols - lowCols) // 2
From 47d2cf0c6ce543b72c8937bbbf163e1634c99dc8 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 27 Nov 2019 23:26:39 +0100
Subject: [PATCH 010/159] Some more tests
---
lib/core/settings.py | 4 ++--
lib/core/testing.py | 22 ++++++++++++++++------
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 03664d18f..a2f435bd6 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.107"
+VERSION = "1.3.11.108"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
@@ -382,7 +382,7 @@ WEBSCARAB_SPLITTER = "### Conversation"
BURP_REQUEST_REGEX = r"={10,}\s+([A-Z]{3,} .+?)\s+={10,}"
# Regex used for parsing XML Burp saved history items
-BURP_XML_HISTORY_REGEX = r'(\d+).+?(\d+).*? --flush-session", ("CloudFlare",)),
- ("-u --flush-session --encoding=ascii --forms --crawl=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3")),
+ ("--list-tampers", ("between", "MySQL", "xforwardedfor")),
+ ("-r --flush-session", ("CloudFlare", "possible DBMS: 'SQLite'")),
+ ("-l --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3", "ORDER BY term out of range", "~xp_cmdshell")),
+ ("-l --offline --banner -v 5", ("banner: '3", "~[TRAFFIC OUT]")),
+ ("-u --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3")),
("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3")),
- ("-u --flush-session --data='' --union-char=1 --mobile --banner --smart", ("might be injectable", "Payload: --flush-session --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session --method=PUT --data='a=1&b=2&c=3&id=1' --skip-static --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
("-u --flush-session -H 'id: 1*' --tables", ("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 --test-filter='OR boolean' --tamper=space2dash", ("banner: '3", " LIKE ")),
@@ -113,7 +117,13 @@ def vulnTest():
handle, request = tempfile.mkstemp(suffix=".req")
os.close(handle)
- open(request, "w+").write("POST / HTTP/1.0\nHost: %s:%s\n\nid=1\n" % (address, port))
+ handle, log = tempfile.mkstemp(suffix=".log")
+ os.close(handle)
+
+ content = "POST / HTTP/1.0\nHost: %s:%s\n\nid=1\n" % (address, port)
+
+ open(request, "w+").write(content)
+ open(log, "w+").write('%d' % (port, encodeBase64(content, binary=False)))
url = "http://%s:%d/?id=1" % (address, port)
direct = "sqlite3://%s" % database
@@ -122,10 +132,10 @@ def vulnTest():
status = '%d/%d (%d%%) ' % (count, len(TESTS), round(100.0 * count / len(TESTS)))
dataToStdout("\r[%s] [INFO] complete: %s" % (time.strftime("%X"), status))
- cmd = "%s %s %s --batch" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), options.replace("", url).replace("", direct).replace("", request))
+ cmd = "%s %s %s --batch" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), options.replace("", url).replace("", direct).replace("", request).replace("", log))
output = shellExec(cmd)
- if not all(check in output for check in checks):
+ if not all((check in output if not check.startswith('~') else check[1:] not in output) for check in checks):
dataToStdout("---\n\n$ %s\n" % cmd)
dataToStdout("%s---\n" % clearColors(output))
retVal = False
From 03728a4f20c90a828b115cc31bcce6f22191af15 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 27 Nov 2019 23:40:36 +0100
Subject: [PATCH 011/159] Bug fix (--common-columns on SQLite)
---
lib/core/common.py | 8 ++++----
lib/core/settings.py | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index 21c9845e2..eb3e86730 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -4068,9 +4068,9 @@ def safeSQLIdentificatorNaming(name, isTable=False):
if retVal.upper() in kb.keywords or (retVal or " ")[0].isdigit() or not re.match(r"\A[A-Za-z0-9_@%s\$]+\Z" % ('.' if _ else ""), retVal): # MsSQL is the only DBMS where we automatically prepend schema to table name (dot is normal)
retVal = unsafeSQLIdentificatorNaming(retVal)
- if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS):
+ if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, 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.SQLITE, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX):
+ elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX):
retVal = "\"%s\"" % retVal
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE,):
retVal = "\"%s\"" % retVal.upper()
@@ -4106,9 +4106,9 @@ def unsafeSQLIdentificatorNaming(name):
retVal = name
if isinstance(name, six.string_types):
- if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS):
+ if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.SQLITE):
retVal = name.replace("`", "")
- elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.SQLITE, DBMS.INFORMIX, DBMS.HSQLDB):
+ elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.INFORMIX, DBMS.HSQLDB):
retVal = name.replace("\"", "")
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE,):
retVal = name.replace("\"", "").upper()
diff --git a/lib/core/settings.py b/lib/core/settings.py
index a2f435bd6..f90455ac8 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.108"
+VERSION = "1.3.11.109"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 989915b91c8ef2f9ea28c5b646303dfc28601ecb Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 28 Nov 2019 00:02:08 +0100
Subject: [PATCH 012/159] Bug fix (type detection in SQLite --common-columns)
---
lib/core/settings.py | 2 +-
lib/utils/brute.py | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index f90455ac8..006443357 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.109"
+VERSION = "1.3.11.110"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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/brute.py b/lib/utils/brute.py
index 7a004d261..4b75a0b5d 100644
--- a/lib/utils/brute.py
+++ b/lib/utils/brute.py
@@ -289,6 +289,8 @@ def columnExists(columnFile, regex=None):
for column in threadData.shared.files:
if Backend.getIdentifiedDbms() in (DBMS.MYSQL,):
result = not inject.checkBooleanExpression("%s" % safeStringFormat("EXISTS(SELECT %s FROM %s WHERE %s REGEXP '[^0-9]')", (column, table, column)))
+ elif Backend.getIdentifiedDbms() in (DBMS.SQLITE,):
+ result = inject.checkBooleanExpression("%s" % safeStringFormat("EXISTS(SELECT %s FROM %s WHERE %s NOT GLOB '*[^0-9]*')", (column, table, column)))
else:
result = inject.checkBooleanExpression("%s" % safeStringFormat("EXISTS(SELECT %s FROM %s WHERE ROUND(%s)=ROUND(%s))", (column, table, column, column)))
From 7731c6c135a1cd2ab147e00e05ec1a0d1a73bba7 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 28 Nov 2019 00:29:42 +0100
Subject: [PATCH 013/159] Minor patch
---
lib/core/dump.py | 2 --
lib/core/settings.py | 2 +-
lib/core/testing.py | 20 ++++++++++----------
3 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/lib/core/dump.py b/lib/core/dump.py
index 31ca30326..c9c06f672 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -137,8 +137,6 @@ class Dump(object):
self._write("%s:\n---\n%s\n---" % (header, _))
else:
self._write("%s: %s" % (header, ("'%s'" % _) if isinstance(data, six.string_types) else _))
- else:
- self._write("%s:\tNone" % header)
def lister(self, header, elements, content_type=None, sort=True):
if elements and sort:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 006443357..939cee8e7 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.110"
+VERSION = "1.3.11.111"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 8da1bdd47..9606fc66a 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -67,24 +67,24 @@ def vulnTest():
TESTS = (
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
("-r --flush-session", ("CloudFlare", "possible DBMS: 'SQLite'")),
- ("-l --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3", "ORDER BY term out of range", "~xp_cmdshell")),
- ("-l --offline --banner -v 5", ("banner: '3", "~[TRAFFIC OUT]")),
- ("-u --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3")),
- ("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3")),
- ("-u --flush-session --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell")),
+ ("-l --offline --banner -v 5", ("banner: '3.", "~[TRAFFIC OUT]")),
+ ("-u --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3.")),
+ ("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3.")),
+ ("-u --flush-session --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session --method=PUT --data='a=1&b=2&c=3&id=1' --skip-static --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
("-u --flush-session -H 'id: 1*' --tables", ("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 --test-filter='OR boolean' --tamper=space2dash", ("banner: '3", " LIKE ")),
+ ("-u --flush-session --banner --invalid-logical --technique=B --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", ("NULL connection is supported with HEAD method", "banner: '3")),
+ ("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner", ("NULL connection is supported with HEAD method", "banner: '3.")),
("-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 --banner --schema --dump -T users --binary-fields=surname --where \"id>3\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "2 entries", "6E616D6569736E756C6C")),
("-u --flush-session --all", ("5 entries", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "luther", "blisset", "fluffy", "179ad45c6ce2cb97cf1029e212046e81", "NULL", "nameisnull", "testpass")),
("-u -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")),
+ ("-u '&query=*' --flush-session --technique=Q --banner", ("Title: SQLite inline queries", "banner: '3.")),
("-d --flush-session --dump -T users --binary-fields=name --where \"id=3\"", ("7775", "179ad45c6ce2cb97cf1029e212046e81 (testpass)",)),
- ("-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=5; SELECT * FROM users; SELECT 987654321\"", ("banner: '3.", "INTEGER", "TEXT", "id", "name", "surname", "5, foobar, nameisnull", "[*] 987654321",)),
)
retVal = True
From 1bfb9efb91aae37d689dbef41b0d4ae090fd218c Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 28 Nov 2019 13:41:02 +0100
Subject: [PATCH 014/159] Minor patch
---
lib/core/settings.py | 2 +-
lib/utils/deps.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 939cee8e7..6670291c9 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.111"
+VERSION = "1.3.11.112"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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/deps.py b/lib/utils/deps.py
index aec75c9cb..3df3e11e0 100644
--- a/lib/utils/deps.py
+++ b/lib/utils/deps.py
@@ -81,7 +81,7 @@ def checkDependencies():
missing_libraries.add('python-ntlm')
try:
- __import__("websocket.ABNF")
+ __import__("websocket._abnf")
debugMsg = "'websocket-client' library is found"
logger.debug(debugMsg)
except ImportError:
From c028fb900385b06951f2aa1354b671a1a54a2d0c Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 28 Nov 2019 13:53:47 +0100
Subject: [PATCH 015/159] Patch for websocket (with multiple recv requirement)
---
lib/core/option.py | 1 +
lib/core/settings.py | 5 ++++-
lib/request/connect.py | 20 ++++++++++++++++++--
3 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index 7d11c809f..bc7e8572e 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2006,6 +2006,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
kb.uChar = NULL
kb.udfFail = False
kb.unionDuplicates = False
+ kb.webSocketRecvCount = None
kb.wizardMode = False
kb.xpCmdshellAvailable = False
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 6670291c9..07f78bb7d 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.112"
+VERSION = "1.3.11.113"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
@@ -232,6 +232,9 @@ STDIN_PIPE_DASH = '-'
# URL used in dummy runs
DUMMY_URL = "http://foo/bar?id=1"
+# Timeout used during initial websocket (pull) testing
+WEBSOCKET_INITIAL_TIMEOUT = 3
+
# The name of the operating system dependent module imported. The following names have currently been registered: 'posix', 'nt', 'mac', 'os2', 'ce', 'java', 'riscos'
PLATFORM = os.name
PYVERSION = sys.version.split()[0]
diff --git a/lib/request/connect.py b/lib/request/connect.py
index 649fe5fc8..f8bed48a6 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -119,6 +119,7 @@ from lib.core.settings import UNENCODED_ORIGINAL_VALUE
from lib.core.settings import UNICODE_ENCODING
from lib.core.settings import URI_HTTP_HEADER
from lib.core.settings import WARN_TIME_STDEV
+from lib.core.settings import WEBSOCKET_INITIAL_TIMEOUT
from lib.request.basic import decodePage
from lib.request.basic import forgeHeaders
from lib.request.basic import processResponse
@@ -451,10 +452,25 @@ class Connect(object):
if webSocket:
ws = websocket.WebSocket()
- ws.settimeout(timeout)
+ ws.settimeout(WEBSOCKET_INITIAL_TIMEOUT if kb.webSocketRecvCount is None else timeout)
ws.connect(url, header=("%s: %s" % _ for _ in headers.items() if _[0] not in ("Host",)), cookie=cookie) # WebSocket will add Host field of headers automatically
ws.send(urldecode(post or ""))
- page = ws.recv()
+
+ _page = []
+
+ if kb.webSocketRecvCount is None:
+ while True:
+ try:
+ _page.append(ws.recv())
+ except websocket.WebSocketTimeoutException:
+ kb.webSocketRecvCount = len(_page)
+ break
+ else:
+ for i in xrange(max(1, kb.webSocketRecvCount)):
+ _page.append(ws.recv())
+
+ page = "\n".join(_page)
+
ws.close()
code = ws.status
status = _http_client.responses[code]
From fddc81876441d4f9c0b2d6338679467a495557ee Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 29 Nov 2019 22:03:16 +0100
Subject: [PATCH 016/159] New tests
---
lib/core/settings.py | 2 +-
lib/core/testing.py | 7 ++++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 07f78bb7d..16320f006 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.113"
+VERSION = "1.3.11.114"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 9606fc66a..de1764c0a 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -66,12 +66,12 @@ def vulnTest():
TESTS = (
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
- ("-r --flush-session", ("CloudFlare", "possible DBMS: 'SQLite'")),
+ ("-r --flush-session -v 5", ("CloudFlare", "possible DBMS: 'SQLite'", "User-agent: foobar")),
("-l --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell")),
("-l --offline --banner -v 5", ("banner: '3.", "~[TRAFFIC OUT]")),
("-u --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3.")),
("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3.")),
- ("-u --flush-session --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session -H 'Foo: Bar' -H 'Sna: Fu' --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session --method=PUT --data='a=1&b=2&c=3&id=1' --skip-static --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
("-u --flush-session -H 'id: 1*' --tables", ("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 --test-filter='OR boolean' --tamper=space2dash", ("banner: '3.", " LIKE ")),
@@ -79,6 +79,7 @@ def vulnTest():
("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner", ("NULL connection is supported with HEAD method", "banner: '3.")),
("-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 --answer=\"crack=n\" -v 3", ("performed 6 queries", "nameisnull", "~using default dictionary")),
("-u --flush-session --all", ("5 entries", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "luther", "blisset", "fluffy", "179ad45c6ce2cb97cf1029e212046e81", "NULL", "nameisnull", "testpass")),
("-u -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",)),
@@ -120,7 +121,7 @@ def vulnTest():
handle, log = tempfile.mkstemp(suffix=".log")
os.close(handle)
- content = "POST / HTTP/1.0\nHost: %s:%s\n\nid=1\n" % (address, port)
+ content = "POST / HTTP/1.0\nUser-agent: foobar\nHost: %s:%s\n\nid=1\n" % (address, port)
open(request, "w+").write(content)
open(log, "w+").write('%d' % (port, encodeBase64(content, binary=False)))
From c1f98d07c1ab1b20e282d6fcbd3b764aca9d6a8a Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sat, 30 Nov 2019 04:42:38 +0100
Subject: [PATCH 017/159] Couple of important patches
---
data/xml/queries.xml | 6 +++++-
extra/vulnserver/vulnserver.py | 6 ++++--
lib/core/common.py | 8 ++++++--
lib/core/settings.py | 2 +-
lib/core/testing.py | 2 ++
plugins/generic/syntax.py | 4 +++-
6 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/data/xml/queries.xml b/data/xml/queries.xml
index 7a8592438..d2ac995be 100644
--- a/data/xml/queries.xml
+++ b/data/xml/queries.xml
@@ -3,7 +3,8 @@
-
+
+
@@ -242,6 +243,9 @@
+
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index 401d77c47..d1f954b1f 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -16,7 +16,9 @@ import sys
import threading
import traceback
-if sys.version_info >= (3, 0):
+PY3 = sys.version_info >= (3, 0)
+
+if PY3:
from http.client import INTERNAL_SERVER_ERROR
from http.client import NOT_FOUND
from http.client import OK
@@ -169,7 +171,7 @@ class ReqHandler(BaseHTTPRequestHandler):
self.end_headers()
else:
self.end_headers()
- self.wfile.write(output.encode("utf8"))
+ self.wfile.write(output.encode("utf8") if PY3 else output)
else:
self.send_response(NOT_FOUND)
self.send_header("Connection", "close")
diff --git a/lib/core/common.py b/lib/core/common.py
index eb3e86730..944c208c3 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -3617,16 +3617,20 @@ def decodeIntToUnicode(value):
try:
if value > 255:
_ = "%x" % value
+
if len(_) % 2 == 1:
_ = "0%s" % _
+
raw = decodeHex(_)
if Backend.isDbms(DBMS.MYSQL):
+ # Reference: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_ord
# Note: https://github.com/sqlmapproject/sqlmap/issues/1531
retVal = getUnicode(raw, conf.encoding or UNICODE_ENCODING)
elif Backend.isDbms(DBMS.MSSQL):
- retVal = getUnicode(raw, "UTF-16-BE") # References: https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017 and https://stackoverflow.com/a/14488478
- elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE):
+ # Reference: https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017 and https://stackoverflow.com/a/14488478
+ retVal = getUnicode(raw, "UTF-16-BE")
+ elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE): # Note: cases with Unicode code points (e.g. http://www.postgresqltutorial.com/postgresql-ascii/)
retVal = _unichr(value)
else:
retVal = getUnicode(raw, conf.encoding)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 16320f006..032854bc6 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.114"
+VERSION = "1.3.11.115"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 de1764c0a..db1c8712a 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -65,6 +65,8 @@ def vulnTest():
"""
TESTS = (
+ (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'",)),
+ (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape", (u": '\u0161u\u0107uraj'",)),
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
("-r --flush-session -v 5", ("CloudFlare", "possible DBMS: 'SQLite'", "User-agent: foobar")),
("-l --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell")),
diff --git a/plugins/generic/syntax.py b/plugins/generic/syntax.py
index fcbaf4adc..5a5b1e0e1 100644
--- a/plugins/generic/syntax.py
+++ b/plugins/generic/syntax.py
@@ -7,8 +7,10 @@ See the file 'LICENSE' for copying permission
import re
+from lib.core.common import Backend
from lib.core.convert import getBytes
from lib.core.data import conf
+from lib.core.enums import DBMS
from lib.core.exception import SqlmapUndefinedMethod
class Syntax(object):
@@ -31,7 +33,7 @@ class Syntax(object):
if replacement != original:
retVal = retVal.replace(item, replacement)
- elif len(original) != len(getBytes(original)) and "n'%s'" % original not in retVal:
+ elif len(original) != len(getBytes(original)) and "n'%s'" % original not in retVal and Backend.getDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.ORACLE, DBMS.MSSQL):
retVal = retVal.replace("'%s'" % original, "n'%s'" % original)
else:
retVal = escaper(expression)
From 04ce6ba91b7d772d1496f5f79c0d6d219dd3c702 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sat, 30 Nov 2019 11:14:41 +0100
Subject: [PATCH 018/159] Minor patch
---
extra/vulnserver/vulnserver.py | 9 +++++----
lib/core/settings.py | 2 +-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index d1f954b1f..22fc1df1c 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -17,6 +17,7 @@ import threading
import traceback
PY3 = sys.version_info >= (3, 0)
+UNICODE_ENCODING = "utf-8"
if PY3:
from http.client import INTERNAL_SERVER_ERROR
@@ -96,7 +97,7 @@ class ReqHandler(BaseHTTPRequestHandler):
self.send_response(INTERNAL_SERVER_ERROR)
self.send_header("Connection", "close")
self.end_headers()
- self.wfile.write("CLOUDFLARE_ERROR_500S_BOX".encode("utf8"))
+ self.wfile.write("CLOUDFLARE_ERROR_500S_BOX".encode(UNICODE_ENCODING))
return
if hasattr(self, "data"):
@@ -127,7 +128,7 @@ class ReqHandler(BaseHTTPRequestHandler):
if not any(_ in self.params for _ in ("id", "query")):
self.send_response(OK)
- self.send_header("Content-type", "text/html")
+ self.send_header("Content-type", "text/html; charset=%s" % UNICODE_ENCODING)
self.send_header("Connection", "close")
self.end_headers()
self.wfile.write(b"GET:
link
POST:
")
@@ -171,7 +172,7 @@ class ReqHandler(BaseHTTPRequestHandler):
self.end_headers()
else:
self.end_headers()
- self.wfile.write(output.encode("utf8") if PY3 else output)
+ self.wfile.write(quote(output if isinstance(output, bytes) else output.encode(UNICODE_ENCODING)))
else:
self.send_response(NOT_FOUND)
self.send_header("Connection", "close")
@@ -190,7 +191,7 @@ class ReqHandler(BaseHTTPRequestHandler):
length = int(self.headers.get("Content-length", 0))
if length:
data = self.rfile.read(length)
- data = unquote_plus(data.decode("utf8"))
+ data = unquote_plus(data.decode(UNICODE_ENCODING))
self.data = data
self.do_REQUEST()
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 032854bc6..218b8ab73 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.115"
+VERSION = "1.3.11.116"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 1233573df175e45963a2d6469e5db9f3ee45dc8c Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sat, 30 Nov 2019 11:25:38 +0100
Subject: [PATCH 019/159] Removing leftover
---
extra/vulnserver/vulnserver.py | 2 +-
lib/core/settings.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index 22fc1df1c..3e2345076 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -172,7 +172,7 @@ class ReqHandler(BaseHTTPRequestHandler):
self.end_headers()
else:
self.end_headers()
- self.wfile.write(quote(output if isinstance(output, bytes) else output.encode(UNICODE_ENCODING)))
+ self.wfile.write(output if isinstance(output, bytes) else output.encode(UNICODE_ENCODING))
else:
self.send_response(NOT_FOUND)
self.send_header("Connection", "close")
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 218b8ab73..9fa6825f4 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.116"
+VERSION = "1.3.11.117"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 f947c5f76e939415724da47142e3dadb47ac9b00 Mon Sep 17 00:00:00 2001
From: raimundmuc
Date: Sat, 30 Nov 2019 22:48:34 +0100
Subject: [PATCH 020/159] Fix regression introduced by b3cdec5 (#4022)
---
plugins/dbms/postgresql/filesystem.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/dbms/postgresql/filesystem.py b/plugins/dbms/postgresql/filesystem.py
index 41d5ebb3d..d21ebf1ec 100644
--- a/plugins/dbms/postgresql/filesystem.py
+++ b/plugins/dbms/postgresql/filesystem.py
@@ -32,7 +32,7 @@ class Filesystem(GenericFilesystem):
return self.udfEvalCmd(cmd=remoteFile, udfName="sys_fileread")
- def writeFile(self, localFile, remoteFile, fileType=None, forceCheck=False):
+ def unionWriteFile(self, localFile, remoteFile, fileType=None, forceCheck=False):
errMsg = "PostgreSQL does not support file upload with UNION "
errMsg += "query SQL injection technique"
raise SqlmapUnsupportedFeatureException(errMsg)
From 20d875a8cea906c0cb94b180d7a3557520cc4057 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sat, 30 Nov 2019 23:10:20 +0100
Subject: [PATCH 021/159] Fixes #4020
---
lib/controller/checks.py | 3 ++-
lib/core/common.py | 2 +-
lib/core/convert.py | 7 ++++++-
lib/core/settings.py | 2 +-
4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/lib/controller/checks.py b/lib/controller/checks.py
index 02d8989ed..fab3f29e9 100644
--- a/lib/controller/checks.py
+++ b/lib/controller/checks.py
@@ -45,6 +45,7 @@ from lib.core.common import unArrayizeValue
from lib.core.common import wasLastResponseDBMSError
from lib.core.common import wasLastResponseHTTPError
from lib.core.compat import xrange
+from lib.core.convert import getBytes
from lib.core.convert import getUnicode
from lib.core.data import conf
from lib.core.data import kb
@@ -788,7 +789,7 @@ def checkSqlInjection(place, parameter, value):
logger.info(infoMsg)
try:
- process = subprocess.Popen(conf.alert.encode(sys.getfilesystemencoding() or UNICODE_ENCODING), shell=True)
+ process = subprocess.Popen(getBytes(conf.alert, sys.getfilesystemencoding() or UNICODE_ENCODING), shell=True)
process.wait()
except Exception as ex:
errMsg = "error occurred while executing '%s' ('%s')" % (conf.alert, getSafeExString(ex))
diff --git a/lib/core/common.py b/lib/core/common.py
index 944c208c3..7f08066a5 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1970,7 +1970,7 @@ def safeFilepathEncode(filepath):
retVal = filepath
if filepath and six.PY2 and isinstance(filepath, six.text_type):
- retVal = filepath.encode(sys.getfilesystemencoding() or UNICODE_ENCODING)
+ retVal = getBytes(filepath, sys.getfilesystemencoding() or UNICODE_ENCODING)
return retVal
diff --git a/lib/core/convert.py b/lib/core/convert.py
index 51e7d7b85..1655d3d43 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -231,6 +231,11 @@ def getBytes(value, encoding=UNICODE_ENCODING, errors="strict", unsafe=True):
retVal = value
+ try:
+ codecs.lookup(encoding)
+ except LookupError:
+ encoding = UNICODE_ENCODING
+
if isinstance(value, six.text_type):
if INVALID_UNICODE_PRIVATE_AREA:
if unsafe:
@@ -391,4 +396,4 @@ def getConsoleLength(value):
else:
retVal = len(value)
- return retVal
\ No newline at end of file
+ return retVal
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 9fa6825f4..c49b5d5b2 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.117"
+VERSION = "1.3.11.118"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 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 948903f23269f6ecc4cc46188655401091a53119 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 2 Dec 2019 10:10:58 +0100
Subject: [PATCH 022/159] Fixes #4024
---
lib/core/convert.py | 5 +++++
lib/core/dump.py | 5 +++--
lib/core/settings.py | 2 +-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/core/convert.py b/lib/core/convert.py
index 1655d3d43..9551a5e43 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -31,6 +31,11 @@ from lib.core.settings import UNICODE_ENCODING
from thirdparty import six
from thirdparty.six import unichr as _unichr
+try:
+ from html import escape as htmlEscape
+except ImportError:
+ from cgi import escape as htmlEscape
+
def base64pickle(value):
"""
Serializes (with pickle) and encodes to Base64 format supplied (binary) value
diff --git a/lib/core/dump.py b/lib/core/dump.py
index c9c06f672..69ccd29a3 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -31,6 +31,7 @@ from lib.core.convert import getBytes
from lib.core.convert import getConsoleLength
from lib.core.convert import getText
from lib.core.convert import getUnicode
+from lib.core.convert import htmlEscape
from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
@@ -557,7 +558,7 @@ class Dump(object):
else:
dataToDumpFile(dumpFP, "%s%s" % (safeCSValue(column), conf.csvDel))
elif conf.dumpFormat == DUMP_FORMAT.HTML:
- dataToDumpFile(dumpFP, "%s | " % getUnicode(cgi.escape(column).encode("ascii", "xmlcharrefreplace")))
+ dataToDumpFile(dumpFP, "%s | " % getUnicode(htmlEscape(column).encode("ascii", "xmlcharrefreplace")))
field += 1
@@ -629,7 +630,7 @@ class Dump(object):
else:
dataToDumpFile(dumpFP, "%s%s" % (safeCSValue(value), conf.csvDel))
elif conf.dumpFormat == DUMP_FORMAT.HTML:
- dataToDumpFile(dumpFP, "%s | " % getUnicode(cgi.escape(value).encode("ascii", "xmlcharrefreplace")))
+ dataToDumpFile(dumpFP, "%s | " % getUnicode(htmlEscape(value).encode("ascii", "xmlcharrefreplace")))
field += 1
diff --git a/lib/core/settings.py b/lib/core/settings.py
index c49b5d5b2..9544dc4cc 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.11.118"
+VERSION = "1.3.12.0"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
From f7a237fdee8b9b2dbdc8233f186989ed4d1bcdf6 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 3 Dec 2019 23:30:28 +0100
Subject: [PATCH 023/159] Adding basic functionality to a hidden feature
---
lib/core/gui.py | 83 ++++++++++++++++++++++++--------------------
lib/core/settings.py | 2 +-
lib/parse/cmdline.py | 5 +--
3 files changed, 50 insertions(+), 40 deletions(-)
diff --git a/lib/core/gui.py b/lib/core/gui.py
index bfb34326d..66ad80744 100644
--- a/lib/core/gui.py
+++ b/lib/core/gui.py
@@ -5,17 +5,23 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
+import os
import re
import socket
import subprocess
import sys
+import tempfile
import threading
import webbrowser
from lib.core.common import getSafeExString
+from lib.core.common import saveConfig
+from lib.core.data import paths
from lib.core.defaults import defaults
+from lib.core.enums import MKSTEMP_PREFIX
from lib.core.exception import SqlmapMissingDependence
from lib.core.settings import DEV_EMAIL_ADDRESS
+from lib.core.settings import IS_WIN
from lib.core.settings import ISSUES_PAGE
from lib.core.settings import GIT_PAGE
from lib.core.settings import SITE
@@ -110,48 +116,19 @@ def runGui(parser):
line = ""
event.widget.master.master.destroy()
return "break"
+ except:
+ return
event.widget.insert(tkinter.END, "\n")
- counter = 0
- while True:
- line = ""
- try:
- #line = queue.get_nowait()
- line = queue.get(timeout=.1)
- event.widget.insert(tkinter.END, line)
- counter = 0
- except _queue.Empty:
- event.widget.see(tkinter.END)
- event.widget.update_idletasks()
- if counter > 3:
- break
- else:
- counter += 1
-
return "break"
def run():
+ global alive
global process
global queue
- ON_POSIX = "posix" in sys.builtin_module_names
-
- def enqueue(stream, queue):
- for line in iter(stream.readline, b''):
- queue.put(line)
- stream.close()
-
- process = subprocess.Popen("/bin/bash", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=1, close_fds=ON_POSIX)
-
- # Reference: https://stackoverflow.com/a/4896288
- queue = _queue.Queue()
- thread = threading.Thread(target=enqueue, args=(process.stdout, queue))
- thread.daemon = True
- thread.start()
-
-
- options = {}
+ config = {}
for key in window._widgets:
dest, type = key
@@ -168,12 +145,34 @@ def runGui(parser):
else:
value = bool(widget.var.get())
- options[dest] = value
+ config[dest] = value
for option in parser.option_list:
- options[option.dest] = defaults.get(option.dest, None)
+ config[option.dest] = defaults.get(option.dest, None)
- parser._args = options
+ handle, configFile = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.CONFIG, text=True)
+ os.close(handle)
+
+ saveConfig(config, configFile)
+
+ def enqueue(stream, queue):
+ global alive
+
+ for line in iter(stream.readline, b''):
+ queue.put(line)
+
+ alive = False
+ stream.close()
+
+ alive = True
+
+ process = subprocess.Popen([sys.executable or "python", os.path.join(paths.SQLMAP_ROOT_PATH, "sqlmap.py"), "-c", configFile], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=1, close_fds=not IS_WIN)
+
+ # Reference: https://stackoverflow.com/a/4896288
+ queue = _queue.Queue()
+ thread = threading.Thread(target=enqueue, args=(process.stdout, queue))
+ thread.daemon = True
+ thread.start()
top = tkinter.Toplevel()
top.title("Console")
@@ -187,6 +186,16 @@ def runGui(parser):
center(top)
+ while alive:
+ line = ""
+ try:
+ #line = queue.get_nowait()
+ line = queue.get(timeout=.1)
+ text.insert(tkinter.END, line)
+ except _queue.Empty:
+ text.see(tkinter.END)
+ text.update_idletasks()
+
menubar = tkinter.Menu(window)
filemenu = tkinter.Menu(menubar, tearoff=0)
@@ -262,4 +271,4 @@ def runGui(parser):
first.focus()
- window.mainloop()
\ No newline at end of file
+ window.mainloop()
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 9544dc4cc..79d38ad4a 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.0"
+VERSION = "1.3.12.1"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index c1a6cac4e..85aef4650 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -78,6 +78,7 @@ from lib.core.defaults import defaults
from lib.core.dicts import DEPRECATED_OPTIONS
from lib.core.enums import AUTOCOMPLETE_TYPE
from lib.core.exception import SqlmapShellQuitException
+from lib.core.exception import SqlmapSilentQuitException
from lib.core.exception import SqlmapSyntaxException
from lib.core.option import _createHomeDirectories
from lib.core.settings import BASIC_HELP_ITEMS
@@ -863,10 +864,10 @@ def cmdLineParser(argv=None):
if "--gui" in argv:
from lib.core.gui import runGui
+
runGui(parser)
- if hasattr(parser, "_args"):
- return parser._args
+ raise SqlmapSilentQuitException
elif "--sqlmap-shell" in argv:
_createHomeDirectories()
From c3a6b71023c03b4b40072cc3221eb051345e7060 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 5 Dec 2019 13:50:16 +0100
Subject: [PATCH 024/159] Fixes #4025
---
lib/core/option.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/core/option.py b/lib/core/option.py
index bc7e8572e..a7c7cbd20 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2466,6 +2466,10 @@ def _basicOptionValidation():
errMsg = "invalid regular expression '%s' ('%s')" % (conf.paramExclude, getSafeExString(ex))
raise SqlmapSyntaxException(errMsg)
+ if conf.cookieDel and len(conf.cookieDel):
+ errMsg = "option '--cookie-del' should contain a single character (e.g. ';')"
+ raise SqlmapSyntaxException(errMsg)
+
if conf.crawlExclude:
try:
re.compile(conf.crawlExclude)
From 568ee4669ec14e1fb30b0645102d010429d70772 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 5 Dec 2019 13:56:46 +0100
Subject: [PATCH 025/159] Minor patch (gui)
---
sqlmap.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/sqlmap.py b/sqlmap.py
index e50f57456..0b086b90c 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -385,6 +385,12 @@ def main():
logger.critical(errMsg)
raise SystemExit
+ elif all(_ in excMsg for _ in ("window = tkinter.Tk()",)):
+ errMsg = "there has been a problem in initialization of GUI interface "
+ errMsg += "('%s')" % excMsg.strip().split('\n')[-1]
+ logger.critical(errMsg)
+ raise SystemExit
+
elif "bad marshal data (unknown type code)" in excMsg:
match = re.search(r"\s*(.+)\s+ValueError", excMsg)
errMsg = "one of your .pyc files are corrupted%s" % (" ('%s')" % match.group(1) if match else "")
From f4bfa7a5ae57f673e19f4c9c7eaf26b25e8e8073 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 5 Dec 2019 22:20:00 +0100
Subject: [PATCH 026/159] Minor patch
---
lib/core/testing.py | 2 +-
sqlmap.py | 92 ++++++++++++++++++++++-----------------------
2 files changed, 47 insertions(+), 47 deletions(-)
diff --git a/lib/core/testing.py b/lib/core/testing.py
index db1c8712a..200be1bd9 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -208,7 +208,7 @@ def smokeTest():
continue
for filename in files:
- if os.path.splitext(filename)[1].lower() == ".py" and filename != "__init__.py":
+ if os.path.splitext(filename)[1].lower() == ".py" and filename not in ("__init__.py", "gui.py"):
path = os.path.join(root, os.path.splitext(filename)[0])
path = path.replace(paths.SQLMAP_ROOT_PATH, '.')
path = path.replace(os.sep, '.').lstrip('.')
diff --git a/sqlmap.py b/sqlmap.py
index 0b086b90c..cfb9ddac3 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -255,32 +255,7 @@ def main():
excMsg = traceback.format_exc()
valid = checkIntegrity()
- if valid is False:
- errMsg = "code integrity check failed (turning off automatic issue creation). "
- errMsg += "You should retrieve the latest development version from official GitHub "
- errMsg += "repository at '%s'" % GIT_PAGE
- logger.critical(errMsg)
- print()
- dataToStdout(excMsg)
- raise SystemExit
-
- elif any(_ in excMsg for _ in ("tamper/", "waf/")):
- logger.critical(errMsg)
- print()
- dataToStdout(excMsg)
- raise SystemExit
-
- elif any(_ in excMsg for _ in ("ImportError", "ModuleNotFoundError", "Can't find file for module")):
- errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip()
- logger.critical(errMsg)
- raise SystemExit
-
- elif all(_ in excMsg for _ in ("SyntaxError: Non-ASCII character", ".py on line", "but no encoding declared")) or any(_ in excMsg for _ in ("source code string cannot contain null bytes", "No module named")):
- errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip()
- logger.critical(errMsg)
- raise SystemExit
-
- elif any(_ in excMsg for _ in ("MemoryError", "Cannot allocate memory")):
+ if any(_ in excMsg for _ in ("MemoryError", "Cannot allocate memory")):
errMsg = "memory exhaustion detected"
logger.critical(errMsg)
raise SystemExit
@@ -300,13 +275,6 @@ def main():
logger.critical(errMsg)
raise SystemExit
- elif all(_ in excMsg for _ in ("No such file", "_'")):
- errMsg = "corrupted installation detected ('%s'). " % excMsg.strip().split('\n')[-1]
- errMsg += "You should retrieve the latest development version from official GitHub "
- errMsg += "repository at '%s'" % GIT_PAGE
- logger.critical(errMsg)
- raise SystemExit
-
elif "Read-only file system" in excMsg:
errMsg = "output device is mounted as read-only"
logger.critical(errMsg)
@@ -373,13 +341,6 @@ def main():
logger.critical(errMsg)
raise SystemExit
- elif "'DictObject' object has no attribute '" in excMsg and all(_ in errMsg for _ in ("(fingerprinted)", "(identified)")):
- errMsg = "there has been a problem in enumeration. "
- errMsg += "Because of a considerable chance of false-positive case "
- errMsg += "you are advised to rerun with switch '--flush-session'"
- logger.critical(errMsg)
- raise SystemExit
-
elif all(_ in excMsg for _ in ("pymysql", "configparser")):
errMsg = "wrong initialization of pymsql detected (using Python3 dependencies)"
logger.critical(errMsg)
@@ -391,6 +352,51 @@ def main():
logger.critical(errMsg)
raise SystemExit
+ elif kb.get("dumpKeyboardInterrupt"):
+ raise SystemExit
+
+ elif any(_ in excMsg for _ in ("Broken pipe",)):
+ raise SystemExit
+
+ elif valid is False:
+ errMsg = "code integrity check failed (turning off automatic issue creation). "
+ errMsg += "You should retrieve the latest development version from official GitHub "
+ errMsg += "repository at '%s'" % GIT_PAGE
+ logger.critical(errMsg)
+ print()
+ dataToStdout(excMsg)
+ raise SystemExit
+
+ elif any(_ in excMsg for _ in ("tamper/", "waf/")):
+ logger.critical(errMsg)
+ print()
+ dataToStdout(excMsg)
+ raise SystemExit
+
+ elif any(_ in excMsg for _ in ("ImportError", "ModuleNotFoundError", "Can't find file for module")):
+ errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip()
+ logger.critical(errMsg)
+ raise SystemExit
+
+ elif all(_ in excMsg for _ in ("SyntaxError: Non-ASCII character", ".py on line", "but no encoding declared")) or any(_ in excMsg for _ in ("source code string cannot contain null bytes", "No module named")):
+ errMsg = "invalid runtime environment ('%s')" % excMsg.split("Error: ")[-1].strip()
+ logger.critical(errMsg)
+ raise SystemExit
+
+ elif all(_ in excMsg for _ in ("No such file", "_'")):
+ errMsg = "corrupted installation detected ('%s'). " % excMsg.strip().split('\n')[-1]
+ errMsg += "You should retrieve the latest development version from official GitHub "
+ errMsg += "repository at '%s'" % GIT_PAGE
+ logger.critical(errMsg)
+ raise SystemExit
+
+ elif "'DictObject' object has no attribute '" in excMsg and all(_ in errMsg for _ in ("(fingerprinted)", "(identified)")):
+ errMsg = "there has been a problem in enumeration. "
+ errMsg += "Because of a considerable chance of false-positive case "
+ errMsg += "you are advised to rerun with switch '--flush-session'"
+ logger.critical(errMsg)
+ raise SystemExit
+
elif "bad marshal data (unknown type code)" in excMsg:
match = re.search(r"\s*(.+)\s+ValueError", excMsg)
errMsg = "one of your .pyc files are corrupted%s" % (" ('%s')" % match.group(1) if match else "")
@@ -398,12 +404,6 @@ def main():
logger.critical(errMsg)
raise SystemExit
- elif kb.get("dumpKeyboardInterrupt"):
- raise SystemExit
-
- elif any(_ in excMsg for _ in ("Broken pipe",)):
- raise SystemExit
-
for match in re.finditer(r'File "(.+?)", line', excMsg):
file_ = match.group(1)
try:
From 424d4ee9689975a60730349d3ac25dfc143e5b7d Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 5 Dec 2019 22:45:57 +0100
Subject: [PATCH 027/159] Minor compatibility update
---
lib/core/gui.py | 64 ++++++++++++++++++++++++-------------------------
1 file changed, 32 insertions(+), 32 deletions(-)
diff --git a/lib/core/gui.py b/lib/core/gui.py
index 66ad80744..6bf7d9587 100644
--- a/lib/core/gui.py
+++ b/lib/core/gui.py
@@ -27,7 +27,6 @@ from lib.core.settings import GIT_PAGE
from lib.core.settings import SITE
from lib.core.settings import VERSION_STRING
from lib.core.settings import WIKI_PAGE
-from thirdparty.six.moves import tkinter_messagebox as _tkinter_messagebox
from thirdparty.six.moves import queue as _queue
line = ""
@@ -36,19 +35,20 @@ queue = None
def runGui(parser):
try:
- import tkinter
- import tkinter.scrolledtext
- import tkinter.ttk
+ from thirdparty.six.moves import tkinter as _tkinter
+ from thirdparty.six.moves import tkinter_scrolledtext as _tkinter_scrolledtext
+ from thirdparty.six.moves import tkinter_ttk as _tkinter_ttk
+ from thirdparty.six.moves import tkinter_messagebox as _tkinter_messagebox
except ImportError as ex:
raise SqlmapMissingDependence("missing dependence ('%s')" % getSafeExString(ex))
# Reference: https://www.reddit.com/r/learnpython/comments/985umy/limit_user_input_to_only_int_with_tkinter/e4dj9k9?utm_source=share&utm_medium=web2x
- class ConstrainedEntry(tkinter.Entry):
+ class ConstrainedEntry(_tkinter.Entry):
def __init__(self, master=None, **kwargs):
- self.var = tkinter.StringVar()
+ self.var = _tkinter.StringVar()
self.regex = kwargs["regex"]
del kwargs["regex"]
- tkinter.Entry.__init__(self, master, textvariable=self.var, **kwargs)
+ _tkinter.Entry.__init__(self, master, textvariable=self.var, **kwargs)
self.old_value = ''
self.var.trace('w', self.check)
self.get, self.set = self.var.get, self.var.set
@@ -60,9 +60,9 @@ def runGui(parser):
self.set(self.old_value)
# Reference: https://code.activestate.com/recipes/580726-tkinter-notebook-that-fits-to-the-height-of-every-/
- class AutoresizableNotebook(tkinter.ttk.Notebook):
+ class AutoresizableNotebook(_tkinter_ttk.Notebook):
def __init__(self, master=None, **kw):
- tkinter.ttk.Notebook.__init__(self, master, **kw)
+ _tkinter_ttk.Notebook.__init__(self, master, **kw)
self.bind("<>", self._on_tab_changed)
def _on_tab_changed(self,event):
@@ -71,11 +71,11 @@ def runGui(parser):
tab = event.widget.nametowidget(event.widget.select())
event.widget.configure(height=tab.winfo_reqheight())
- window = tkinter.Tk()
+ window = _tkinter.Tk()
window.title(VERSION_STRING)
# Reference: https://www.holadevs.com/pregunta/64750/change-selected-tab-color-in-ttknotebook
- style = tkinter.ttk.Style()
+ style = _tkinter_ttk.Style()
settings = {"TNotebook.Tab": {"configure": {"padding": [5, 1], "background": "#fdd57e" }, "map": {"background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")]}}}
style.theme_create("custom", parent="alt", settings=settings)
style.theme_use("custom")
@@ -119,7 +119,7 @@ def runGui(parser):
except:
return
- event.widget.insert(tkinter.END, "\n")
+ event.widget.insert(_tkinter.END, "\n")
return "break"
@@ -174,11 +174,11 @@ def runGui(parser):
thread.daemon = True
thread.start()
- top = tkinter.Toplevel()
+ top = _tkinter.Toplevel()
top.title("Console")
# Reference: https://stackoverflow.com/a/13833338
- text = tkinter.scrolledtext.ScrolledText(top, undo=True)
+ text = _tkinter_scrolledtext.ScrolledText(top, undo=True)
text.bind("", onKeyPress)
text.bind("", onReturnPress)
text.pack()
@@ -191,23 +191,23 @@ def runGui(parser):
try:
#line = queue.get_nowait()
line = queue.get(timeout=.1)
- text.insert(tkinter.END, line)
+ text.insert(_tkinter.END, line)
except _queue.Empty:
- text.see(tkinter.END)
+ text.see(_tkinter.END)
text.update_idletasks()
- menubar = tkinter.Menu(window)
+ menubar = _tkinter.Menu(window)
- filemenu = tkinter.Menu(menubar, tearoff=0)
- filemenu.add_command(label="Open", state=tkinter.DISABLED)
- filemenu.add_command(label="Save", state=tkinter.DISABLED)
+ filemenu = _tkinter.Menu(menubar, tearoff=0)
+ filemenu.add_command(label="Open", state=_tkinter.DISABLED)
+ filemenu.add_command(label="Save", state=_tkinter.DISABLED)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=window.quit)
menubar.add_cascade(label="File", menu=filemenu)
menubar.add_command(label="Run", command=run)
- helpmenu = tkinter.Menu(menubar, tearoff=0)
+ helpmenu = _tkinter.Menu(menubar, tearoff=0)
helpmenu.add_command(label="Official site", command=lambda: webbrowser.open(SITE))
helpmenu.add_command(label="Github pages", command=lambda: webbrowser.open(GIT_PAGE))
helpmenu.add_command(label="Wiki pages", command=lambda: webbrowser.open(WIKI_PAGE))
@@ -225,33 +225,33 @@ def runGui(parser):
frames = {}
for group in parser.option_groups:
- frame = frames[group.title] = tkinter.Frame(notebook, width=200, height=200)
+ frame = frames[group.title] = _tkinter.Frame(notebook, width=200, height=200)
notebook.add(frames[group.title], text=group.title)
- tkinter.Label(frame).grid(column=0, row=0, sticky=tkinter.W)
+ _tkinter.Label(frame).grid(column=0, row=0, sticky=_tkinter.W)
row = 1
if group.get_description():
- tkinter.Label(frame, text="%s:" % group.get_description()).grid(column=0, row=1, columnspan=3, sticky=tkinter.W)
- tkinter.Label(frame).grid(column=0, row=2, sticky=tkinter.W)
+ _tkinter.Label(frame, text="%s:" % group.get_description()).grid(column=0, row=1, columnspan=3, sticky=_tkinter.W)
+ _tkinter.Label(frame).grid(column=0, row=2, sticky=_tkinter.W)
row += 2
for option in group.option_list:
- tkinter.Label(frame, text="%s " % parser.formatter._format_option_strings(option)).grid(column=0, row=row, sticky=tkinter.W)
+ _tkinter.Label(frame, text="%s " % parser.formatter._format_option_strings(option)).grid(column=0, row=row, sticky=_tkinter.W)
if option.type == "string":
- widget = tkinter.Entry(frame)
+ widget = _tkinter.Entry(frame)
elif option.type == "float":
widget = ConstrainedEntry(frame, regex=r"\A\d*\.?\d*\Z")
elif option.type == "int":
widget = ConstrainedEntry(frame, regex=r"\A\d*\Z")
else:
- var = tkinter.IntVar()
- widget = tkinter.Checkbutton(frame, variable=var)
+ var = _tkinter.IntVar()
+ widget = _tkinter.Checkbutton(frame, variable=var)
widget.var = var
first = first or widget
- widget.grid(column=1, row=row, sticky=tkinter.W)
+ widget.grid(column=1, row=row, sticky=_tkinter.W)
window._widgets[(option.dest, option.type)] = widget
@@ -260,11 +260,11 @@ def runGui(parser):
if hasattr(widget, "insert"):
widget.insert(0, default)
- tkinter.Label(frame, text=" %s" % option.help).grid(column=2, row=row, sticky=tkinter.W)
+ _tkinter.Label(frame, text=" %s" % option.help).grid(column=2, row=row, sticky=_tkinter.W)
row += 1
- tkinter.Label(frame).grid(column=0, row=row, sticky=tkinter.W)
+ _tkinter.Label(frame).grid(column=0, row=row, sticky=_tkinter.W)
notebook.pack(expand=1, fill="both")
notebook.enable_traversal()
From ea0ec868e9196a113a7f71382e0d2491b8cca79b Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 6 Dec 2019 15:15:39 +0100
Subject: [PATCH 028/159] Fixes #4029
---
lib/controller/controller.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/controller/controller.py b/lib/controller/controller.py
index 3f122f5f9..a9bd38e28 100644
--- a/lib/controller/controller.py
+++ b/lib/controller/controller.py
@@ -456,18 +456,18 @@ def start():
for place in parameters:
# Test User-Agent and Referer headers only if
# --level >= 3
- skip = (place == PLACE.USER_AGENT and conf.level < 3)
- skip |= (place == PLACE.REFERER and conf.level < 3)
+ skip = (place == PLACE.USER_AGENT and (kb.testOnlyCustom or conf.level < 3))
+ skip |= (place == PLACE.REFERER and (kb.testOnlyCustom or conf.level < 3))
# --param-filter
skip |= (len(conf.paramFilter) > 0 and place.upper() not in conf.paramFilter)
# Test Host header only if
# --level >= 5
- skip |= (place == PLACE.HOST and conf.level < 5)
+ skip |= (place == PLACE.HOST and (kb.testOnlyCustom or conf.level < 5))
# Test Cookie header only if --level >= 2
- skip |= (place == PLACE.COOKIE and conf.level < 2)
+ skip |= (place == PLACE.COOKIE and (kb.testOnlyCustom or conf.level < 2))
skip |= (place == PLACE.USER_AGENT and intersect(USER_AGENT_ALIASES, conf.skip, True) not in ([], None))
skip |= (place == PLACE.REFERER and intersect(REFERER_ALIASES, conf.skip, True) not in ([], None))
From 82e6bc64c23c40c4178e0e6b2026abedf082bdbc Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 6 Dec 2019 15:20:09 +0100
Subject: [PATCH 029/159] Fixes #4026
---
lib/core/option.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/core/option.py b/lib/core/option.py
index a7c7cbd20..7e6cac63d 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2477,6 +2477,13 @@ def _basicOptionValidation():
errMsg = "invalid regular expression '%s' ('%s')" % (conf.crawlExclude, getSafeExString(ex))
raise SqlmapSyntaxException(errMsg)
+ if conf.scope:
+ try:
+ re.compile(conf.scope)
+ except Exception as ex:
+ errMsg = "invalid regular expression '%s' ('%s')" % (conf.scope, getSafeExString(ex))
+ raise SqlmapSyntaxException(errMsg)
+
if conf.dumpTable and conf.dumpAll:
errMsg = "switch '--dump' is incompatible with switch '--dump-all'"
raise SqlmapSyntaxException(errMsg)
From 292bdf44795a151192c6fa13cb34356254a108b9 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 6 Dec 2019 16:02:25 +0100
Subject: [PATCH 030/159] Fixes #4028
---
lib/core/dump.py | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/lib/core/dump.py b/lib/core/dump.py
index 69ccd29a3..d5655aaba 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -70,13 +70,12 @@ class Dump(object):
self._lock = threading.Lock()
def _write(self, data, newline=True, console=True, content_type=None):
- if conf.api:
- dataToStdout(data, content_type=content_type, status=CONTENT_STATUS.COMPLETE)
- return
-
text = "%s%s" % (data, "\n" if newline else " ")
- if console:
+ if conf.api:
+ dataToStdout(data, content_type=content_type, status=CONTENT_STATUS.COMPLETE)
+
+ elif console:
dataToStdout(text)
multiThreadMode = isMultiThreadMode()
@@ -118,7 +117,6 @@ class Dump(object):
def string(self, header, data, content_type=None, sort=True):
if conf.api:
self._write(data, content_type=content_type)
- return
if isListLike(data):
self.lister(header, data, content_type, sort)
@@ -150,7 +148,6 @@ class Dump(object):
if conf.api:
self._write(elements, content_type=content_type)
- return
if elements:
self._write("%s [%d]:" % (header, len(elements)))
@@ -202,7 +199,6 @@ class Dump(object):
if conf.api:
self._write(userSettings, content_type=content_type)
- return
if userSettings:
self._write("%s:" % header)
@@ -236,7 +232,6 @@ class Dump(object):
if isinstance(dbTables, dict) and len(dbTables) > 0:
if conf.api:
self._write(dbTables, content_type=CONTENT_TYPE.TABLES)
- return
maxlength = 0
@@ -279,7 +274,6 @@ class Dump(object):
if isinstance(tableColumns, dict) and len(tableColumns) > 0:
if conf.api:
self._write(tableColumns, content_type=content_type)
- return
for db, tables in tableColumns.items():
if not db:
@@ -353,7 +347,6 @@ class Dump(object):
if isinstance(dbTables, dict) and len(dbTables) > 0:
if conf.api:
self._write(dbTables, content_type=CONTENT_TYPE.COUNT)
- return
maxlength1 = len("Table")
maxlength2 = len("Entries")
@@ -412,7 +405,6 @@ class Dump(object):
if conf.api:
self._write(tableValues, content_type=CONTENT_TYPE.DUMP_TABLE)
- return
dumpDbPath = os.path.join(conf.dumpPath, unsafeSQLIdentificatorNaming(db))
@@ -668,7 +660,6 @@ class Dump(object):
def dbColumns(self, dbColumnsDict, colConsider, dbs):
if conf.api:
self._write(dbColumnsDict, content_type=CONTENT_TYPE.COLUMNS)
- return
for column in dbColumnsDict.keys():
if colConsider == "1":
From 0c8f6156d2780fca95b2d046752a088d573da814 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 6 Dec 2019 16:03:51 +0100
Subject: [PATCH 031/159] Trivial update
---
lib/core/dump.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/lib/core/dump.py b/lib/core/dump.py
index d5655aaba..9fd4c8fcf 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -5,7 +5,6 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
-import cgi
import hashlib
import os
import re
From 5d32ca638b1e7e29d18609d28a096247b1eb10b9 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 6 Dec 2019 16:11:22 +0100
Subject: [PATCH 032/159] Minor update
---
sqlmapapi.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sqlmapapi.py b/sqlmapapi.py
index 28da90369..5eabbdded 100755
--- a/sqlmapapi.py
+++ b/sqlmapapi.py
@@ -16,7 +16,7 @@ import optparse
import os
import warnings
-warnings.filterwarnings(action="ignore", message=".*was already imported", category=UserWarning)
+warnings.filterwarnings(action="ignore", category=UserWarning)
warnings.filterwarnings(action="ignore", category=DeprecationWarning)
from lib.core.common import getUnicode
From e8535081921246917e6b173bf836aa737700faf8 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 9 Dec 2019 11:31:07 +0100
Subject: [PATCH 033/159] Update for #4030
---
lib/core/agent.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/core/agent.py b/lib/core/agent.py
index 5b0a1e21c..bc96632d7 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -247,7 +247,7 @@ class Agent(object):
# If we are replacing () the parameter original value with
# our payload do not prepend with the prefix
- if where == PAYLOAD.WHERE.REPLACE:
+ if where == PAYLOAD.WHERE.REPLACE and not conf.prefix: # Note: https://github.com/sqlmapproject/sqlmap/issues/4030
query = ""
# If the technique is stacked queries () do not put a space
From 7b5a640d1f24900825d80a2a8189f128cad1f0eb Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 9 Dec 2019 11:35:22 +0100
Subject: [PATCH 034/159] Minor update
---
extra/shutils/pyflakes.sh | 2 +-
lib/core/convert.py | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/extra/shutils/pyflakes.sh b/extra/shutils/pyflakes.sh
index e4ea94d74..cbdbe80c9 100755
--- a/extra/shutils/pyflakes.sh
+++ b/extra/shutils/pyflakes.sh
@@ -4,4 +4,4 @@
# See the file 'LICENSE' for copying permission
# Runs pyflakes on all python files (prerequisite: apt-get install pyflakes)
-find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec pyflakes '{}' \; | grep -v "redefines '_'"
+find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec pyflakes3 '{}' \; | grep -v "redefines '_'"
diff --git a/lib/core/convert.py b/lib/core/convert.py
index 9551a5e43..d5d24b3ed 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -19,6 +19,7 @@ import re
import sys
from lib.core.bigarray import BigArray
+from lib.core.compat import xrange
from lib.core.data import conf
from lib.core.data import kb
from lib.core.settings import INVALID_UNICODE_PRIVATE_AREA
From 38d5086b88a90597e31aac5fad992c21cb0c464d Mon Sep 17 00:00:00 2001
From: "Gabriel M. Dutra"
Date: Mon, 9 Dec 2019 17:49:11 -0300
Subject: [PATCH 035/159] Added implicit verification (#4032)
---
sqlmapapi.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sqlmapapi.py b/sqlmapapi.py
index 5eabbdded..9c903b81d 100755
--- a/sqlmapapi.py
+++ b/sqlmapapi.py
@@ -63,9 +63,9 @@ def main():
(args, _) = apiparser.parse_args()
# Start the client or the server
- if args.server is True:
+ if args.server:
server(args.host, args.port, adapter=args.adapter, username=args.username, password=args.password)
- elif args.client is True:
+ elif args.client:
client(args.host, args.port, username=args.username, password=args.password)
else:
apiparser.print_help()
From 1a95cea1f23aeeb2a396752e11e22f65b98aa292 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 9 Dec 2019 22:13:52 +0100
Subject: [PATCH 036/159] Trivial updates
---
lib/core/gui.py | 6 +++---
lib/core/profiling.py | 4 ++--
lib/core/update.py | 2 +-
lib/utils/api.py | 2 +-
lib/utils/brute.py | 2 +-
thirdparty/keepalive/keepalive.py | 4 +++-
6 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/lib/core/gui.py b/lib/core/gui.py
index 6bf7d9587..3143b892f 100644
--- a/lib/core/gui.py
+++ b/lib/core/gui.py
@@ -65,7 +65,7 @@ def runGui(parser):
_tkinter_ttk.Notebook.__init__(self, master, **kw)
self.bind("<>", self._on_tab_changed)
- def _on_tab_changed(self,event):
+ def _on_tab_changed(self, event):
event.widget.update_idletasks()
tab = event.widget.nametowidget(event.widget.select())
@@ -76,7 +76,7 @@ def runGui(parser):
# Reference: https://www.holadevs.com/pregunta/64750/change-selected-tab-color-in-ttknotebook
style = _tkinter_ttk.Style()
- settings = {"TNotebook.Tab": {"configure": {"padding": [5, 1], "background": "#fdd57e" }, "map": {"background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")]}}}
+ settings = {"TNotebook.Tab": {"configure": {"padding": [5, 1], "background": "#fdd57e"}, "map": {"background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")]}}}
style.theme_create("custom", parent="alt", settings=settings)
style.theme_use("custom")
@@ -189,7 +189,7 @@ def runGui(parser):
while alive:
line = ""
try:
- #line = queue.get_nowait()
+ # line = queue.get_nowait()
line = queue.get(timeout=.1)
text.insert(_tkinter.END, line)
except _queue.Empty:
diff --git a/lib/core/profiling.py b/lib/core/profiling.py
index 0fe0836d6..2282d9448 100644
--- a/lib/core/profiling.py
+++ b/lib/core/profiling.py
@@ -27,7 +27,7 @@ def profile(profileOutputFile=None, dotOutputFile=None, imageOutputFile=None):
import pydot
except ImportError as ex:
errMsg = "profiling requires third-party libraries ('%s') " % getSafeExString(ex)
- errMsg += "(Hint: 'sudo apt-get install python-pydot python-pyparsing python-profiler graphviz')"
+ errMsg += "(Hint: 'sudo apt install python-pydot python-pyparsing python-profiler graphviz')"
logger.error(errMsg)
return
@@ -84,7 +84,7 @@ def profile(profileOutputFile=None, dotOutputFile=None, imageOutputFile=None):
pydotGraph.write_png(imageOutputFile)
except OSError:
errMsg = "profiling requires graphviz installed "
- errMsg += "(Hint: 'sudo apt-get install graphviz')"
+ errMsg += "(Hint: 'sudo apt install graphviz')"
logger.error(errMsg)
else:
infoMsg = "displaying interactive graph with xdot library"
diff --git a/lib/core/update.py b/lib/core/update.py
index 9cd588263..4314575ff 100644
--- a/lib/core/update.py
+++ b/lib/core/update.py
@@ -136,6 +136,6 @@ def update():
infoMsg += "https://github.com/sqlmapproject/sqlmap/downloads"
else:
infoMsg = "for Linux platform it's recommended "
- infoMsg += "to install a standard 'git' package (e.g.: 'sudo apt-get install git')"
+ infoMsg += "to install a standard 'git' package (e.g.: 'sudo apt install git')"
logger.info(infoMsg)
diff --git a/lib/utils/api.py b/lib/utils/api.py
index 84d2327e1..468c09c03 100644
--- a/lib/utils/api.py
+++ b/lib/utils/api.py
@@ -705,7 +705,7 @@ def server(host=RESTAPI_DEFAULT_ADDRESS, port=RESTAPI_DEFAULT_PORT, adapter=REST
errMsg += "List of supported adapters: %s" % ', '.join(sorted(list(server_names.keys())))
else:
errMsg = "Server support for adapter '%s' is not installed on this system " % adapter
- errMsg += "(Note: you can try to install it with 'sudo apt-get install python-%s' or 'sudo pip install %s')" % (adapter, adapter)
+ errMsg += "(Note: you can try to install it with 'sudo apt install python-%s' or 'sudo pip install %s')" % (adapter, adapter)
logger.critical(errMsg)
def _client(url, options=None):
diff --git a/lib/utils/brute.py b/lib/utils/brute.py
index 4b75a0b5d..b1589dafe 100644
--- a/lib/utils/brute.py
+++ b/lib/utils/brute.py
@@ -163,7 +163,7 @@ def tableExists(tableFile, regex=None):
if not threadData.shared.files:
warnMsg = "no table(s) found"
if conf.db:
- warnMsg += " for database '%s'" % conf.db
+ warnMsg += " for database '%s'" % conf.db
logger.warn(warnMsg)
else:
for item in threadData.shared.files:
diff --git a/thirdparty/keepalive/keepalive.py b/thirdparty/keepalive/keepalive.py
index 86bcdd877..4647f1f7c 100644
--- a/thirdparty/keepalive/keepalive.py
+++ b/thirdparty/keepalive/keepalive.py
@@ -107,9 +107,11 @@ from __future__ import print_function
try:
from thirdparty.six.moves import http_client as _http_client
+ from thirdparty.six.moves import range as _range
from thirdparty.six.moves import urllib as _urllib
except ImportError:
from six.moves import http_client as _http_client
+ from six.moves import range as _range
from six.moves import urllib as _urllib
import socket
@@ -569,7 +571,7 @@ def fetch(N, url, delay=0):
import time
lens = []
starttime = time.time()
- for i in range(N):
+ for i in _range(N):
if delay and i > 0: time.sleep(delay)
fo = _urllib.request.urlopen(url)
foo = fo.read()
From 251c8ba064a2289317b559bf6f021be80611ae09 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 10 Dec 2019 13:54:29 +0100
Subject: [PATCH 037/159] Minor update
---
lib/core/testing.py | 4 ++--
lib/parse/cmdline.py | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/core/testing.py b/lib/core/testing.py
index 200be1bd9..788935d57 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -69,14 +69,14 @@ def vulnTest():
(u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape", (u": '\u0161u\u0107uraj'",)),
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
("-r --flush-session -v 5", ("CloudFlare", "possible DBMS: 'SQLite'", "User-agent: foobar")),
- ("-l --flush-session --skip-waf -v 3 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell")),
+ ("-l --flush-session --keep-alive --skip-waf -v 5 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell", "Connection: keep-alive")),
("-l --offline --banner -v 5", ("banner: '3.", "~[TRAFFIC OUT]")),
("-u --flush-session --encoding=ascii --forms --crawl=2 --threads=2 --banner", ("total of 2 targets", "might be injectable", "Type: UNION query", "banner: '3.")),
("-u --flush-session --data='{\"id\": 1}' --banner", ("might be injectable", "3 columns", "Payload: {\"id\"", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "banner: '3.")),
("-u --flush-session -H 'Foo: Bar' -H 'Sna: Fu' --data='' --union-char=1 --mobile --answers='smartphone=3' --banner --smart -v 5", ("might be injectable", "Payload: --flush-session --method=PUT --data='a=1&b=2&c=3&id=1' --skip-static --dump -T users --start=1 --stop=2", ("might be injectable", "Parameter: id (PUT)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "2 entries")),
("-u --flush-session -H 'id: 1*' --tables", ("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 --test-filter='OR boolean' --tamper=space2dash", ("banner: '3.", " LIKE ")),
+ ("-u --flush-session --banner --invalid-logical --technique=B --predict-output --test-filter='OR boolean' --tamper=space2dash", ("banner: '3.", " LIKE ")),
("-u --flush-session --cookie=\"PHPSESSID=d41d8cd98f00b204e9800998ecf8427e; id=1*; id2=2\" --tables --union-cols=3", ("might be injectable", "Cookie #1* ((custom) HEADER)", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", " users ")),
("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner", ("NULL connection is supported with HEAD method", "banner: '3.")),
("-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")),
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index 85aef4650..f69ca58ea 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -942,6 +942,8 @@ def cmdLineParser(argv=None):
elif argv[i] == "-H":
if i + 1 < len(argv):
extraHeaders.append(argv[i + 1])
+ elif argv[i] == "--deps":
+ argv[i] = "--dependencies"
elif argv[i] == "-r":
for j in xrange(i + 2, len(argv)):
value = argv[j]
From 9866e478b912a5f64d1f2c969cf2cee23538cdce Mon Sep 17 00:00:00 2001
From: "Gabriel M. Dutra"
Date: Tue, 10 Dec 2019 11:26:57 -0300
Subject: [PATCH 038/159] Change vocabulary for better understanding. (#4034)
---
doc/translations/README-pt-BR.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/translations/README-pt-BR.md b/doc/translations/README-pt-BR.md
index 1887772fe..71f755d1d 100644
--- a/doc/translations/README-pt-BR.md
+++ b/doc/translations/README-pt-BR.md
@@ -2,7 +2,7 @@
[](https://travis-ci.org/sqlmapproject/sqlmap) [](https://www.python.org/) [](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [](https://badge.fury.io/py/sqlmap) [](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [](https://twitter.com/sqlmap)
-sqlmap é uma ferramenta de teste de penetração de código aberto que automatiza o processo de detecção e exploração de falhas de injeção SQL. Com essa ferramenta é possível assumir total controle de servidores de banco de dados em páginas web vulneráveis, inclusive de base de dados fora do sistema invadido. Ele possui um motor de detecção poderoso, empregando as últimas e mais devastadoras técnicas de teste de penetração por SQL Injection, que permite acessar a base de dados, o sistema de arquivos subjacente e executar comandos no sistema operacional.
+sqlmap é uma ferramenta de teste de intrusão, de código aberto, que automatiza o processo de detecção e exploração de falhas de injeção SQL. Com essa ferramenta é possível assumir total controle de servidores de banco de dados em páginas web vulneráveis, inclusive de base de dados fora do sistema invadido. Ele possui um motor de detecção poderoso, empregando as últimas e mais devastadoras técnicas de teste de intrusão por SQL Injection, que permite acessar a base de dados, o sistema de arquivos subjacente e executar comandos no sistema operacional.
Imagens
----
From a5ed4c52552826ac33bf89e483fba3d66d47fdca Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 12 Dec 2019 11:42:03 +0100
Subject: [PATCH 039/159] Minor update
---
data/txt/common-tables.txt | 64 ++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/data/txt/common-tables.txt b/data/txt/common-tables.txt
index 95d234b33..8c1c8953f 100644
--- a/data/txt/common-tables.txt
+++ b/data/txt/common-tables.txt
@@ -3416,3 +3416,67 @@ usertbl
# WebGoat
user_data
+
+# https://laurent22.github.io/so-injections/
+
+accounts
+admin
+baza_site
+benutzer
+category
+comments
+company
+credentials
+Customer
+customers
+data
+details
+dhruv_users
+dt_tb
+employees
+events
+forsale
+friends
+giorni
+images
+info
+items
+kontabankowe
+login
+logs
+markers
+members
+messages
+orders
+order_table
+photos
+player
+players
+points
+register
+reports
+rooms
+shells
+signup
+songs
+student
+students
+table
+table2
+tbl_images
+tblproduct
+testv2
+tickets
+topicinfo
+trabajo
+user
+user_auth
+userinfo
+user_info
+userregister
+users
+usuarios
+utenti
+wm_products
+wp_payout_history
+zamowienia
From f01610b39739d045d9fc78860b0e119b7e01e84b Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 12 Dec 2019 11:51:26 +0100
Subject: [PATCH 040/159] Minor update
---
data/txt/common-columns.txt | 33 +++++++++++++++++++++++++++++++++
data/txt/common-tables.txt | 16 ++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/data/txt/common-columns.txt b/data/txt/common-columns.txt
index abcfb489b..9b310bfa8 100644
--- a/data/txt/common-columns.txt
+++ b/data/txt/common-columns.txt
@@ -474,6 +474,7 @@ module_addr
flag
# spanish
+
usuario
nombre
contrasena
@@ -486,6 +487,7 @@ tono
cuna
# german
+
benutzername
benutzer
passwort
@@ -499,6 +501,7 @@ stichwort
schlusselwort
# french
+
utilisateur
usager
consommateur
@@ -510,6 +513,7 @@ touche
clef
# italian
+
utente
nome
utilizzatore
@@ -521,17 +525,20 @@ chiavetta
cifrario
# portuguese
+
usufrutuario
chave
cavilha
# slavic
+
korisnik
sifra
lozinka
kljuc
# turkish
+
numara
sira
lokasyon
@@ -605,6 +612,7 @@ kontak
kontaklar
# List from schemafuzz.py (http://www.beenuarora.com/code/schemafuzz.py)
+
user
pass
cc_number
@@ -828,6 +836,7 @@ xar_name
xar_pass
# List from http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
+
account
accnts
accnt
@@ -897,6 +906,7 @@ user_pwd
user_passwd
# List from hyrax (http://sla.ckers.org/forum/read.php?16,36047)
+
fld_id
fld_username
fld_password
@@ -1049,6 +1059,7 @@ yhmm
yonghu
# site:br
+
content_id
codigo
geometry
@@ -1305,6 +1316,7 @@ newssummaryauthor
and_xevento
# site:de
+
rolle_nr
standort_nr
ja
@@ -1467,6 +1479,7 @@ summary_id
gameid
# site:es
+
catid
dni
prune_id
@@ -1556,6 +1569,7 @@ time_stamp
bannerid
# site:fr
+
numero
id_auteur
titre
@@ -1607,6 +1621,7 @@ n_dir
age
# site:ru
+
dt_id
subdivision_id
sub_class_id
@@ -1812,6 +1827,7 @@ language_id
val
# site:jp
+
dealer_id
modify_date
regist_date
@@ -1943,6 +1959,7 @@ c_commu_topic_id
c_diary_comment_log_id
# site:it
+
idcomune
idruolo
idtrattamento
@@ -2446,6 +2463,7 @@ client_img
does_repeat
# site:cn
+
typeid
cronid
advid
@@ -2621,6 +2639,7 @@ disablepostctrl
fieldname
# site:id
+
ajar
akses
aktif
@@ -2672,9 +2691,23 @@ urut
waktu
# WebGoat
+
cookie
login_count
+# https://sqlwiki.netspi.com/attackQueries/dataTargeting/
+
+credit
+card
+pin
+cvv
+pan
+password
+social
+ssn
+account
+confidential
+
# Misc
u_pass
diff --git a/data/txt/common-tables.txt b/data/txt/common-tables.txt
index 8c1c8953f..12c210c29 100644
--- a/data/txt/common-tables.txt
+++ b/data/txt/common-tables.txt
@@ -1618,6 +1618,7 @@ Contributor
flag
# Various Joomla tables
+
jos_vm_product_download
jos_vm_coupons
jos_vm_product_reviews
@@ -1711,6 +1712,7 @@ publicusers
cmsusers
# List provided by Anastasios Monachos (anastasiosm@gmail.com)
+
blacklist
cost
moves
@@ -1762,6 +1764,7 @@ TBLCORPUSERS
TBLCORPORATEUSERS
# List from schemafuzz.py (http://www.beenuarora.com/code/schemafuzz.py)
+
tbladmins
sort
_wfspro_admin
@@ -2048,6 +2051,7 @@ Login
Logins
# List from http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
+
account
accnts
accnt
@@ -2117,6 +2121,7 @@ user_pwd
user_passwd
# List from hyrax (http://sla.ckers.org/forum/read.php?16,36047)
+
wsop
Admin
Config
@@ -2437,9 +2442,11 @@ Affichage1name
sb_host_adminAffichage1name
# site:jp
+
TypesTab
# site:it
+
utenti
categorie
attivita
@@ -2581,6 +2588,7 @@ oil_stats_agents
SGA_XPLAN_TPL_DBA_INDEXES
# site:fr
+
Avion
departement
Compagnie
@@ -2751,6 +2759,7 @@ spip_ortho_dico
spip_caches
# site:ru
+
guestbook
binn_forum_settings
binn_forms_templ
@@ -2848,6 +2857,7 @@ binn_path_temps
order_item
# site:de
+
tt_content
kunde
medien
@@ -3010,6 +3020,7 @@ wp_categories
chessmessages
# site:br
+
endereco
pessoa
usuarios
@@ -3172,6 +3183,7 @@ LT_CUSTOM2
LT_CUSTOM3
# site:es
+
jos_respuestas
DEPARTAMENTO
EMPLEADO
@@ -3210,6 +3222,7 @@ grupo
facturas
# site:cn
+
url
cdb_adminactions
BlockInfo
@@ -3355,6 +3368,7 @@ mymps_mail_sendlist
mymps_navurl
# site:tr
+
kullanici
kullanicilar
yonetici
@@ -3401,6 +3415,7 @@ kontak
kontaklar
# List provided by Pedrito Perez (0ark1ang3l@gmail.com)
+
adminstbl
admintbl
affiliateUsers
@@ -3415,6 +3430,7 @@ userstbl
usertbl
# WebGoat
+
user_data
# https://laurent22.github.io/so-injections/
From 6e06df3d39fc6c0b1d768aec0ade605f9fbabe84 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 12 Dec 2019 14:10:02 +0100
Subject: [PATCH 041/159] Minor bug fix
---
plugins/generic/databases.py | 2 +-
plugins/generic/syntax.py | 15 +++++++++------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py
index 7f80357b5..0f04f4015 100644
--- a/plugins/generic/databases.py
+++ b/plugins/generic/databases.py
@@ -901,7 +901,7 @@ class Databases(object):
self.getTables()
infoMsg = "fetched tables: "
- infoMsg += ", ".join(["%s" % ", ".join("%s%s%s" % (unsafeSQLIdentificatorNaming(db), ".." if Backend.isDbms(DBMS.MSSQL) or Backend.isDbms(DBMS.SYBASE) else '.', unsafeSQLIdentificatorNaming(_)) for _ in tbl) for db, tbl in kb.data.cachedTables.items()])
+ infoMsg += ", ".join(["%s" % ", ".join("'%s%s%s'" % (unsafeSQLIdentificatorNaming(db), ".." if Backend.isDbms(DBMS.MSSQL) or Backend.isDbms(DBMS.SYBASE) else '.', unsafeSQLIdentificatorNaming(_)) for _ in tbl) for db, tbl in kb.data.cachedTables.items()])
logger.info(infoMsg)
for db, tables in kb.data.cachedTables.items():
diff --git a/plugins/generic/syntax.py b/plugins/generic/syntax.py
index 5a5b1e0e1..bb0bee737 100644
--- a/plugins/generic/syntax.py
+++ b/plugins/generic/syntax.py
@@ -28,13 +28,16 @@ class Syntax(object):
if quote:
for item in re.findall(r"'[^']*'+", expression):
original = item[1:-1]
- if original and re.search(r"\[(SLEEPTIME|RAND)", original) is None: # e.g. '[SLEEPTIME]' marker
- replacement = escaper(original) if not conf.noEscape else original
+ if original:
+ if Backend.isDbms(DBMS.SQLITE) and "X%s" % item in expression:
+ continue
+ if re.search(r"\[(SLEEPTIME|RAND)", original) is None: # e.g. '[SLEEPTIME]' marker
+ replacement = escaper(original) if not conf.noEscape else original
- if replacement != original:
- retVal = retVal.replace(item, replacement)
- elif len(original) != len(getBytes(original)) and "n'%s'" % original not in retVal and Backend.getDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.ORACLE, DBMS.MSSQL):
- retVal = retVal.replace("'%s'" % original, "n'%s'" % original)
+ if replacement != original:
+ retVal = retVal.replace(item, replacement)
+ elif len(original) != len(getBytes(original)) and "n'%s'" % original not in retVal and Backend.getDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.ORACLE, DBMS.MSSQL):
+ retVal = retVal.replace("'%s'" % original, "n'%s'" % original)
else:
retVal = escaper(expression)
From 3145de15d8f54c0991c7f070cd6a034ad3356d28 Mon Sep 17 00:00:00 2001
From: tanaydin sirin
Date: Fri, 13 Dec 2019 17:29:12 +0100
Subject: [PATCH 042/159] Update common-columns.txt (#4039)
Some more common Turkish column names.
---
data/txt/common-columns.txt | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/data/txt/common-columns.txt b/data/txt/common-columns.txt
index 9b310bfa8..16f7e8c7c 100644
--- a/data/txt/common-columns.txt
+++ b/data/txt/common-columns.txt
@@ -539,6 +539,19 @@ kljuc
# turkish
+isim
+ad
+adi
+soyisim
+soyad
+soyadi
+kimlik
+kimlikno
+tckimlikno
+tckimlik
+yonetici
+sil
+silinmis
numara
sira
lokasyon
@@ -554,7 +567,9 @@ ev_adres
is_adresi
ev_adresi
isadresi
+isadres
evadresi
+evadres
il
ilce
eposta
From 24aadbd850ff6d4a1754ce924124d33a593efa0c Mon Sep 17 00:00:00 2001
From: Ryan Young
Date: Sun, 15 Dec 2019 08:06:26 -0700
Subject: [PATCH 043/159] Support IPv6 literals ("[::1]:8080") in the proxy
switch. (#4041)
---
lib/core/option.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index 7e6cac63d..24eb466e3 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -995,7 +995,7 @@ def _setHTTPHandlers():
errMsg = "invalid proxy address '%s' ('%s')" % (conf.proxy, getSafeExString(ex))
raise SqlmapSyntaxException(errMsg)
- hostnamePort = _.netloc.split(":")
+ hostnamePort = _.netloc.rsplit(":", 1)
scheme = _.scheme.upper()
hostname = hostnamePort[0]
From 7dae324ed6ca4b7a49c4f6d3a9d0c83925a87614 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sun, 15 Dec 2019 16:33:03 +0100
Subject: [PATCH 044/159] Trivial update
---
lib/request/connect.py | 4 ++--
thirdparty/identywaf/data.json | 6 ++++++
thirdparty/identywaf/identYwaf.py | 2 +-
3 files changed, 9 insertions(+), 3 deletions(-)
mode change 100644 => 100755 thirdparty/identywaf/data.json
diff --git a/lib/request/connect.py b/lib/request/connect.py
index f8bed48a6..26ab5526b 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -1054,11 +1054,11 @@ class Connect(object):
match = re.search(r"%s=[^&]*" % re.escape(parameter), paramString, re.I)
if match:
- retVal = re.sub("(?i)%s" % re.escape(match.group(0)), ("%s=%s" % (parameter, newValue)).replace('\\', r'\\'), paramString)
+ retVal = re.sub(r"(?i)%s" % re.escape(match.group(0)), ("%s=%s" % (parameter, newValue)).replace('\\', r'\\'), paramString)
else:
match = re.search(r"(%s[\"']:[\"'])([^\"']+)" % re.escape(parameter), paramString, re.I)
if match:
- retVal = re.sub("(?i)%s" % re.escape(match.group(0)), "%s%s" % (match.group(1), newValue), paramString)
+ retVal = re.sub(r"(?i)%s" % re.escape(match.group(0)), "%s%s" % (match.group(1), newValue), paramString)
return retVal
diff --git a/thirdparty/identywaf/data.json b/thirdparty/identywaf/data.json
old mode 100644
new mode 100755
index de90fdbbe..c6ab44ca5
--- a/thirdparty/identywaf/data.json
+++ b/thirdparty/identywaf/data.json
@@ -431,6 +431,12 @@
"e34c:RVZXum60OEhCWapAYKYPkoJyWOpohM4IiUYMr2RWg1qQJLX2uhdOn9htOj+hX7AB16FcPxJPdLsXomtKaK59nui6c4RmkgI2FZjxtDtAeq+c3qA4chS1XKTC"
]
},
+ "kuipernet": {
+ "company": "ASTSoft",
+ "name": "Kuipernet",
+ "regex": "(?s)Content-Length: 118214.+W5M0MpCehiHzreSzNTczkc9d",
+ "signatures": []
+ },
"malcare": {
"company": "Inactiv",
"name": "MalCare",
diff --git a/thirdparty/identywaf/identYwaf.py b/thirdparty/identywaf/identYwaf.py
index 80f0d71ce..2209352f3 100755
--- a/thirdparty/identywaf/identYwaf.py
+++ b/thirdparty/identywaf/identYwaf.py
@@ -60,7 +60,7 @@ else:
HTTPCookieProcessor = urllib2.HTTPCookieProcessor
NAME = "identYwaf"
-VERSION = "1.0.122"
+VERSION = "1.0.124"
BANNER = r"""
` __ __ `
____ ___ ___ ____ ______ `| T T` __ __ ____ _____
From d38acbe34726564eed580a66b48a754ce338a32d Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 18 Dec 2019 10:19:03 +0100
Subject: [PATCH 045/159] Fixing lost versioning
---
lib/core/settings.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 79d38ad4a..85d372a5b 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.1"
+VERSION = "1.3.12.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)
From d52d5f0ddc1f7cdef5aa51f7c54fc91218f1727e Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 18 Dec 2019 11:04:01 +0100
Subject: [PATCH 046/159] Fixes #4046
---
lib/core/settings.py | 2 +-
lib/request/redirecthandler.py | 16 +++++++++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 85d372a5b..b48ba9fc5 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.24"
+VERSION = "1.3.12.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/lib/request/redirecthandler.py b/lib/request/redirecthandler.py
index b74665108..13c3fb4a1 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -10,6 +10,7 @@ import time
import types
from lib.core.common import getHostHeader
+from lib.core.common import getSafeExString
from lib.core.common import logHTTPTraffic
from lib.core.common import readInput
from lib.core.convert import getUnicode
@@ -139,6 +140,14 @@ class SmartRedirectHandler(_urllib.request.HTTPRedirectHandler):
except _urllib.error.HTTPError as ex:
result = ex
+ # Dirty hack for https://github.com/sqlmapproject/sqlmap/issues/4046
+ try:
+ hasattr(result, "read")
+ except KeyError:
+ class _(object):
+ pass
+ result = _()
+
# Dirty hack for http://bugs.python.org/issue15701
try:
result.info()
@@ -149,7 +158,12 @@ class SmartRedirectHandler(_urllib.request.HTTPRedirectHandler):
if not hasattr(result, "read"):
def _(self, length=None):
- return ex.msg
+ try:
+ retVal = getSafeExString(ex)
+ except:
+ retVal = ""
+ finally:
+ return retVal
result.read = types.MethodType(_, result)
if not getattr(result, "url", None):
From b4f9bf3f21579af276fe32efb44bfd34ded16b96 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 18 Dec 2019 11:30:13 +0100
Subject: [PATCH 047/159] I don't know how this went through
---
lib/core/settings.py | 2 +-
sqlmapapi.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index b48ba9fc5..d6aa96891 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.25"
+VERSION = "1.3.12.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)
diff --git a/sqlmapapi.py b/sqlmapapi.py
index 9c903b81d..9af5ab716 100755
--- a/sqlmapapi.py
+++ b/sqlmapapi.py
@@ -53,8 +53,8 @@ def main():
# Parse command line options
apiparser = optparse.OptionParser()
- apiparser.add_option("-s", "--server", help="Run as a REST-JSON API server", default=RESTAPI_DEFAULT_PORT, action="store_true")
- apiparser.add_option("-c", "--client", help="Run as a REST-JSON API client", default=RESTAPI_DEFAULT_PORT, action="store_true")
+ apiparser.add_option("-s", "--server", help="Run as a REST-JSON API server", action="store_true")
+ apiparser.add_option("-c", "--client", help="Run as a REST-JSON API client", action="store_true")
apiparser.add_option("-H", "--host", help="Host of the REST-JSON API server (default \"%s\")" % RESTAPI_DEFAULT_ADDRESS, default=RESTAPI_DEFAULT_ADDRESS, action="store")
apiparser.add_option("-p", "--port", help="Port of the the REST-JSON API server (default %d)" % RESTAPI_DEFAULT_PORT, default=RESTAPI_DEFAULT_PORT, type="int", action="store")
apiparser.add_option("--adapter", help="Server (bottle) adapter to use (default \"%s\")" % RESTAPI_DEFAULT_ADAPTER, default=RESTAPI_DEFAULT_ADAPTER, action="store")
From c96283a083c32e3fa55b1e33d1861665d41e94a7 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 18 Dec 2019 12:29:07 +0100
Subject: [PATCH 048/159] Minor patch
---
lib/core/settings.py | 2 +-
thirdparty/bottle/bottle.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index d6aa96891..0df23a4b1 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.26"
+VERSION = "1.3.12.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)
diff --git a/thirdparty/bottle/bottle.py b/thirdparty/bottle/bottle.py
index a937493ba..9e6219e40 100644
--- a/thirdparty/bottle/bottle.py
+++ b/thirdparty/bottle/bottle.py
@@ -2630,7 +2630,7 @@ def debug(mode=True):
""" Change the debug level.
There is only one debug level supported at the moment."""
global DEBUG
- if mode: warnings.simplefilter('default')
+ #if mode: warnings.simplefilter('default') # neutralizing already set warning filters (e.g. DeprecationWarning inside sqlmapapi.py)
DEBUG = bool(mode)
From 9ca5dc798e7550c66f4e587868ccdbf8a50b7673 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 19 Dec 2019 17:35:39 +0100
Subject: [PATCH 049/159] Fixes #4047
---
lib/core/common.py | 2 +-
lib/core/settings.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index 7f08066a5..b6e77c6f3 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1643,7 +1643,7 @@ def parseTargetUrl():
if '=' not in urlSplit.query:
conf.url = "%s?%s" % (conf.url, getUnicode(urlSplit.query))
else:
- conf.parameters[PLACE.GET] = urldecode(urlSplit.query) if urlSplit.query and urlencode(DEFAULT_GET_POST_DELIMITER, None) not in urlSplit.query else urlSplit.query
+ conf.parameters[PLACE.GET] = urldecode(urlSplit.query, spaceplus=not conf.base64Parameter) if urlSplit.query and urlencode(DEFAULT_GET_POST_DELIMITER, None) not in urlSplit.query else urlSplit.query
if not conf.referer and (intersect(REFERER_ALIASES, conf.testParameter, True) or conf.level >= 3):
debugMsg = "setting the HTTP Referer header to the target URL"
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 0df23a4b1..2c1c33d65 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.27"
+VERSION = "1.3.12.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)
From 884ee5673019c9fda75329766b96d4739f986ad9 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Mon, 23 Dec 2019 12:14:40 +0100
Subject: [PATCH 050/159] Fixes #4050
---
lib/core/settings.py | 2 +-
lib/utils/sqlalchemy.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 2c1c33d65..52a53249e 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.28"
+VERSION = "1.3.12.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/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index ac862498b..a7af101b7 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -25,7 +25,7 @@ except ImportError:
try:
import MySQLdb # used by SQLAlchemy in case of MySQL
warnings.filterwarnings("error", category=MySQLdb.Warning)
-except ImportError:
+except (ImportError, AttributeError):
pass
from lib.core.data import conf
From 70e6700eb7692c50cffe2118ffbe6cb206bd9cfe Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 27 Dec 2019 14:38:22 +0100
Subject: [PATCH 051/159] Fixes #4053
---
lib/core/settings.py | 2 +-
sqlmap.py | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 52a53249e..93c57e67a 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.29"
+VERSION = "1.3.12.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)
diff --git a/sqlmap.py b/sqlmap.py
index cfb9ddac3..b353ae324 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -275,6 +275,11 @@ def main():
logger.critical(errMsg)
raise SystemExit
+ elif all(_ in excMsg for _ in ("Permission denied", "metasploit")):
+ errMsg = "permission error occurred while using Metasploit"
+ logger.critical(errMsg)
+ raise SystemExit
+
elif "Read-only file system" in excMsg:
errMsg = "output device is mounted as read-only"
logger.critical(errMsg)
From bcb94827240ccaa28f1cd1cec236d3eebc89d401 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 27 Dec 2019 15:20:09 +0100
Subject: [PATCH 052/159] Fixes #4048
---
lib/core/settings.py | 2 +-
lib/core/target.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 93c57e67a..2f37b6388 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.30"
+VERSION = "1.3.12.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/lib/core/target.py b/lib/core/target.py
index d23fbb49d..65028db59 100644
--- a/lib/core/target.py
+++ b/lib/core/target.py
@@ -401,7 +401,7 @@ def _setRequestParams():
raise SqlmapGenericException(errMsg)
if conf.csrfToken:
- if not any(re.search(conf.csrfToken, ' '.join(_), re.I) for _ in (conf.paramDict.get(PLACE.GET, {}), conf.paramDict.get(PLACE.POST, {}))) and not re.search(r"\b%s\b" % conf.csrfToken, conf.data or "") and conf.csrfToken not in set(_[0].lower() for _ in conf.httpHeaders) and conf.csrfToken not in conf.paramDict.get(PLACE.COOKIE, {}):
+ if not any(re.search(conf.csrfToken, ' '.join(_), re.I) for _ in (conf.paramDict.get(PLACE.GET, {}), conf.paramDict.get(PLACE.POST, {}), conf.paramDict.get(PLACE.COOKIE, {}))) and not re.search(r"\b%s\b" % conf.csrfToken, conf.data or "") and conf.csrfToken not in set(_[0].lower() for _ in conf.httpHeaders) and conf.csrfToken not in conf.paramDict.get(PLACE.COOKIE, {}):
errMsg = "anti-CSRF token parameter '%s' not " % conf.csrfToken._original
errMsg += "found in provided GET, POST, Cookie or header values"
raise SqlmapGenericException(errMsg)
From 4c5cb9e0d46a04a65ea29d09fdf0e68f7736f88b Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 27 Dec 2019 15:37:02 +0100
Subject: [PATCH 053/159] Subtle (sneaky) bug removed (related to #4051) -
False or '' results with ''
---
lib/core/common.py | 4 +++-
lib/core/settings.py | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index b6e77c6f3..e88975f7f 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1123,8 +1123,10 @@ def readInput(message, default=None, checkBatch=True, boolean=False):
if boolean:
retVal = retVal.strip().upper() == 'Y'
+ else:
+ retVal = retVal or ""
- return retVal or ""
+ return retVal
def setTechnique(technique):
"""
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 2f37b6388..2fcd63fca 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.31"
+VERSION = "1.3.12.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)
From cf7022b0a0e7d6519019732dbc0dbf19a1be3a58 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 27 Dec 2019 18:18:32 +0100
Subject: [PATCH 054/159] Minor patch (empty input without newline)
---
lib/core/common.py | 5 ++++-
lib/core/settings.py | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index e88975f7f..377d135fa 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1104,7 +1104,10 @@ def readInput(message, default=None, checkBatch=True, boolean=False):
dataToStdout("%s" % message, forceOutput=not kb.wizardMode, bold=True)
kb.prependFlag = False
- retVal = _input().strip() or default
+ retVal = _input()
+ if not retVal: # Note: Python doesn't print newline on empty input
+ dataToStdout("\n")
+ retVal = retVal.strip() or default
retVal = getUnicode(retVal, encoding=sys.stdin.encoding) if retVal else retVal
except:
try:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 2fcd63fca..c57bd2851 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.32"
+VERSION = "1.3.12.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)
From e0ecf8c8042b86b38c900c21ffdb2486a469f176 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 31 Dec 2019 11:03:14 +0100
Subject: [PATCH 055/159] Fixes #4056
---
lib/core/settings.py | 2 +-
lib/request/redirecthandler.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index c57bd2851..7a2fe64b9 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.33"
+VERSION = "1.3.12.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/lib/request/redirecthandler.py b/lib/request/redirecthandler.py
index 13c3fb4a1..18bb1285a 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -174,7 +174,7 @@ class SmartRedirectHandler(_urllib.request.HTTPRedirectHandler):
except:
redurl = None
result = fp
- fp.read = io.BytesIO("").read
+ fp.read = io.BytesIO(b"").read
else:
result = fp
From 4833e408241948bc2aea7661a563bac1edc9d81a Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 1 Jan 2020 13:22:06 +0100
Subject: [PATCH 056/159] Version bump
---
lib/core/settings.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 7a2fe64b9..7a40fcfe3 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.3.12.34"
+VERSION = "1.4"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
From 4efd745b5cb5a96899c587beec14abb5cee20eca Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 1 Jan 2020 13:25:15 +0100
Subject: [PATCH 057/159] Copyright year bump
---
LICENSE | 2 +-
data/txt/common-columns.txt | 2 +-
data/txt/common-files.txt | 2 +-
data/txt/common-outputs.txt | 2 +-
data/txt/common-tables.txt | 2 +-
data/txt/keywords.txt | 2 +-
data/txt/user-agents.txt | 2 +-
extra/__init__.py | 2 +-
extra/beep/__init__.py | 2 +-
extra/beep/beep.py | 2 +-
extra/cloak/__init__.py | 2 +-
extra/cloak/cloak.py | 2 +-
extra/dbgtool/__init__.py | 2 +-
extra/dbgtool/dbgtool.py | 2 +-
extra/shutils/blanks.sh | 2 +-
extra/shutils/drei.sh | 2 +-
extra/shutils/duplicates.py | 2 +-
extra/shutils/junk.sh | 2 +-
extra/shutils/modernize.sh | 2 +-
extra/shutils/pycodestyle.sh | 2 +-
extra/shutils/pydiatra.sh | 2 +-
extra/shutils/pyflakes.sh | 2 +-
extra/shutils/pypi.sh | 4 ++--
extra/vulnserver/__init__.py | 2 +-
extra/vulnserver/vulnserver.py | 2 +-
lib/__init__.py | 2 +-
lib/controller/__init__.py | 2 +-
lib/controller/action.py | 2 +-
lib/controller/checks.py | 2 +-
lib/controller/controller.py | 2 +-
lib/controller/handler.py | 2 +-
lib/core/__init__.py | 2 +-
lib/core/agent.py | 2 +-
lib/core/bigarray.py | 2 +-
lib/core/common.py | 2 +-
lib/core/compat.py | 2 +-
lib/core/convert.py | 2 +-
lib/core/data.py | 2 +-
lib/core/datatype.py | 2 +-
lib/core/decorators.py | 2 +-
lib/core/defaults.py | 2 +-
lib/core/dicts.py | 2 +-
lib/core/dump.py | 2 +-
lib/core/enums.py | 2 +-
lib/core/exception.py | 2 +-
lib/core/gui.py | 4 ++--
lib/core/log.py | 2 +-
lib/core/option.py | 2 +-
lib/core/optiondict.py | 2 +-
lib/core/patch.py | 2 +-
lib/core/profiling.py | 2 +-
lib/core/readlineng.py | 2 +-
lib/core/replication.py | 2 +-
lib/core/revision.py | 2 +-
lib/core/session.py | 2 +-
lib/core/settings.py | 2 +-
lib/core/shell.py | 2 +-
lib/core/subprocessng.py | 2 +-
lib/core/target.py | 2 +-
lib/core/testing.py | 2 +-
lib/core/threads.py | 2 +-
lib/core/unescaper.py | 2 +-
lib/core/update.py | 2 +-
lib/core/wordlist.py | 2 +-
lib/parse/__init__.py | 2 +-
lib/parse/banner.py | 2 +-
lib/parse/cmdline.py | 2 +-
lib/parse/configfile.py | 2 +-
lib/parse/handler.py | 2 +-
lib/parse/headers.py | 2 +-
lib/parse/html.py | 2 +-
lib/parse/payloads.py | 2 +-
lib/parse/sitemap.py | 2 +-
lib/request/__init__.py | 2 +-
lib/request/basic.py | 2 +-
lib/request/basicauthhandler.py | 2 +-
lib/request/chunkedhandler.py | 2 +-
lib/request/comparison.py | 2 +-
lib/request/connect.py | 2 +-
lib/request/direct.py | 2 +-
lib/request/dns.py | 2 +-
lib/request/httpshandler.py | 2 +-
lib/request/inject.py | 2 +-
lib/request/methodrequest.py | 2 +-
lib/request/pkihandler.py | 2 +-
lib/request/rangehandler.py | 2 +-
lib/request/redirecthandler.py | 2 +-
lib/request/templates.py | 2 +-
lib/takeover/__init__.py | 2 +-
lib/takeover/abstraction.py | 2 +-
lib/takeover/icmpsh.py | 2 +-
lib/takeover/metasploit.py | 2 +-
lib/takeover/registry.py | 2 +-
lib/takeover/udf.py | 2 +-
lib/takeover/web.py | 2 +-
lib/takeover/xp_cmdshell.py | 2 +-
lib/techniques/__init__.py | 2 +-
lib/techniques/blind/__init__.py | 2 +-
lib/techniques/blind/inference.py | 2 +-
lib/techniques/dns/__init__.py | 2 +-
lib/techniques/dns/test.py | 2 +-
lib/techniques/dns/use.py | 2 +-
lib/techniques/error/__init__.py | 2 +-
lib/techniques/error/use.py | 2 +-
lib/techniques/union/__init__.py | 2 +-
lib/techniques/union/test.py | 2 +-
lib/techniques/union/use.py | 2 +-
lib/utils/__init__.py | 2 +-
lib/utils/api.py | 2 +-
lib/utils/brute.py | 2 +-
lib/utils/crawler.py | 2 +-
lib/utils/deps.py | 2 +-
lib/utils/getch.py | 2 +-
lib/utils/har.py | 2 +-
lib/utils/hash.py | 2 +-
lib/utils/hashdb.py | 2 +-
lib/utils/httpd.py | 2 +-
lib/utils/pivotdumptable.py | 2 +-
lib/utils/progress.py | 2 +-
lib/utils/purge.py | 2 +-
lib/utils/safe2bin.py | 2 +-
lib/utils/search.py | 2 +-
lib/utils/sqlalchemy.py | 2 +-
lib/utils/timeout.py | 2 +-
lib/utils/versioncheck.py | 2 +-
lib/utils/xrange.py | 2 +-
plugins/__init__.py | 2 +-
plugins/dbms/__init__.py | 2 +-
plugins/dbms/access/__init__.py | 2 +-
plugins/dbms/access/connector.py | 2 +-
plugins/dbms/access/enumeration.py | 2 +-
plugins/dbms/access/filesystem.py | 2 +-
plugins/dbms/access/fingerprint.py | 2 +-
plugins/dbms/access/syntax.py | 2 +-
plugins/dbms/access/takeover.py | 2 +-
plugins/dbms/db2/__init__.py | 2 +-
plugins/dbms/db2/connector.py | 2 +-
plugins/dbms/db2/enumeration.py | 2 +-
plugins/dbms/db2/filesystem.py | 2 +-
plugins/dbms/db2/fingerprint.py | 2 +-
plugins/dbms/db2/syntax.py | 2 +-
plugins/dbms/db2/takeover.py | 2 +-
plugins/dbms/firebird/__init__.py | 2 +-
plugins/dbms/firebird/connector.py | 2 +-
plugins/dbms/firebird/enumeration.py | 2 +-
plugins/dbms/firebird/filesystem.py | 2 +-
plugins/dbms/firebird/fingerprint.py | 2 +-
plugins/dbms/firebird/syntax.py | 2 +-
plugins/dbms/firebird/takeover.py | 2 +-
plugins/dbms/h2/__init__.py | 2 +-
plugins/dbms/h2/connector.py | 2 +-
plugins/dbms/h2/enumeration.py | 2 +-
plugins/dbms/h2/filesystem.py | 2 +-
plugins/dbms/h2/fingerprint.py | 2 +-
plugins/dbms/h2/syntax.py | 2 +-
plugins/dbms/h2/takeover.py | 2 +-
plugins/dbms/hsqldb/__init__.py | 2 +-
plugins/dbms/hsqldb/connector.py | 2 +-
plugins/dbms/hsqldb/enumeration.py | 2 +-
plugins/dbms/hsqldb/filesystem.py | 2 +-
plugins/dbms/hsqldb/fingerprint.py | 2 +-
plugins/dbms/hsqldb/syntax.py | 2 +-
plugins/dbms/hsqldb/takeover.py | 2 +-
plugins/dbms/informix/__init__.py | 2 +-
plugins/dbms/informix/connector.py | 2 +-
plugins/dbms/informix/enumeration.py | 2 +-
plugins/dbms/informix/filesystem.py | 2 +-
plugins/dbms/informix/fingerprint.py | 2 +-
plugins/dbms/informix/syntax.py | 2 +-
plugins/dbms/informix/takeover.py | 2 +-
plugins/dbms/maxdb/__init__.py | 2 +-
plugins/dbms/maxdb/connector.py | 2 +-
plugins/dbms/maxdb/enumeration.py | 2 +-
plugins/dbms/maxdb/filesystem.py | 2 +-
plugins/dbms/maxdb/fingerprint.py | 2 +-
plugins/dbms/maxdb/syntax.py | 2 +-
plugins/dbms/maxdb/takeover.py | 2 +-
plugins/dbms/mssqlserver/__init__.py | 2 +-
plugins/dbms/mssqlserver/connector.py | 2 +-
plugins/dbms/mssqlserver/enumeration.py | 2 +-
plugins/dbms/mssqlserver/filesystem.py | 2 +-
plugins/dbms/mssqlserver/fingerprint.py | 2 +-
plugins/dbms/mssqlserver/syntax.py | 2 +-
plugins/dbms/mssqlserver/takeover.py | 2 +-
plugins/dbms/mysql/__init__.py | 2 +-
plugins/dbms/mysql/connector.py | 2 +-
plugins/dbms/mysql/enumeration.py | 2 +-
plugins/dbms/mysql/filesystem.py | 2 +-
plugins/dbms/mysql/fingerprint.py | 2 +-
plugins/dbms/mysql/syntax.py | 2 +-
plugins/dbms/mysql/takeover.py | 2 +-
plugins/dbms/oracle/__init__.py | 2 +-
plugins/dbms/oracle/connector.py | 2 +-
plugins/dbms/oracle/enumeration.py | 2 +-
plugins/dbms/oracle/filesystem.py | 2 +-
plugins/dbms/oracle/fingerprint.py | 2 +-
plugins/dbms/oracle/syntax.py | 2 +-
plugins/dbms/oracle/takeover.py | 2 +-
plugins/dbms/postgresql/__init__.py | 2 +-
plugins/dbms/postgresql/connector.py | 2 +-
plugins/dbms/postgresql/enumeration.py | 2 +-
plugins/dbms/postgresql/filesystem.py | 2 +-
plugins/dbms/postgresql/fingerprint.py | 2 +-
plugins/dbms/postgresql/syntax.py | 2 +-
plugins/dbms/postgresql/takeover.py | 2 +-
plugins/dbms/sqlite/__init__.py | 2 +-
plugins/dbms/sqlite/connector.py | 2 +-
plugins/dbms/sqlite/enumeration.py | 2 +-
plugins/dbms/sqlite/filesystem.py | 2 +-
plugins/dbms/sqlite/fingerprint.py | 2 +-
plugins/dbms/sqlite/syntax.py | 2 +-
plugins/dbms/sqlite/takeover.py | 2 +-
plugins/dbms/sybase/__init__.py | 2 +-
plugins/dbms/sybase/connector.py | 2 +-
plugins/dbms/sybase/enumeration.py | 2 +-
plugins/dbms/sybase/filesystem.py | 2 +-
plugins/dbms/sybase/fingerprint.py | 2 +-
plugins/dbms/sybase/syntax.py | 2 +-
plugins/dbms/sybase/takeover.py | 2 +-
plugins/generic/__init__.py | 2 +-
plugins/generic/connector.py | 2 +-
plugins/generic/custom.py | 2 +-
plugins/generic/databases.py | 2 +-
plugins/generic/entries.py | 2 +-
plugins/generic/enumeration.py | 2 +-
plugins/generic/filesystem.py | 2 +-
plugins/generic/fingerprint.py | 2 +-
plugins/generic/misc.py | 2 +-
plugins/generic/search.py | 2 +-
plugins/generic/syntax.py | 2 +-
plugins/generic/takeover.py | 2 +-
plugins/generic/users.py | 2 +-
sqlmap.py | 2 +-
sqlmapapi.py | 2 +-
tamper/__init__.py | 2 +-
tamper/apostrophemask.py | 2 +-
tamper/apostrophenullencode.py | 2 +-
tamper/appendnullbyte.py | 2 +-
tamper/base64encode.py | 2 +-
tamper/between.py | 2 +-
tamper/bluecoat.py | 2 +-
tamper/chardoubleencode.py | 2 +-
tamper/charencode.py | 2 +-
tamper/charunicodeencode.py | 2 +-
tamper/charunicodeescape.py | 2 +-
tamper/commalesslimit.py | 2 +-
tamper/commalessmid.py | 2 +-
tamper/commentbeforeparentheses.py | 2 +-
tamper/concat2concatws.py | 2 +-
tamper/equaltolike.py | 2 +-
tamper/escapequotes.py | 2 +-
tamper/greatest.py | 2 +-
tamper/halfversionedmorekeywords.py | 2 +-
tamper/hex2char.py | 2 +-
tamper/htmlencode.py | 2 +-
tamper/ifnull2casewhenisnull.py | 2 +-
tamper/ifnull2ifisnull.py | 2 +-
tamper/informationschemacomment.py | 2 +-
tamper/least.py | 2 +-
tamper/lowercase.py | 2 +-
tamper/luanginx.py | 2 +-
tamper/modsecurityversioned.py | 2 +-
tamper/modsecurityzeroversioned.py | 2 +-
tamper/multiplespaces.py | 2 +-
tamper/overlongutf8.py | 2 +-
tamper/overlongutf8more.py | 2 +-
tamper/percentage.py | 2 +-
tamper/plus2concat.py | 2 +-
tamper/plus2fnconcat.py | 2 +-
tamper/randomcase.py | 2 +-
tamper/randomcomments.py | 2 +-
tamper/sp_password.py | 2 +-
tamper/space2comment.py | 2 +-
tamper/space2dash.py | 2 +-
tamper/space2hash.py | 2 +-
tamper/space2morecomment.py | 2 +-
tamper/space2morehash.py | 2 +-
tamper/space2mssqlblank.py | 2 +-
tamper/space2mssqlhash.py | 2 +-
tamper/space2mysqlblank.py | 2 +-
tamper/space2mysqldash.py | 2 +-
tamper/space2plus.py | 2 +-
tamper/space2randomblank.py | 2 +-
tamper/substring2leftright.py | 2 +-
tamper/symboliclogical.py | 2 +-
tamper/unionalltounion.py | 2 +-
tamper/unmagicquotes.py | 2 +-
tamper/uppercase.py | 2 +-
tamper/varnish.py | 2 +-
tamper/versionedkeywords.py | 2 +-
tamper/versionedmorekeywords.py | 2 +-
tamper/xforwardedfor.py | 2 +-
292 files changed, 294 insertions(+), 294 deletions(-)
diff --git a/LICENSE b/LICENSE
index da63e45d6..3fd5aa775 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
COPYING -- Describes the terms under which sqlmap is distributed. A copy
of the GNU General Public License (GPL) is appended to this file.
-sqlmap is (C) 2006-2019 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar.
+sqlmap is (C) 2006-2020 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar.
This program is free software; you may redistribute and/or modify it under
the terms of the GNU General Public License as published by the Free
diff --git a/data/txt/common-columns.txt b/data/txt/common-columns.txt
index 16f7e8c7c..6b47653ea 100644
--- a/data/txt/common-columns.txt
+++ b/data/txt/common-columns.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
id
diff --git a/data/txt/common-files.txt b/data/txt/common-files.txt
index 8db048a6b..92f64688e 100644
--- a/data/txt/common-files.txt
+++ b/data/txt/common-files.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Reference: https://gist.github.com/sckalath/78ad449346171d29241a
diff --git a/data/txt/common-outputs.txt b/data/txt/common-outputs.txt
index 874bd83e2..f5292688b 100644
--- a/data/txt/common-outputs.txt
+++ b/data/txt/common-outputs.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
[Banners]
diff --git a/data/txt/common-tables.txt b/data/txt/common-tables.txt
index 12c210c29..7f111c621 100644
--- a/data/txt/common-tables.txt
+++ b/data/txt/common-tables.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
users
diff --git a/data/txt/keywords.txt b/data/txt/keywords.txt
index 0dbc046b0..8113c553c 100644
--- a/data/txt/keywords.txt
+++ b/data/txt/keywords.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# SQL-92 keywords (reference: http://developer.mimer.com/validator/sql-reserved-words.tml)
diff --git a/data/txt/user-agents.txt b/data/txt/user-agents.txt
index 488a09d47..5b0adbc05 100644
--- a/data/txt/user-agents.txt
+++ b/data/txt/user-agents.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Opera
diff --git a/extra/__init__.py b/extra/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/extra/__init__.py
+++ b/extra/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/beep/__init__.py b/extra/beep/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/extra/beep/__init__.py
+++ b/extra/beep/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/beep/beep.py b/extra/beep/beep.py
index 88c042d52..7a866bff0 100644
--- a/extra/beep/beep.py
+++ b/extra/beep/beep.py
@@ -3,7 +3,7 @@
"""
beep.py - Make a beep sound
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/cloak/__init__.py b/extra/cloak/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/extra/cloak/__init__.py
+++ b/extra/cloak/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/cloak/cloak.py b/extra/cloak/cloak.py
index 345a061d1..860f4fde3 100644
--- a/extra/cloak/cloak.py
+++ b/extra/cloak/cloak.py
@@ -3,7 +3,7 @@
"""
cloak.py - Simple file encryption/compression utility
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/dbgtool/__init__.py b/extra/dbgtool/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/extra/dbgtool/__init__.py
+++ b/extra/dbgtool/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/dbgtool/dbgtool.py b/extra/dbgtool/dbgtool.py
index 30ae5e837..4d7352557 100644
--- a/extra/dbgtool/dbgtool.py
+++ b/extra/dbgtool/dbgtool.py
@@ -3,7 +3,7 @@
"""
dbgtool.py - Portable executable to ASCII debug script converter
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/shutils/blanks.sh b/extra/shutils/blanks.sh
index 9813f9a10..59670fbdb 100755
--- a/extra/shutils/blanks.sh
+++ b/extra/shutils/blanks.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Removes trailing spaces from blank lines inside project files
diff --git a/extra/shutils/drei.sh b/extra/shutils/drei.sh
index 85d40379e..f73027a30 100755
--- a/extra/shutils/drei.sh
+++ b/extra/shutils/drei.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Stress test against Python3
diff --git a/extra/shutils/duplicates.py b/extra/shutils/duplicates.py
index 7ffe0d444..158d0a457 100755
--- a/extra/shutils/duplicates.py
+++ b/extra/shutils/duplicates.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Removes duplicate entries in wordlist like files
diff --git a/extra/shutils/junk.sh b/extra/shutils/junk.sh
index 57ff21184..5d6e298b5 100755
--- a/extra/shutils/junk.sh
+++ b/extra/shutils/junk.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
find . -type d -name "__pycache__" -exec rm -rf {} \; &>/dev/null
diff --git a/extra/shutils/modernize.sh b/extra/shutils/modernize.sh
index ac5cab002..10f84244f 100755
--- a/extra/shutils/modernize.sh
+++ b/extra/shutils/modernize.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# sudo pip install modernize
diff --git a/extra/shutils/pycodestyle.sh b/extra/shutils/pycodestyle.sh
index 53acf30f9..7136ecee9 100755
--- a/extra/shutils/pycodestyle.sh
+++ b/extra/shutils/pycodestyle.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Runs pycodestyle on all python files (prerequisite: pip install pycodestyle)
diff --git a/extra/shutils/pydiatra.sh b/extra/shutils/pydiatra.sh
index 3b560004a..a299cf853 100755
--- a/extra/shutils/pydiatra.sh
+++ b/extra/shutils/pydiatra.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Runs py2diatra on all python files (prerequisite: pip install pydiatra)
diff --git a/extra/shutils/pyflakes.sh b/extra/shutils/pyflakes.sh
index cbdbe80c9..8f22c5e2c 100755
--- a/extra/shutils/pyflakes.sh
+++ b/extra/shutils/pyflakes.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
# Runs pyflakes on all python files (prerequisite: apt-get install pyflakes)
diff --git a/extra/shutils/pypi.sh b/extra/shutils/pypi.sh
index 016853a06..7e9892d19 100755
--- a/extra/shutils/pypi.sh
+++ b/extra/shutils/pypi.sh
@@ -16,7 +16,7 @@ cat > $TMP_DIR/setup.py << EOF
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
@@ -67,7 +67,7 @@ cat > sqlmap/__init__.py << EOF
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/vulnserver/__init__.py b/extra/vulnserver/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/extra/vulnserver/__init__.py
+++ b/extra/vulnserver/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index 3e2345076..d14dbc94a 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -3,7 +3,7 @@
"""
vulnserver.py - Trivial SQLi vulnerable HTTP server (Note: for testing purposes)
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/__init__.py b/lib/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/__init__.py
+++ b/lib/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/controller/__init__.py b/lib/controller/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/controller/__init__.py
+++ b/lib/controller/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/controller/action.py b/lib/controller/action.py
index 40ea3f26e..f2b7fe465 100644
--- a/lib/controller/action.py
+++ b/lib/controller/action.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/controller/checks.py b/lib/controller/checks.py
index fab3f29e9..dab1609ff 100644
--- a/lib/controller/checks.py
+++ b/lib/controller/checks.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/controller/controller.py b/lib/controller/controller.py
index a9bd38e28..c9a5b7e87 100644
--- a/lib/controller/controller.py
+++ b/lib/controller/controller.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/controller/handler.py b/lib/controller/handler.py
index 6ab21b71a..fc439729a 100644
--- a/lib/controller/handler.py
+++ b/lib/controller/handler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/__init__.py b/lib/core/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/core/__init__.py
+++ b/lib/core/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/agent.py b/lib/core/agent.py
index bc96632d7..de7f50e09 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/bigarray.py b/lib/core/bigarray.py
index ea6338697..2b6c148c1 100644
--- a/lib/core/bigarray.py
+++ b/lib/core/bigarray.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/common.py b/lib/core/common.py
index 377d135fa..ae8d5dfcc 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/compat.py b/lib/core/compat.py
index 0466e7cc0..78572c762 100644
--- a/lib/core/compat.py
+++ b/lib/core/compat.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/convert.py b/lib/core/convert.py
index d5d24b3ed..4eadbf968 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/data.py b/lib/core/data.py
index 3a56c7fb4..ffd460ae0 100644
--- a/lib/core/data.py
+++ b/lib/core/data.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/datatype.py b/lib/core/datatype.py
index 860347a49..b6cbc5441 100644
--- a/lib/core/datatype.py
+++ b/lib/core/datatype.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/decorators.py b/lib/core/decorators.py
index a01f08404..33a7a074f 100644
--- a/lib/core/decorators.py
+++ b/lib/core/decorators.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/defaults.py b/lib/core/defaults.py
index 914caac38..0dcdd076c 100644
--- a/lib/core/defaults.py
+++ b/lib/core/defaults.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/dicts.py b/lib/core/dicts.py
index 5fb35af9e..4e0f07bef 100644
--- a/lib/core/dicts.py
+++ b/lib/core/dicts.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/dump.py b/lib/core/dump.py
index 9fd4c8fcf..e76b60c67 100644
--- a/lib/core/dump.py
+++ b/lib/core/dump.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/enums.py b/lib/core/enums.py
index a1264fb35..3ab83f540 100644
--- a/lib/core/enums.py
+++ b/lib/core/enums.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/exception.py b/lib/core/exception.py
index ad87adf6f..83013473a 100644
--- a/lib/core/exception.py
+++ b/lib/core/exception.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/gui.py b/lib/core/gui.py
index 3143b892f..85885b791 100644
--- a/lib/core/gui.py
+++ b/lib/core/gui.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
@@ -213,7 +213,7 @@ def runGui(parser):
helpmenu.add_command(label="Wiki pages", command=lambda: webbrowser.open(WIKI_PAGE))
helpmenu.add_command(label="Report issue", command=lambda: webbrowser.open(ISSUES_PAGE))
helpmenu.add_separator()
- helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo("About", "Copyright (c) 2006-2019\n\n (%s)" % DEV_EMAIL_ADDRESS))
+ helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo("About", "Copyright (c) 2006-2020\n\n (%s)" % DEV_EMAIL_ADDRESS))
menubar.add_cascade(label="Help", menu=helpmenu)
window.config(menu=menubar)
diff --git a/lib/core/log.py b/lib/core/log.py
index 096fdfd90..3ab750e1e 100644
--- a/lib/core/log.py
+++ b/lib/core/log.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/option.py b/lib/core/option.py
index 24eb466e3..fa64003d7 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index 8da3b0399..caa75fa90 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/patch.py b/lib/core/patch.py
index 60ac0ef10..6d809e413 100644
--- a/lib/core/patch.py
+++ b/lib/core/patch.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/profiling.py b/lib/core/profiling.py
index 2282d9448..33aad3b67 100644
--- a/lib/core/profiling.py
+++ b/lib/core/profiling.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/readlineng.py b/lib/core/readlineng.py
index 90bf42741..cffc55185 100644
--- a/lib/core/readlineng.py
+++ b/lib/core/readlineng.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/replication.py b/lib/core/replication.py
index d0a1a3d1e..93e38fc85 100644
--- a/lib/core/replication.py
+++ b/lib/core/replication.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/revision.py b/lib/core/revision.py
index 6988f1a5e..eb45f96a7 100644
--- a/lib/core/revision.py
+++ b/lib/core/revision.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/session.py b/lib/core/session.py
index 9cf569b68..ba6087912 100644
--- a/lib/core/session.py
+++ b/lib/core/session.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 7a40fcfe3..7bbb515c2 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/shell.py b/lib/core/shell.py
index e147223fd..e2896ad20 100644
--- a/lib/core/shell.py
+++ b/lib/core/shell.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/subprocessng.py b/lib/core/subprocessng.py
index e0d99951f..216706de7 100644
--- a/lib/core/subprocessng.py
+++ b/lib/core/subprocessng.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/target.py b/lib/core/target.py
index 65028db59..72957074b 100644
--- a/lib/core/target.py
+++ b/lib/core/target.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/testing.py b/lib/core/testing.py
index 788935d57..4685c6bae 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/threads.py b/lib/core/threads.py
index 4e65c8a4e..c717681fe 100644
--- a/lib/core/threads.py
+++ b/lib/core/threads.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/unescaper.py b/lib/core/unescaper.py
index e2e33e84d..6f7956a14 100644
--- a/lib/core/unescaper.py
+++ b/lib/core/unescaper.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/update.py b/lib/core/update.py
index 4314575ff..75ec48b59 100644
--- a/lib/core/update.py
+++ b/lib/core/update.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/core/wordlist.py b/lib/core/wordlist.py
index a200e5376..2139c6d0f 100644
--- a/lib/core/wordlist.py
+++ b/lib/core/wordlist.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/__init__.py b/lib/parse/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/parse/__init__.py
+++ b/lib/parse/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/banner.py b/lib/parse/banner.py
index 6d5a60f29..d34ccf674 100644
--- a/lib/parse/banner.py
+++ b/lib/parse/banner.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index f69ca58ea..7c6fa2986 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/configfile.py b/lib/parse/configfile.py
index aa1c207b7..c0d7ce7ca 100644
--- a/lib/parse/configfile.py
+++ b/lib/parse/configfile.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/handler.py b/lib/parse/handler.py
index 805c756cf..9e071a14c 100644
--- a/lib/parse/handler.py
+++ b/lib/parse/handler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/headers.py b/lib/parse/headers.py
index 9676f91b1..75480193e 100644
--- a/lib/parse/headers.py
+++ b/lib/parse/headers.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/html.py b/lib/parse/html.py
index 3ec61d52f..8af2067ce 100644
--- a/lib/parse/html.py
+++ b/lib/parse/html.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/payloads.py b/lib/parse/payloads.py
index 6ee738f16..19caab070 100644
--- a/lib/parse/payloads.py
+++ b/lib/parse/payloads.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/parse/sitemap.py b/lib/parse/sitemap.py
index 83461c1b9..7acb1864c 100644
--- a/lib/parse/sitemap.py
+++ b/lib/parse/sitemap.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/__init__.py b/lib/request/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/request/__init__.py
+++ b/lib/request/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/basic.py b/lib/request/basic.py
index d4d78fc66..09d94d2be 100644
--- a/lib/request/basic.py
+++ b/lib/request/basic.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/basicauthhandler.py b/lib/request/basicauthhandler.py
index 58eec7d4e..252739ce1 100644
--- a/lib/request/basicauthhandler.py
+++ b/lib/request/basicauthhandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/chunkedhandler.py b/lib/request/chunkedhandler.py
index 9c226a9cb..243b4a643 100644
--- a/lib/request/chunkedhandler.py
+++ b/lib/request/chunkedhandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/comparison.py b/lib/request/comparison.py
index 18f37640e..90fb14c53 100644
--- a/lib/request/comparison.py
+++ b/lib/request/comparison.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/connect.py b/lib/request/connect.py
index 26ab5526b..a5eff1103 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/direct.py b/lib/request/direct.py
index 755291efa..ea64470f3 100644
--- a/lib/request/direct.py
+++ b/lib/request/direct.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/dns.py b/lib/request/dns.py
index 8c6df781b..7f6c914d1 100644
--- a/lib/request/dns.py
+++ b/lib/request/dns.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/httpshandler.py b/lib/request/httpshandler.py
index dd12c13db..c7cb41abe 100644
--- a/lib/request/httpshandler.py
+++ b/lib/request/httpshandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/inject.py b/lib/request/inject.py
index 8b17a3941..579a1e7f6 100644
--- a/lib/request/inject.py
+++ b/lib/request/inject.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/methodrequest.py b/lib/request/methodrequest.py
index b05902efa..318a87a84 100644
--- a/lib/request/methodrequest.py
+++ b/lib/request/methodrequest.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/pkihandler.py b/lib/request/pkihandler.py
index d6d42c823..174c4495d 100644
--- a/lib/request/pkihandler.py
+++ b/lib/request/pkihandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/rangehandler.py b/lib/request/rangehandler.py
index fcfc7e145..f63d0bc41 100644
--- a/lib/request/rangehandler.py
+++ b/lib/request/rangehandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/redirecthandler.py b/lib/request/redirecthandler.py
index 18bb1285a..5ecc2a193 100644
--- a/lib/request/redirecthandler.py
+++ b/lib/request/redirecthandler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/request/templates.py b/lib/request/templates.py
index 6f8f155e0..c19c9c9ed 100644
--- a/lib/request/templates.py
+++ b/lib/request/templates.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/__init__.py b/lib/takeover/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/takeover/__init__.py
+++ b/lib/takeover/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/abstraction.py b/lib/takeover/abstraction.py
index accc9f6a2..b85f93365 100644
--- a/lib/takeover/abstraction.py
+++ b/lib/takeover/abstraction.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/icmpsh.py b/lib/takeover/icmpsh.py
index 0fcec0f2d..4aab03baf 100644
--- a/lib/takeover/icmpsh.py
+++ b/lib/takeover/icmpsh.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/metasploit.py b/lib/takeover/metasploit.py
index 18c7a5b84..2e12d2c07 100644
--- a/lib/takeover/metasploit.py
+++ b/lib/takeover/metasploit.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/registry.py b/lib/takeover/registry.py
index d70a2b607..991ce631a 100644
--- a/lib/takeover/registry.py
+++ b/lib/takeover/registry.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/udf.py b/lib/takeover/udf.py
index 2848d67ff..fd2ed655d 100644
--- a/lib/takeover/udf.py
+++ b/lib/takeover/udf.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/web.py b/lib/takeover/web.py
index a459e2cc9..b338131f5 100644
--- a/lib/takeover/web.py
+++ b/lib/takeover/web.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/takeover/xp_cmdshell.py b/lib/takeover/xp_cmdshell.py
index 1ea8228c2..2f06fb047 100644
--- a/lib/takeover/xp_cmdshell.py
+++ b/lib/takeover/xp_cmdshell.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/__init__.py b/lib/techniques/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/techniques/__init__.py
+++ b/lib/techniques/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/blind/__init__.py b/lib/techniques/blind/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/techniques/blind/__init__.py
+++ b/lib/techniques/blind/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py
index 28eb23511..063ad7334 100644
--- a/lib/techniques/blind/inference.py
+++ b/lib/techniques/blind/inference.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/dns/__init__.py b/lib/techniques/dns/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/techniques/dns/__init__.py
+++ b/lib/techniques/dns/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/dns/test.py b/lib/techniques/dns/test.py
index 361a3b088..f1f5948ad 100644
--- a/lib/techniques/dns/test.py
+++ b/lib/techniques/dns/test.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/dns/use.py b/lib/techniques/dns/use.py
index bca5594b8..611ad75d5 100644
--- a/lib/techniques/dns/use.py
+++ b/lib/techniques/dns/use.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/error/__init__.py b/lib/techniques/error/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/techniques/error/__init__.py
+++ b/lib/techniques/error/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/error/use.py b/lib/techniques/error/use.py
index 783a2e952..f46fc54c1 100644
--- a/lib/techniques/error/use.py
+++ b/lib/techniques/error/use.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/union/__init__.py b/lib/techniques/union/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/techniques/union/__init__.py
+++ b/lib/techniques/union/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/union/test.py b/lib/techniques/union/test.py
index 30b58c94b..8e4d25c58 100644
--- a/lib/techniques/union/test.py
+++ b/lib/techniques/union/test.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/techniques/union/use.py b/lib/techniques/union/use.py
index bdec4e797..af05c946b 100644
--- a/lib/techniques/union/use.py
+++ b/lib/techniques/union/use.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/__init__.py b/lib/utils/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/lib/utils/__init__.py
+++ b/lib/utils/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/api.py b/lib/utils/api.py
index 468c09c03..649b9f602 100644
--- a/lib/utils/api.py
+++ b/lib/utils/api.py
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/brute.py b/lib/utils/brute.py
index b1589dafe..ed2c2b661 100644
--- a/lib/utils/brute.py
+++ b/lib/utils/brute.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/crawler.py b/lib/utils/crawler.py
index f88e33bef..574916eca 100644
--- a/lib/utils/crawler.py
+++ b/lib/utils/crawler.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/deps.py b/lib/utils/deps.py
index 3df3e11e0..1b184f1d0 100644
--- a/lib/utils/deps.py
+++ b/lib/utils/deps.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/getch.py b/lib/utils/getch.py
index 84e099e5d..25b899f9b 100644
--- a/lib/utils/getch.py
+++ b/lib/utils/getch.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/har.py b/lib/utils/har.py
index a065a9b01..0dabb2b36 100644
--- a/lib/utils/har.py
+++ b/lib/utils/har.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/hash.py b/lib/utils/hash.py
index 32afff4e2..0779d6ca7 100644
--- a/lib/utils/hash.py
+++ b/lib/utils/hash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/hashdb.py b/lib/utils/hashdb.py
index a0f964976..dc8c503e7 100644
--- a/lib/utils/hashdb.py
+++ b/lib/utils/hashdb.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/httpd.py b/lib/utils/httpd.py
index da5fd9935..0e6ef9325 100644
--- a/lib/utils/httpd.py
+++ b/lib/utils/httpd.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/pivotdumptable.py b/lib/utils/pivotdumptable.py
index 27774ad3f..254621102 100644
--- a/lib/utils/pivotdumptable.py
+++ b/lib/utils/pivotdumptable.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/progress.py b/lib/utils/progress.py
index cc509c3db..76ad2cf06 100644
--- a/lib/utils/progress.py
+++ b/lib/utils/progress.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/purge.py b/lib/utils/purge.py
index 72d99a555..d722fc67c 100644
--- a/lib/utils/purge.py
+++ b/lib/utils/purge.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/safe2bin.py b/lib/utils/safe2bin.py
index b8e7d1482..50a6d5093 100644
--- a/lib/utils/safe2bin.py
+++ b/lib/utils/safe2bin.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/search.py b/lib/utils/search.py
index 5ade9c0be..8c239b7df 100644
--- a/lib/utils/search.py
+++ b/lib/utils/search.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/sqlalchemy.py b/lib/utils/sqlalchemy.py
index a7af101b7..4a8d1d705 100644
--- a/lib/utils/sqlalchemy.py
+++ b/lib/utils/sqlalchemy.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/timeout.py b/lib/utils/timeout.py
index a08f1f2c3..27c716705 100644
--- a/lib/utils/timeout.py
+++ b/lib/utils/timeout.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/versioncheck.py b/lib/utils/versioncheck.py
index 57eecb0e0..0e0ebeaa0 100644
--- a/lib/utils/versioncheck.py
+++ b/lib/utils/versioncheck.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/lib/utils/xrange.py b/lib/utils/xrange.py
index a8b3d69a1..6d51e12be 100644
--- a/lib/utils/xrange.py
+++ b/lib/utils/xrange.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/__init__.py b/plugins/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/plugins/__init__.py
+++ b/plugins/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/__init__.py b/plugins/dbms/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/plugins/dbms/__init__.py
+++ b/plugins/dbms/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/__init__.py b/plugins/dbms/access/__init__.py
index f204b0a09..28d260eec 100644
--- a/plugins/dbms/access/__init__.py
+++ b/plugins/dbms/access/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/connector.py b/plugins/dbms/access/connector.py
index 1bf363aa4..7dec85d67 100644
--- a/plugins/dbms/access/connector.py
+++ b/plugins/dbms/access/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/enumeration.py b/plugins/dbms/access/enumeration.py
index 540aec0f5..cc691205b 100644
--- a/plugins/dbms/access/enumeration.py
+++ b/plugins/dbms/access/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/filesystem.py b/plugins/dbms/access/filesystem.py
index 05b6a01e0..ddc220d9a 100644
--- a/plugins/dbms/access/filesystem.py
+++ b/plugins/dbms/access/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/fingerprint.py b/plugins/dbms/access/fingerprint.py
index c604a22b9..967d1d3e1 100644
--- a/plugins/dbms/access/fingerprint.py
+++ b/plugins/dbms/access/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/syntax.py b/plugins/dbms/access/syntax.py
index fb64ecc3a..21881cd15 100644
--- a/plugins/dbms/access/syntax.py
+++ b/plugins/dbms/access/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/access/takeover.py b/plugins/dbms/access/takeover.py
index a7e67b73a..e134d0dab 100644
--- a/plugins/dbms/access/takeover.py
+++ b/plugins/dbms/access/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/__init__.py b/plugins/dbms/db2/__init__.py
index e37cc3913..e6f0dfa58 100644
--- a/plugins/dbms/db2/__init__.py
+++ b/plugins/dbms/db2/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/connector.py b/plugins/dbms/db2/connector.py
index ab162ff55..2120618ca 100644
--- a/plugins/dbms/db2/connector.py
+++ b/plugins/dbms/db2/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/enumeration.py b/plugins/dbms/db2/enumeration.py
index 4f29cfb64..ab42b0a7e 100644
--- a/plugins/dbms/db2/enumeration.py
+++ b/plugins/dbms/db2/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/filesystem.py b/plugins/dbms/db2/filesystem.py
index 76c3c44e7..e8c642492 100644
--- a/plugins/dbms/db2/filesystem.py
+++ b/plugins/dbms/db2/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/fingerprint.py b/plugins/dbms/db2/fingerprint.py
index 891510906..4bb198d0e 100644
--- a/plugins/dbms/db2/fingerprint.py
+++ b/plugins/dbms/db2/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/syntax.py b/plugins/dbms/db2/syntax.py
index 669d5ca85..f9355c077 100644
--- a/plugins/dbms/db2/syntax.py
+++ b/plugins/dbms/db2/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/db2/takeover.py b/plugins/dbms/db2/takeover.py
index ca204b034..432fa6f78 100644
--- a/plugins/dbms/db2/takeover.py
+++ b/plugins/dbms/db2/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/__init__.py b/plugins/dbms/firebird/__init__.py
index 85b46a55d..121a2a414 100644
--- a/plugins/dbms/firebird/__init__.py
+++ b/plugins/dbms/firebird/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/connector.py b/plugins/dbms/firebird/connector.py
index 10305f68e..edd0ae750 100644
--- a/plugins/dbms/firebird/connector.py
+++ b/plugins/dbms/firebird/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/enumeration.py b/plugins/dbms/firebird/enumeration.py
index 4281f8bb6..248f3dc12 100644
--- a/plugins/dbms/firebird/enumeration.py
+++ b/plugins/dbms/firebird/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/filesystem.py b/plugins/dbms/firebird/filesystem.py
index 888da8433..41640ab15 100644
--- a/plugins/dbms/firebird/filesystem.py
+++ b/plugins/dbms/firebird/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/fingerprint.py b/plugins/dbms/firebird/fingerprint.py
index 79ca5e352..ab27b003e 100644
--- a/plugins/dbms/firebird/fingerprint.py
+++ b/plugins/dbms/firebird/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/syntax.py b/plugins/dbms/firebird/syntax.py
index dc903b0f1..ace022dcc 100644
--- a/plugins/dbms/firebird/syntax.py
+++ b/plugins/dbms/firebird/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/firebird/takeover.py b/plugins/dbms/firebird/takeover.py
index 2adb716b5..8dc3fc729 100644
--- a/plugins/dbms/firebird/takeover.py
+++ b/plugins/dbms/firebird/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/__init__.py b/plugins/dbms/h2/__init__.py
index 334b53df6..659645506 100644
--- a/plugins/dbms/h2/__init__.py
+++ b/plugins/dbms/h2/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/connector.py b/plugins/dbms/h2/connector.py
index 630d4e2e6..9715ab48a 100644
--- a/plugins/dbms/h2/connector.py
+++ b/plugins/dbms/h2/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/enumeration.py b/plugins/dbms/h2/enumeration.py
index fc35f28a6..0d26d2b7f 100644
--- a/plugins/dbms/h2/enumeration.py
+++ b/plugins/dbms/h2/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/filesystem.py b/plugins/dbms/h2/filesystem.py
index 2bfb05ea0..aa1a9951b 100644
--- a/plugins/dbms/h2/filesystem.py
+++ b/plugins/dbms/h2/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/fingerprint.py b/plugins/dbms/h2/fingerprint.py
index 35cbbb688..56f89ce03 100644
--- a/plugins/dbms/h2/fingerprint.py
+++ b/plugins/dbms/h2/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/syntax.py b/plugins/dbms/h2/syntax.py
index be1bb443d..fb6bbe94b 100644
--- a/plugins/dbms/h2/syntax.py
+++ b/plugins/dbms/h2/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/h2/takeover.py b/plugins/dbms/h2/takeover.py
index 075123723..ea2781173 100644
--- a/plugins/dbms/h2/takeover.py
+++ b/plugins/dbms/h2/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/__init__.py b/plugins/dbms/hsqldb/__init__.py
index 166c121da..7d06406ca 100644
--- a/plugins/dbms/hsqldb/__init__.py
+++ b/plugins/dbms/hsqldb/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/connector.py b/plugins/dbms/hsqldb/connector.py
index 2f8ae08aa..5aa9b2d57 100644
--- a/plugins/dbms/hsqldb/connector.py
+++ b/plugins/dbms/hsqldb/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/enumeration.py b/plugins/dbms/hsqldb/enumeration.py
index 6c0fd662f..e9aa4c40b 100644
--- a/plugins/dbms/hsqldb/enumeration.py
+++ b/plugins/dbms/hsqldb/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/filesystem.py b/plugins/dbms/hsqldb/filesystem.py
index a5dd2990c..162c8e0a5 100644
--- a/plugins/dbms/hsqldb/filesystem.py
+++ b/plugins/dbms/hsqldb/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/fingerprint.py b/plugins/dbms/hsqldb/fingerprint.py
index a14644b1b..6641acd21 100644
--- a/plugins/dbms/hsqldb/fingerprint.py
+++ b/plugins/dbms/hsqldb/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/syntax.py b/plugins/dbms/hsqldb/syntax.py
index be1bb443d..fb6bbe94b 100644
--- a/plugins/dbms/hsqldb/syntax.py
+++ b/plugins/dbms/hsqldb/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/hsqldb/takeover.py b/plugins/dbms/hsqldb/takeover.py
index 5c7d2199d..9db7a6f66 100644
--- a/plugins/dbms/hsqldb/takeover.py
+++ b/plugins/dbms/hsqldb/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/__init__.py b/plugins/dbms/informix/__init__.py
index 50e2adee4..d0177dd71 100644
--- a/plugins/dbms/informix/__init__.py
+++ b/plugins/dbms/informix/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/connector.py b/plugins/dbms/informix/connector.py
index 133dc21ba..03bc7dc47 100644
--- a/plugins/dbms/informix/connector.py
+++ b/plugins/dbms/informix/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/enumeration.py b/plugins/dbms/informix/enumeration.py
index 5b44899c6..05584dba1 100644
--- a/plugins/dbms/informix/enumeration.py
+++ b/plugins/dbms/informix/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/filesystem.py b/plugins/dbms/informix/filesystem.py
index 76c3c44e7..e8c642492 100644
--- a/plugins/dbms/informix/filesystem.py
+++ b/plugins/dbms/informix/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/fingerprint.py b/plugins/dbms/informix/fingerprint.py
index a3adbaf8b..bd1ea19d4 100644
--- a/plugins/dbms/informix/fingerprint.py
+++ b/plugins/dbms/informix/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/syntax.py b/plugins/dbms/informix/syntax.py
index b6a39f605..fc4f98522 100644
--- a/plugins/dbms/informix/syntax.py
+++ b/plugins/dbms/informix/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/informix/takeover.py b/plugins/dbms/informix/takeover.py
index ca204b034..432fa6f78 100644
--- a/plugins/dbms/informix/takeover.py
+++ b/plugins/dbms/informix/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/__init__.py b/plugins/dbms/maxdb/__init__.py
index 6bd694025..1cc74e599 100644
--- a/plugins/dbms/maxdb/__init__.py
+++ b/plugins/dbms/maxdb/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/connector.py b/plugins/dbms/maxdb/connector.py
index 8b06d639e..94a40ae78 100644
--- a/plugins/dbms/maxdb/connector.py
+++ b/plugins/dbms/maxdb/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/enumeration.py b/plugins/dbms/maxdb/enumeration.py
index bece7afeb..36d626033 100644
--- a/plugins/dbms/maxdb/enumeration.py
+++ b/plugins/dbms/maxdb/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/filesystem.py b/plugins/dbms/maxdb/filesystem.py
index 00c09480d..76e42d4ee 100644
--- a/plugins/dbms/maxdb/filesystem.py
+++ b/plugins/dbms/maxdb/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/fingerprint.py b/plugins/dbms/maxdb/fingerprint.py
index 575091a77..75816c368 100644
--- a/plugins/dbms/maxdb/fingerprint.py
+++ b/plugins/dbms/maxdb/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/syntax.py b/plugins/dbms/maxdb/syntax.py
index 1f2730966..dc6c66174 100644
--- a/plugins/dbms/maxdb/syntax.py
+++ b/plugins/dbms/maxdb/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/maxdb/takeover.py b/plugins/dbms/maxdb/takeover.py
index 796443b21..20079a4aa 100644
--- a/plugins/dbms/maxdb/takeover.py
+++ b/plugins/dbms/maxdb/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/__init__.py b/plugins/dbms/mssqlserver/__init__.py
index 40696af8c..ef7ca75fa 100644
--- a/plugins/dbms/mssqlserver/__init__.py
+++ b/plugins/dbms/mssqlserver/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/connector.py b/plugins/dbms/mssqlserver/connector.py
index 668efdd47..119ccb63d 100644
--- a/plugins/dbms/mssqlserver/connector.py
+++ b/plugins/dbms/mssqlserver/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/enumeration.py b/plugins/dbms/mssqlserver/enumeration.py
index 46437fbed..91956307e 100644
--- a/plugins/dbms/mssqlserver/enumeration.py
+++ b/plugins/dbms/mssqlserver/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/filesystem.py b/plugins/dbms/mssqlserver/filesystem.py
index 5fe0301d9..ed394ecde 100644
--- a/plugins/dbms/mssqlserver/filesystem.py
+++ b/plugins/dbms/mssqlserver/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/fingerprint.py b/plugins/dbms/mssqlserver/fingerprint.py
index e4820fc32..4e4f7db0e 100644
--- a/plugins/dbms/mssqlserver/fingerprint.py
+++ b/plugins/dbms/mssqlserver/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/syntax.py b/plugins/dbms/mssqlserver/syntax.py
index 4100babe3..8cf6c2910 100644
--- a/plugins/dbms/mssqlserver/syntax.py
+++ b/plugins/dbms/mssqlserver/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mssqlserver/takeover.py b/plugins/dbms/mssqlserver/takeover.py
index 0e35ae7aa..c47253a0e 100644
--- a/plugins/dbms/mssqlserver/takeover.py
+++ b/plugins/dbms/mssqlserver/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/__init__.py b/plugins/dbms/mysql/__init__.py
index 3c171b692..a53a4212f 100644
--- a/plugins/dbms/mysql/__init__.py
+++ b/plugins/dbms/mysql/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/connector.py b/plugins/dbms/mysql/connector.py
index 6e1fc60de..a2abdd3d3 100644
--- a/plugins/dbms/mysql/connector.py
+++ b/plugins/dbms/mysql/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/enumeration.py b/plugins/dbms/mysql/enumeration.py
index ccb7e534e..ebaf32f33 100644
--- a/plugins/dbms/mysql/enumeration.py
+++ b/plugins/dbms/mysql/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/filesystem.py b/plugins/dbms/mysql/filesystem.py
index 4ce41cf33..f92485a2c 100644
--- a/plugins/dbms/mysql/filesystem.py
+++ b/plugins/dbms/mysql/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/fingerprint.py b/plugins/dbms/mysql/fingerprint.py
index 6b2f66e16..228ba311a 100644
--- a/plugins/dbms/mysql/fingerprint.py
+++ b/plugins/dbms/mysql/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/syntax.py b/plugins/dbms/mysql/syntax.py
index 542e094ef..8d135c93e 100644
--- a/plugins/dbms/mysql/syntax.py
+++ b/plugins/dbms/mysql/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/mysql/takeover.py b/plugins/dbms/mysql/takeover.py
index a66d12313..73308010b 100644
--- a/plugins/dbms/mysql/takeover.py
+++ b/plugins/dbms/mysql/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/__init__.py b/plugins/dbms/oracle/__init__.py
index e2d352542..1188be561 100644
--- a/plugins/dbms/oracle/__init__.py
+++ b/plugins/dbms/oracle/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/connector.py b/plugins/dbms/oracle/connector.py
index 2d2fcc69d..26085c751 100644
--- a/plugins/dbms/oracle/connector.py
+++ b/plugins/dbms/oracle/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/enumeration.py b/plugins/dbms/oracle/enumeration.py
index c79a89758..ba3d1b1ab 100644
--- a/plugins/dbms/oracle/enumeration.py
+++ b/plugins/dbms/oracle/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/filesystem.py b/plugins/dbms/oracle/filesystem.py
index 4684531a3..c5a42c9fb 100644
--- a/plugins/dbms/oracle/filesystem.py
+++ b/plugins/dbms/oracle/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/fingerprint.py b/plugins/dbms/oracle/fingerprint.py
index 4a31b0625..9dc7cb654 100644
--- a/plugins/dbms/oracle/fingerprint.py
+++ b/plugins/dbms/oracle/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/syntax.py b/plugins/dbms/oracle/syntax.py
index 60865c00c..afa75fc7e 100644
--- a/plugins/dbms/oracle/syntax.py
+++ b/plugins/dbms/oracle/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/oracle/takeover.py b/plugins/dbms/oracle/takeover.py
index dbffdb4fa..2c638e735 100644
--- a/plugins/dbms/oracle/takeover.py
+++ b/plugins/dbms/oracle/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/__init__.py b/plugins/dbms/postgresql/__init__.py
index 7d46c6f1f..c40c28221 100644
--- a/plugins/dbms/postgresql/__init__.py
+++ b/plugins/dbms/postgresql/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/connector.py b/plugins/dbms/postgresql/connector.py
index 1b81bc1f5..acd70b6b5 100644
--- a/plugins/dbms/postgresql/connector.py
+++ b/plugins/dbms/postgresql/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/enumeration.py b/plugins/dbms/postgresql/enumeration.py
index b1097bcf0..4dcbdecc2 100644
--- a/plugins/dbms/postgresql/enumeration.py
+++ b/plugins/dbms/postgresql/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/filesystem.py b/plugins/dbms/postgresql/filesystem.py
index d21ebf1ec..a12a8c581 100644
--- a/plugins/dbms/postgresql/filesystem.py
+++ b/plugins/dbms/postgresql/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/fingerprint.py b/plugins/dbms/postgresql/fingerprint.py
index f21c6b5ec..853d50881 100644
--- a/plugins/dbms/postgresql/fingerprint.py
+++ b/plugins/dbms/postgresql/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/syntax.py b/plugins/dbms/postgresql/syntax.py
index 179c828de..ec7fe6cca 100644
--- a/plugins/dbms/postgresql/syntax.py
+++ b/plugins/dbms/postgresql/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/postgresql/takeover.py b/plugins/dbms/postgresql/takeover.py
index 0350a36d9..e4454d17d 100644
--- a/plugins/dbms/postgresql/takeover.py
+++ b/plugins/dbms/postgresql/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/__init__.py b/plugins/dbms/sqlite/__init__.py
index 004a7165d..226e8feda 100644
--- a/plugins/dbms/sqlite/__init__.py
+++ b/plugins/dbms/sqlite/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/connector.py b/plugins/dbms/sqlite/connector.py
index f099b766d..f1270eb68 100644
--- a/plugins/dbms/sqlite/connector.py
+++ b/plugins/dbms/sqlite/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/enumeration.py b/plugins/dbms/sqlite/enumeration.py
index 0ee814629..1c985b81f 100644
--- a/plugins/dbms/sqlite/enumeration.py
+++ b/plugins/dbms/sqlite/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/filesystem.py b/plugins/dbms/sqlite/filesystem.py
index 89426f8fc..d6b5e3820 100644
--- a/plugins/dbms/sqlite/filesystem.py
+++ b/plugins/dbms/sqlite/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/fingerprint.py b/plugins/dbms/sqlite/fingerprint.py
index 40ec72911..4093a3d69 100644
--- a/plugins/dbms/sqlite/fingerprint.py
+++ b/plugins/dbms/sqlite/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/syntax.py b/plugins/dbms/sqlite/syntax.py
index b4b20e767..f9d5af85f 100644
--- a/plugins/dbms/sqlite/syntax.py
+++ b/plugins/dbms/sqlite/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sqlite/takeover.py b/plugins/dbms/sqlite/takeover.py
index 0f1f5dab1..e5410583c 100644
--- a/plugins/dbms/sqlite/takeover.py
+++ b/plugins/dbms/sqlite/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/__init__.py b/plugins/dbms/sybase/__init__.py
index 9eedd7e01..0b31f519b 100644
--- a/plugins/dbms/sybase/__init__.py
+++ b/plugins/dbms/sybase/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/connector.py b/plugins/dbms/sybase/connector.py
index 80298459a..d73538809 100644
--- a/plugins/dbms/sybase/connector.py
+++ b/plugins/dbms/sybase/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/enumeration.py b/plugins/dbms/sybase/enumeration.py
index 9e4f9e63e..d45410f5d 100644
--- a/plugins/dbms/sybase/enumeration.py
+++ b/plugins/dbms/sybase/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/filesystem.py b/plugins/dbms/sybase/filesystem.py
index a2f8757a4..305b9bd8f 100644
--- a/plugins/dbms/sybase/filesystem.py
+++ b/plugins/dbms/sybase/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/fingerprint.py b/plugins/dbms/sybase/fingerprint.py
index a97a27b01..9381dd270 100644
--- a/plugins/dbms/sybase/fingerprint.py
+++ b/plugins/dbms/sybase/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/syntax.py b/plugins/dbms/sybase/syntax.py
index f8299027d..7a9e70199 100644
--- a/plugins/dbms/sybase/syntax.py
+++ b/plugins/dbms/sybase/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/dbms/sybase/takeover.py b/plugins/dbms/sybase/takeover.py
index 98681a78b..55f6e1c58 100644
--- a/plugins/dbms/sybase/takeover.py
+++ b/plugins/dbms/sybase/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/__init__.py b/plugins/generic/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/plugins/generic/__init__.py
+++ b/plugins/generic/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/connector.py b/plugins/generic/connector.py
index 656485e1a..6f001e5bf 100644
--- a/plugins/generic/connector.py
+++ b/plugins/generic/connector.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/custom.py b/plugins/generic/custom.py
index 41860b569..a1faa80ee 100644
--- a/plugins/generic/custom.py
+++ b/plugins/generic/custom.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py
index 0f04f4015..5a86d7123 100644
--- a/plugins/generic/databases.py
+++ b/plugins/generic/databases.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/entries.py b/plugins/generic/entries.py
index e54927675..83e4fea09 100644
--- a/plugins/generic/entries.py
+++ b/plugins/generic/entries.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/enumeration.py b/plugins/generic/enumeration.py
index c8b40728e..d5b35b7e0 100644
--- a/plugins/generic/enumeration.py
+++ b/plugins/generic/enumeration.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/filesystem.py b/plugins/generic/filesystem.py
index 946c3ae95..2a04bb9f0 100644
--- a/plugins/generic/filesystem.py
+++ b/plugins/generic/filesystem.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/fingerprint.py b/plugins/generic/fingerprint.py
index 26ff4e39b..76c7199f1 100644
--- a/plugins/generic/fingerprint.py
+++ b/plugins/generic/fingerprint.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/misc.py b/plugins/generic/misc.py
index 3f1793317..528dad0b1 100644
--- a/plugins/generic/misc.py
+++ b/plugins/generic/misc.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/search.py b/plugins/generic/search.py
index 30f1feaac..c2a680afa 100644
--- a/plugins/generic/search.py
+++ b/plugins/generic/search.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/syntax.py b/plugins/generic/syntax.py
index bb0bee737..f6476382a 100644
--- a/plugins/generic/syntax.py
+++ b/plugins/generic/syntax.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/takeover.py b/plugins/generic/takeover.py
index 7d1de8f37..33e45886f 100644
--- a/plugins/generic/takeover.py
+++ b/plugins/generic/takeover.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/plugins/generic/users.py b/plugins/generic/users.py
index 5985d3b3b..1636522eb 100644
--- a/plugins/generic/users.py
+++ b/plugins/generic/users.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/sqlmap.py b/sqlmap.py
index b353ae324..811fc4ca7 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/sqlmapapi.py b/sqlmapapi.py
index 9af5ab716..f178334e7 100755
--- a/sqlmapapi.py
+++ b/sqlmapapi.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/__init__.py b/tamper/__init__.py
index c654cbef7..a1e6b4789 100644
--- a/tamper/__init__.py
+++ b/tamper/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/apostrophemask.py b/tamper/apostrophemask.py
index d5ed52de3..6c2c243a4 100644
--- a/tamper/apostrophemask.py
+++ b/tamper/apostrophemask.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/apostrophenullencode.py b/tamper/apostrophenullencode.py
index 751c0096b..ae0a9bc51 100644
--- a/tamper/apostrophenullencode.py
+++ b/tamper/apostrophenullencode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/appendnullbyte.py b/tamper/appendnullbyte.py
index 5d23e4d57..88ee1d522 100644
--- a/tamper/appendnullbyte.py
+++ b/tamper/appendnullbyte.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/base64encode.py b/tamper/base64encode.py
index 9718da1e0..0aa8185a3 100644
--- a/tamper/base64encode.py
+++ b/tamper/base64encode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/between.py b/tamper/between.py
index e8d46b8f4..c222fb470 100644
--- a/tamper/between.py
+++ b/tamper/between.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/bluecoat.py b/tamper/bluecoat.py
index 0ec2af80c..d488280bd 100644
--- a/tamper/bluecoat.py
+++ b/tamper/bluecoat.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/chardoubleencode.py b/tamper/chardoubleencode.py
index 512c2b3b4..128d4100e 100644
--- a/tamper/chardoubleencode.py
+++ b/tamper/chardoubleencode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/charencode.py b/tamper/charencode.py
index bf2283b1f..8e4330a84 100644
--- a/tamper/charencode.py
+++ b/tamper/charencode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/charunicodeencode.py b/tamper/charunicodeencode.py
index ba7a8dea1..59258ef26 100644
--- a/tamper/charunicodeencode.py
+++ b/tamper/charunicodeencode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/charunicodeescape.py b/tamper/charunicodeescape.py
index 790d8d6c4..4e749ffbb 100644
--- a/tamper/charunicodeescape.py
+++ b/tamper/charunicodeescape.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/commalesslimit.py b/tamper/commalesslimit.py
index 7ebecbcec..5d062ead7 100644
--- a/tamper/commalesslimit.py
+++ b/tamper/commalesslimit.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/commalessmid.py b/tamper/commalessmid.py
index 379586829..fb7f500a8 100644
--- a/tamper/commalessmid.py
+++ b/tamper/commalessmid.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/commentbeforeparentheses.py b/tamper/commentbeforeparentheses.py
index 23933c279..da59c92a5 100644
--- a/tamper/commentbeforeparentheses.py
+++ b/tamper/commentbeforeparentheses.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/concat2concatws.py b/tamper/concat2concatws.py
index d2663bb2f..c13d50a92 100644
--- a/tamper/concat2concatws.py
+++ b/tamper/concat2concatws.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/equaltolike.py b/tamper/equaltolike.py
index bc65eff13..56d70fd97 100644
--- a/tamper/equaltolike.py
+++ b/tamper/equaltolike.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/escapequotes.py b/tamper/escapequotes.py
index db7c4c388..2a52be973 100644
--- a/tamper/escapequotes.py
+++ b/tamper/escapequotes.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/greatest.py b/tamper/greatest.py
index 989280cc8..6c654e6fe 100644
--- a/tamper/greatest.py
+++ b/tamper/greatest.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/halfversionedmorekeywords.py b/tamper/halfversionedmorekeywords.py
index 3d4f91d2a..84256d332 100644
--- a/tamper/halfversionedmorekeywords.py
+++ b/tamper/halfversionedmorekeywords.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/hex2char.py b/tamper/hex2char.py
index 71d1f1ed4..bdfa32feb 100644
--- a/tamper/hex2char.py
+++ b/tamper/hex2char.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/htmlencode.py b/tamper/htmlencode.py
index 8eed7b406..2a7512351 100644
--- a/tamper/htmlencode.py
+++ b/tamper/htmlencode.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/ifnull2casewhenisnull.py b/tamper/ifnull2casewhenisnull.py
index b7680ff13..f5f13c37b 100644
--- a/tamper/ifnull2casewhenisnull.py
+++ b/tamper/ifnull2casewhenisnull.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""
diff --git a/tamper/ifnull2ifisnull.py b/tamper/ifnull2ifisnull.py
index c933751ce..22c0d409b 100644
--- a/tamper/ifnull2ifisnull.py
+++ b/tamper/ifnull2ifisnull.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/informationschemacomment.py b/tamper/informationschemacomment.py
index 7076fecaa..101ab13d7 100644
--- a/tamper/informationschemacomment.py
+++ b/tamper/informationschemacomment.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/least.py b/tamper/least.py
index 53a8a6aad..bd085d25f 100644
--- a/tamper/least.py
+++ b/tamper/least.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/lowercase.py b/tamper/lowercase.py
index 101e4436a..3b3c18b44 100644
--- a/tamper/lowercase.py
+++ b/tamper/lowercase.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/luanginx.py b/tamper/luanginx.py
index e50675744..bffc4793b 100644
--- a/tamper/luanginx.py
+++ b/tamper/luanginx.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/modsecurityversioned.py b/tamper/modsecurityversioned.py
index 605c1aee2..05b8de00f 100644
--- a/tamper/modsecurityversioned.py
+++ b/tamper/modsecurityversioned.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/modsecurityzeroversioned.py b/tamper/modsecurityzeroversioned.py
index af358f58b..774a1cbf3 100644
--- a/tamper/modsecurityzeroversioned.py
+++ b/tamper/modsecurityzeroversioned.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/multiplespaces.py b/tamper/multiplespaces.py
index ec8b2d6d3..a190c9d28 100644
--- a/tamper/multiplespaces.py
+++ b/tamper/multiplespaces.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/overlongutf8.py b/tamper/overlongutf8.py
index 5cc28a630..21a1ec453 100644
--- a/tamper/overlongutf8.py
+++ b/tamper/overlongutf8.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/overlongutf8more.py b/tamper/overlongutf8more.py
index 301945f4f..d2a5fa4ea 100644
--- a/tamper/overlongutf8more.py
+++ b/tamper/overlongutf8more.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/percentage.py b/tamper/percentage.py
index a97c96942..4045a4790 100644
--- a/tamper/percentage.py
+++ b/tamper/percentage.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/plus2concat.py b/tamper/plus2concat.py
index f94d26685..7aecbb9fd 100644
--- a/tamper/plus2concat.py
+++ b/tamper/plus2concat.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/plus2fnconcat.py b/tamper/plus2fnconcat.py
index c0002e53b..cdb799b3e 100644
--- a/tamper/plus2fnconcat.py
+++ b/tamper/plus2fnconcat.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/randomcase.py b/tamper/randomcase.py
index 766693eb4..c39b6648c 100644
--- a/tamper/randomcase.py
+++ b/tamper/randomcase.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/randomcomments.py b/tamper/randomcomments.py
index 678c36a92..53882e8bb 100644
--- a/tamper/randomcomments.py
+++ b/tamper/randomcomments.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/sp_password.py b/tamper/sp_password.py
index 0f2f813a4..054bcd07b 100644
--- a/tamper/sp_password.py
+++ b/tamper/sp_password.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2comment.py b/tamper/space2comment.py
index 7db34f56e..e81fa6363 100644
--- a/tamper/space2comment.py
+++ b/tamper/space2comment.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2dash.py b/tamper/space2dash.py
index 445ade421..07629fc9f 100644
--- a/tamper/space2dash.py
+++ b/tamper/space2dash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2hash.py b/tamper/space2hash.py
index 416133260..1325b6302 100644
--- a/tamper/space2hash.py
+++ b/tamper/space2hash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2morecomment.py b/tamper/space2morecomment.py
index 39499c117..9061baa08 100644
--- a/tamper/space2morecomment.py
+++ b/tamper/space2morecomment.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2morehash.py b/tamper/space2morehash.py
index be2d0c669..fa901db32 100644
--- a/tamper/space2morehash.py
+++ b/tamper/space2morehash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2mssqlblank.py b/tamper/space2mssqlblank.py
index 0e4135daf..c9098413e 100644
--- a/tamper/space2mssqlblank.py
+++ b/tamper/space2mssqlblank.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2mssqlhash.py b/tamper/space2mssqlhash.py
index f0d88fe01..d2810b0e9 100644
--- a/tamper/space2mssqlhash.py
+++ b/tamper/space2mssqlhash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2mysqlblank.py b/tamper/space2mysqlblank.py
index 7352d417a..78d46f399 100644
--- a/tamper/space2mysqlblank.py
+++ b/tamper/space2mysqlblank.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2mysqldash.py b/tamper/space2mysqldash.py
index 917505a4a..ef5d2489d 100644
--- a/tamper/space2mysqldash.py
+++ b/tamper/space2mysqldash.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2plus.py b/tamper/space2plus.py
index 8fc74c8b1..ceb2be995 100644
--- a/tamper/space2plus.py
+++ b/tamper/space2plus.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/space2randomblank.py b/tamper/space2randomblank.py
index 343afa8d9..690cb3353 100644
--- a/tamper/space2randomblank.py
+++ b/tamper/space2randomblank.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/substring2leftright.py b/tamper/substring2leftright.py
index 4ed890c0b..94a1520e8 100644
--- a/tamper/substring2leftright.py
+++ b/tamper/substring2leftright.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/symboliclogical.py b/tamper/symboliclogical.py
index 88af8f9ad..f8f694a74 100644
--- a/tamper/symboliclogical.py
+++ b/tamper/symboliclogical.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/unionalltounion.py b/tamper/unionalltounion.py
index 6d24acb06..24f600d1a 100644
--- a/tamper/unionalltounion.py
+++ b/tamper/unionalltounion.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/unmagicquotes.py b/tamper/unmagicquotes.py
index a89e0a75e..c404945dc 100644
--- a/tamper/unmagicquotes.py
+++ b/tamper/unmagicquotes.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/uppercase.py b/tamper/uppercase.py
index faec80704..320527d80 100644
--- a/tamper/uppercase.py
+++ b/tamper/uppercase.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/varnish.py b/tamper/varnish.py
index 6b79f494c..6722d8ed7 100644
--- a/tamper/varnish.py
+++ b/tamper/varnish.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/versionedkeywords.py b/tamper/versionedkeywords.py
index e2c3fcc4d..c78495a77 100644
--- a/tamper/versionedkeywords.py
+++ b/tamper/versionedkeywords.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/versionedmorekeywords.py b/tamper/versionedmorekeywords.py
index 035a05a79..a2bbabfc1 100644
--- a/tamper/versionedmorekeywords.py
+++ b/tamper/versionedmorekeywords.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
diff --git a/tamper/xforwardedfor.py b/tamper/xforwardedfor.py
index e6cadf2d0..ab33c6b11 100644
--- a/tamper/xforwardedfor.py
+++ b/tamper/xforwardedfor.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
+Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
From e9ec443a8ae54d8892b8e32781442e124a83d659 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 1 Jan 2020 13:30:20 +0100
Subject: [PATCH 058/159] First dummy 2020 commit
---
lib/core/settings.py | 2 +-
lib/utils/api.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 7bbb515c2..8ad535f72 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4"
+VERSION = "1.4.1.0"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
diff --git a/lib/utils/api.py b/lib/utils/api.py
index 649b9f602..19593fc94 100644
--- a/lib/utils/api.py
+++ b/lib/utils/api.py
@@ -459,7 +459,7 @@ def option_get(taskid):
logger.debug("(%s) Requested value for unknown option '%s'" % (taskid, option))
return jsonize({"success": False, "message": "Unknown option '%s'" % option})
- logger.debug("(%s) Retrieved values for option(s) '%s'" % (taskid, ",".join(options)))
+ logger.debug("(%s) Retrieved values for option(s) '%s'" % (taskid, ','.join(options)))
return jsonize({"success": True, "options": results})
From 4606d5afd50ee32cd66e68ebe33de18fbe676122 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 1 Jan 2020 14:02:52 +0100
Subject: [PATCH 059/159] Copyright year bump
---
lib/core/settings.py | 2 +-
thirdparty/identywaf/__init__.py | 2 +-
thirdparty/identywaf/identYwaf.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 8ad535f72..81469534e 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.0"
+VERSION = "1.4.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)
diff --git a/thirdparty/identywaf/__init__.py b/thirdparty/identywaf/__init__.py
index aa130ea22..499824272 100644
--- a/thirdparty/identywaf/__init__.py
+++ b/thirdparty/identywaf/__init__.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (c) 2019 Miroslav Stampar (@stamparm), MIT
+# Copyright (c) 2019-2020 Miroslav Stampar (@stamparm), MIT
# See the file 'LICENSE' for copying permission
# The above copyright notice and this permission notice shall be included in
diff --git a/thirdparty/identywaf/identYwaf.py b/thirdparty/identywaf/identYwaf.py
index 2209352f3..0aab764b7 100755
--- a/thirdparty/identywaf/identYwaf.py
+++ b/thirdparty/identywaf/identYwaf.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
-Copyright (c) 2019 Miroslav Stampar (@stamparm), MIT
+Copyright (c) 2019-2020 Miroslav Stampar (@stamparm), MIT
See the file 'LICENSE' for copying permission
The above copyright notice and this permission notice shall be included in
From 8ace3363bd8419061d5cb6bc0369fb5dcf352be0 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 1 Jan 2020 14:04:01 +0100
Subject: [PATCH 060/159] Trivial update
---
lib/core/settings.py | 2 +-
thirdparty/identywaf/LICENSE | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 81469534e..6de7dce16 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.1"
+VERSION = "1.4.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)
diff --git a/thirdparty/identywaf/LICENSE b/thirdparty/identywaf/LICENSE
index fbea8d26e..c46b637f9 100644
--- a/thirdparty/identywaf/LICENSE
+++ b/thirdparty/identywaf/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019 Miroslav Stampar
+Copyright (c) 2019-2020 Miroslav Stampar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
From 5d62195a4104fdf6f4fd5f81c5e9a07ebcfeebe6 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 3 Jan 2020 13:46:12 +0100
Subject: [PATCH 061/159] Minor update of testing
---
lib/core/settings.py | 2 +-
lib/core/testing.py | 9 +++++++++
lib/parse/html.py | 6 ++++++
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 6de7dce16..cac50d621 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.2"
+VERSION = "1.4.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/core/testing.py b/lib/core/testing.py
index 4685c6bae..295bc3ebc 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -192,6 +192,15 @@ def smokeTest():
dirtyPatchRandom()
+ content = open(paths.ERRORS_XML, "r").read()
+ for regex in re.findall(r'', content):
+ try:
+ re.compile(regex)
+ except re.error:
+ errMsg = "smoke test failed at compiling '%s'" % regex
+ logger.error(errMsg)
+ return False
+
retVal = True
count, length = 0, 0
diff --git a/lib/parse/html.py b/lib/parse/html.py
index 8af2067ce..9357ab39f 100644
--- a/lib/parse/html.py
+++ b/lib/parse/html.py
@@ -57,6 +57,12 @@ def htmlParser(page):
"""
This function calls a class that parses the input HTML page to
fingerprint the back-end database management system
+
+ >>> from lib.core.enums import DBMS
+ >>> htmlParser("Warning: mysql_fetch_array() expects parameter 1 to be resource") == DBMS.MYSQL
+ True
+ >>> threadData = getCurrentThreadData()
+ >>> threadData.lastErrorPage = None
"""
xmlfile = paths.ERRORS_XML
From bb51c0e41e9756574c3105ca7379cb3786aa72b6 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Fri, 3 Jan 2020 14:03:01 +0100
Subject: [PATCH 062/159] Minor update
---
lib/core/settings.py | 2 +-
lib/core/shell.py | 19 ++++++++++++-------
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index cac50d621..9410744ac 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.3"
+VERSION = "1.4.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/core/shell.py b/lib/core/shell.py
index e2896ad20..47c00c050 100644
--- a/lib/core/shell.py
+++ b/lib/core/shell.py
@@ -118,19 +118,24 @@ def autoCompletion(completion=None, os=None, commands=None):
if os == OS.WINDOWS:
# Reference: http://en.wikipedia.org/wiki/List_of_DOS_commands
completer = CompleterNG({
- "copy": None, "del": None, "dir": None,
- "echo": None, "md": None, "mem": None,
+ "attrib": None, "copy": None, "del": None,
+ "dir": None, "echo": None, "fc": None,
+ "label": None, "md": None, "mem": None,
"move": None, "net": None, "netstat -na": None,
- "ver": None, "xcopy": None, "whoami": None,
+ "tree": None, "truename": None, "type": None,
+ "ver": None, "vol": None, "xcopy": None,
})
else:
# Reference: http://en.wikipedia.org/wiki/List_of_Unix_commands
completer = CompleterNG({
- "cp": None, "rm": None, "ls": None,
- "echo": None, "mkdir": None, "free": None,
- "mv": None, "ifconfig": None, "netstat -natu": None,
- "pwd": None, "uname": None, "id": None,
+ "cat": None, "chmod": None, "chown": None,
+ "cp": None, "cut": None, "date": None, "df": None,
+ "diff": None, "du": None, "echo": None, "env": None,
+ "file": None, "find": None, "free": None, "grep": None,
+ "id": None, "ifconfig": None, "ls": None, "mkdir": None,
+ "mv": None, "netstat": None, "pwd": None, "rm": None,
+ "uname": None, "whoami": None,
})
readline.set_completer(completer.complete)
From 6b451997666d4aee06ef269217f4de8688fd3b94 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sun, 5 Jan 2020 22:43:25 +0100
Subject: [PATCH 063/159] Removing obsolete code
---
lib/core/common.py | 1 -
lib/core/option.py | 4 +-
lib/core/optiondict.py | 1 -
lib/core/settings.py | 2 +-
lib/core/testing.py | 124 -------------------------------------
lib/parse/cmdline.py | 5 +-
lib/takeover/metasploit.py | 7 ---
lib/utils/progress.py | 7 +--
sqlmap.py | 3 -
9 files changed, 6 insertions(+), 148 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index ae8d5dfcc..ccb4b3fb4 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1398,7 +1398,6 @@ def setPaths(rootPath):
paths.WORDLIST = os.path.join(paths.SQLMAP_TXT_PATH, "wordlist.tx_")
paths.ERRORS_XML = os.path.join(paths.SQLMAP_XML_PATH, "errors.xml")
paths.BOUNDARIES_XML = os.path.join(paths.SQLMAP_XML_PATH, "boundaries.xml")
- paths.LIVE_TESTS_XML = os.path.join(paths.SQLMAP_XML_PATH, "livetests.xml")
paths.QUERIES_XML = os.path.join(paths.SQLMAP_XML_PATH, "queries.xml")
paths.GENERIC_XML = os.path.join(paths.SQLMAP_XML_BANNER_PATH, "generic.xml")
paths.MSSQL_XML = os.path.join(paths.SQLMAP_XML_BANNER_PATH, "mssql.xml")
diff --git a/lib/core/option.py b/lib/core/option.py
index fa64003d7..d8d234ea5 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -2602,7 +2602,7 @@ def _basicOptionValidation():
errMsg = "value for option '--union-char' must be an alpha-numeric value (e.g. 1)"
raise SqlmapSyntaxException(errMsg)
- if conf.hashFile and any((conf.direct, conf.url, conf.logFile, conf.bulkFile, conf.googleDork, conf.configFile, conf.requestFile, conf.updateAll, conf.smokeTest, conf.liveTest, conf.wizard, conf.dependencies, conf.purge, conf.listTampers)):
+ if conf.hashFile and any((conf.direct, conf.url, conf.logFile, conf.bulkFile, conf.googleDork, conf.configFile, conf.requestFile, conf.updateAll, conf.smokeTest, conf.wizard, conf.dependencies, conf.purge, conf.listTampers)):
errMsg = "option '--crack' should be used as a standalone"
raise SqlmapSyntaxException(errMsg)
@@ -2669,7 +2669,7 @@ def init():
parseTargetDirect()
- if any((conf.url, conf.logFile, conf.bulkFile, conf.requestFile, conf.googleDork, conf.liveTest)):
+ if any((conf.url, conf.logFile, conf.bulkFile, conf.requestFile, conf.googleDork)):
_setHostname()
_setHTTPTimeout()
_setHTTPExtraHeaders()
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index caa75fa90..7273718e6 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -252,7 +252,6 @@ optDict = {
"forceDns": "boolean",
"murphyRate": "integer",
"smokeTest": "boolean",
- "liveTest": "boolean",
"stopFail": "boolean",
"runCase": "string",
},
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 9410744ac..addeff4dd 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.4"
+VERSION = "1.4.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/core/testing.py b/lib/core/testing.py
index 295bc3ebc..9b5e1451a 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -289,130 +289,6 @@ def adjustValueType(tagName, value):
break
return value
-def liveTest():
- """
- Runs the test of a program against the live testing environment
- """
-
- retVal = True
- count = 0
- global_ = {}
- vars_ = {}
-
- livetests = readXmlFile(paths.LIVE_TESTS_XML)
- length = len(livetests.getElementsByTagName("case"))
-
- element = livetests.getElementsByTagName("global")
- if element:
- for item in element:
- for child in item.childNodes:
- if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
- global_[child.tagName] = adjustValueType(child.tagName, child.getAttribute("value"))
-
- element = livetests.getElementsByTagName("vars")
- if element:
- for item in element:
- for child in item.childNodes:
- if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
- var = child.getAttribute("value")
- vars_[child.tagName] = randomStr(6) if var == "random" else var
-
- for case in livetests.getElementsByTagName("case"):
- parse_from_console_output = False
- count += 1
- name = None
- parse = []
- switches = dict(global_)
- value = ""
- vulnerable = True
- result = None
-
- if case.hasAttribute("name"):
- name = case.getAttribute("name")
-
- if conf.runCase and ((conf.runCase.isdigit() and conf.runCase != count) or not re.search(conf.runCase, name, re.DOTALL)):
- continue
-
- if case.getElementsByTagName("switches"):
- for child in case.getElementsByTagName("switches")[0].childNodes:
- if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
- value = replaceVars(child.getAttribute("value"), vars_)
- switches[child.tagName] = adjustValueType(child.tagName, value)
-
- if case.getElementsByTagName("parse"):
- for item in case.getElementsByTagName("parse")[0].getElementsByTagName("item"):
- if item.hasAttribute("value"):
- value = replaceVars(item.getAttribute("value"), vars_)
-
- if item.hasAttribute("console_output"):
- parse_from_console_output = bool(item.getAttribute("console_output"))
-
- parse.append((value, parse_from_console_output))
-
- conf.verbose = global_.get("verbose", 1)
- setVerbosity()
-
- msg = "running live test case: %s (%d/%d)" % (name, count, length)
- logger.info(msg)
-
- initCase(switches, count)
-
- test_case_fd = codecs.open(os.path.join(paths.SQLMAP_OUTPUT_PATH, "test_case"), "wb", UNICODE_ENCODING)
- test_case_fd.write("%s\n" % name)
-
- try:
- result = runCase(parse)
- except SqlmapNotVulnerableException:
- vulnerable = False
- finally:
- conf.verbose = global_.get("verbose", 1)
- setVerbosity()
-
- if result is True:
- logger.info("test passed")
- cleanCase()
- else:
- errMsg = "test failed"
-
- if _failures.failedItems:
- errMsg += " at parsing items: %s" % ", ".join(i for i in _failures.failedItems)
-
- errMsg += " - scan folder: %s" % paths.SQLMAP_OUTPUT_PATH
- errMsg += " - traceback: %s" % bool(_failures.failedTraceBack)
-
- if not vulnerable:
- errMsg += " - SQL injection not detected"
-
- logger.error(errMsg)
- test_case_fd.write("%s\n" % errMsg)
-
- if _failures.failedParseOn:
- console_output_fd = codecs.open(os.path.join(paths.SQLMAP_OUTPUT_PATH, "console_output"), "wb", UNICODE_ENCODING)
- console_output_fd.write(_failures.failedParseOn)
- console_output_fd.close()
-
- if _failures.failedTraceBack:
- traceback_fd = codecs.open(os.path.join(paths.SQLMAP_OUTPUT_PATH, "traceback"), "wb", UNICODE_ENCODING)
- traceback_fd.write(_failures.failedTraceBack)
- traceback_fd.close()
-
- beep()
-
- if conf.stopFail is True:
- return retVal
-
- test_case_fd.close()
- retVal &= bool(result)
-
- dataToStdout("\n")
-
- if retVal:
- logger.info("live test final result: PASSED")
- else:
- logger.error("live test final result: FAILED")
-
- return retVal
-
def initCase(switches, count):
_failures.failedItems = []
_failures.failedParseOn = None
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index 7c6fa2986..c56b4b0d6 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -787,9 +787,6 @@ def cmdLineParser(argv=None):
parser.add_argument("--smoke-test", dest="smokeTest", action="store_true",
help=SUPPRESS)
- parser.add_argument("--live-test", dest="liveTest", action="store_true",
- help=SUPPRESS)
-
parser.add_argument("--vuln-test", dest="vulnTest", action="store_true",
help=SUPPRESS)
@@ -1005,7 +1002,7 @@ def cmdLineParser(argv=None):
if args.dummy:
args.url = args.url or DUMMY_URL
- if not any((args.direct, args.url, args.logFile, args.bulkFile, args.googleDork, args.configFile, args.requestFile, args.updateAll, args.smokeTest, args.vulnTest, args.liveTest, args.wizard, args.dependencies, args.purge, args.listTampers, args.hashFile)):
+ if not any((args.direct, args.url, args.logFile, args.bulkFile, args.googleDork, args.configFile, args.requestFile, args.updateAll, args.smokeTest, args.vulnTest, args.wizard, args.dependencies, args.purge, args.listTampers, args.hashFile)):
errMsg = "missing a mandatory option (-d, -u, -l, -m, -r, -g, -c, --list-tampers, --wizard, --update, --purge or --dependencies). "
errMsg += "Use -h for basic and -hh for advanced help\n"
parser.error(errMsg)
diff --git a/lib/takeover/metasploit.py b/lib/takeover/metasploit.py
index 2e12d2c07..0abc6c574 100644
--- a/lib/takeover/metasploit.py
+++ b/lib/takeover/metasploit.py
@@ -569,13 +569,6 @@ class Metasploit(object):
errMsg += "to open a remote session"
raise SqlmapGenericException(errMsg)
- if conf.liveTest and timeout:
- if initialized:
- send_all(proc, "exit\n")
- time.sleep(2)
- else:
- proc.kill()
-
except select.error as ex:
# Reference: https://github.com/andymccurdy/redis-py/pull/743/commits/2b59b25bb08ea09e98aede1b1f23a270fc085a9f
if ex.args[0] == errno.EINTR:
diff --git a/lib/utils/progress.py b/lib/utils/progress.py
index 76ad2cf06..97874854a 100644
--- a/lib/utils/progress.py
+++ b/lib/utils/progress.py
@@ -93,11 +93,8 @@ class ProgressBar(object):
dataToStdout("\r%s %d/%d%s" % (self._progBar, self._amount, self._max, (" (ETA %s)" % (self._convertSeconds(int(eta)) if eta is not None else "??:??"))))
if self._amount >= self._max:
- if not conf.liveTest:
- dataToStdout("\r%s\r" % (" " * self._width))
- kb.prependFlag = False
- else:
- dataToStdout("\n")
+ dataToStdout("\r%s\r" % (" " * self._width))
+ kb.prependFlag = False
def __str__(self):
"""
diff --git a/sqlmap.py b/sqlmap.py
index 811fc4ca7..347460cc5 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -173,9 +173,6 @@ def main():
elif conf.vulnTest:
from lib.core.testing import vulnTest
os._exitcode = 1 - (vulnTest() or 0)
- elif conf.liveTest:
- from lib.core.testing import liveTest
- os._exitcode = 1 - (liveTest() or 0)
else:
from lib.controller.controller import start
if conf.profile and six.PY2:
From 3a048a9e67632af6121443f07818d2a4674d5b85 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sun, 5 Jan 2020 22:46:16 +0100
Subject: [PATCH 064/159] Trivial cleanup
---
data/xml/livetests.xml | 3648 ----------------------------------------
lib/core/settings.py | 2 +-
lib/core/testing.py | 5 -
3 files changed, 1 insertion(+), 3654 deletions(-)
delete mode 100644 data/xml/livetests.xml
diff --git a/data/xml/livetests.xml b/data/xml/livetests.xml
deleted file mode 100644
index b30b9b290..000000000
--- a/data/xml/livetests.xml
+++ /dev/null
@@ -1,3648 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/core/settings.py b/lib/core/settings.py
index addeff4dd..70c8ec627 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.5"
+VERSION = "1.4.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/core/testing.py b/lib/core/testing.py
index 9b5e1451a..0ab7c938c 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -22,14 +22,11 @@ import threading
import time
import traceback
-from extra.beep.beep import beep
from extra.vulnserver import vulnserver
from lib.controller.controller import start
from lib.core.common import clearColors
from lib.core.common import clearConsoleLine
from lib.core.common import dataToStdout
-from lib.core.common import randomStr
-from lib.core.common import readXmlFile
from lib.core.common import shellExec
from lib.core.compat import round
from lib.core.compat import xrange
@@ -42,11 +39,9 @@ from lib.core.data import paths
from lib.core.data import queries
from lib.core.enums import MKSTEMP_PREFIX
from lib.core.exception import SqlmapBaseException
-from lib.core.exception import SqlmapNotVulnerableException
from lib.core.log import LOGGER_HANDLER
from lib.core.option import init
from lib.core.option import initOptions
-from lib.core.option import setVerbosity
from lib.core.optiondict import optDict
from lib.core.settings import UNICODE_ENCODING
from lib.parse.cmdline import cmdLineParser
From dc9e2df3c66827cd593acea886d58bb5b464cfcb Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sun, 5 Jan 2020 22:51:31 +0100
Subject: [PATCH 065/159] Minor update
---
doc/CHANGELOG.md | 5 +++++
lib/core/settings.py | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md
index 95eb8678e..17bb18997 100644
--- a/doc/CHANGELOG.md
+++ b/doc/CHANGELOG.md
@@ -1,3 +1,8 @@
+# Version 1.4 (2020-01-01)
+
+* [View changes](https://github.com/sqlmapproject/sqlmap/compare/1.3...1.4)
+* [View issues](https://github.com/sqlmapproject/sqlmap/milestone/5?closed=1)
+
# Version 1.3 (2019-01-05)
* [View changes](https://github.com/sqlmapproject/sqlmap/compare/1.2...1.3)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 70c8ec627..34863902d 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.6"
+VERSION = "1.4.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)
From 49afd47c1327651c25a913788551f2355377aa72 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Sun, 5 Jan 2020 22:56:10 +0100
Subject: [PATCH 066/159] Trivial update (year bump)
---
lib/core/settings.py | 2 +-
thirdparty/identywaf/data.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 34863902d..ace6049a2 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.7"
+VERSION = "1.4.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/thirdparty/identywaf/data.json b/thirdparty/identywaf/data.json
index c6ab44ca5..8bd55c273 100755
--- a/thirdparty/identywaf/data.json
+++ b/thirdparty/identywaf/data.json
@@ -1,5 +1,5 @@
{
- "__copyright__": "Copyright (c) 2019 Miroslav Stampar (@stamparm), MIT. See the file 'LICENSE' for copying permission",
+ "__copyright__": "Copyright (c) 2019-2020 Miroslav Stampar (@stamparm), MIT. See the file 'LICENSE' for copying permission",
"__notice__": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software",
"payloads": [
From 0ea39098bd89ffa1870b250d4864ff01bfa08158 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 7 Jan 2020 09:31:54 +0100
Subject: [PATCH 067/159] Fixes #4063
---
lib/core/settings.py | 2 +-
thirdparty/beautifulsoup/beautifulsoup.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index ace6049a2..d4f526e1b 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.8"
+VERSION = "1.4.1.9"
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
diff --git a/thirdparty/beautifulsoup/beautifulsoup.py b/thirdparty/beautifulsoup/beautifulsoup.py
index 0837bf72c..bc8889f76 100644
--- a/thirdparty/beautifulsoup/beautifulsoup.py
+++ b/thirdparty/beautifulsoup/beautifulsoup.py
@@ -595,7 +595,7 @@ class Tag(PageElement):
stopNode = self._lastRecursiveChild().next
strings = []
current = self.contents[0]
- while current is not stopNode:
+ while current and current is not stopNode:
if isinstance(current, NavigableString):
strings.append(current.strip())
current = current.next
@@ -897,7 +897,7 @@ class Tag(PageElement):
return # Note: https://stackoverflow.com/a/30217723 (PEP 479)
stopNode = self._lastRecursiveChild().next
current = self.contents[0]
- while current is not stopNode:
+ while current and current is not stopNode:
yield current
current = current.next
From 7a0a4c28e5fce11dac54799bda687bf104d89cd9 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 7 Jan 2020 11:48:02 +0100
Subject: [PATCH 068/159] Minor update
---
data/xml/banner/generic.xml | 16 ++++++++++++++++
lib/core/option.py | 2 +-
lib/core/settings.py | 2 +-
lib/core/testing.py | 14 ++++++++++----
lib/parse/cmdline.py | 2 +-
sqlmap.conf | 2 +-
6 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/data/xml/banner/generic.xml b/data/xml/banner/generic.xml
index 6e671825f..93f968c42 100644
--- a/data/xml/banner/generic.xml
+++ b/data/xml/banner/generic.xml
@@ -83,6 +83,10 @@
+
+
+
+
@@ -115,10 +119,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/core/option.py b/lib/core/option.py
index d8d234ea5..ae0178760 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1139,7 +1139,7 @@ def _setSafeVisit():
conf.safeUrl = "http://%s" % conf.safeUrl
if (conf.safeFreq or 0) <= 0:
- errMsg = "please provide a valid value (>0) for safe frequency (--safe-freq) while using safe visit features"
+ errMsg = "please provide a valid value (>0) for safe frequency ('--safe-freq') while using safe visit features"
raise SqlmapSyntaxException(errMsg)
def _setPrefixSuffix():
diff --git a/lib/core/settings.py b/lib/core/settings.py
index d4f526e1b..f51d06d86 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.9"
+VERSION = "1.4.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/testing.py b/lib/core/testing.py
index 0ab7c938c..85fd6af79 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -60,8 +60,8 @@ def vulnTest():
"""
TESTS = (
- (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'",)),
- (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape", (u": '\u0161u\u0107uraj'",)),
+ (u"-c --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'",)),
+ (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape --string=luther", (u": '\u0161u\u0107uraj'",)),
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
("-r --flush-session -v 5", ("CloudFlare", "possible DBMS: 'SQLite'", "User-agent: foobar")),
("-l --flush-session --keep-alive --skip-waf -v 5 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell", "Connection: keep-alive")),
@@ -76,7 +76,7 @@ def vulnTest():
("-u --flush-session --null-connection --technique=B --tamper=between,randomcase --banner", ("NULL connection is supported with HEAD method", "banner: '3.")),
("-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 --answer=\"crack=n\" -v 3", ("performed 6 queries", "nameisnull", "~using default dictionary")),
+ ("-u --technique=U --fresh-queries --force-partial --dump -T users --answers=\"crack=n\" -v 3", ("performed 6 queries", "nameisnull", "~using default dictionary")),
("-u --flush-session --all", ("5 entries", "Type: boolean-based blind", "Type: time-based blind", "Type: UNION query", "luther", "blisset", "fluffy", "179ad45c6ce2cb97cf1029e212046e81", "NULL", "nameisnull", "testpass")),
("-u -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",)),
@@ -105,6 +105,9 @@ def vulnTest():
except:
time.sleep(1)
+ handle, config = tempfile.mkstemp(suffix=".conf")
+ os.close(handle)
+
handle, database = tempfile.mkstemp(suffix=".sqlite")
os.close(handle)
@@ -126,11 +129,14 @@ def vulnTest():
url = "http://%s:%d/?id=1" % (address, port)
direct = "sqlite3://%s" % database
+ content = open(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.conf"))).read().replace("url =", "url = %s" % url)
+ open(config, "w+").write(content)
+
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))
- cmd = "%s %s %s --batch" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), options.replace("", url).replace("", direct).replace("", request).replace("", log))
+ cmd = "%s %s %s --batch" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), options.replace("", url).replace("", direct).replace("", request).replace("", log).replace("", config))
output = shellExec(cmd)
if not all((check in output if not check.startswith('~') else check[1:] not in output) for check in checks):
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index c56b4b0d6..8bf6a8188 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -252,7 +252,7 @@ def cmdLineParser(argv=None):
help="Load safe HTTP request from a file")
request.add_argument("--safe-freq", dest="safeFreq", type=int,
- help="Test requests between two visits to a given safe URL")
+ help="Regular requests between visits to a safe URL")
request.add_argument("--skip-urlencode", dest="skipUrlEncode", action="store_true",
help="Skip URL encoding of payload data")
diff --git a/sqlmap.conf b/sqlmap.conf
index 7c32a6312..e9e7d015c 100644
--- a/sqlmap.conf
+++ b/sqlmap.conf
@@ -171,7 +171,7 @@ safePost =
# Load safe HTTP request from a file.
safeReqFile =
-# Test requests between two visits to a given safe URL (default 0).
+# Regular requests between visits to a safe URL (default 0).
# Valid: integer
# Default: 0
safeFreq = 0
From 57f17794c4501fd94acb2848328a3d08ab801be6 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 7 Jan 2020 21:08:18 +0100
Subject: [PATCH 069/159] Adding support for all_proxy (#91)
---
lib/core/option.py | 7 +++++++
lib/core/settings.py | 5 ++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index ae0178760..307c1304e 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -1759,6 +1759,13 @@ def _cleanupOptions():
conf.binaryFields = conf.binaryFields.replace(" ", "")
conf.binaryFields = re.split(PARAMETER_SPLITTING_REGEX, conf.binaryFields)
+ envProxy = max(os.environ.get(_, "") for _ in ("all_proxy", "ALL_PROXY", "http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"))
+ if re.search(r"\A(https?|socks[45])://.+:\d+\Z", envProxy) and conf.proxy is None:
+ debugMsg = "using environment proxy '%s'" % envProxy
+ logger.debug(debugMsg)
+
+ conf.proxy = envProxy
+
if any((conf.proxy, conf.proxyFile, conf.tor)):
conf.disablePrecon = True
diff --git a/lib/core/settings.py b/lib/core/settings.py
index f51d06d86..4dc09a3e5 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.10"
+VERSION = "1.4.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)
@@ -486,6 +486,9 @@ GOOGLE_ANALYTICS_COOKIE_PREFIX = "__UTM"
# Prefix for configuration overriding environment variables
SQLMAP_ENVIRONMENT_PREFIX = "SQLMAP_"
+# General OS environment variables that can be used for setting proxy address
+PROXY_ENVIRONMENT_VARIABLES = ("all_proxy", "ALL_PROXY", "http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY")
+
# Turn off resume console info to avoid potential slowdowns
TURN_OFF_RESUME_INFO_LIMIT = 20
From 0e9dd9b0bed0eaa6ef81c7ba5eb83ed232e0a8a7 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Tue, 7 Jan 2020 23:49:45 +0100
Subject: [PATCH 070/159] Some testing stuff
---
extra/vulnserver/vulnserver.py | 2 +-
lib/core/optiondict.py | 2 -
lib/core/settings.py | 2 +-
lib/core/testing.py | 185 +++++++++++----------------------
lib/parse/cmdline.py | 7 +-
sqlmap.py | 3 +
6 files changed, 66 insertions(+), 135 deletions(-)
diff --git a/extra/vulnserver/vulnserver.py b/extra/vulnserver/vulnserver.py
index d14dbc94a..4c6d2f4f5 100644
--- a/extra/vulnserver/vulnserver.py
+++ b/extra/vulnserver/vulnserver.py
@@ -191,7 +191,7 @@ class ReqHandler(BaseHTTPRequestHandler):
length = int(self.headers.get("Content-length", 0))
if length:
data = self.rfile.read(length)
- data = unquote_plus(data.decode(UNICODE_ENCODING))
+ data = unquote_plus(data.decode(UNICODE_ENCODING, "ignore"))
self.data = data
self.do_REQUEST()
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index 7273718e6..472690076 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -252,8 +252,6 @@ optDict = {
"forceDns": "boolean",
"murphyRate": "integer",
"smokeTest": "boolean",
- "stopFail": "boolean",
- "runCase": "string",
},
"API": {
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 4dc09a3e5..b27db5e65 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.11"
+VERSION = "1.4.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/core/testing.py b/lib/core/testing.py
index 85fd6af79..730de1fa6 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -7,51 +7,33 @@ See the file 'LICENSE' for copying permission
from __future__ import division
-import codecs
import doctest
import logging
import os
import random
import re
-import shutil
import socket
import sqlite3
import sys
import tempfile
import threading
import time
-import traceback
from extra.vulnserver import vulnserver
-from lib.controller.controller import start
from lib.core.common import clearColors
from lib.core.common import clearConsoleLine
from lib.core.common import dataToStdout
+from lib.core.common import randomInt
+from lib.core.common import randomStr
from lib.core.common import shellExec
from lib.core.compat import round
from lib.core.compat import xrange
from lib.core.convert import encodeBase64
-from lib.core.convert import getUnicode
-from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.data import paths
from lib.core.data import queries
-from lib.core.enums import MKSTEMP_PREFIX
-from lib.core.exception import SqlmapBaseException
-from lib.core.log import LOGGER_HANDLER
-from lib.core.option import init
-from lib.core.option import initOptions
-from lib.core.optiondict import optDict
-from lib.core.settings import UNICODE_ENCODING
-from lib.parse.cmdline import cmdLineParser
-class Failures(object):
- failedItems = None
- failedParseOn = None
- failedTraceBack = None
-
-_failures = Failures()
_rand = 0
def vulnTest():
@@ -154,6 +136,63 @@ def vulnTest():
return retVal
+def fuzzTest():
+ count = 0
+ address, port = "127.0.0.10", random.randint(1025, 65535)
+
+ def _thread():
+ vulnserver.init(quiet=True)
+ vulnserver.run(address=address, port=port)
+
+ thread = threading.Thread(target=_thread)
+ thread.daemon = True
+ thread.start()
+
+ while True:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ s.connect((address, port))
+ break
+ except:
+ time.sleep(1)
+
+ handle, config = tempfile.mkstemp(suffix=".conf")
+ os.close(handle)
+
+ url = "http://%s:%d/?id=1" % (address, port)
+
+ content = open(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.conf"))).read().replace("url =", "url = %s" % url)
+ open(config, "w+").write(content)
+
+ while True:
+ lines = content.split("\n")
+
+ for i in xrange(20):
+ j = random.randint(0, len(lines) - 1)
+ if lines[j].strip().endswith('='):
+ lines[j] += random.sample(("True", "False", randomStr(), str(randomInt())), 1)[0]
+
+ k = random.randint(0, len(lines) - 1)
+ if '=' in lines[k]:
+ lines[k] += chr(random.randint(0, 255))
+
+ open(config, "w+").write("\n".join(lines))
+
+ cmd = "%s %s -c %s --batch --flush-session --technique=%s --banner" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), config, random.sample("BEUQ", 1)[0])
+ output = shellExec(cmd)
+
+ if "Traceback" in output:
+ dataToStdout("---\n\n$ %s\n" % cmd)
+ dataToStdout("%s---\n" % clearColors(output))
+ else:
+ handle, config = tempfile.mkstemp(prefix="sqlmapcrash", suffix=".conf")
+ os.close(handle)
+ open(config, "w+").write("\n".join(lines))
+
+ dataToStdout("\r%d\r" % count)
+
+ count += 1
+
def dirtyPatchRandom():
"""
Unifying random generated data across different Python versions
@@ -274,109 +313,3 @@ def smokeTest():
logger.error("smoke test final result: FAILED")
return retVal
-
-def adjustValueType(tagName, value):
- for family in optDict:
- for name, type_ in optDict[family].items():
- if type(type_) == tuple:
- type_ = type_[0]
- if tagName == name:
- if type_ == "boolean":
- value = (value == "True")
- elif type_ == "integer":
- value = int(value)
- elif type_ == "float":
- value = float(value)
- break
- return value
-
-def initCase(switches, count):
- _failures.failedItems = []
- _failures.failedParseOn = None
- _failures.failedTraceBack = None
-
- paths.SQLMAP_OUTPUT_PATH = tempfile.mkdtemp(prefix="%s%d-" % (MKSTEMP_PREFIX.TESTING, count))
- paths.SQLMAP_DUMP_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "dump")
- paths.SQLMAP_FILES_PATH = os.path.join(paths.SQLMAP_OUTPUT_PATH, "%s", "files")
-
- logger.debug("using output directory '%s' for this test case" % paths.SQLMAP_OUTPUT_PATH)
-
- LOGGER_HANDLER.stream = sys.stdout = tempfile.SpooledTemporaryFile(max_size=0, mode="w+b", prefix="sqlmapstdout-")
-
- cmdLineOptions = cmdLineParser()
-
- if switches:
- for key, value in switches.items():
- if key in cmdLineOptions.__dict__:
- cmdLineOptions.__dict__[key] = value
-
- initOptions(cmdLineOptions, True)
- init()
-
-def cleanCase():
- shutil.rmtree(paths.SQLMAP_OUTPUT_PATH, True)
-
-def runCase(parse):
- retVal = True
- handled_exception = None
- unhandled_exception = None
- result = False
- console = ""
-
- try:
- result = start()
- except KeyboardInterrupt:
- pass
- except SqlmapBaseException as ex:
- handled_exception = ex
- except Exception as ex:
- unhandled_exception = ex
- finally:
- sys.stdout.seek(0)
- console = sys.stdout.read()
- LOGGER_HANDLER.stream = sys.stdout = sys.__stdout__
-
- if unhandled_exception:
- _failures.failedTraceBack = "unhandled exception: %s" % str(traceback.format_exc())
- retVal = None
- elif handled_exception:
- _failures.failedTraceBack = "handled exception: %s" % str(traceback.format_exc())
- retVal = None
- elif result is False: # this means no SQL injection has been detected - if None, ignore
- retVal = False
-
- console = getUnicode(console, encoding=sys.stdin.encoding)
-
- if parse and retVal:
- with codecs.open(conf.dumper.getOutputFile(), "rb", UNICODE_ENCODING) as f:
- content = f.read()
-
- for item, parse_from_console_output in parse:
- parse_on = console if parse_from_console_output else content
-
- if item.startswith("r'") and item.endswith("'"):
- if not re.search(item[2:-1], parse_on, re.DOTALL):
- retVal = None
- _failures.failedItems.append(item)
-
- elif item not in parse_on:
- retVal = None
- _failures.failedItems.append(item)
-
- if _failures.failedItems:
- _failures.failedParseOn = console
-
- elif retVal is False:
- _failures.failedParseOn = console
-
- return retVal
-
-def replaceVars(item, vars_):
- retVal = item
-
- if item and vars_:
- for var in re.findall(r"\$\{([^}]+)\}", item):
- if var in vars_:
- retVal = retVal.replace("${%s}" % var, vars_[var])
-
- return retVal
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index 8bf6a8188..09c963d8f 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -790,10 +790,7 @@ def cmdLineParser(argv=None):
parser.add_argument("--vuln-test", dest="vulnTest", action="store_true",
help=SUPPRESS)
- parser.add_argument("--stop-fail", dest="stopFail", action="store_true",
- help=SUPPRESS)
-
- parser.add_argument("--run-case", dest="runCase",
+ parser.add_argument("--fuzz-test", dest="fuzzTest", action="store_true",
help=SUPPRESS)
# API options
@@ -1002,7 +999,7 @@ def cmdLineParser(argv=None):
if args.dummy:
args.url = args.url or DUMMY_URL
- if not any((args.direct, args.url, args.logFile, args.bulkFile, args.googleDork, args.configFile, args.requestFile, args.updateAll, args.smokeTest, args.vulnTest, args.wizard, args.dependencies, args.purge, args.listTampers, args.hashFile)):
+ if not any((args.direct, args.url, args.logFile, args.bulkFile, args.googleDork, args.configFile, args.requestFile, args.updateAll, args.smokeTest, args.vulnTest, args.fuzzTest, args.wizard, args.dependencies, args.purge, args.listTampers, args.hashFile)):
errMsg = "missing a mandatory option (-d, -u, -l, -m, -r, -g, -c, --list-tampers, --wizard, --update, --purge or --dependencies). "
errMsg += "Use -h for basic and -hh for advanced help\n"
parser.error(errMsg)
diff --git a/sqlmap.py b/sqlmap.py
index 347460cc5..8269e665e 100755
--- a/sqlmap.py
+++ b/sqlmap.py
@@ -173,6 +173,9 @@ def main():
elif conf.vulnTest:
from lib.core.testing import vulnTest
os._exitcode = 1 - (vulnTest() or 0)
+ elif conf.fuzzTest:
+ from lib.core.testing import fuzzTest
+ fuzzTest()
else:
from lib.controller.controller import start
if conf.profile and six.PY2:
From dbebb34bc8148b969fb3ff44a5efa36b86ee3053 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 8 Jan 2020 00:01:15 +0100
Subject: [PATCH 071/159] Trivial patch
---
lib/core/settings.py | 2 +-
lib/core/testing.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index b27db5e65..f83d3942c 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.12"
+VERSION = "1.4.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)
diff --git a/lib/core/testing.py b/lib/core/testing.py
index 730de1fa6..d26dc964c 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -184,11 +184,11 @@ def fuzzTest():
if "Traceback" in output:
dataToStdout("---\n\n$ %s\n" % cmd)
dataToStdout("%s---\n" % clearColors(output))
- else:
+
handle, config = tempfile.mkstemp(prefix="sqlmapcrash", suffix=".conf")
os.close(handle)
open(config, "w+").write("\n".join(lines))
-
+ else:
dataToStdout("\r%d\r" % count)
count += 1
From 239e4d792775f6c92c0a5f39f69fdf7f647128f2 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 8 Jan 2020 00:11:13 +0100
Subject: [PATCH 072/159] Minor patch
---
lib/core/convert.py | 2 +-
lib/core/settings.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/core/convert.py b/lib/core/convert.py
index 4eadbf968..a92f08279 100644
--- a/lib/core/convert.py
+++ b/lib/core/convert.py
@@ -300,7 +300,7 @@ def getUnicode(value, encoding=None, noneToNull=False):
for candidate in candidates:
try:
return six.text_type(value, candidate)
- except UnicodeDecodeError:
+ except (UnicodeDecodeError, LookupError):
pass
try:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index f83d3942c..bd5690b56 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.13"
+VERSION = "1.4.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)
From c95c3702544d0bb6179dac136843a2233ae90fa1 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 8 Jan 2020 10:37:59 +0100
Subject: [PATCH 073/159] Couple of patches
---
lib/core/common.py | 2 +-
lib/core/option.py | 9 +++++++--
lib/core/settings.py | 2 +-
lib/core/testing.py | 2 +-
lib/parse/cmdline.py | 3 +++
5 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/lib/core/common.py b/lib/core/common.py
index ccb4b3fb4..1c7e98f1d 100644
--- a/lib/core/common.py
+++ b/lib/core/common.py
@@ -1080,7 +1080,7 @@ def readInput(message, default=None, checkBatch=True, boolean=False):
logger.debug(debugMsg)
if retVal is None:
- if checkBatch and conf.get("batch") or conf.get("api"):
+ if checkBatch and conf.get("batch") or any(conf.get(_) for _ in ("api", "nonInteractive")):
if isListLike(default):
options = ','.join(getUnicode(opt, UNICODE_ENCODING) for opt in default)
elif default:
diff --git a/lib/core/option.py b/lib/core/option.py
index 307c1304e..d21f1e299 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -330,8 +330,13 @@ def _setRequestFromFile():
infoMsg = "parsing second-order HTTP request from '%s'" % conf.secondReq
logger.info(infoMsg)
- target = next(parseRequestFile(conf.secondReq, False))
- kb.secondReq = target
+ try:
+ target = next(parseRequestFile(conf.secondReq, False))
+ kb.secondReq = target
+ except StopIteration:
+ errMsg = "specified second-order HTTP request file '%s' " % conf.secondReq
+ errMsg += "does not contain a valid HTTP request"
+ raise SqlmapDataException(errMsg)
def _setCrawler():
if not conf.crawlDepth:
diff --git a/lib/core/settings.py b/lib/core/settings.py
index bd5690b56..4356b5d40 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.14"
+VERSION = "1.4.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/core/testing.py b/lib/core/testing.py
index d26dc964c..980fa16dc 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -178,7 +178,7 @@ def fuzzTest():
open(config, "w+").write("\n".join(lines))
- cmd = "%s %s -c %s --batch --flush-session --technique=%s --banner" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), config, random.sample("BEUQ", 1)[0])
+ cmd = "%s %s -c %s --non-interactive --flush-session --technique=%s --banner" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), config, random.sample("BEUQ", 1)[0])
output = shellExec(cmd)
if "Traceback" in output:
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index 09c963d8f..91f871db9 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -781,6 +781,9 @@ def cmdLineParser(argv=None):
parser.add_argument("--force-pivoting", dest="forcePivoting", action="store_true",
help=SUPPRESS)
+ parser.add_argument("--non-interactive", dest="nonInteractive", action="store_true",
+ help=SUPPRESS)
+
parser.add_argument("--gui", dest="gui", action="store_true",
help=SUPPRESS)
From 89aff21fb672ccec8a5f76084d9ec5255017e737 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 8 Jan 2020 10:43:11 +0100
Subject: [PATCH 074/159] Minor patch
---
lib/core/settings.py | 2 +-
lib/core/testing.py | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 4356b5d40..1a3d92ac9 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.15"
+VERSION = "1.4.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 980fa16dc..95c7be521 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -169,6 +169,10 @@ def fuzzTest():
for i in xrange(20):
j = random.randint(0, len(lines) - 1)
+
+ if any(_ in lines[j] for _ in ("googleDork",)):
+ continue
+
if lines[j].strip().endswith('='):
lines[j] += random.sample(("True", "False", randomStr(), str(randomInt())), 1)[0]
@@ -178,7 +182,7 @@ def fuzzTest():
open(config, "w+").write("\n".join(lines))
- cmd = "%s %s -c %s --non-interactive --flush-session --technique=%s --banner" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), config, random.sample("BEUQ", 1)[0])
+ cmd = "%s %s -c %s --non-interactive --answers='Github=n' --flush-session --technique=%s --banner" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sqlmap.py")), config, random.sample("BEUQ", 1)[0])
output = shellExec(cmd)
if "Traceback" in output:
From e7dd7e2d489aa6c893d856d8741a4f1d4dce6122 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Wed, 8 Jan 2020 10:53:08 +0100
Subject: [PATCH 075/159] Trivial refactoring
---
lib/core/option.py | 3 ++-
lib/core/settings.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/core/option.py b/lib/core/option.py
index d21f1e299..3400e1612 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -121,6 +121,7 @@ from lib.core.settings import MAX_NUMBER_OF_THREADS
from lib.core.settings import NULL
from lib.core.settings import PARAMETER_SPLITTING_REGEX
from lib.core.settings import PRECONNECT_CANDIDATE_TIMEOUT
+from lib.core.settings import PROXY_ENVIRONMENT_VARIABLES
from lib.core.settings import SOCKET_PRE_CONNECT_QUEUE_SIZE
from lib.core.settings import SQLMAP_ENVIRONMENT_PREFIX
from lib.core.settings import SUPPORTED_DBMS
@@ -1764,7 +1765,7 @@ def _cleanupOptions():
conf.binaryFields = conf.binaryFields.replace(" ", "")
conf.binaryFields = re.split(PARAMETER_SPLITTING_REGEX, conf.binaryFields)
- envProxy = max(os.environ.get(_, "") for _ in ("all_proxy", "ALL_PROXY", "http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"))
+ envProxy = max(os.environ.get(_, "") for _ in PROXY_ENVIRONMENT_VARIABLES)
if re.search(r"\A(https?|socks[45])://.+:\d+\Z", envProxy) and conf.proxy is None:
debugMsg = "using environment proxy '%s'" % envProxy
logger.debug(debugMsg)
diff --git a/lib/core/settings.py b/lib/core/settings.py
index 1a3d92ac9..af08009be 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.16"
+VERSION = "1.4.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)
From ab203c1ec5316536113b69842426df899d38b268 Mon Sep 17 00:00:00 2001
From: Miroslav Stampar
Date: Thu, 9 Jan 2020 11:25:09 +0100
Subject: [PATCH 076/159] Couple of fixes (--check-internet) and updates
---
lib/controller/controller.py | 18 ++++++++++++++----
lib/core/settings.py | 6 +++---
lib/core/testing.py | 6 +++++-
3 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/lib/controller/controller.py b/lib/controller/controller.py
index c9a5b7e87..57414dcfb 100644
--- a/lib/controller/controller.py
+++ b/lib/controller/controller.py
@@ -58,6 +58,7 @@ from lib.core.enums import NOTE
from lib.core.enums import PAYLOAD
from lib.core.enums import PLACE
from lib.core.exception import SqlmapBaseException
+from lib.core.exception import SqlmapConnectionException
from lib.core.exception import SqlmapNoneDataException
from lib.core.exception import SqlmapNotVulnerableException
from lib.core.exception import SqlmapSilentQuitException
@@ -307,11 +308,20 @@ def start():
warnMsg = "[%s] [WARNING] no connection detected" % time.strftime("%X")
dataToStdout(warnMsg)
- while not checkInternet():
- dataToStdout('.')
- time.sleep(5)
+ valid = False
+ for _ in xrange(conf.retries):
+ if checkInternet():
+ valid = True
+ break
+ else:
+ dataToStdout('.')
+ time.sleep(5)
- dataToStdout("\n")
+ if not valid:
+ errMsg = "please check your Internet connection and rerun"
+ raise SqlmapConnectionException(errMsg)
+ else:
+ dataToStdout("\n")
conf.url = targetUrl
conf.method = targetMethod.upper().strip() if targetMethod else targetMethod
diff --git a/lib/core/settings.py b/lib/core/settings.py
index af08009be..ea922d9d2 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -18,7 +18,7 @@ from lib.core.enums import OS
from thirdparty.six import unichr as _unichr
# sqlmap version (...)
-VERSION = "1.4.1.17"
+VERSION = "1.4.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)
@@ -565,10 +565,10 @@ LAST_UPDATE_NAGGING_DAYS = 60
MIN_ERROR_PARSING_NON_WRITING_RATIO = 0.05
# Generic address for checking the Internet connection while using switch --check-internet
-CHECK_INTERNET_ADDRESS = "https://ipinfo.io/"
+CHECK_INTERNET_ADDRESS = "https://ipinfo.io/json"
# Value to look for in response to CHECK_INTERNET_ADDRESS
-CHECK_INTERNET_VALUE = "IP Address Details"
+CHECK_INTERNET_VALUE = '"ip":'
# Payload used for checking of existence of WAF/IPS (dummier the better)
IPS_WAF_CHECK_PAYLOAD = "AND 1=1 UNION ALL SELECT 1,NULL,'',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#"
diff --git a/lib/core/testing.py b/lib/core/testing.py
index 95c7be521..8e9640cb8 100644
--- a/lib/core/testing.py
+++ b/lib/core/testing.py
@@ -42,8 +42,11 @@ def vulnTest():
"""
TESTS = (
+ ("-h", ("to see full list of options run with '-hh'",)),
+ ("-u --flush-session --wizard --check-internet", ("Please choose:", "back-end DBMS: SQLite", "current user is DBA: True", "banner: '3.", "~no connection detected")),
(u"-c --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=U", (u": '\u0161u\u0107uraj'",)),
- (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape --string=luther", (u": '\u0161u\u0107uraj'",)),
+ (u"-u --flush-session --sql-query=\"SELECT '\u0161u\u0107uraj'\" --technique=B --no-escape --string=luther --unstable", (u": '\u0161u\u0107uraj'",)),
+ ("--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")),
("--list-tampers", ("between", "MySQL", "xforwardedfor")),
("-r --flush-session -v 5", ("CloudFlare", "possible DBMS: 'SQLite'", "User-agent: foobar")),
("-l --flush-session --keep-alive --skip-waf -v 5 --technique=U --union-from=users --banner --parse-errors", ("banner: '3.", "ORDER BY term out of range", "~xp_cmdshell", "Connection: keep-alive")),
@@ -65,6 +68,7 @@ def vulnTest():
("-u '&query=*' --flush-session --technique=Q --banner", ("Title: SQLite inline queries", "banner: '3.")),
("-d