sqlmap/plugins/dbms/oracle/fingerprint.py

161 lines
4.8 KiB
Python
Raw Normal View History

2008-10-15 19:38:22 +04:00
#!/usr/bin/env python
"""
2008-10-15 19:56:32 +04:00
$Id$
2008-10-15 19:38:22 +04:00
This file is part of the sqlmap project, http://sqlmap.sourceforge.net.
2010-03-03 18:26:27 +03:00
Copyright (c) 2007-2010 Bernardo Damele A. G. <bernardo.damele@gmail.com>
Copyright (c) 2006 Daniele Bellucci <daniele.bellucci@gmail.com>
2008-10-15 19:38:22 +04:00
sqlmap is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation version 2 of the License.
sqlmap is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along
with sqlmap; if not, write to the Free Software Foundation, Inc., 51
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
"""
import re
from lib.core.agent import agent
from lib.core.common import formatDBMSfp
from lib.core.common import formatFingerprint
2008-10-15 19:38:22 +04:00
from lib.core.common import getHtmlErrorFp
from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.session import setDbms
from lib.core.settings import ORACLE_ALIASES
from lib.request import inject
from lib.request.connect import Connect as Request
2008-10-15 19:38:22 +04:00
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
2008-10-15 19:38:22 +04:00
class Fingerprint(GenericFingerprint):
2008-10-15 19:38:22 +04:00
def __init__(self):
GenericFingerprint.__init__(self)
2008-10-15 19:38:22 +04:00
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: "
2008-10-15 19:38:22 +04:00
if not conf.extensiveFp:
value += "Oracle"
return value
2008-10-15 19:38:22 +04:00
actVer = formatDBMSfp()
blank = " " * 15
value += "active fingerprint: %s" % actVer
2008-10-15 19:38:22 +04:00
if kb.bannerFp:
2010-03-04 12:16:45 +03:00
banVer = kb.bannerFp["dbmsVersion"] if 'dbmsVersion' in kb.bannerFp else None
banVer = formatDBMSfp([banVer])
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
2008-10-15 19:38:22 +04:00
htmlErrorFp = getHtmlErrorFp()
2008-10-15 19:38:22 +04:00
if htmlErrorFp:
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
2008-10-15 19:38:22 +04:00
return value
def checkDbms(self):
logMsg = "testing Oracle"
logger.info(logMsg)
if conf.direct:
conf.dbmsConnector.connect()
2008-10-15 19:38:22 +04:00
if conf.dbms in ORACLE_ALIASES:
setDbms("Oracle")
self.getBanner()
2008-10-15 19:38:22 +04:00
if not conf.extensiveFp:
return True
# NOTE: SELECT ROWNUM=ROWNUM FROM DUAL does not work connecting
# directly to the Oracle database
if conf.direct:
result = True
else:
payload = agent.fullPayload(" AND ROWNUM=ROWNUM")
result = Request.queryPage(payload)
2008-10-15 19:38:22 +04:00
if result:
2008-10-15 19:38:22 +04:00
logMsg = "confirming Oracle"
logger.info(logMsg)
# NOTE: SELECT LENGTH(SYSDATE)=LENGTH(SYSDATE) FROM DUAL does
# not work connecting directly to the Oracle database
if conf.direct:
result = True
else:
payload = agent.fullPayload(" AND LENGTH(SYSDATE)=LENGTH(SYSDATE)")
result = Request.queryPage(payload)
2008-10-15 19:38:22 +04:00
if not result:
2008-10-15 19:38:22 +04:00
warnMsg = "the back-end DMBS is not Oracle"
logger.warn(warnMsg)
return False
setDbms("Oracle")
self.getBanner()
2008-10-15 19:38:22 +04:00
if not conf.extensiveFp:
return True
query = "SELECT SUBSTR((VERSION), 1, 2) FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1"
version = inject.getValue(query, unpack=False)
if re.search("^11", version):
2008-10-15 19:38:22 +04:00
kb.dbmsVersion = ["11i"]
elif re.search("^10", version):
2008-10-15 19:38:22 +04:00
kb.dbmsVersion = ["10g"]
elif re.search("^9", version):
2008-10-15 19:38:22 +04:00
kb.dbmsVersion = ["9i"]
elif re.search("^8", version):
2008-10-15 19:38:22 +04:00
kb.dbmsVersion = ["8i"]
return True
else:
warnMsg = "the back-end DMBS is not Oracle"
logger.warn(warnMsg)
return False
def forceDbmsEnum(self):
if conf.db:
conf.db = conf.db.upper()
else:
conf.db = "USERS"
warnMsg = "on Oracle it is only possible to enumerate "
warnMsg += "if you provide a TABLESPACE_NAME as database "
warnMsg += "name. sqlmap is going to use 'USERS' as database "
warnMsg += "name"
logger.warn(warnMsg)
if conf.tbl:
conf.tbl = conf.tbl.upper()