Skip to content

Commit 1b48ff2

Browse files
committed
Adding initial support for Informix (Issue sqlmapproject#552)
1 parent 640e605 commit 1b48ff2

File tree

17 files changed

+383
-7
lines changed

17 files changed

+383
-7
lines changed

lib/controller/handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from lib.core.settings import SYBASE_ALIASES
2323
from lib.core.settings import DB2_ALIASES
2424
from lib.core.settings import HSQLDB_ALIASES
25+
from lib.core.settings import INFORMIX_ALIASES
2526
from lib.utils.sqlalchemy import SQLAlchemy
2627

2728
from plugins.dbms.mssqlserver import MSSQLServerMap
@@ -46,6 +47,8 @@
4647
from plugins.dbms.db2.connector import Connector as DB2Conn
4748
from plugins.dbms.hsqldb import HSQLDBMap
4849
from plugins.dbms.hsqldb.connector import Connector as HSQLDBConn
50+
from plugins.dbms.informix import InformixMap
51+
from plugins.dbms.informix.connector import Connector as InformixConn
4952

5053
def setHandler():
5154
"""
@@ -65,6 +68,7 @@ def setHandler():
6568
(DBMS.SYBASE, SYBASE_ALIASES, SybaseMap, SybaseConn),
6669
(DBMS.DB2, DB2_ALIASES, DB2Map, DB2Conn),
6770
(DBMS.HSQLDB, HSQLDB_ALIASES, HSQLDBMap, HSQLDBConn),
71+
(DBMS.INFORMIX, INFORMIX_ALIASES, InformixMap, InformixConn),
6872
]
6973

7074
_ = max(_ if (Backend.getIdentifiedDbms() or "").lower() in _[1] else None for _ in items)

lib/core/agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ def getFields(self, query):
486486
@rtype: C{str}
487487
"""
488488

489-
prefixRegex = r"(?:\s+(?:FIRST|SKIP|LIMIT \d+)\s+\d+)*"
489+
prefixRegex = r"(?:\s+(?:FIRST|SKIP|LIMIT( \d+)?)\s+\d+)*"
490490
fieldsSelectTop = re.search(r"\ASELECT\s+TOP\s+[\d]+\s+(.+?)\s+FROM", query, re.I)
491491
fieldsSelectRownum = re.search(r"\ASELECT\s+([^()]+?),\s*ROWNUM AS LIMIT FROM", query, re.I)
492492
fieldsSelectDistinct = re.search(r"\ASELECT%s\s+DISTINCT\((.+?)\)\s+FROM" % prefixRegex, query, re.I)

lib/core/dicts.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from lib.core.settings import SYBASE_ALIASES
2222
from lib.core.settings import DB2_ALIASES
2323
from lib.core.settings import HSQLDB_ALIASES
24+
from lib.core.settings import INFORMIX_ALIASES
2425

2526
FIREBIRD_TYPES = {
2627
261: "BLOB",
@@ -146,8 +147,9 @@
146147
DBMS.FIREBIRD: (FIREBIRD_ALIASES, "python-kinterbasdb", "http://kinterbasdb.sourceforge.net/", "firebird"),
147148
DBMS.MAXDB: (MAXDB_ALIASES, None, None, "maxdb"),
148149
DBMS.SYBASE: (SYBASE_ALIASES, "python-pymssql", "http://pymssql.sourceforge.net/", "sybase"),
149-
DBMS.DB2: (DB2_ALIASES, "python ibm-db", "http://code.google.com/p/ibm-db/", "ibm_db_sa"),
150+
DBMS.DB2: (DB2_ALIASES, "python ibm-db", "https://github.com/ibmdb/python-ibmdb", "ibm_db_sa"),
150151
DBMS.HSQLDB: (HSQLDB_ALIASES, "python jaydebeapi & python-jpype", "https://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/", None),
152+
DBMS.INFORMIX: (INFORMIX_ALIASES, "python ibm-db", "https://github.com/ibmdb/python-ibmdb", "ibm_db_sa"),
151153
}
152154

153155
FROM_DUMMY_TABLE = {
@@ -156,7 +158,8 @@
156158
DBMS.FIREBIRD: " FROM RDB$DATABASE",
157159
DBMS.MAXDB: " FROM VERSIONS",
158160
DBMS.DB2: " FROM SYSIBM.SYSDUMMY1",
159-
DBMS.HSQLDB: " FROM INFORMATION_SCHEMA.SYSTEM_USERS"
161+
DBMS.HSQLDB: " FROM INFORMATION_SCHEMA.SYSTEM_USERS",
162+
DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL"
160163
}
161164

162165
SQL_STATEMENTS = {

lib/core/enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class DBMS:
3434
SQLITE = "SQLite"
3535
SYBASE = "Sybase"
3636
HSQLDB = "HSQLDB"
37+
INFORMIX = "Informix"
3738

3839
class DBMS_DIRECTORY_NAME:
3940
ACCESS = "access"
@@ -47,6 +48,7 @@ class DBMS_DIRECTORY_NAME:
4748
SQLITE = "sqlite"
4849
SYBASE = "sybase"
4950
HSQLDB = "hsqldb"
51+
INFORMIX = "informix"
5052

5153
class CUSTOM_LOGGING:
5254
PAYLOAD = 9

lib/core/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from lib.core.revision import getRevisionNumber
2020

2121
# sqlmap version (<major>.<minor>.<month>.<monthly commit>)
22-
VERSION = "1.0.9.22"
22+
VERSION = "1.0.9.23"
2323
REVISION = getRevisionNumber()
2424
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
2525
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}

lib/utils/deps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def checkDependencies():
4444
elif dbmsName == DBMS.HSQLDB:
4545
import jaydebeapi
4646
import jpype
47+
elif dbmsName == DBMS.INFORMIX:
48+
import ibm_db_dbi
4749
except ImportError:
4850
warnMsg = "sqlmap requires '%s' third-party library " % data[1]
4951
warnMsg += "in order to directly connect to the DBMS "

plugins/dbms/informix/__init__.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
5+
See the file 'doc/COPYING' for copying permission
6+
"""
7+
8+
from lib.core.enums import DBMS
9+
from lib.core.settings import INFORMIX_SYSTEM_DBS
10+
from lib.core.unescaper import unescaper
11+
12+
from plugins.dbms.informix.enumeration import Enumeration
13+
from plugins.dbms.informix.filesystem import Filesystem
14+
from plugins.dbms.informix.fingerprint import Fingerprint
15+
from plugins.dbms.informix.syntax import Syntax
16+
from plugins.dbms.informix.takeover import Takeover
17+
from plugins.generic.misc import Miscellaneous
18+
19+
class InformixMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover):
20+
"""
21+
This class defines Informix methods
22+
"""
23+
24+
def __init__(self):
25+
self.excludeDbsList = INFORMIX_SYSTEM_DBS
26+
27+
Syntax.__init__(self)
28+
Fingerprint.__init__(self)
29+
Enumeration.__init__(self)
30+
Filesystem.__init__(self)
31+
Miscellaneous.__init__(self)
32+
Takeover.__init__(self)
33+
34+
unescaper[DBMS.INFORMIX] = Syntax.escape

plugins/dbms/informix/connector.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
5+
See the file 'doc/COPYING' for copying permission
6+
"""
7+
8+
try:
9+
import ibm_db_dbi
10+
except ImportError:
11+
pass
12+
13+
import logging
14+
15+
from lib.core.data import conf
16+
from lib.core.data import logger
17+
from lib.core.exception import SqlmapConnectionException
18+
from plugins.generic.connector import Connector as GenericConnector
19+
20+
class Connector(GenericConnector):
21+
"""
22+
Homepage: http://code.google.com/p/ibm-db/
23+
User guide: http://code.google.com/p/ibm-db/wiki/README
24+
API: http://www.python.org/dev/peps/pep-0249/
25+
License: Apache License 2.0
26+
"""
27+
28+
def __init__(self):
29+
GenericConnector.__init__(self)
30+
31+
def connect(self):
32+
self.initConnection()
33+
34+
try:
35+
database = "DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;" % (self.db, self.hostname, self.port)
36+
self.connector = ibm_db_dbi.connect(database, self.user, self.password)
37+
except ibm_db_dbi.OperationalError, msg:
38+
raise SqlmapConnectionException(msg)
39+
40+
41+
self.initCursor()
42+
self.printConnected()
43+
44+
def fetchall(self):
45+
try:
46+
return self.cursor.fetchall()
47+
except ibm_db_dbi.ProgrammingError, msg:
48+
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg[1])
49+
return None
50+
51+
def execute(self, query):
52+
try:
53+
self.cursor.execute(query)
54+
except (ibm_db_dbi.OperationalError, ibm_db_dbi.ProgrammingError), msg:
55+
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg[1])
56+
except ibm_db_dbi.InternalError, msg:
57+
raise SqlmapConnectionException(msg[1])
58+
59+
self.connector.commit()
60+
61+
def select(self, query):
62+
self.execute(query)
63+
return self.fetchall()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
5+
See the file 'doc/COPYING' for copying permission
6+
"""
7+
8+
9+
from lib.core.data import logger
10+
from plugins.generic.enumeration import Enumeration as GenericEnumeration
11+
12+
class Enumeration(GenericEnumeration):
13+
def __init__(self):
14+
GenericEnumeration.__init__(self)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
5+
See the file 'doc/COPYING' for copying permission
6+
"""
7+
8+
from plugins.generic.filesystem import Filesystem as GenericFilesystem
9+
10+
class Filesystem(GenericFilesystem):
11+
def __init__(self):
12+
GenericFilesystem.__init__(self)

0 commit comments

Comments
 (0)