Path: blob/master/plugins/dbms/mssqlserver/fingerprint.py
2992 views
#!/usr/bin/env python12"""3Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)4See the file 'LICENSE' for copying permission5"""67from lib.core.common import Backend8from lib.core.common import Format9from lib.core.convert import getUnicode10from lib.core.data import conf11from lib.core.data import kb12from lib.core.data import logger13from lib.core.enums import DBMS14from lib.core.enums import OS15from lib.core.session import setDbms16from lib.core.settings import MSSQL_ALIASES17from lib.request import inject18from plugins.generic.fingerprint import Fingerprint as GenericFingerprint1920class Fingerprint(GenericFingerprint):21def __init__(self):22GenericFingerprint.__init__(self, DBMS.MSSQL)2324def getFingerprint(self):25value = ""26wsOsFp = Format.getOs("web server", kb.headersFp)2728if wsOsFp:29value += "%s\n" % wsOsFp3031if kb.data.banner:32dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp)3334if dbmsOsFp:35value += "%s\n" % dbmsOsFp3637value += "back-end DBMS: "38actVer = Format.getDbms()3940if not conf.extensiveFp:41value += actVer42return value4344blank = " " * 1545value += "active fingerprint: %s" % actVer4647if kb.bannerFp:48release = kb.bannerFp.get("dbmsRelease")49version = kb.bannerFp.get("dbmsVersion")50servicepack = kb.bannerFp.get("dbmsServicePack")5152if release and version and servicepack:53banVer = "%s %s " % (DBMS.MSSQL, release)54banVer += "Service Pack %s " % servicepack55banVer += "version %s" % version5657value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)5859htmlErrorFp = Format.getErrorParsedDBMSes()6061if htmlErrorFp:62value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)6364return value6566def checkDbms(self):67if not conf.extensiveFp and Backend.isDbmsWithin(MSSQL_ALIASES):68setDbms("%s %s" % (DBMS.MSSQL, Backend.getVersion()))6970self.getBanner()7172Backend.setOs(OS.WINDOWS)7374return True7576infoMsg = "testing %s" % DBMS.MSSQL77logger.info(infoMsg)7879# NOTE: SELECT LEN(@@VERSION)=LEN(@@VERSION) FROM DUAL does not80# work connecting directly to the Microsoft SQL Server database81if conf.direct:82result = True83else:84result = inject.checkBooleanExpression("UNICODE(SQUARE(NULL)) IS NULL")8586if result:87infoMsg = "confirming %s" % DBMS.MSSQL88logger.info(infoMsg)8990for version, check in (91("Azure", "@@VERSION LIKE '%Azure%'"),92("2025", "CHARINDEX('17.0.',@@VERSION)>0"),93("2022", "GREATEST(NULL,NULL) IS NULL"),94("2019", "CHARINDEX('15.0.',@@VERSION)>0"),95("2017", "TRIM(NULL) IS NULL"),96("2016", "ISJSON(NULL) IS NULL"),97("2014", "CHARINDEX('12.0.',@@VERSION)>0"),98("2012", "CONCAT(NULL,NULL)=CONCAT(NULL,NULL)"),99("2008", "SYSDATETIME()=SYSDATETIME()"),100("2005", "XACT_STATE()=XACT_STATE()"),101("2000", "HOST_NAME()=HOST_NAME()"),102):103result = inject.checkBooleanExpression(check)104105if result:106Backend.setVersion(version)107break108109if Backend.getVersion():110setDbms("%s %s" % (DBMS.MSSQL, Backend.getVersion()))111else:112setDbms(DBMS.MSSQL)113114self.getBanner()115116Backend.setOs(OS.WINDOWS)117118return True119else:120warnMsg = "the back-end DBMS is not %s" % DBMS.MSSQL121logger.warning(warnMsg)122123return False124125def checkDbmsOs(self, detailed=False):126if Backend.getOs() and Backend.getOsVersion() and Backend.getOsServicePack():127return128129if not Backend.getOs():130Backend.setOs(OS.WINDOWS)131132if not detailed:133return134135infoMsg = "fingerprinting the back-end DBMS operating system "136infoMsg += "version and service pack"137logger.info(infoMsg)138139infoMsg = "the back-end DBMS operating system is %s" % Backend.getOs()140141self.createSupportTbl(self.fileTblName, self.tblField, "varchar(1000)")142inject.goStacked("INSERT INTO %s(%s) VALUES (%s)" % (self.fileTblName, self.tblField, "@@VERSION"))143144# Reference: https://en.wikipedia.org/wiki/Comparison_of_Microsoft_Windows_versions145# https://en.wikipedia.org/wiki/Windows_NT#Releases146versions = {147"NT": ("4.0", (6, 5, 4, 3, 2, 1)),148"2000": ("5.0", (4, 3, 2, 1)),149"XP": ("5.1", (3, 2, 1)),150"2003": ("5.2", (2, 1)),151"Vista or 2008": ("6.0", (2, 1)),152"7 or 2008 R2": ("6.1", (1, 0)),153"8 or 2012": ("6.2", (0,)),154"8.1 or 2012 R2": ("6.3", (0,)),155"10 or 11 or 2016 or 2019 or 2022": ("10.0", (0,))156}157158# Get back-end DBMS underlying operating system version159for version, data in versions.items():160query = "EXISTS(SELECT %s FROM %s WHERE %s " % (self.tblField, self.fileTblName, self.tblField)161query += "LIKE '%Windows NT " + data[0] + "%')"162result = inject.checkBooleanExpression(query)163164if result:165Backend.setOsVersion(version)166infoMsg += " %s" % Backend.getOsVersion()167break168169if not Backend.getOsVersion():170Backend.setOsVersion("2003")171Backend.setOsServicePack(2)172173warnMsg = "unable to fingerprint the underlying operating "174warnMsg += "system version, assuming it is Windows "175warnMsg += "%s Service Pack %d" % (Backend.getOsVersion(), Backend.getOsServicePack())176logger.warning(warnMsg)177178self.cleanup(onlyFileTbl=True)179180return181182# Get back-end DBMS underlying operating system service pack183sps = versions[Backend.getOsVersion()][1]184for sp in sps:185query = "EXISTS(SELECT %s FROM %s WHERE %s " % (self.tblField, self.fileTblName, self.tblField)186query += "LIKE '%Service Pack " + getUnicode(sp) + "%')"187result = inject.checkBooleanExpression(query)188189if result:190Backend.setOsServicePack(sp)191break192193if not Backend.getOsServicePack():194debugMsg = "assuming the operating system has no service pack"195logger.debug(debugMsg)196197Backend.setOsServicePack(0)198199if Backend.getOsVersion():200infoMsg += " Service Pack %d" % Backend.getOsServicePack()201202logger.info(infoMsg)203204self.cleanup(onlyFileTbl=True)205206207