Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/controller/handler.py
2989 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 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.utils.sqlalchemy import SQLAlchemy
45
46
from plugins.dbms.access.connector import Connector as AccessConn
47
from plugins.dbms.access import AccessMap
48
from plugins.dbms.altibase.connector import Connector as AltibaseConn
49
from plugins.dbms.altibase import AltibaseMap
50
from plugins.dbms.cache.connector import Connector as CacheConn
51
from plugins.dbms.cache import CacheMap
52
from plugins.dbms.clickhouse.connector import Connector as ClickHouseConn
53
from plugins.dbms.clickhouse import ClickHouseMap
54
from plugins.dbms.cratedb.connector import Connector as CrateDBConn
55
from plugins.dbms.cratedb import CrateDBMap
56
from plugins.dbms.cubrid.connector import Connector as CubridConn
57
from plugins.dbms.cubrid import CubridMap
58
from plugins.dbms.db2.connector import Connector as DB2Conn
59
from plugins.dbms.db2 import DB2Map
60
from plugins.dbms.derby.connector import Connector as DerbyConn
61
from plugins.dbms.derby import DerbyMap
62
from plugins.dbms.extremedb.connector import Connector as ExtremeDBConn
63
from plugins.dbms.extremedb import ExtremeDBMap
64
from plugins.dbms.firebird.connector import Connector as FirebirdConn
65
from plugins.dbms.firebird import FirebirdMap
66
from plugins.dbms.frontbase.connector import Connector as FrontBaseConn
67
from plugins.dbms.frontbase import FrontBaseMap
68
from plugins.dbms.h2.connector import Connector as H2Conn
69
from plugins.dbms.h2 import H2Map
70
from plugins.dbms.hsqldb.connector import Connector as HSQLDBConn
71
from plugins.dbms.hsqldb import HSQLDBMap
72
from plugins.dbms.informix.connector import Connector as InformixConn
73
from plugins.dbms.informix import InformixMap
74
from plugins.dbms.maxdb.connector import Connector as MaxDBConn
75
from plugins.dbms.maxdb import MaxDBMap
76
from plugins.dbms.mckoi.connector import Connector as MckoiConn
77
from plugins.dbms.mckoi import MckoiMap
78
from plugins.dbms.mimersql.connector import Connector as MimerSQLConn
79
from plugins.dbms.mimersql import MimerSQLMap
80
from plugins.dbms.monetdb.connector import Connector as MonetDBConn
81
from plugins.dbms.monetdb import MonetDBMap
82
from plugins.dbms.mssqlserver.connector import Connector as MSSQLServerConn
83
from plugins.dbms.mssqlserver import MSSQLServerMap
84
from plugins.dbms.mysql.connector import Connector as MySQLConn
85
from plugins.dbms.mysql import MySQLMap
86
from plugins.dbms.oracle.connector import Connector as OracleConn
87
from plugins.dbms.oracle import OracleMap
88
from plugins.dbms.postgresql.connector import Connector as PostgreSQLConn
89
from plugins.dbms.postgresql import PostgreSQLMap
90
from plugins.dbms.presto.connector import Connector as PrestoConn
91
from plugins.dbms.presto import PrestoMap
92
from plugins.dbms.raima.connector import Connector as RaimaConn
93
from plugins.dbms.raima import RaimaMap
94
from plugins.dbms.sqlite.connector import Connector as SQLiteConn
95
from plugins.dbms.sqlite import SQLiteMap
96
from plugins.dbms.sybase.connector import Connector as SybaseConn
97
from plugins.dbms.sybase import SybaseMap
98
from plugins.dbms.vertica.connector import Connector as VerticaConn
99
from plugins.dbms.vertica import VerticaMap
100
from plugins.dbms.virtuoso.connector import Connector as VirtuosoConn
101
from plugins.dbms.virtuoso import VirtuosoMap
102
103
def setHandler():
104
"""
105
Detect which is the target web application back-end database
106
management system.
107
"""
108
109
items = [
110
(DBMS.MYSQL, MYSQL_ALIASES, MySQLMap, MySQLConn),
111
(DBMS.ORACLE, ORACLE_ALIASES, OracleMap, OracleConn),
112
(DBMS.PGSQL, PGSQL_ALIASES, PostgreSQLMap, PostgreSQLConn),
113
(DBMS.MSSQL, MSSQL_ALIASES, MSSQLServerMap, MSSQLServerConn),
114
(DBMS.SQLITE, SQLITE_ALIASES, SQLiteMap, SQLiteConn),
115
(DBMS.ACCESS, ACCESS_ALIASES, AccessMap, AccessConn),
116
(DBMS.FIREBIRD, FIREBIRD_ALIASES, FirebirdMap, FirebirdConn),
117
(DBMS.MAXDB, MAXDB_ALIASES, MaxDBMap, MaxDBConn),
118
(DBMS.SYBASE, SYBASE_ALIASES, SybaseMap, SybaseConn),
119
(DBMS.DB2, DB2_ALIASES, DB2Map, DB2Conn),
120
(DBMS.HSQLDB, HSQLDB_ALIASES, HSQLDBMap, HSQLDBConn),
121
(DBMS.H2, H2_ALIASES, H2Map, H2Conn),
122
(DBMS.INFORMIX, INFORMIX_ALIASES, InformixMap, InformixConn),
123
(DBMS.MONETDB, MONETDB_ALIASES, MonetDBMap, MonetDBConn),
124
(DBMS.DERBY, DERBY_ALIASES, DerbyMap, DerbyConn),
125
(DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, VerticaConn),
126
(DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, MckoiConn),
127
(DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, PrestoConn),
128
(DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, AltibaseConn),
129
(DBMS.MIMERSQL, MIMERSQL_ALIASES, MimerSQLMap, MimerSQLConn),
130
(DBMS.CLICKHOUSE, CLICKHOUSE_ALIASES, ClickHouseMap, ClickHouseConn),
131
(DBMS.CRATEDB, CRATEDB_ALIASES, CrateDBMap, CrateDBConn),
132
(DBMS.CUBRID, CUBRID_ALIASES, CubridMap, CubridConn),
133
(DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn),
134
(DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, ExtremeDBConn),
135
(DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn),
136
(DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, RaimaConn),
137
(DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, VirtuosoConn),
138
]
139
140
_ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items)
141
if _:
142
items.remove(_)
143
items.insert(0, _)
144
145
for dbms, aliases, Handler, Connector in items:
146
if conf.forceDbms:
147
if conf.forceDbms.lower() not in aliases:
148
continue
149
else:
150
kb.dbms = conf.dbms = conf.forceDbms = dbms
151
152
if kb.dbmsFilter:
153
if dbms not in kb.dbmsFilter:
154
continue
155
156
handler = Handler()
157
conf.dbmsConnector = Connector()
158
159
if conf.direct:
160
exception = None
161
dialect = DBMS_DICT[dbms][3]
162
163
if dialect:
164
try:
165
sqlalchemy = SQLAlchemy(dialect=dialect)
166
sqlalchemy.connect()
167
168
if sqlalchemy.connector:
169
conf.dbmsConnector = sqlalchemy
170
except Exception as ex:
171
exception = ex
172
173
if not dialect or exception:
174
try:
175
conf.dbmsConnector.connect()
176
except NameError:
177
if exception:
178
raise exception
179
else:
180
msg = "support for direct connection to '%s' is not available. " % dbms
181
msg += "Please rerun with '--dependencies'"
182
raise SqlmapConnectionException(msg)
183
except:
184
if exception:
185
singleTimeWarnMessage(getSafeExString(exception))
186
raise
187
188
if conf.forceDbms == dbms or handler.checkDbms():
189
if kb.resolutionDbms:
190
conf.dbmsHandler = max(_ for _ in items if _[0] == kb.resolutionDbms)[2]()
191
conf.dbmsHandler._dbms = kb.resolutionDbms
192
else:
193
conf.dbmsHandler = handler
194
conf.dbmsHandler._dbms = dbms
195
196
break
197
else:
198
conf.dbmsConnector = None
199
200
# At this point back-end DBMS is correctly fingerprinted, no need
201
# to enforce it anymore
202
Backend.flushForcedDbms()
203
204