Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/plugins/dbms/oracle/fingerprint.py
2992 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
import re
9
10
from lib.core.common import Backend
11
from lib.core.common import Format
12
from lib.core.common import hashDBRetrieve
13
from lib.core.common import hashDBWrite
14
from lib.core.data import conf
15
from lib.core.data import kb
16
from lib.core.data import logger
17
from lib.core.enums import DBMS
18
from lib.core.enums import FORK
19
from lib.core.enums import HASHDB_KEYS
20
from lib.core.session import setDbms
21
from lib.core.settings import ORACLE_ALIASES
22
from lib.request import inject
23
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
24
25
class Fingerprint(GenericFingerprint):
26
def __init__(self):
27
GenericFingerprint.__init__(self, DBMS.ORACLE)
28
29
def getFingerprint(self):
30
fork = hashDBRetrieve(HASHDB_KEYS.DBMS_FORK)
31
32
if fork is None:
33
if inject.checkBooleanExpression("NULL_EQU(NULL,NULL)=1"):
34
fork = FORK.DM8
35
else:
36
fork = ""
37
38
hashDBWrite(HASHDB_KEYS.DBMS_FORK, fork)
39
40
value = ""
41
wsOsFp = Format.getOs("web server", kb.headersFp)
42
43
if wsOsFp:
44
value += "%s\n" % wsOsFp
45
46
if kb.data.banner:
47
dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp)
48
49
if dbmsOsFp:
50
value += "%s\n" % dbmsOsFp
51
52
value += "back-end DBMS: "
53
54
if not conf.extensiveFp:
55
value += DBMS.ORACLE
56
if fork:
57
value += " (%s fork)" % fork
58
return value
59
60
actVer = Format.getDbms()
61
blank = " " * 15
62
value += "active fingerprint: %s" % actVer
63
64
if kb.bannerFp:
65
banVer = kb.bannerFp.get("dbmsVersion")
66
67
if banVer:
68
banVer = Format.getDbms([banVer])
69
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
70
71
htmlErrorFp = Format.getErrorParsedDBMSes()
72
73
if htmlErrorFp:
74
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
75
76
if fork:
77
value += "\n%sfork fingerprint: %s" % (blank, fork)
78
79
return value
80
81
def checkDbms(self):
82
if not conf.extensiveFp and Backend.isDbmsWithin(ORACLE_ALIASES):
83
setDbms(DBMS.ORACLE)
84
85
self.getBanner()
86
87
return True
88
89
infoMsg = "testing %s" % DBMS.ORACLE
90
logger.info(infoMsg)
91
92
# NOTE: SELECT LENGTH(SYSDATE)=LENGTH(SYSDATE) FROM DUAL does
93
# not work connecting directly to the Oracle database
94
if conf.direct:
95
result = True
96
else:
97
result = inject.checkBooleanExpression("LENGTH(SYSDATE)=LENGTH(SYSDATE)")
98
99
if result:
100
infoMsg = "confirming %s" % DBMS.ORACLE
101
logger.info(infoMsg)
102
103
# NOTE: SELECT NVL(RAWTOHEX([RANDNUM1]),[RANDNUM1])=RAWTOHEX([RANDNUM1]) FROM DUAL does
104
# not work connecting directly to the Oracle database
105
if conf.direct:
106
result = True
107
else:
108
result = inject.checkBooleanExpression("NVL(RAWTOHEX([RANDNUM1]),[RANDNUM1])=RAWTOHEX([RANDNUM1])")
109
110
if not result:
111
warnMsg = "the back-end DBMS is not %s" % DBMS.ORACLE
112
logger.warning(warnMsg)
113
114
return False
115
116
setDbms(DBMS.ORACLE)
117
118
self.getBanner()
119
120
if not conf.extensiveFp:
121
return True
122
123
infoMsg = "actively fingerprinting %s" % DBMS.ORACLE
124
logger.info(infoMsg)
125
126
# Reference: https://en.wikipedia.org/wiki/Oracle_Database
127
for version in ("23c", "21c", "19c", "18c", "12c", "11g", "10g", "9i", "8i", "7"):
128
number = int(re.search(r"([\d]+)", version).group(1))
129
output = inject.checkBooleanExpression("%d=(SELECT SUBSTR((VERSION),1,%d) FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1)" % (number, 1 if number < 10 else 2))
130
131
if output:
132
Backend.setVersion(version)
133
break
134
135
return True
136
else:
137
warnMsg = "the back-end DBMS is not %s" % DBMS.ORACLE
138
logger.warning(warnMsg)
139
140
return False
141
142
def forceDbmsEnum(self):
143
if conf.db:
144
conf.db = conf.db.upper()
145
146
if conf.tbl:
147
conf.tbl = conf.tbl.upper()
148
149