sqlmap/plugins/dbms/hsqldb/fingerprint.py

154 lines
5.2 KiB
Python
Raw Permalink Normal View History

2019-05-08 13:47:52 +03:00
#!/usr/bin/env python
2013-06-24 17:34:25 +04:00
"""
2024-01-04 01:11:52 +03:00
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
2017-10-11 15:50:46 +03:00
See the file 'LICENSE' for copying permission
2013-06-24 17:34:25 +04:00
"""
import re
from lib.core.common import Backend
from lib.core.common import Format
from lib.core.common import unArrayizeValue
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 HSQLDB_ALIASES
2013-06-24 17:34:25 +04:00
from lib.request import inject
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
class Fingerprint(GenericFingerprint):
def __init__(self):
GenericFingerprint.__init__(self, DBMS.HSQLDB)
2013-06-24 17:34:25 +04:00
def getFingerprint(self):
value = ""
wsOsFp = Format.getOs("web server", kb.headersFp)
2017-04-10 20:21:22 +03:00
if wsOsFp and not conf.api:
2013-06-24 17:34:25 +04:00
value += "%s\n" % wsOsFp
if kb.data.banner:
dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp)
2017-04-10 20:21:22 +03:00
if dbmsOsFp and not conf.api:
2013-06-24 17:34:25 +04:00
value += "%s\n" % dbmsOsFp
value += "back-end DBMS: "
actVer = Format.getDbms()
if not conf.extensiveFp:
value += actVer
return value
blank = " " * 15
value += "active fingerprint: %s" % actVer
if kb.bannerFp:
2018-08-25 23:57:49 +03:00
banVer = kb.bannerFp.get("dbmsVersion")
2013-06-24 17:34:25 +04:00
2019-05-22 10:43:10 +03:00
if banVer:
if re.search(r"-log$", kb.data.banner or ""):
banVer += ", logging enabled"
2013-06-24 17:34:25 +04:00
2019-05-22 10:43:10 +03:00
banVer = Format.getDbms([banVer])
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
2013-06-24 17:34:25 +04:00
htmlErrorFp = Format.getErrorParsedDBMSes()
if htmlErrorFp:
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
return value
def checkDbms(self):
"""
References for fingerprint:
DATABASE_VERSION()
version 2.2.6 added two-arg REPLACE functio REPLACE('a','a') compared to REPLACE('a','a','d')
version 2.2.5 added SYSTIMESTAMP function
version 2.2.3 added REGEXPR_SUBSTRING and REGEXPR_SUBSTRING_ARRAY functions
version 2.2.0 added support for ROWNUM() function
version 2.1.0 added MEDIAN aggregate function
version < 2.0.1 added support for datetime ROUND and TRUNC functions
version 2.0.0 added VALUES support
version 1.8.0.4 Added org.hsqldbdb.Library function, getDatabaseFullProductVersion to return the
2013-06-24 17:34:25 +04:00
full version string, including the 4th digit (e.g 1.8.0.4).
version 1.7.2 CASE statements added and INFORMATION_SCHEMA
2014-08-20 23:07:19 +04:00
2013-06-24 17:34:25 +04:00
"""
2017-03-06 14:53:04 +03:00
if not conf.extensiveFp and Backend.isDbmsWithin(HSQLDB_ALIASES):
setDbms("%s %s" % (DBMS.HSQLDB, Backend.getVersion()))
2013-06-24 17:34:25 +04:00
if Backend.isVersionGreaterOrEqualThan("1.7.2"):
kb.data.has_information_schema = True
self.getBanner()
return True
infoMsg = "testing %s" % DBMS.HSQLDB
2013-06-24 17:34:25 +04:00
logger.info(infoMsg)
2013-07-01 14:05:02 +04:00
result = inject.checkBooleanExpression("CASEWHEN(1=1,1,0)=1")
2013-06-24 17:34:25 +04:00
if result:
infoMsg = "confirming %s" % DBMS.HSQLDB
2013-06-24 17:34:25 +04:00
logger.info(infoMsg)
result = inject.checkBooleanExpression("ROUNDMAGIC(PI())>=3")
if not result:
warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB
logger.warning(warnMsg)
2013-06-24 17:34:25 +04:00
return False
else:
result = inject.checkBooleanExpression("ZERO() IS 0") # Note: check for H2 DBMS (sharing majority of same functions)
if result:
warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB
logger.warning(warnMsg)
return False
2013-06-24 17:34:25 +04:00
kb.data.has_information_schema = True
Backend.setVersion(">= 1.7.2")
setDbms("%s 1.7.2" % DBMS.HSQLDB)
2013-06-24 17:34:25 +04:00
banner = self.getBanner()
if banner:
Backend.setVersion("= %s" % banner)
else:
if inject.checkBooleanExpression("(SELECT [RANDNUM] FROM (VALUES(0)))=[RANDNUM]"):
2013-06-24 18:12:37 +04:00
Backend.setVersionList([">= 2.0.0", "< 2.3.0"])
2013-06-24 17:34:25 +04:00
else:
banner = unArrayizeValue(inject.getValue("\"org.hsqldbdb.Library.getDatabaseFullProductVersion\"()", safeCharEncode=True))
2013-06-24 17:34:25 +04:00
if banner:
Backend.setVersion("= %s" % banner)
else:
Backend.setVersionList([">= 1.7.2", "< 1.8.0"])
return True
else:
2018-03-11 04:20:22 +03:00
warnMsg = "the back-end DBMS is not %s" % DBMS.HSQLDB
logger.warning(warnMsg)
2013-06-24 17:34:25 +04:00
2018-03-11 05:28:19 +03:00
dbgMsg = "...or version is < 1.7.2"
2018-03-11 04:20:22 +03:00
logger.debug(dbgMsg)
2013-06-24 17:34:25 +04:00
return False
2013-07-01 14:05:02 +04:00
def getHostname(self):
2013-07-01 15:01:53 +04:00
warnMsg = "on HSQLDB it is not possible to enumerate the hostname"
logger.warning(warnMsg)
def checkDbmsOs(self, detailed=False):
if Backend.getOs():
infoMsg = "the back-end DBMS operating system is %s" % Backend.getOs()
logger.info(infoMsg)
else:
self.userChooseDbmsOs()