sqlmap/plugins/dbms/maxdb/fingerprint.py

138 lines
3.7 KiB
Python
Raw Normal View History

2019-05-08 13:47:52 +03:00
#!/usr/bin/env python
"""
2020-01-01 15:25:15 +03:00
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
2017-10-11 15:50:46 +03:00
See the file 'LICENSE' for copying permission
"""
from lib.core.agent import agent
from lib.core.common import Backend
from lib.core.common import Format
2019-03-28 18:04:38 +03:00
from lib.core.compat import xrange
from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.enums import DBMS
from lib.core.session import setDbms
from lib.core.settings import MAXDB_ALIASES
2010-12-09 14:23:44 +03:00
from lib.request import inject
from lib.request.connect import Connect as Request
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
class Fingerprint(GenericFingerprint):
def __init__(self):
GenericFingerprint.__init__(self, DBMS.MAXDB)
def _versionCheck(self):
infoMsg = "executing %s SYSINFO version check" % DBMS.MAXDB
logger.info(infoMsg)
2011-04-30 17:20:05 +04:00
query = agent.prefixQuery("/* NoValue */")
query = agent.suffixQuery(query)
payload = agent.payload(newValue=query)
2011-04-30 17:20:05 +04:00
result = Request.queryPage(payload)
if not result:
warnMsg = "unable to perform %s version check" % DBMS.MAXDB
logger.warn(warnMsg)
return None
minor, major = None, None
2012-07-06 19:18:22 +04:00
for version in (6, 7):
result = inject.checkBooleanExpression("%d=(SELECT MAJORVERSION FROM SYSINFO.VERSION)" % version)
if result:
major = version
for version in xrange(0, 10):
result = inject.checkBooleanExpression("%d=(SELECT MINORVERSION FROM SYSINFO.VERSION)" % version)
if result:
minor = version
if major and minor:
return "%s.%s" % (major, minor)
else:
return None
def getFingerprint(self):
2011-04-30 17:20:05 +04:00
value = ""
wsOsFp = Format.getOs("web server", kb.headersFp)
if wsOsFp:
value += "%s\n" % wsOsFp
if kb.data.banner:
dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp)
if dbmsOsFp:
value += "%s\n" % dbmsOsFp
2011-04-30 17:20:05 +04:00
blank = " " * 15
value += "back-end DBMS: "
if not conf.extensiveFp:
2010-11-02 15:08:28 +03:00
value += DBMS.MAXDB
return value
actVer = Format.getDbms() + " (%s)" % self._versionCheck()
2011-04-30 17:20:05 +04:00
blank = " " * 15
value += "active fingerprint: %s" % actVer
if kb.bannerFp:
value += "\n%sbanner parsing fingerprint: -" % blank
htmlErrorFp = Format.getErrorParsedDBMSes()
if htmlErrorFp:
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
return value
def checkDbms(self):
2017-03-06 14:53:04 +03:00
if not conf.extensiveFp and Backend.isDbmsWithin(MAXDB_ALIASES):
2010-11-02 14:59:24 +03:00
setDbms(DBMS.MAXDB)
self.getBanner()
return True
2011-04-30 19:29:59 +04:00
infoMsg = "testing %s" % DBMS.MAXDB
logger.info(infoMsg)
2011-02-21 00:17:16 +03:00
result = inject.checkBooleanExpression("ALPHA(NULL) IS NULL")
if result:
2011-04-30 19:29:59 +04:00
infoMsg = "confirming %s" % DBMS.MAXDB
logger.info(infoMsg)
result = inject.checkBooleanExpression("MAPCHAR(NULL,1,DEFAULTMAP) IS NULL")
if not result:
warnMsg = "the back-end DBMS is not %s" % DBMS.MAXDB
logger.warn(warnMsg)
return False
2010-11-02 14:59:24 +03:00
setDbms(DBMS.MAXDB)
self.getBanner()
return True
else:
warnMsg = "the back-end DBMS is not %s" % DBMS.MAXDB
logger.warn(warnMsg)
return False
def forceDbmsEnum(self):
2011-02-21 01:41:42 +03:00
if conf.db:
conf.db = conf.db.upper()
else:
conf.db = "USER"
2011-02-21 01:07:12 +03:00
if conf.tbl:
conf.tbl = conf.tbl.upper()