|
|
|
@ -17,17 +17,23 @@ from lib.core.settings import SQLITE_ALIASES
|
|
|
|
|
from lib.request import inject
|
|
|
|
|
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
|
|
|
|
|
|
|
|
|
|
# 该插件用于检测sqlite数据库,通过执行一些常用函数来判断数据库类型,并获取数据库版本信息,最后返回检测结果。
|
|
|
|
|
# 通过执行SQLITE_VERSION()函数来判断数据库类型,获取数据库版本信息,检测数据库是否存在。
|
|
|
|
|
|
|
|
|
|
class Fingerprint(GenericFingerprint):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
# 初始化父类Fingerprint,对象的数据库管理系统类型设置为SQLite
|
|
|
|
|
GenericFingerprint.__init__(self, DBMS.SQLITE)
|
|
|
|
|
|
|
|
|
|
def getFingerprint(self):
|
|
|
|
|
value = ""
|
|
|
|
|
# 获取Web服务器的操作系统指纹
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
@ -36,14 +42,17 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
|
|
|
|
|
value += "back-end DBMS: "
|
|
|
|
|
|
|
|
|
|
# 如果不是详尽指纹模式,直接返回DBMS类型
|
|
|
|
|
if not conf.extensiveFp:
|
|
|
|
|
value += DBMS.SQLITE
|
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
# 获取当前活动的数据库管理系统信息
|
|
|
|
|
actVer = Format.getDbms()
|
|
|
|
|
blank = " " * 15
|
|
|
|
|
value += "active fingerprint: %s" % actVer
|
|
|
|
|
|
|
|
|
|
# 如果有数据库版本信息的指纹,则进行处理
|
|
|
|
|
if kb.bannerFp:
|
|
|
|
|
banVer = kb.bannerFp.get("dbmsVersion")
|
|
|
|
|
|
|
|
|
@ -51,6 +60,7 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
banVer = Format.getDbms([banVer])
|
|
|
|
|
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
|
|
|
|
|
|
|
|
|
|
# 获取HTML错误消息中的指纹
|
|
|
|
|
htmlErrorFp = Format.getErrorParsedDBMSes()
|
|
|
|
|
|
|
|
|
|
if htmlErrorFp:
|
|
|
|
@ -66,6 +76,7 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
* http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# 如果不是详尽指纹模式并且数据库管理系统在已知的SQLite别名之中
|
|
|
|
|
if not conf.extensiveFp and Backend.isDbmsWithin(SQLITE_ALIASES):
|
|
|
|
|
setDbms(DBMS.SQLITE)
|
|
|
|
|
|
|
|
|
@ -76,12 +87,14 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
infoMsg = "testing %s" % DBMS.SQLITE
|
|
|
|
|
logger.info(infoMsg)
|
|
|
|
|
|
|
|
|
|
# 检查布尔表达式,验证是否为SQLite
|
|
|
|
|
result = inject.checkBooleanExpression("LAST_INSERT_ROWID()=LAST_INSERT_ROWID()")
|
|
|
|
|
|
|
|
|
|
if result:
|
|
|
|
|
infoMsg = "confirming %s" % DBMS.SQLITE
|
|
|
|
|
logger.info(infoMsg)
|
|
|
|
|
|
|
|
|
|
# 进一步确认数据库版本
|
|
|
|
|
result = inject.checkBooleanExpression("SQLITE_VERSION()=SQLITE_VERSION()")
|
|
|
|
|
|
|
|
|
|
if not result:
|
|
|
|
@ -93,6 +106,7 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
infoMsg = "actively fingerprinting %s" % DBMS.SQLITE
|
|
|
|
|
logger.info(infoMsg)
|
|
|
|
|
|
|
|
|
|
# 依据RANDOMBLOB函数确定SQLite版本
|
|
|
|
|
result = inject.checkBooleanExpression("RANDOMBLOB(-1)>0")
|
|
|
|
|
version = '3' if result else '2'
|
|
|
|
|
Backend.setVersion(version)
|
|
|
|
@ -109,4 +123,5 @@ class Fingerprint(GenericFingerprint):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def forceDbmsEnum(self):
|
|
|
|
|
# 强制数据库管理系统枚举,设置数据库名称
|
|
|
|
|
conf.db = "%s%s" % (DBMS.SQLITE, METADB_SUFFIX)
|
|
|
|
|