Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/plugins/dbms/presto/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
from lib.core.common import Backend
9
from lib.core.common import Format
10
from lib.core.data import conf
11
from lib.core.data import kb
12
from lib.core.data import logger
13
from lib.core.enums import DBMS
14
from lib.core.session import setDbms
15
from lib.core.settings import PRESTO_ALIASES
16
from lib.request import inject
17
from plugins.generic.fingerprint import Fingerprint as GenericFingerprint
18
19
class Fingerprint(GenericFingerprint):
20
def __init__(self):
21
GenericFingerprint.__init__(self, DBMS.PRESTO)
22
23
def getFingerprint(self):
24
value = ""
25
wsOsFp = Format.getOs("web server", kb.headersFp)
26
27
if wsOsFp:
28
value += "%s\n" % wsOsFp
29
30
if kb.data.banner:
31
dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp)
32
33
if dbmsOsFp:
34
value += "%s\n" % dbmsOsFp
35
36
value += "back-end DBMS: "
37
38
if not conf.extensiveFp:
39
value += DBMS.PRESTO
40
return value
41
42
actVer = Format.getDbms()
43
blank = " " * 15
44
value += "active fingerprint: %s" % actVer
45
46
if kb.bannerFp:
47
banVer = kb.bannerFp.get("dbmsVersion")
48
49
if banVer:
50
banVer = Format.getDbms([banVer])
51
value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer)
52
53
htmlErrorFp = Format.getErrorParsedDBMSes()
54
55
if htmlErrorFp:
56
value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp)
57
58
return value
59
60
def checkDbms(self):
61
if not conf.extensiveFp and Backend.isDbmsWithin(PRESTO_ALIASES):
62
setDbms(DBMS.PRESTO)
63
64
self.getBanner()
65
66
return True
67
68
infoMsg = "testing %s" % DBMS.PRESTO
69
logger.info(infoMsg)
70
71
result = inject.checkBooleanExpression("TO_BASE64URL(NULL) IS NULL")
72
73
if result:
74
infoMsg = "confirming %s" % DBMS.PRESTO
75
logger.info(infoMsg)
76
77
result = inject.checkBooleanExpression("TO_HEX(FROM_HEX(NULL)) IS NULL")
78
79
if not result:
80
warnMsg = "the back-end DBMS is not %s" % DBMS.PRESTO
81
logger.warning(warnMsg)
82
83
return False
84
85
setDbms(DBMS.PRESTO)
86
87
if not conf.extensiveFp:
88
return True
89
90
infoMsg = "actively fingerprinting %s" % DBMS.PRESTO
91
logger.info(infoMsg)
92
93
# Reference: https://prestodb.io/docs/current/release/release-0.200.html
94
if inject.checkBooleanExpression("FROM_IEEE754_32(NULL) IS NULL"):
95
Backend.setVersion(">= 0.200")
96
# Reference: https://prestodb.io/docs/current/release/release-0.193.html
97
elif inject.checkBooleanExpression("NORMAL_CDF(NULL,NULL,NULL) IS NULL"):
98
Backend.setVersion(">= 0.193")
99
# Reference: https://prestodb.io/docs/current/release/release-0.183.html
100
elif inject.checkBooleanExpression("MAP_ENTRIES(NULL) IS NULL"):
101
Backend.setVersion(">= 0.183")
102
# Reference: https://prestodb.io/docs/current/release/release-0.171.html
103
elif inject.checkBooleanExpression("CODEPOINT(NULL) IS NULL"):
104
Backend.setVersion(">= 0.171")
105
# Reference: https://prestodb.io/docs/current/release/release-0.162.html
106
elif inject.checkBooleanExpression("XXHASH64(NULL) IS NULL"):
107
Backend.setVersion(">= 0.162")
108
# Reference: https://prestodb.io/docs/current/release/release-0.151.html
109
elif inject.checkBooleanExpression("COSINE_SIMILARITY(NULL,NULL) IS NULL"):
110
Backend.setVersion(">= 0.151")
111
# Reference: https://prestodb.io/docs/current/release/release-0.143.html
112
elif inject.checkBooleanExpression("TRUNCATE(NULL) IS NULL"):
113
Backend.setVersion(">= 0.143")
114
# Reference: https://prestodb.io/docs/current/release/release-0.137.html
115
elif inject.checkBooleanExpression("BIT_COUNT(NULL,NULL) IS NULL"):
116
Backend.setVersion(">= 0.137")
117
# Reference: https://prestodb.io/docs/current/release/release-0.130.html
118
elif inject.checkBooleanExpression("MAP_CONCAT(NULL,NULL) IS NULL"):
119
Backend.setVersion(">= 0.130")
120
# Reference: https://prestodb.io/docs/current/release/release-0.115.html
121
elif inject.checkBooleanExpression("SHA1(NULL) IS NULL"):
122
Backend.setVersion(">= 0.115")
123
# Reference: https://prestodb.io/docs/current/release/release-0.100.html
124
elif inject.checkBooleanExpression("SPLIT(NULL,NULL) IS NULL"):
125
Backend.setVersion(">= 0.100")
126
# Reference: https://prestodb.io/docs/current/release/release-0.70.html
127
elif inject.checkBooleanExpression("GREATEST(NULL,NULL) IS NULL"):
128
Backend.setVersion(">= 0.70")
129
else:
130
Backend.setVersion("< 0.100")
131
132
return True
133
else:
134
warnMsg = "the back-end DBMS is not %s" % DBMS.PRESTO
135
logger.warning(warnMsg)
136
137
return False
138
139