mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2025-02-03 13:14:13 +03:00
Minor patches and updates
This commit is contained in:
parent
eec048daf8
commit
422b1a6f95
|
@ -63,6 +63,7 @@ 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.datatype import OrderedSet
|
||||
from lib.core.decorators import cachedmethod
|
||||
from lib.core.defaults import defaults
|
||||
from lib.core.dicts import DBMS_DICT
|
||||
|
@ -843,7 +844,15 @@ def getManualDirectories():
|
|||
return directories
|
||||
|
||||
def getAutoDirectories():
|
||||
retVal = set()
|
||||
"""
|
||||
>>> pushValue(kb.absFilePaths)
|
||||
>>> kb.absFilePaths = ["C:\\inetpub\\wwwroot\\index.asp", "/var/www/html"]
|
||||
>>> getAutoDirectories()
|
||||
['C:/inetpub/wwwroot', '/var/www/html']
|
||||
>>> kb.absFilePaths = popValue()
|
||||
"""
|
||||
|
||||
retVal = OrderedSet()
|
||||
|
||||
if kb.absFilePaths:
|
||||
infoMsg = "retrieved web server absolute paths: "
|
||||
|
@ -1370,7 +1379,16 @@ def weAreFrozen():
|
|||
|
||||
def parseTargetDirect():
|
||||
"""
|
||||
Parse target dbms and set some attributes into the configuration singleton.
|
||||
Parse target dbms and set some attributes into the configuration singleton
|
||||
|
||||
>>> pushValue(conf.direct)
|
||||
>>> conf.direct = "mysql://root:testpass@127.0.0.1:3306/testdb"
|
||||
>>> parseTargetDirect()
|
||||
>>> conf.dbmsDb
|
||||
'testdb'
|
||||
>>> conf.dbmsPass
|
||||
'testpass'
|
||||
>>> conf.direct = popValue()
|
||||
"""
|
||||
|
||||
if not conf.direct:
|
||||
|
@ -1411,6 +1429,9 @@ def parseTargetDirect():
|
|||
|
||||
break
|
||||
|
||||
if kb.smokeMode:
|
||||
return
|
||||
|
||||
if not details:
|
||||
errMsg = "invalid target details, valid syntax is for instance "
|
||||
errMsg += "'mysql://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME' "
|
||||
|
@ -1475,7 +1496,16 @@ def parseTargetDirect():
|
|||
|
||||
def parseTargetUrl():
|
||||
"""
|
||||
Parse target URL and set some attributes into the configuration singleton.
|
||||
Parse target URL and set some attributes into the configuration singleton
|
||||
|
||||
>>> pushValue(conf.url)
|
||||
>>> conf.url = "https://www.test.com/?id=1"
|
||||
>>> parseTargetUrl()
|
||||
>>> conf.hostname
|
||||
'www.test.com'
|
||||
>>> conf.scheme
|
||||
'https'
|
||||
>>> conf.url = popValue()
|
||||
"""
|
||||
|
||||
if not conf.url:
|
||||
|
@ -1826,11 +1856,13 @@ def directoryPath(filepath):
|
|||
|
||||
>>> directoryPath('/var/log/apache.log')
|
||||
'/var/log'
|
||||
>>> directoryPath('/var/log')
|
||||
'/var/log'
|
||||
"""
|
||||
|
||||
retVal = filepath
|
||||
|
||||
if filepath:
|
||||
if filepath and os.path.splitext(filepath)[-1]:
|
||||
retVal = ntpath.dirname(filepath) if isWindowsDriveLetterPath(filepath) else posixpath.dirname(filepath)
|
||||
|
||||
return retVal
|
||||
|
@ -3029,8 +3061,7 @@ def filterNone(values):
|
|||
|
||||
def isDBMSVersionAtLeast(version):
|
||||
"""
|
||||
Checks if the recognized DBMS version is at least the version
|
||||
specified
|
||||
Checks if the recognized DBMS version is at least the version specified
|
||||
"""
|
||||
|
||||
retVal = None
|
||||
|
@ -3065,6 +3096,12 @@ def isDBMSVersionAtLeast(version):
|
|||
def parseSqliteTableSchema(value):
|
||||
"""
|
||||
Parses table column names and types from specified SQLite table schema
|
||||
|
||||
>>> kb.data.cachedColumns = {}
|
||||
>>> parseSqliteTableSchema("CREATE TABLE users\\n\\t\\tid INTEGER\\n\\t\\tname TEXT\\n);")
|
||||
True
|
||||
>>> repr(kb.data.cachedColumns).count(',') == 1
|
||||
True
|
||||
"""
|
||||
|
||||
retVal = False
|
||||
|
@ -3091,8 +3128,13 @@ def getTechniqueData(technique=None):
|
|||
|
||||
def isTechniqueAvailable(technique):
|
||||
"""
|
||||
Returns True if there is injection data which sqlmap could use for
|
||||
technique specified
|
||||
Returns True if there is injection data which sqlmap could use for technique specified
|
||||
|
||||
>>> pushValue(kb.injection.data)
|
||||
>>> kb.injection.data[PAYLOAD.TECHNIQUE.ERROR] = [test for test in getSortedInjectionTests() if "error" in test["title"].lower()][0]
|
||||
>>> isTechniqueAvailable(PAYLOAD.TECHNIQUE.ERROR)
|
||||
True
|
||||
>>> kb.injection.data = popValue()
|
||||
"""
|
||||
|
||||
if conf.tech and isinstance(conf.tech, list) and technique not in conf.tech:
|
||||
|
@ -3103,6 +3145,12 @@ def isTechniqueAvailable(technique):
|
|||
def isStackingAvailable():
|
||||
"""
|
||||
Returns True whether techniques using stacking are available
|
||||
|
||||
>>> pushValue(kb.injection.data)
|
||||
>>> kb.injection.data[PAYLOAD.TECHNIQUE.STACKED] = [test for test in getSortedInjectionTests() if "stacked" in test["title"].lower()][0]
|
||||
>>> isStackingAvailable()
|
||||
True
|
||||
>>> kb.injection.data = popValue()
|
||||
"""
|
||||
|
||||
retVal = False
|
||||
|
@ -3121,6 +3169,12 @@ def isStackingAvailable():
|
|||
def isInferenceAvailable():
|
||||
"""
|
||||
Returns True whether techniques using inference technique are available
|
||||
|
||||
>>> pushValue(kb.injection.data)
|
||||
>>> kb.injection.data[PAYLOAD.TECHNIQUE.BOOLEAN] = getSortedInjectionTests()[0]
|
||||
>>> isInferenceAvailable()
|
||||
True
|
||||
>>> kb.injection.data = popValue()
|
||||
"""
|
||||
|
||||
return any(isTechniqueAvailable(_) for _ in (PAYLOAD.TECHNIQUE.BOOLEAN, PAYLOAD.TECHNIQUE.STACKED, PAYLOAD.TECHNIQUE.TIME))
|
||||
|
@ -3290,8 +3344,13 @@ def isListLike(value):
|
|||
|
||||
def getSortedInjectionTests():
|
||||
"""
|
||||
Returns prioritized test list by eventually detected DBMS from error
|
||||
messages
|
||||
Returns prioritized test list by eventually detected DBMS from error messages
|
||||
|
||||
>>> pushValue(kb.forcedDbms)
|
||||
>>> kb.forcedDbms = DBMS.SQLITE
|
||||
>>> [test for test in getSortedInjectionTests() if hasattr(test, "details") and hasattr(test.details, "dbms")][0].details.dbms == kb.forcedDbms
|
||||
True
|
||||
>>> kb.forcedDbms = popValue()
|
||||
"""
|
||||
|
||||
retVal = copy.deepcopy(conf.tests)
|
||||
|
@ -3317,8 +3376,7 @@ def getSortedInjectionTests():
|
|||
|
||||
def filterListValue(value, regex):
|
||||
"""
|
||||
Returns list with items that have parts satisfying given regular
|
||||
expression
|
||||
Returns list with items that have parts satisfying given regular expression
|
||||
|
||||
>>> filterListValue(['users', 'admins', 'logs'], r'(users|admins)')
|
||||
['users', 'admins']
|
||||
|
@ -3348,6 +3406,9 @@ def showHttpErrorCodes():
|
|||
def openFile(filename, mode='r', encoding=UNICODE_ENCODING, errors="reversible", buffering=1): # "buffering=1" means line buffered (Reference: http://stackoverflow.com/a/3168436)
|
||||
"""
|
||||
Returns file handle of a given filename
|
||||
|
||||
>>> "openFile" in openFile(__file__).read()
|
||||
True
|
||||
"""
|
||||
|
||||
if filename == STDIN_PIPE_DASH:
|
||||
|
@ -3399,22 +3460,6 @@ def decodeIntToUnicode(value):
|
|||
|
||||
return retVal
|
||||
|
||||
def md5File(filename):
|
||||
"""
|
||||
Calculates MD5 digest of a file
|
||||
|
||||
# Reference: http://stackoverflow.com/a/3431838
|
||||
"""
|
||||
|
||||
checkFile(filename)
|
||||
|
||||
digest = hashlib.md5()
|
||||
with open(filename, "rb") as f:
|
||||
for chunk in iter(lambda: f.read(4096), ""):
|
||||
digest.update(chunk)
|
||||
|
||||
return digest.hexdigest()
|
||||
|
||||
def checkIntegrity():
|
||||
"""
|
||||
Checks integrity of code files during the unhandled exceptions
|
||||
|
@ -3441,6 +3486,9 @@ def checkIntegrity():
|
|||
def getDaysFromLastUpdate():
|
||||
"""
|
||||
Get total number of days from last update
|
||||
|
||||
>>> getDaysFromLastUpdate() >= 0
|
||||
True
|
||||
"""
|
||||
|
||||
if not paths:
|
||||
|
@ -3451,6 +3499,9 @@ def getDaysFromLastUpdate():
|
|||
def unhandledExceptionMessage():
|
||||
"""
|
||||
Returns detailed message about occurred unhandled exception
|
||||
|
||||
>>> all(_ in unhandledExceptionMessage() for _ in ("unhandled exception occurred", "Operating system", "Command line"))
|
||||
True
|
||||
"""
|
||||
|
||||
errMsg = "unhandled exception occurred in %s. It is recommended to retry your " % VERSION_STRING
|
||||
|
|
|
@ -1987,6 +1987,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
|
|||
kb.serverHeader = None
|
||||
kb.singleLogFlags = set()
|
||||
kb.skipSeqMatcher = False
|
||||
kb.smokeMode = False
|
||||
kb.reduceTests = None
|
||||
kb.tlsSNI = {}
|
||||
kb.stickyDBMS = False
|
||||
|
|
|
@ -18,7 +18,7 @@ from lib.core.enums import OS
|
|||
from thirdparty import six
|
||||
|
||||
# sqlmap version (<major>.<minor>.<month>.<monthly commit>)
|
||||
VERSION = "1.3.5.26"
|
||||
VERSION = "1.3.5.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)
|
||||
|
|
|
@ -7,6 +7,7 @@ See the file 'LICENSE' for copying permission
|
|||
|
||||
import codecs
|
||||
import doctest
|
||||
import logging
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
|
@ -29,6 +30,7 @@ from lib.core.compat import round
|
|||
from lib.core.compat import xrange
|
||||
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.enums import MKSTEMP_PREFIX
|
||||
|
@ -161,9 +163,14 @@ def smokeTest():
|
|||
errMsg = "smoke test failed at importing module '%s' (%s):\n%s" % (path, os.path.join(root, filename), ex)
|
||||
logger.error(errMsg)
|
||||
else:
|
||||
# Run doc tests
|
||||
# Reference: http://docs.python.org/library/doctest.html
|
||||
logger.setLevel(logging.CRITICAL)
|
||||
kb.smokeMode = True
|
||||
|
||||
(failure_count, test_count) = doctest.testmod(module)
|
||||
|
||||
kb.smokeMode = False
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
if failure_count > 0:
|
||||
retVal = False
|
||||
|
||||
|
|
|
@ -352,7 +352,7 @@ def unionUse(expression, unpack=True, dump=False):
|
|||
key = re.sub(r"[^A-Za-z0-9]", "", item).lower()
|
||||
if key not in filtered or re.search(r"[^A-Za-z0-9]", item):
|
||||
filtered[key] = item
|
||||
items = filtered.values()
|
||||
items = list(filtered.values())
|
||||
items = [items]
|
||||
index = None
|
||||
for index in xrange(1 + len(threadData.shared.buffered)):
|
||||
|
|
|
@ -5,6 +5,7 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from lib.core.common import isListLike
|
||||
from lib.core.common import readInput
|
||||
from lib.core.common import safeSQLIdentificatorNaming
|
||||
from lib.core.common import unsafeSQLIdentificatorNaming
|
||||
|
@ -48,7 +49,7 @@ class Enumeration(GenericEnumeration):
|
|||
retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.schemaname' % kb.aliasName], blind=True)
|
||||
|
||||
if retVal:
|
||||
kb.data.cachedDbs = retVal[0].values()[0]
|
||||
kb.data.cachedDbs = list(retVal[0].values())[0]
|
||||
|
||||
if kb.data.cachedDbs:
|
||||
kb.data.cachedDbs.sort()
|
||||
|
@ -83,7 +84,7 @@ class Enumeration(GenericEnumeration):
|
|||
retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.tablename' % kb.aliasName], blind=True)
|
||||
|
||||
if retVal:
|
||||
for table in retVal[0].values()[0]:
|
||||
for table in list(retVal[0].values())[0]:
|
||||
if db not in kb.data.cachedTables:
|
||||
kb.data.cachedTables[db] = [table]
|
||||
else:
|
||||
|
@ -131,9 +132,9 @@ class Enumeration(GenericEnumeration):
|
|||
self.getTables()
|
||||
|
||||
if len(kb.data.cachedTables) > 0:
|
||||
tblList = kb.data.cachedTables.values()
|
||||
tblList = list(kb.data.cachedTables.values())
|
||||
|
||||
if isinstance(tblList[0], (set, tuple, list)):
|
||||
if isListLike(tblList[0]):
|
||||
tblList = tblList[0]
|
||||
else:
|
||||
errMsg = "unable to retrieve the tables "
|
||||
|
|
|
@ -6,6 +6,7 @@ See the file 'LICENSE' for copying permission
|
|||
"""
|
||||
|
||||
from lib.core.common import filterPairValues
|
||||
from lib.core.common import isListLike
|
||||
from lib.core.common import isTechniqueAvailable
|
||||
from lib.core.common import readInput
|
||||
from lib.core.common import safeSQLIdentificatorNaming
|
||||
|
@ -47,7 +48,7 @@ class Enumeration(GenericEnumeration):
|
|||
retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.name' % kb.aliasName], blind=blind, alias=kb.aliasName)
|
||||
|
||||
if retVal:
|
||||
kb.data.cachedUsers = retVal[0].values()[0]
|
||||
kb.data.cachedUsers = list(retVal[0].values())[0]
|
||||
break
|
||||
|
||||
return kb.data.cachedUsers
|
||||
|
@ -102,7 +103,7 @@ class Enumeration(GenericEnumeration):
|
|||
retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.name' % kb.aliasName], blind=blind, alias=kb.aliasName)
|
||||
|
||||
if retVal:
|
||||
kb.data.cachedDbs = retVal[0].values()[0]
|
||||
kb.data.cachedDbs = list(retVal[0].values())[0]
|
||||
break
|
||||
|
||||
if kb.data.cachedDbs:
|
||||
|
@ -146,7 +147,7 @@ class Enumeration(GenericEnumeration):
|
|||
retVal = pivotDumpTable("(%s) AS %s" % (query, kb.aliasName), ['%s.name' % kb.aliasName], blind=blind, alias=kb.aliasName)
|
||||
|
||||
if retVal:
|
||||
for table in retVal[0].values()[0]:
|
||||
for table in list(retVal[0].values())[0]:
|
||||
if db not in kb.data.cachedTables:
|
||||
kb.data.cachedTables[db] = [table]
|
||||
else:
|
||||
|
@ -195,9 +196,9 @@ class Enumeration(GenericEnumeration):
|
|||
self.getTables()
|
||||
|
||||
if len(kb.data.cachedTables) > 0:
|
||||
tblList = kb.data.cachedTables.values()
|
||||
tblList = list(kb.data.cachedTables.values())
|
||||
|
||||
if isinstance(tblList[0], (set, tuple, list)):
|
||||
if isListLike(tblList[0]):
|
||||
tblList = tblList[0]
|
||||
else:
|
||||
errMsg = "unable to retrieve the tables "
|
||||
|
|
|
@ -478,9 +478,9 @@ class Databases:
|
|||
if conf.db in kb.data.cachedTables:
|
||||
tblList = kb.data.cachedTables[conf.db]
|
||||
else:
|
||||
tblList = kb.data.cachedTables.values()
|
||||
tblList = list(kb.data.cachedTables.values())
|
||||
|
||||
if isinstance(tblList[0], (set, tuple, list)):
|
||||
if isListLike(tblList[0]):
|
||||
tblList = tblList[0]
|
||||
|
||||
tblList = list(tblList)
|
||||
|
|
|
@ -93,9 +93,9 @@ class Entries:
|
|||
self.getTables()
|
||||
|
||||
if len(kb.data.cachedTables) > 0:
|
||||
tblList = kb.data.cachedTables.values()
|
||||
tblList = list(kb.data.cachedTables.values())
|
||||
|
||||
if isinstance(tblList[0], (set, tuple, list)):
|
||||
if isListLike(tblList[0]):
|
||||
tblList = tblList[0]
|
||||
elif not conf.search:
|
||||
errMsg = "unable to retrieve the tables "
|
||||
|
|
Loading…
Reference in New Issue
Block a user