sqlmap/plugins/dbms/sqlite/fingerprint.py

114 lines
3.1 KiB
Python
Raw Normal View History

#!/usr/bin/env python
"""
$Id$
Copyright (c) 2006-2010 sqlmap developers (http://sqlmap.sourceforge.net/)
2010-10-15 03:18:29 +04:00
See the file 'doc/COPYING' for copying permission
"""
from lib.core.agent import agent
from lib.core.common import formatDBMSfp
from lib.core.common import formatFingerprint
2011-01-02 19:51:21 +03:00
from lib.core.common import getErrorParsedDBMSesFormatted
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 METADB_SUFFIX
from lib.core.settings import SQLITE_ALIASES
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)
def getFingerprint(self):
value = ""
wsOsFp = formatFingerprint("web server", kb.headersFp)
if wsOsFp:
value += "%s\n" % wsOsFp
if kb.data.banner:
dbmsOsFp = formatFingerprint("back-end DBMS", kb.bannerFp)
if dbmsOsFp:
value += "%s\n" % dbmsOsFp
value += "back-end DBMS: "
if not conf.extensiveFp:
2010-11-02 15:08:28 +03:00
value += DBMS.SQLITE
return value
actVer = formatDBMSfp()
blank = " " * 15
value += "active fingerprint: %s" % actVer
if kb.bannerFp:
banVer = kb.bannerFp["dbmsVersion"]
banVer = formatDBMSfp([banVer])
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
2011-01-02 19:51:21 +03:00
htmlErrorFp = getErrorParsedDBMSesFormatted()
if htmlErrorFp:
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
return value
def checkDbms(self):
"""
References for fingerprint:
* http://www.sqlite.org/lang_corefunc.html
* http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions
"""
if (kb.dbms is not None and kb.dbms.lower() in SQLITE_ALIASES) or conf.dbms in SQLITE_ALIASES:
2010-11-02 14:59:24 +03:00
setDbms(DBMS.SQLITE)
self.getBanner()
if not conf.extensiveFp:
return True
logMsg = "testing SQLite"
logger.info(logMsg)
result = inject.checkBooleanExpression("LAST_INSERT_ROWID()=LAST_INSERT_ROWID()")
if result:
logMsg = "confirming SQLite"
logger.info(logMsg)
result = inject.checkBooleanExpression("SQLITE_VERSION()=SQLITE_VERSION()")
if not result:
2010-11-12 13:02:02 +03:00
warnMsg = "the back-end DBMS is not SQLite"
logger.warn(warnMsg)
return False
2010-12-10 13:54:17 +03:00
else:
result = inject.checkBooleanExpression("RANDOMBLOB(-1)>0")
2010-12-10 13:54:17 +03:00
kb.dbmsVersion = [ '3' if result else '2' ]
2010-11-02 14:59:24 +03:00
setDbms(DBMS.SQLITE)
self.getBanner()
return True
else:
2010-11-12 13:02:02 +03:00
warnMsg = "the back-end DBMS is not SQLite"
logger.warn(warnMsg)
return False
def forceDbmsEnum(self):
conf.db = "%s%s" % (DBMS.SQLITE, METADB_SUFFIX)