Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/controller/handler.py
3553 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2026 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 getSafeExString
10
from lib.core.common import singleTimeWarnMessage
11
from lib.core.data import conf
12
from lib.core.data import kb
13
from lib.core.dicts import DBMS_DICT
14
from lib.core.enums import DBMS
15
from lib.core.exception import SqlmapConnectionException
16
from lib.core.settings import ACCESS_ALIASES
17
from lib.core.settings import ALTIBASE_ALIASES
18
from lib.core.settings import CACHE_ALIASES
19
from lib.core.settings import CLICKHOUSE_ALIASES
20
from lib.core.settings import CRATEDB_ALIASES
21
from lib.core.settings import CUBRID_ALIASES
22
from lib.core.settings import DB2_ALIASES
23
from lib.core.settings import DERBY_ALIASES
24
from lib.core.settings import EXTREMEDB_ALIASES
25
from lib.core.settings import FIREBIRD_ALIASES
26
from lib.core.settings import FRONTBASE_ALIASES
27
from lib.core.settings import H2_ALIASES
28
from lib.core.settings import HSQLDB_ALIASES
29
from lib.core.settings import INFORMIX_ALIASES
30
from lib.core.settings import MAXDB_ALIASES
31
from lib.core.settings import MCKOI_ALIASES
32
from lib.core.settings import MIMERSQL_ALIASES
33
from lib.core.settings import MONETDB_ALIASES
34
from lib.core.settings import MSSQL_ALIASES
35
from lib.core.settings import MYSQL_ALIASES
36
from lib.core.settings import ORACLE_ALIASES
37
from lib.core.settings import PGSQL_ALIASES
38
from lib.core.settings import PRESTO_ALIASES
39
from lib.core.settings import RAIMA_ALIASES
40
from lib.core.settings import SQLITE_ALIASES
41
from lib.core.settings import SYBASE_ALIASES
42
from lib.core.settings import VERTICA_ALIASES
43
from lib.core.settings import VIRTUOSO_ALIASES
44
from lib.core.settings import SNOWFLAKE_ALIASES
45
from lib.utils.sqlalchemy import SQLAlchemy
46
47
from plugins.dbms.access import AccessMap
48
from plugins.dbms.altibase import AltibaseMap
49
from plugins.dbms.cache import CacheMap
50
from plugins.dbms.clickhouse import ClickHouseMap
51
from plugins.dbms.cratedb import CrateDBMap
52
from plugins.dbms.cubrid import CubridMap
53
from plugins.dbms.db2 import DB2Map
54
from plugins.dbms.derby import DerbyMap
55
from plugins.dbms.extremedb import ExtremeDBMap
56
from plugins.dbms.firebird import FirebirdMap
57
from plugins.dbms.frontbase import FrontBaseMap
58
from plugins.dbms.h2 import H2Map
59
from plugins.dbms.hsqldb import HSQLDBMap
60
from plugins.dbms.informix import InformixMap
61
from plugins.dbms.maxdb import MaxDBMap
62
from plugins.dbms.mckoi import MckoiMap
63
from plugins.dbms.mimersql import MimerSQLMap
64
from plugins.dbms.monetdb import MonetDBMap
65
from plugins.dbms.mssqlserver import MSSQLServerMap
66
from plugins.dbms.mysql import MySQLMap
67
from plugins.dbms.oracle import OracleMap
68
from plugins.dbms.postgresql import PostgreSQLMap
69
from plugins.dbms.presto import PrestoMap
70
from plugins.dbms.raima import RaimaMap
71
from plugins.dbms.sqlite import SQLiteMap
72
from plugins.dbms.sybase import SybaseMap
73
from plugins.dbms.vertica import VerticaMap
74
from plugins.dbms.virtuoso import VirtuosoMap
75
from plugins.dbms.snowflake import SnowflakeMap
76
77
def setHandler():
78
"""
79
Detect which is the target web application back-end database
80
management system.
81
"""
82
83
items = [
84
(DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, "plugins.dbms.mysql.connector"),
85
(DBMS.ORACLE, ORACLE_ALIASES, OracleMap, "plugins.dbms.oracle.connector"),
86
(DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, "plugins.dbms.postgresql.connector"),
87
(DBMS.MSSQL, MSSQL_ALIASES, MSSQLServerMap, "plugins.dbms.mssqlserver.connector"),
88
(DBMS.SQLITE, SQLITE_ALIASES, SQLiteMap, "plugins.dbms.sqlite.connector"),
89
(DBMS.ACCESS, ACCESS_ALIASES, AccessMap, "plugins.dbms.access.connector"),
90
(DBMS.FIREBIRD, FIREBIRD_ALIASES, FirebirdMap, "plugins.dbms.firebird.connector"),
91
(DBMS.MAXDB, MAXDB_ALIASES, MaxDBMap, "plugins.dbms.maxdb.connector"),
92
(DBMS.SYBASE, SYBASE_ALIASES, SybaseMap, "plugins.dbms.sybase.connector"),
93
(DBMS.DB2, DB2_ALIASES, DB2Map, "plugins.dbms.db2.connector"),
94
(DBMS.HSQLDB, HSQLDB_ALIASES, HSQLDBMap, "plugins.dbms.hsqldb.connector"),
95
(DBMS.H2, H2_ALIASES, H2Map, "plugins.dbms.h2.connector"),
96
(DBMS.INFORMIX, INFORMIX_ALIASES, InformixMap, "plugins.dbms.informix.connector"),
97
(DBMS.MONETDB, MONETDB_ALIASES, MonetDBMap, "plugins.dbms.monetdb.connector"),
98
(DBMS.DERBY, DERBY_ALIASES, DerbyMap, "plugins.dbms.derby.connector"),
99
(DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, "plugins.dbms.vertica.connector"),
100
(DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, "plugins.dbms.mckoi.connector"),
101
(DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, "plugins.dbms.presto.connector"),
102
(DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, "plugins.dbms.altibase.connector"),
103
(DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, "plugins.dbms.mimersql.connector"),
104
(DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickHouseMap, "plugins.dbms.clickhouse.connector"),
105
(DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, "plugins.dbms.cratedb.connector"),
106
(DBMS.CUBRID, CUBRID_ALIASES, CubridMap, "plugins.dbms.cubrid.connector"),
107
(DBMS.CACHE, CACHE_ALIASES, CacheMap, "plugins.dbms.cache.connector"),
108
(DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, "plugins.dbms.extremedb.connector"),
109
(DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, "plugins.dbms.frontbase.connector"),
110
(DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, "plugins.dbms.raima.connector"),
111
(DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, "plugins.dbms.virtuoso.connector"),
112
(DBMS.SNOWFLAKE, SNOWFLAKE_ALIASES, SnowflakeMap, "plugins.dbms.snowflake.connector"),
113
]
114
115
_ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items)
116
if _:
117
items.remove(_)
118
items.insert(0, _)
119
120
for dbms, aliases, Handler, connector in items:
121
if conf.forceDbms:
122
if conf.forceDbms.lower() not in aliases:
123
continue
124
else:
125
kb.dbms = conf.dbms = conf.forceDbms = dbms
126
127
if kb.dbmsFilter:
128
if dbms not in kb.dbmsFilter:
129
continue
130
131
handler = Handler()
132
conf.dbmsConnector = None
133
134
if conf.direct:
135
_ = __import__(connector, fromlist=['Connector'])
136
conf.dbmsConnector = _.Connector()
137
138
exception = None
139
dialect = DBMS_DICT[dbms][3]
140
141
if dialect:
142
try:
143
sqlalchemy = SQLAlchemy(dialect=dialect)
144
sqlalchemy.connect()
145
146
if sqlalchemy.connector:
147
conf.dbmsConnector = sqlalchemy
148
except Exception as ex:
149
exception = ex
150
151
if not dialect or exception:
152
try:
153
conf.dbmsConnector.connect()
154
except NameError:
155
if exception:
156
raise exception
157
else:
158
msg = "support for direct connection to '%s' is not available. " % dbms
159
msg += "Please rerun with '--dependencies'"
160
raise SqlmapConnectionException(msg)
161
except:
162
if exception:
163
singleTimeWarnMessage(getSafeExString(exception))
164
raise
165
166
if conf.forceDbms == dbms or handler.checkDbms():
167
if kb.resolutionDbms:
168
conf.dbmsHandler = max(_ for _ in items if _[0] == kb.resolutionDbms)[2]()
169
conf.dbmsHandler._dbms = kb.resolutionDbms
170
else:
171
conf.dbmsHandler = handler
172
conf.dbmsHandler._dbms = dbms
173
174
break
175
else:
176
conf.dbmsConnector = None
177
178
# At this point back-end DBMS is correctly fingerprinted, no need
179
# to enforce it anymore
180
Backend.flushForcedDbms()
181
182