mirror of
				https://github.com/sqlmapproject/sqlmap.git
				synced 2025-10-31 16:07:55 +03:00 
			
		
		
		
	Adding support for Altibase
This commit is contained in:
		
							parent
							
								
									70df6d8b22
								
							
						
					
					
						commit
						d227413a14
					
				|  | @ -210,4 +210,9 @@ | ||||||
|         <error regexp="com\.simba\.presto\.jdbc"/> |         <error regexp="com\.simba\.presto\.jdbc"/> | ||||||
|         <error regexp="UNION query has different number of fields: \d+, \d+"/> |         <error regexp="UNION query has different number of fields: \d+, \d+"/> | ||||||
|     </dbms> |     </dbms> | ||||||
|  | 
 | ||||||
|  |     <!-- Altibase --> | ||||||
|  |     <dbms value="Altibase"> | ||||||
|  |         <error regexp="Altibase\.jdbc\.driver"/> | ||||||
|  |     </dbms> | ||||||
| </root> | </root> | ||||||
|  |  | ||||||
|  | @ -894,7 +894,6 @@ | ||||||
|         <substring query="SUBSTRING((%s),%d,%d)"/> |         <substring query="SUBSTRING((%s),%d,%d)"/> | ||||||
|         <concatenate query="CONCAT(%s,%s)"/> |         <concatenate query="CONCAT(%s,%s)"/> | ||||||
|         <case query="SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END)"/> |         <case query="SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END)"/> | ||||||
|         <hex/> |  | ||||||
|         <inference query="ASCII(SUBSTRING((%s),%d,1))>%d"/> |         <inference query="ASCII(SUBSTRING((%s),%d,1))>%d"/> | ||||||
|         <banner query="SELECT value FROM environment WHERE name='monet_version'"/> |         <banner query="SELECT value FROM environment WHERE name='monet_version'"/> | ||||||
|         <current_user query="CURRENT_USER"/> |         <current_user query="CURRENT_USER"/> | ||||||
|  | @ -1192,4 +1191,77 @@ | ||||||
|             <blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" query2="SELECT DISTINCT(table_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" count2="SELECT COUNT(DISTINCT(table_name)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" condition="column_name" condition2="table_schema" condition3="table_name"/> |             <blind query="SELECT DISTINCT(table_schema) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" query2="SELECT DISTINCT(table_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM INFORMATION_SCHEMA.COLUMNS WHERE %s" count2="SELECT COUNT(DISTINCT(table_name)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='%s'" condition="column_name" condition2="table_schema" condition3="table_name"/> | ||||||
|         </search_column> |         </search_column> | ||||||
|     </dbms> |     </dbms> | ||||||
|  | 
 | ||||||
|  |     <!-- Altibase --> | ||||||
|  |     <dbms value="Altibase"> | ||||||
|  |         <cast query="CAST(%s AS VARCHAR(4000))"/> | ||||||
|  |         <length query="LENGTH(%s)"/> | ||||||
|  |         <isnull query="NVL(%s,' ')"/> | ||||||
|  |         <delimiter query="||"/> | ||||||
|  |         <limit query="LIMIT %d,%d"/> | ||||||
|  |         <limitregexp query="\s+LIMIT\s+([\d]+)\s*\,\s*([\d]+)" query2="\s+LIMIT\s+([\d]+)"/> | ||||||
|  |         <limitgroupstart query="1"/> | ||||||
|  |         <limitgroupstop query="2"/> | ||||||
|  |         <limitstring query=" LIMIT "/> | ||||||
|  |         <order query="ORDER BY %s ASC"/> | ||||||
|  |         <count query="COUNT(%s)"/> | ||||||
|  |         <comment query="--" query2="/*"/> | ||||||
|  |         <substring query="SUBSTR((%s),%d,%d)"/> | ||||||
|  |         <concatenate query="%s||%s"/> | ||||||
|  |         <case query="SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END)"/> | ||||||
|  |         <hex query="HEX_ENCODE(%s)"/> | ||||||
|  |         <inference query="ASCII(SUBSTR((%s),%d,1))>%d"/> | ||||||
|  |         <banner query="SELECT PRODUCT_SIGNATURE FROM V$DATABASE"/> | ||||||
|  |         <current_user query="USER_NAME()"/> | ||||||
|  |         <current_db query="USER_NAME()"/> | ||||||
|  |         <hostname/> | ||||||
|  |         <table_comment query="SELECT COMMENTS FROM SYSTEM_.SYS_COMMENTS_ WHERE USER_NAME='%s' AND TABLE_NAME='%s'"/> | ||||||
|  |         <column_comment query="SELECT COMMENTS FROM SYSTEM_.SYS_COMMENTS_ WHERE USER_NAME='%s' AND TABLE_NAME='%s' AND COLUMN_NAME='%s'"/> | ||||||
|  |         <is_dba query="(SELECT COUNT(*) FROM SYSTEM_.DBA_USERS_ WHERE USER_NAME=USER_NAME())=1"/> | ||||||
|  |         <users> | ||||||
|  |             <inband query="SELECT USER_NAME FROM SYSTEM_.SYS_USERS_"/> | ||||||
|  |             <blind query="SELECT USER_NAME FROM SYSTEM_.SYS_USERS_ LIMIT %d,1" count="SELECT COUNT(USER_NAME) FROM SYSTEM_.SYS_USERS_"/> | ||||||
|  |         </users> | ||||||
|  |         <passwords> | ||||||
|  |             <inband query="SELECT USER_NAME,PASSWORD FROM SYSTEM_.SYS_USERS_" condition="USER_NAME"/> | ||||||
|  |             <blind query="SELECT PASSWORD FROM SYSTEM_.SYS_USERS_ WHERE USER_NAME='%s'" count="SELECT COUNT(PASSWORD) FROM SYSTEM_.SYS_USERS_ WHERE USER_NAME='%s'"/> | ||||||
|  |         </passwords> | ||||||
|  |         <privileges> | ||||||
|  |             <inband query="SELECT USER_NAME,PRIV_NAME FROM SYSTEM_.SYS_GRANT_OBJECT_ JOIN SYSTEM_.SYS_PRIVILEGES_ ON SYSTEM_.SYS_GRANT_OBJECT_.PRIV_ID=SYSTEM_.SYS_PRIVILEGES_.PRIV_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_GRANT_OBJECT_.GRANTEE_ID" condition="USER_NAME"/> | ||||||
|  |             <blind query="SELECT PRIV_NAME FROM SYSTEM_.SYS_GRANT_OBJECT_ JOIN SYSTEM_.SYS_PRIVILEGES_ ON SYSTEM_.SYS_GRANT_OBJECT_.PRIV_ID=SYSTEM_.SYS_PRIVILEGES_.PRIV_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_GRANT_OBJECT_.GRANTEE_ID WHERE USER_NAME='%d' LIMIT %d,1" count="SELECT COUNT(PRIV_NAME) FROM SYSTEM_.SYS_GRANT_OBJECT_ JOIN SYSTEM_.SYS_PRIVILEGES_ ON SYSTEM_.SYS_GRANT_OBJECT_.PRIV_ID=SYSTEM_.SYS_PRIVILEGES_.PRIV_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_GRANT_OBJECT_.GRANTEE_ID WHERE USER_NAME='%d'"/> | ||||||
|  |         </privileges> | ||||||
|  |         <roles> | ||||||
|  |             <inband query="SELECT GRANTEE.USER_NAME AS GRANTEE, USER_ROLE.USER_NAME AS GRANTED_ROLE FROM SYSTEM_.SYS_USER_ROLES_ JOIN SYSTEM_.SYS_USERS_ GRANTEE ON GRANTEE_ID=GRANTEE.USER_ID JOIN SYSTEM_.SYS_USERS_ USER_ROLE ON ROLE_ID=USER_ROLE.USER_ID" condition="GRANTEE"/> | ||||||
|  |             <blind query="SELECT USER_ROLE.USER_NAME AS GRANTED_ROLE FROM SYSTEM_.SYS_USER_ROLES_ JOIN SYSTEM_.SYS_USERS_ GRANTEE ON GRANTEE_ID=GRANTEE.USER_ID JOIN SYSTEM_.SYS_USERS_ USER_ROLE ON ROLE_ID=USER_ROLE.USER_ID WHERE GRANTEE.USER_NAME='%s' LIMIT %d,1" count="SELECT COUNT(*) FROM SYSTEM_.SYS_USER_ROLES_ JOIN SYSTEM_.SYS_USERS_ GRANTEE ON GRANTEE_ID=GRANTEE.USER_ID JOIN SYSTEM_.SYS_USERS_ USER_ROLE ON ROLE_ID=USER_ROLE.USER_ID WHERE GRANTEE.USER_NAME='%s'"/> | ||||||
|  |         </roles> | ||||||
|  |         <statements/> | ||||||
|  |         <dbs> | ||||||
|  |             <inband query="SELECT USER_NAME FROM SYSTEM_.SYS_USERS_"/> | ||||||
|  |             <blind query="SELECT USER_NAME FROM SYSTEM_.SYS_USERS_ LIMIT %d,1" count="SELECT COUNT(USER_NAME) FROM SYSTEM_.SYS_USERS_"/> | ||||||
|  |         </dbs> | ||||||
|  |         <tables> | ||||||
|  |             <inband query="SELECT USER_NAME,TABLE_NAME FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID" condition="USER_NAME"/> | ||||||
|  |             <blind query="SELECT TABLE_NAME FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s' LIMIT %d,1" count="SELECT COUNT(TABLE_NAME) FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s'"/> | ||||||
|  |         </tables> | ||||||
|  |         <columns> | ||||||
|  |             <inband query="SELECT COLUMN_NAME,DATA_TYPE FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE TABLE_NAME='%s' AND USER_NAME='%s'" condition="COLUMN_NAME"/> | ||||||
|  |             <blind query="SELECT COLUMN_NAME FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE TABLE_NAME='%s' AND USER_NAME='%s'" query2="SELECT DATA_TYPE FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE TABLE_NAME='%s' AND COLUMN_NAME='%s' AND USER_NAME='%s'" count="SELECT COUNT(COLUMN_NAME) FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE TABLE_NAME='%s' AND USER_NAME='%s'" condition="COLUMN_NAME"/> | ||||||
|  |         </columns> | ||||||
|  |         <dump_table> | ||||||
|  |             <inband query="SELECT %s FROM %s"/> | ||||||
|  |             <blind query="SELECT %s FROM %s LIMIT %d,1" count="SELECT COUNT(*) FROM %s"/> | ||||||
|  |         </dump_table> | ||||||
|  |         <search_db> | ||||||
|  |             <inband query="SELECT USER_NAME FROM SYSTEM_.SYS_USERS_ WHERE %s" condition="USER_NAME"/> | ||||||
|  |             <blind query="SELECT DISTINCT(USER_NAME) FROM SYSTEM_.SYS_USERS_ WHERE %s" count="SELECT COUNT(DISTINCT(USER_NAME)) FROM SYSTEM_.SYS_USERS_ WHERE %s" condition="USER_NAME"/> | ||||||
|  |         </search_db> | ||||||
|  |         <search_table> | ||||||
|  |             <inband query="SELECT USER_NAME,TABLE_NAME FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" condition="TABLE_NAME" condition2="USER_NAME"/> | ||||||
|  |             <blind query="SELECT DISTINCT(USER_NAME) FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" query2="SELECT DISTINCT(TABLE_NAME) FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s'" count="SELECT COUNT(DISTINCT(USER_NAME)) FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" count2="SELECT COUNT(DISTINCT(TABLE_NAME)) FROM SYSTEM_.SYS_TABLES_ JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s'" condition="TABLE_NAME" condition2="USER_NAME"/> | ||||||
|  |         </search_table> | ||||||
|  |         <search_column> | ||||||
|  |             <inband query="SELECT USER_NAME,TABLE_NAME FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" condition="COLUMN_NAME" condition2="USER_NAME" condition3="TABLE_NAME"/> | ||||||
|  |             <blind query="SELECT DISTINCT(USER_NAME) FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" query2="SELECT DISTINCT(TABLE_NAME) FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s'" count="SELECT COUNT(DISTINCT(USER_NAME)) FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE %s" count2="SELECT COUNT(DISTINCT(TABLE_NAME)) FROM SYSTEM_.SYS_COLUMNS_ JOIN SYSTEM_.SYS_TABLES_ ON SYSTEM_.SYS_COLUMNS_.TABLE_ID=SYSTEM_.SYS_TABLES_.TABLE_ID JOIN SYSTEM_.SYS_USERS_ ON SYSTEM_.SYS_USERS_.USER_ID=SYSTEM_.SYS_TABLES_.USER_ID WHERE USER_NAME='%s'" condition="COLUMN_NAME" condition2="USER_NAME" condition3="TABLE_NAME"/> | ||||||
|  |         </search_column> | ||||||
|  |     </dbms> | ||||||
| </root> | </root> | ||||||
|  |  | ||||||
|  | @ -54,6 +54,7 @@ from lib.core.datatype import AttribDict | ||||||
| from lib.core.datatype import InjectionDict | from lib.core.datatype import InjectionDict | ||||||
| from lib.core.decorators import stackedmethod | from lib.core.decorators import stackedmethod | ||||||
| from lib.core.dicts import FROM_DUMMY_TABLE | from lib.core.dicts import FROM_DUMMY_TABLE | ||||||
|  | from lib.core.dicts import HEURISTIC_NULL_EVAL | ||||||
| from lib.core.enums import DBMS | from lib.core.enums import DBMS | ||||||
| from lib.core.enums import HASHDB_KEYS | from lib.core.enums import HASHDB_KEYS | ||||||
| from lib.core.enums import HEURISTIC_TEST | from lib.core.enums import HEURISTIC_TEST | ||||||
|  | @ -888,7 +889,7 @@ def heuristicCheckDbms(injection): | ||||||
|             continue |             continue | ||||||
| 
 | 
 | ||||||
|         if checkBooleanExpression("(SELECT '%s'%s)=%s%s%s" % (randStr1, FROM_DUMMY_TABLE.get(dbms, ""), SINGLE_QUOTE_MARKER, randStr1, SINGLE_QUOTE_MARKER)): |         if checkBooleanExpression("(SELECT '%s'%s)=%s%s%s" % (randStr1, FROM_DUMMY_TABLE.get(dbms, ""), SINGLE_QUOTE_MARKER, randStr1, SINGLE_QUOTE_MARKER)): | ||||||
|             if not checkBooleanExpression("(SELECT '%s'%s)=%s%s%s" % (randStr1, FROM_DUMMY_TABLE.get(dbms, ""), SINGLE_QUOTE_MARKER, randStr2, SINGLE_QUOTE_MARKER)): |             if dbms in HEURISTIC_NULL_EVAL and checkBooleanExpression("(SELECT %s%s) IS NULL" % (HEURISTIC_NULL_EVAL[dbms], FROM_DUMMY_TABLE.get(dbms, ""))) or not checkBooleanExpression("(SELECT '%s'%s)=%s%s%s" % (randStr1, FROM_DUMMY_TABLE.get(dbms, ""), SINGLE_QUOTE_MARKER, randStr2, SINGLE_QUOTE_MARKER)): | ||||||
|                 retVal = dbms |                 retVal = dbms | ||||||
|                 break |                 break | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ from lib.core.dicts import DBMS_DICT | ||||||
| from lib.core.enums import DBMS | from lib.core.enums import DBMS | ||||||
| from lib.core.exception import SqlmapConnectionException | from lib.core.exception import SqlmapConnectionException | ||||||
| from lib.core.settings import ACCESS_ALIASES | from lib.core.settings import ACCESS_ALIASES | ||||||
|  | from lib.core.settings import ALTIBASE_ALIASES | ||||||
| from lib.core.settings import DB2_ALIASES | from lib.core.settings import DB2_ALIASES | ||||||
| from lib.core.settings import DERBY_ALIASES | from lib.core.settings import DERBY_ALIASES | ||||||
| from lib.core.settings import FIREBIRD_ALIASES | from lib.core.settings import FIREBIRD_ALIASES | ||||||
|  | @ -33,6 +34,8 @@ from lib.utils.sqlalchemy import SQLAlchemy | ||||||
| 
 | 
 | ||||||
| from plugins.dbms.access.connector import Connector as AccessConn | from plugins.dbms.access.connector import Connector as AccessConn | ||||||
| from plugins.dbms.access import AccessMap | from plugins.dbms.access import AccessMap | ||||||
|  | from plugins.dbms.altibase.connector import Connector as AltibaseConn | ||||||
|  | from plugins.dbms.altibase import AltibaseMap | ||||||
| from plugins.dbms.db2.connector import Connector as DB2Conn | from plugins.dbms.db2.connector import Connector as DB2Conn | ||||||
| from plugins.dbms.db2 import DB2Map | from plugins.dbms.db2 import DB2Map | ||||||
| from plugins.dbms.derby.connector import Connector as DerbyConn | from plugins.dbms.derby.connector import Connector as DerbyConn | ||||||
|  | @ -93,6 +96,7 @@ def setHandler(): | ||||||
|         (DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, VerticaConn), |         (DBMS.VERTICA, VERTICA_ALIASES, VerticaMap, VerticaConn), | ||||||
|         (DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, MckoiConn), |         (DBMS.MCKOI, MCKOI_ALIASES, MckoiMap, MckoiConn), | ||||||
|         (DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, PrestoConn), |         (DBMS.PRESTO, PRESTO_ALIASES, PrestoMap, PrestoConn), | ||||||
|  |         (DBMS.ALTIBASE, ALTIBASE_ALIASES, AltibaseMap, AltibaseConn), | ||||||
|     ] |     ] | ||||||
| 
 | 
 | ||||||
|     _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) |     _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) | ||||||
|  |  | ||||||
|  | @ -659,7 +659,7 @@ class Agent(object): | ||||||
|             elif fieldsNoSelect: |             elif fieldsNoSelect: | ||||||
|                 concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop) |                 concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop) | ||||||
| 
 | 
 | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO): |         elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE): | ||||||
|             if fieldsExists: |             if fieldsExists: | ||||||
|                 concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1) |                 concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1) | ||||||
|                 concatenatedQuery += "||'%s'" % kb.chars.stop |                 concatenatedQuery += "||'%s'" % kb.chars.stop | ||||||
|  | @ -948,10 +948,14 @@ class Agent(object): | ||||||
|         fromFrom = limitedQuery[fromIndex + 1:] |         fromFrom = limitedQuery[fromIndex + 1:] | ||||||
|         orderBy = None |         orderBy = None | ||||||
| 
 | 
 | ||||||
|         if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.SQLITE, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO): |         if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.SQLITE, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO,): | ||||||
|             limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) |             limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) | ||||||
|             limitedQuery += " %s" % limitStr |             limitedQuery += " %s" % limitStr | ||||||
| 
 | 
 | ||||||
|  |         elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE,): | ||||||
|  |             limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num + 1, 1) | ||||||
|  |             limitedQuery += " %s" % limitStr | ||||||
|  | 
 | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.DERBY,): |         elif Backend.getIdentifiedDbms() in (DBMS.DERBY,): | ||||||
|             limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) |             limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) | ||||||
|             limitedQuery += " %s" % limitStr |             limitedQuery += " %s" % limitStr | ||||||
|  |  | ||||||
|  | @ -4074,7 +4074,7 @@ def safeSQLIdentificatorNaming(name, isTable=False): | ||||||
|                 retVal = "`%s`" % retVal |                 retVal = "`%s`" % retVal | ||||||
|             elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO): |             elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO): | ||||||
|                 retVal = "\"%s\"" % retVal |                 retVal = "\"%s\"" % retVal | ||||||
|             elif Backend.getIdentifiedDbms() in (DBMS.ORACLE,): |             elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE): | ||||||
|                 retVal = "\"%s\"" % retVal.upper() |                 retVal = "\"%s\"" % retVal.upper() | ||||||
|             elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE): |             elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE): | ||||||
|                 if isTable: |                 if isTable: | ||||||
|  | @ -4110,9 +4110,9 @@ def unsafeSQLIdentificatorNaming(name): | ||||||
|     if isinstance(name, six.string_types): |     if isinstance(name, six.string_types): | ||||||
|         if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.SQLITE): |         if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.SQLITE): | ||||||
|             retVal = name.replace("`", "") |             retVal = name.replace("`", "") | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.INFORMIX, DBMS.HSQLDB, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO): |         elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO): | ||||||
|             retVal = name.replace("\"", "") |             retVal = name.replace("\"", "") | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.ORACLE,): |         elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE): | ||||||
|             retVal = name.replace("\"", "").upper() |             retVal = name.replace("\"", "").upper() | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE): |         elif Backend.getIdentifiedDbms() in (DBMS.MSSQL, DBMS.SYBASE): | ||||||
|             retVal = name.replace("[", "").replace("]", "") |             retVal = name.replace("[", "").replace("]", "") | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ from lib.core.enums import DBMS | ||||||
| from lib.core.enums import OS | from lib.core.enums import OS | ||||||
| from lib.core.enums import POST_HINT | from lib.core.enums import POST_HINT | ||||||
| from lib.core.settings import ACCESS_ALIASES | from lib.core.settings import ACCESS_ALIASES | ||||||
|  | from lib.core.settings import ALTIBASE_ALIASES | ||||||
| from lib.core.settings import BLANK | from lib.core.settings import BLANK | ||||||
| from lib.core.settings import DB2_ALIASES | from lib.core.settings import DB2_ALIASES | ||||||
| from lib.core.settings import DERBY_ALIASES | from lib.core.settings import DERBY_ALIASES | ||||||
|  | @ -208,6 +209,7 @@ DBMS_DICT = { | ||||||
|     DBMS.VERTICA: (VERTICA_ALIASES, "vertica-python", "https://github.com/vertica/vertica-python", "vertica+vertica_python"), |     DBMS.VERTICA: (VERTICA_ALIASES, "vertica-python", "https://github.com/vertica/vertica-python", "vertica+vertica_python"), | ||||||
|     DBMS.MCKOI: (MCKOI_ALIASES, None, None, None), |     DBMS.MCKOI: (MCKOI_ALIASES, None, None, None), | ||||||
|     DBMS.PRESTO: (PRESTO_ALIASES, "presto-python-client", "https://github.com/prestodb/presto-python-client", None), |     DBMS.PRESTO: (PRESTO_ALIASES, "presto-python-client", "https://github.com/prestodb/presto-python-client", None), | ||||||
|  |     DBMS.ALTIBASE: (ALTIBASE_ALIASES, None, None, None), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/ | # Reference: https://blog.jooq.org/tag/sysibm-sysdummy1/ | ||||||
|  | @ -219,7 +221,23 @@ FROM_DUMMY_TABLE = { | ||||||
|     DBMS.DB2: " FROM SYSIBM.SYSDUMMY1", |     DBMS.DB2: " FROM SYSIBM.SYSDUMMY1", | ||||||
|     DBMS.HSQLDB: " FROM INFORMATION_SCHEMA.SYSTEM_USERS", |     DBMS.HSQLDB: " FROM INFORMATION_SCHEMA.SYSTEM_USERS", | ||||||
|     DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL", |     DBMS.INFORMIX: " FROM SYSMASTER:SYSDUAL", | ||||||
|     DBMS.DERBY: " FROM SYSIBM.SYSDUMMY1" |     DBMS.DERBY: " FROM SYSIBM.SYSDUMMY1", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | HEURISTIC_NULL_EVAL = { | ||||||
|  |     DBMS.ACCESS: "CVAR(NULL)", | ||||||
|  |     DBMS.MAXDB: "ALPHA(NULL)", | ||||||
|  |     DBMS.MSSQL: "DIFFERENCE(NULL,NULL)", | ||||||
|  |     DBMS.MYSQL: "QUARTER(NULL)", | ||||||
|  |     DBMS.ORACLE: "INSTR2(NULL,NULL)", | ||||||
|  |     DBMS.PGSQL: "QUOTE_IDENT(NULL)", | ||||||
|  |     DBMS.SQLITE: "UNLIKELY(NULL)", | ||||||
|  |     DBMS.MONETDB: "CODE(NULL)", | ||||||
|  |     DBMS.DERBY: "NULLIF(USER,SESSION_USER)", | ||||||
|  |     DBMS.VERTICA: "BITSTRING_TO_BINARY(NULL)", | ||||||
|  |     DBMS.MCKOI: "TONUMBER(NULL)", | ||||||
|  |     DBMS.PRESTO: "FROM_HEX(NULL)", | ||||||
|  |     DBMS.ALTIBASE: "TDESENCRYPT(NULL,NULL)", | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| SQL_STATEMENTS = { | SQL_STATEMENTS = { | ||||||
|  |  | ||||||
|  | @ -168,6 +168,8 @@ class Dump(object): | ||||||
|             self.string("current database (no practical usage on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) |             self.string("current database (no practical usage on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) | ||||||
|         elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA): |         elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.VERTICA): | ||||||
|             self.string("current schema (equivalent to database on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) |             self.string("current schema (equivalent to database on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) | ||||||
|  |         elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE,): | ||||||
|  |             self.string("current user (equivalent to database on %s)" % Backend.getIdentifiedDbms(), data, content_type=CONTENT_TYPE.CURRENT_DB) | ||||||
|         else: |         else: | ||||||
|             self.string("current database", data, content_type=CONTENT_TYPE.CURRENT_DB) |             self.string("current database", data, content_type=CONTENT_TYPE.CURRENT_DB) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -42,14 +42,15 @@ class DBMS(object): | ||||||
|     PGSQL = "PostgreSQL" |     PGSQL = "PostgreSQL" | ||||||
|     SQLITE = "SQLite" |     SQLITE = "SQLite" | ||||||
|     SYBASE = "Sybase" |     SYBASE = "Sybase" | ||||||
|  |     INFORMIX = "Informix" | ||||||
|     HSQLDB = "HSQLDB" |     HSQLDB = "HSQLDB" | ||||||
|     H2 = "H2" |     H2 = "H2" | ||||||
|     INFORMIX = "Informix" |  | ||||||
|     MONETDB = "MonetDB" |     MONETDB = "MonetDB" | ||||||
|     DERBY = "Apache Derby" |     DERBY = "Apache Derby" | ||||||
|     VERTICA = "Vertica" |     VERTICA = "Vertica" | ||||||
|     MCKOI = "Mckoi" |     MCKOI = "Mckoi" | ||||||
|     PRESTO = "Presto" |     PRESTO = "Presto" | ||||||
|  |     ALTIBASE = "Altibase" | ||||||
| 
 | 
 | ||||||
| class DBMS_DIRECTORY_NAME(object): | class DBMS_DIRECTORY_NAME(object): | ||||||
|     ACCESS = "access" |     ACCESS = "access" | ||||||
|  | @ -70,6 +71,7 @@ class DBMS_DIRECTORY_NAME(object): | ||||||
|     VERTICA = "vertica" |     VERTICA = "vertica" | ||||||
|     MCKOI = "mckoi" |     MCKOI = "mckoi" | ||||||
|     PRESTO = "presto" |     PRESTO = "presto" | ||||||
|  |     ALTIBASE = "altibase" | ||||||
| 
 | 
 | ||||||
| class FORK(object): | class FORK(object): | ||||||
|     MARIADB = "MariaDB" |     MARIADB = "MariaDB" | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ from lib.core.enums import OS | ||||||
| from thirdparty.six import unichr as _unichr | from thirdparty.six import unichr as _unichr | ||||||
| 
 | 
 | ||||||
| # sqlmap version (<major>.<minor>.<month>.<monthly commit>) | # sqlmap version (<major>.<minor>.<month>.<monthly commit>) | ||||||
| VERSION = "1.4.1.56" | VERSION = "1.4.1.57" | ||||||
| TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" | TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" | ||||||
| TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} | TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} | ||||||
| VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) | VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) | ||||||
|  | @ -264,6 +264,7 @@ DERBY_SYSTEM_DBS = ("NULLID", "SQLJ", "SYS", "SYSCAT", "SYSCS_DIAG", "SYSCS_UTIL | ||||||
| VERTICA_SYSTEM_DBS = ("v_catalog", "v_internal", "v_monitor",) | VERTICA_SYSTEM_DBS = ("v_catalog", "v_internal", "v_monitor",) | ||||||
| MCKOI_SYSTEM_DBS = ("",) | MCKOI_SYSTEM_DBS = ("",) | ||||||
| PRESTO_SYSTEM_DBS = ("information_schema",) | PRESTO_SYSTEM_DBS = ("information_schema",) | ||||||
|  | ALTIBASE_SYSTEM_DBS = ("SYSTEM_",) | ||||||
| 
 | 
 | ||||||
| MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms") | MSSQL_ALIASES = ("microsoft sql server", "mssqlserver", "mssql", "ms") | ||||||
| MYSQL_ALIASES = ("mysql", "my") + ("mariadb", "maria", "memsql", "tidb") | MYSQL_ALIASES = ("mysql", "my") + ("mariadb", "maria", "memsql", "tidb") | ||||||
|  | @ -283,20 +284,22 @@ DERBY_ALIASES = ("derby", "apache derby",) | ||||||
| VERTICA_ALIASES = ("vertica",) | VERTICA_ALIASES = ("vertica",) | ||||||
| MCKOI_ALIASES = ("mckoi",) | MCKOI_ALIASES = ("mckoi",) | ||||||
| PRESTO_ALIASES = ("presto",) | PRESTO_ALIASES = ("presto",) | ||||||
| 
 | ALTIBASE_ALIASES = ("altibase",) | ||||||
| UPPER_CASE_IDENTIFIERS = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.MAXDB, DBMS.H2, DBMS.DERBY)) |  | ||||||
| 
 | 
 | ||||||
| DBMS_DIRECTORY_DICT = dict((getattr(DBMS, _), getattr(DBMS_DIRECTORY_NAME, _)) for _ in dir(DBMS) if not _.startswith("_")) | DBMS_DIRECTORY_DICT = dict((getattr(DBMS, _), getattr(DBMS_DIRECTORY_NAME, _)) for _ in dir(DBMS) if not _.startswith("_")) | ||||||
| 
 | 
 | ||||||
| SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES | SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES + SQLITE_ALIASES + ACCESS_ALIASES + FIREBIRD_ALIASES + MAXDB_ALIASES + SYBASE_ALIASES + DB2_ALIASES + HSQLDB_ALIASES + H2_ALIASES + INFORMIX_ALIASES + MONETDB_ALIASES + DERBY_ALIASES + VERTICA_ALIASES + MCKOI_ALIASES + PRESTO_ALIASES + ALTIBASE_ALIASES | ||||||
| SUPPORTED_OS = ("linux", "windows") | SUPPORTED_OS = ("linux", "windows") | ||||||
| 
 | 
 | ||||||
| DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES)) | DBMS_ALIASES = ((DBMS.MSSQL, MSSQL_ALIASES), (DBMS.MYSQL, MYSQL_ALIASES), (DBMS.PGSQL, PGSQL_ALIASES), (DBMS.ORACLE, ORACLE_ALIASES), (DBMS.SQLITE, SQLITE_ALIASES), (DBMS.ACCESS, ACCESS_ALIASES), (DBMS.FIREBIRD, FIREBIRD_ALIASES), (DBMS.MAXDB, MAXDB_ALIASES), (DBMS.SYBASE, SYBASE_ALIASES), (DBMS.DB2, DB2_ALIASES), (DBMS.HSQLDB, HSQLDB_ALIASES), (DBMS.H2, H2_ALIASES), (DBMS.INFORMIX, INFORMIX_ALIASES), (DBMS.MONETDB, MONETDB_ALIASES), (DBMS.DERBY, DERBY_ALIASES), (DBMS.VERTICA, VERTICA_ALIASES), (DBMS.MCKOI, MCKOI_ALIASES), (DBMS.PRESTO, PRESTO_ALIASES), (DBMS.ALTIBASE, ALTIBASE_ALIASES)) | ||||||
| 
 | 
 | ||||||
| USER_AGENT_ALIASES = ("ua", "useragent", "user-agent") | USER_AGENT_ALIASES = ("ua", "useragent", "user-agent") | ||||||
| REFERER_ALIASES = ("ref", "referer", "referrer") | REFERER_ALIASES = ("ref", "referer", "referrer") | ||||||
| HOST_ALIASES = ("host",) | HOST_ALIASES = ("host",) | ||||||
| 
 | 
 | ||||||
|  | # DBMSes with upper case identifiers | ||||||
|  | UPPER_CASE_DBMSES = set((DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.MAXDB, DBMS.H2, DBMS.DERBY, DBMS.ALTIBASE)) | ||||||
|  | 
 | ||||||
| # Default schemas to use (when unable to enumerate) | # Default schemas to use (when unable to enumerate) | ||||||
| H2_DEFAULT_SCHEMA = HSQLDB_DEFAULT_SCHEMA = "PUBLIC" | H2_DEFAULT_SCHEMA = HSQLDB_DEFAULT_SCHEMA = "PUBLIC" | ||||||
| VERTICA_DEFAULT_SCHEMA = "public" | VERTICA_DEFAULT_SCHEMA = "public" | ||||||
|  |  | ||||||
|  | @ -41,7 +41,7 @@ from lib.core.exception import SqlmapNoneDataException | ||||||
| from lib.core.settings import BRUTE_COLUMN_EXISTS_TEMPLATE | from lib.core.settings import BRUTE_COLUMN_EXISTS_TEMPLATE | ||||||
| from lib.core.settings import BRUTE_TABLE_EXISTS_TEMPLATE | from lib.core.settings import BRUTE_TABLE_EXISTS_TEMPLATE | ||||||
| from lib.core.settings import METADB_SUFFIX | from lib.core.settings import METADB_SUFFIX | ||||||
| from lib.core.settings import UPPER_CASE_IDENTIFIERS | from lib.core.settings import UPPER_CASE_DBMSES | ||||||
| from lib.core.threads import getCurrentThreadData | from lib.core.threads import getCurrentThreadData | ||||||
| from lib.core.threads import runThreads | from lib.core.threads import runThreads | ||||||
| from lib.request import inject | from lib.request import inject | ||||||
|  | @ -84,7 +84,7 @@ def tableExists(tableFile, regex=None): | ||||||
| 
 | 
 | ||||||
|     pushValue(conf.db) |     pushValue(conf.db) | ||||||
| 
 | 
 | ||||||
|     if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |     if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|         conf.db = conf.db.upper() |         conf.db = conf.db.upper() | ||||||
| 
 | 
 | ||||||
|     message = "which common tables (wordlist) file do you want to use?\n" |     message = "which common tables (wordlist) file do you want to use?\n" | ||||||
|  | @ -202,7 +202,7 @@ def columnExists(columnFile, regex=None): | ||||||
|         errMsg = "missing table parameter" |         errMsg = "missing table parameter" | ||||||
|         raise SqlmapMissingMandatoryOptionException(errMsg) |         raise SqlmapMissingMandatoryOptionException(errMsg) | ||||||
| 
 | 
 | ||||||
|     if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |     if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|         conf.db = conf.db.upper() |         conf.db = conf.db.upper() | ||||||
| 
 | 
 | ||||||
|     result = inject.checkBooleanExpression(safeStringFormat(BRUTE_COLUMN_EXISTS_TEMPLATE, (randomStr(), randomStr()))) |     result = inject.checkBooleanExpression(safeStringFormat(BRUTE_COLUMN_EXISTS_TEMPLATE, (randomStr(), randomStr()))) | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								plugins/dbms/altibase/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								plugins/dbms/altibase/__init__.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.enums import DBMS | ||||||
|  | from lib.core.settings import ALTIBASE_SYSTEM_DBS | ||||||
|  | from lib.core.unescaper import unescaper | ||||||
|  | 
 | ||||||
|  | from plugins.dbms.altibase.enumeration import Enumeration | ||||||
|  | from plugins.dbms.altibase.filesystem import Filesystem | ||||||
|  | from plugins.dbms.altibase.fingerprint import Fingerprint | ||||||
|  | from plugins.dbms.altibase.syntax import Syntax | ||||||
|  | from plugins.dbms.altibase.takeover import Takeover | ||||||
|  | from plugins.generic.misc import Miscellaneous | ||||||
|  | 
 | ||||||
|  | class AltibaseMap(Syntax, Fingerprint, Enumeration, Filesystem, Miscellaneous, Takeover): | ||||||
|  |     """ | ||||||
|  |     This class defines Altibase methods | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self): | ||||||
|  |         self.excludeDbsList = ALTIBASE_SYSTEM_DBS | ||||||
|  | 
 | ||||||
|  |         for cls in self.__class__.__bases__: | ||||||
|  |             cls.__init__(self) | ||||||
|  | 
 | ||||||
|  |     unescaper[DBMS.ALTIBASE] = Syntax.escape | ||||||
							
								
								
									
										15
									
								
								plugins/dbms/altibase/connector.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								plugins/dbms/altibase/connector.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.exception import SqlmapUnsupportedFeatureException | ||||||
|  | from plugins.generic.connector import Connector as GenericConnector | ||||||
|  | 
 | ||||||
|  | class Connector(GenericConnector): | ||||||
|  |     def connect(self): | ||||||
|  |         errMsg = "on Altibase it is not (currently) possible to establish a " | ||||||
|  |         errMsg += "direct connection" | ||||||
|  |         raise SqlmapUnsupportedFeatureException(errMsg) | ||||||
							
								
								
									
										20
									
								
								plugins/dbms/altibase/enumeration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								plugins/dbms/altibase/enumeration.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.data import logger | ||||||
|  | from plugins.generic.enumeration import Enumeration as GenericEnumeration | ||||||
|  | 
 | ||||||
|  | class Enumeration(GenericEnumeration): | ||||||
|  |     def getStatements(self): | ||||||
|  |         warnMsg = "on Altibase it is not possible to enumerate the SQL statements" | ||||||
|  |         logger.warn(warnMsg) | ||||||
|  | 
 | ||||||
|  |         return [] | ||||||
|  | 
 | ||||||
|  |     def getHostname(self): | ||||||
|  |         warnMsg = "on Altibase it is not possible to enumerate the hostname" | ||||||
|  |         logger.warn(warnMsg) | ||||||
							
								
								
									
										11
									
								
								plugins/dbms/altibase/filesystem.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								plugins/dbms/altibase/filesystem.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from plugins.generic.filesystem import Filesystem as GenericFilesystem | ||||||
|  | 
 | ||||||
|  | class Filesystem(GenericFilesystem): | ||||||
|  |     pass | ||||||
							
								
								
									
										95
									
								
								plugins/dbms/altibase/fingerprint.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								plugins/dbms/altibase/fingerprint.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,95 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.common import Backend | ||||||
|  | from lib.core.common import Format | ||||||
|  | from lib.core.data import conf | ||||||
|  | from lib.core.data import kb | ||||||
|  | from lib.core.data import logger | ||||||
|  | from lib.core.enums import DBMS | ||||||
|  | from lib.core.session import setDbms | ||||||
|  | from lib.core.settings import ALTIBASE_ALIASES | ||||||
|  | from lib.request import inject | ||||||
|  | from plugins.generic.fingerprint import Fingerprint as GenericFingerprint | ||||||
|  | 
 | ||||||
|  | class Fingerprint(GenericFingerprint): | ||||||
|  |     def __init__(self): | ||||||
|  |         GenericFingerprint.__init__(self, DBMS.ALTIBASE) | ||||||
|  | 
 | ||||||
|  |     def getFingerprint(self): | ||||||
|  |         value = "" | ||||||
|  |         wsOsFp = Format.getOs("web server", kb.headersFp) | ||||||
|  | 
 | ||||||
|  |         if wsOsFp: | ||||||
|  |             value += "%s\n" % wsOsFp | ||||||
|  | 
 | ||||||
|  |         if kb.data.banner: | ||||||
|  |             dbmsOsFp = Format.getOs("back-end DBMS", kb.bannerFp) | ||||||
|  | 
 | ||||||
|  |             if dbmsOsFp: | ||||||
|  |                 value += "%s\n" % dbmsOsFp | ||||||
|  | 
 | ||||||
|  |         value += "back-end DBMS: " | ||||||
|  | 
 | ||||||
|  |         if not conf.extensiveFp: | ||||||
|  |             value += DBMS.ALTIBASE | ||||||
|  |             return value | ||||||
|  | 
 | ||||||
|  |         actVer = Format.getDbms() | ||||||
|  |         blank = " " * 15 | ||||||
|  |         value += "active fingerprint: %s" % actVer | ||||||
|  | 
 | ||||||
|  |         if kb.bannerFp: | ||||||
|  |             banVer = kb.bannerFp.get("dbmsVersion") | ||||||
|  | 
 | ||||||
|  |             if banVer: | ||||||
|  |                 banVer = Format.getDbms([banVer]) | ||||||
|  |                 value += "\n%sbanner parsing fingerprint: %s" % (blank, banVer) | ||||||
|  | 
 | ||||||
|  |         htmlErrorFp = Format.getErrorParsedDBMSes() | ||||||
|  | 
 | ||||||
|  |         if htmlErrorFp: | ||||||
|  |             value += "\n%shtml error message fingerprint: %s" % (blank, htmlErrorFp) | ||||||
|  | 
 | ||||||
|  |         return value | ||||||
|  | 
 | ||||||
|  |     def checkDbms(self): | ||||||
|  |         if not conf.extensiveFp and Backend.isDbmsWithin(ALTIBASE_ALIASES): | ||||||
|  |             setDbms(DBMS.ALTIBASE) | ||||||
|  | 
 | ||||||
|  |             self.getBanner() | ||||||
|  | 
 | ||||||
|  |             return True | ||||||
|  | 
 | ||||||
|  |         infoMsg = "testing %s" % DBMS.ALTIBASE | ||||||
|  |         logger.info(infoMsg) | ||||||
|  | 
 | ||||||
|  |         # Reference: http://support.altibase.com/fileDownload.do?gubun=admin&no=228 | ||||||
|  |         result = inject.checkBooleanExpression("CHOSUNG(NULL) IS NULL") | ||||||
|  | 
 | ||||||
|  |         if result: | ||||||
|  |             infoMsg = "confirming %s" % DBMS.ALTIBASE | ||||||
|  |             logger.info(infoMsg) | ||||||
|  | 
 | ||||||
|  |             result = inject.checkBooleanExpression("TDESENCRYPT(NULL,NULL) IS NULL") | ||||||
|  | 
 | ||||||
|  |             if not result: | ||||||
|  |                 warnMsg = "the back-end DBMS is not %s" % DBMS.ALTIBASE | ||||||
|  |                 logger.warn(warnMsg) | ||||||
|  | 
 | ||||||
|  |                 return False | ||||||
|  | 
 | ||||||
|  |             setDbms(DBMS.ALTIBASE) | ||||||
|  | 
 | ||||||
|  |             self.getBanner() | ||||||
|  | 
 | ||||||
|  |             return True | ||||||
|  |         else: | ||||||
|  |             warnMsg = "the back-end DBMS is not %s" % DBMS.ALTIBASE | ||||||
|  |             logger.warn(warnMsg) | ||||||
|  | 
 | ||||||
|  |             return False | ||||||
							
								
								
									
										22
									
								
								plugins/dbms/altibase/syntax.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								plugins/dbms/altibase/syntax.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.convert import getOrds | ||||||
|  | from plugins.generic.syntax import Syntax as GenericSyntax | ||||||
|  | 
 | ||||||
|  | class Syntax(GenericSyntax): | ||||||
|  |     @staticmethod | ||||||
|  |     def escape(expression, quote=True): | ||||||
|  |         """ | ||||||
|  |         >>> Syntax.escape("SELECT 'abcdefgh' FROM foobar") == "SELECT CHR(97)||CHR(98)||CHR(99)||CHR(100)||CHR(101)||CHR(102)||CHR(103)||CHR(104) FROM foobar" | ||||||
|  |         True | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         def escaper(value): | ||||||
|  |             return "||".join("CHR(%d)" % _ for _ in getOrds(value)) | ||||||
|  | 
 | ||||||
|  |         return Syntax._escape(expression, quote, escaper) | ||||||
							
								
								
									
										28
									
								
								plugins/dbms/altibase/takeover.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								plugins/dbms/altibase/takeover.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) | ||||||
|  | See the file 'LICENSE' for copying permission | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from lib.core.exception import SqlmapUnsupportedFeatureException | ||||||
|  | from plugins.generic.takeover import Takeover as GenericTakeover | ||||||
|  | 
 | ||||||
|  | class Takeover(GenericTakeover): | ||||||
|  |     def osCmd(self): | ||||||
|  |         errMsg = "on Altibase it is not possible to execute commands" | ||||||
|  |         raise SqlmapUnsupportedFeatureException(errMsg) | ||||||
|  | 
 | ||||||
|  |     def osShell(self): | ||||||
|  |         errMsg = "on Altibase it is not possible to execute commands" | ||||||
|  |         raise SqlmapUnsupportedFeatureException(errMsg) | ||||||
|  | 
 | ||||||
|  |     def osPwn(self): | ||||||
|  |         errMsg = "on Altibase it is not possible to establish an " | ||||||
|  |         errMsg += "out-of-band connection" | ||||||
|  |         raise SqlmapUnsupportedFeatureException(errMsg) | ||||||
|  | 
 | ||||||
|  |     def osSmb(self): | ||||||
|  |         errMsg = "on Altibase it is not possible to establish an " | ||||||
|  |         errMsg += "out-of-band connection" | ||||||
|  |         raise SqlmapUnsupportedFeatureException(errMsg) | ||||||
|  | @ -48,7 +48,7 @@ from lib.core.exception import SqlmapNoneDataException | ||||||
| from lib.core.exception import SqlmapUserQuitException | from lib.core.exception import SqlmapUserQuitException | ||||||
| from lib.core.settings import CURRENT_DB | from lib.core.settings import CURRENT_DB | ||||||
| from lib.core.settings import REFLECTED_VALUE_MARKER | from lib.core.settings import REFLECTED_VALUE_MARKER | ||||||
| from lib.core.settings import UPPER_CASE_IDENTIFIERS | from lib.core.settings import UPPER_CASE_DBMSES | ||||||
| from lib.core.settings import VERTICA_DEFAULT_SCHEMA | from lib.core.settings import VERTICA_DEFAULT_SCHEMA | ||||||
| from lib.request import inject | from lib.request import inject | ||||||
| from lib.techniques.union.use import unionUse | from lib.techniques.union.use import unionUse | ||||||
|  | @ -87,6 +87,11 @@ class Databases(object): | ||||||
|             warnMsg += "schema names for enumeration as the counterpart to database " |             warnMsg += "schema names for enumeration as the counterpart to database " | ||||||
|             warnMsg += "names on other DBMSes" |             warnMsg += "names on other DBMSes" | ||||||
|             singleTimeWarnMessage(warnMsg) |             singleTimeWarnMessage(warnMsg) | ||||||
|  |         elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE,): | ||||||
|  |             warnMsg = "on %s you'll need to use " % Backend.getIdentifiedDbms() | ||||||
|  |             warnMsg += "user names for enumeration as the counterpart to database " | ||||||
|  |             warnMsg += "names on other DBMSes" | ||||||
|  |             singleTimeWarnMessage(warnMsg) | ||||||
| 
 | 
 | ||||||
|         return kb.data.currentDb |         return kb.data.currentDb | ||||||
| 
 | 
 | ||||||
|  | @ -110,6 +115,14 @@ class Databases(object): | ||||||
| 
 | 
 | ||||||
|             infoMsg = "fetching database (schema) names" |             infoMsg = "fetching database (schema) names" | ||||||
| 
 | 
 | ||||||
|  |         elif Backend.getIdentifiedDbms() in (DBMS.ALTIBASE,): | ||||||
|  |             warnMsg = "user names are going to be used on %s " % Backend.getIdentifiedDbms() | ||||||
|  |             warnMsg += "for enumeration as the counterpart to database " | ||||||
|  |             warnMsg += "names on other DBMSes" | ||||||
|  |             logger.warn(warnMsg) | ||||||
|  | 
 | ||||||
|  |             infoMsg = "fetching database (user) names" | ||||||
|  | 
 | ||||||
|         else: |         else: | ||||||
|             infoMsg = "fetching database names" |             infoMsg = "fetching database names" | ||||||
| 
 | 
 | ||||||
|  | @ -142,7 +155,7 @@ class Databases(object): | ||||||
|                 errMsg = "unable to retrieve the number of databases" |                 errMsg = "unable to retrieve the number of databases" | ||||||
|                 logger.error(errMsg) |                 logger.error(errMsg) | ||||||
|             else: |             else: | ||||||
|                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|                 indexRange = getLimitRange(count, plusOne=plusOne) |                 indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|                 for index in indexRange: |                 for index in indexRange: | ||||||
|  | @ -229,7 +242,7 @@ class Databases(object): | ||||||
|         if conf.db == CURRENT_DB: |         if conf.db == CURRENT_DB: | ||||||
|             conf.db = self.getCurrentDb() |             conf.db = self.getCurrentDb() | ||||||
| 
 | 
 | ||||||
|         if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |         if conf.db and Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|             conf.db = conf.db.upper() |             conf.db = conf.db.upper() | ||||||
| 
 | 
 | ||||||
|         if conf.db: |         if conf.db: | ||||||
|  | @ -316,7 +329,7 @@ class Databases(object): | ||||||
|                         if conf.getComments: |                         if conf.getComments: | ||||||
|                             _ = queries[Backend.getIdentifiedDbms()].table_comment |                             _ = queries[Backend.getIdentifiedDbms()].table_comment | ||||||
|                             if hasattr(_, "query"): |                             if hasattr(_, "query"): | ||||||
|                                 if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                                 if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(db.upper()), unsafeSQLIdentificatorNaming(table.upper())) |                                     query = _.query % (unsafeSQLIdentificatorNaming(db.upper()), unsafeSQLIdentificatorNaming(table.upper())) | ||||||
|                                 else: |                                 else: | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(db), unsafeSQLIdentificatorNaming(table)) |                                     query = _.query % (unsafeSQLIdentificatorNaming(db), unsafeSQLIdentificatorNaming(table)) | ||||||
|  | @ -373,7 +386,7 @@ class Databases(object): | ||||||
| 
 | 
 | ||||||
|                 tables = [] |                 tables = [] | ||||||
| 
 | 
 | ||||||
|                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|                 indexRange = getLimitRange(count, plusOne=plusOne) |                 indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|                 for index in indexRange: |                 for index in indexRange: | ||||||
|  | @ -398,7 +411,7 @@ class Databases(object): | ||||||
|                         if conf.getComments: |                         if conf.getComments: | ||||||
|                             _ = queries[Backend.getIdentifiedDbms()].table_comment |                             _ = queries[Backend.getIdentifiedDbms()].table_comment | ||||||
|                             if hasattr(_, "query"): |                             if hasattr(_, "query"): | ||||||
|                                 if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                                 if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(db.upper()), unsafeSQLIdentificatorNaming(table.upper())) |                                     query = _.query % (unsafeSQLIdentificatorNaming(db.upper()), unsafeSQLIdentificatorNaming(table.upper())) | ||||||
|                                 else: |                                 else: | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(db), unsafeSQLIdentificatorNaming(table)) |                                     query = _.query % (unsafeSQLIdentificatorNaming(db), unsafeSQLIdentificatorNaming(table)) | ||||||
|  | @ -458,7 +471,7 @@ class Databases(object): | ||||||
|                 raise SqlmapNoneDataException(errMsg) |                 raise SqlmapNoneDataException(errMsg) | ||||||
| 
 | 
 | ||||||
|         elif conf.db is not None: |         elif conf.db is not None: | ||||||
|             if Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 conf.db = conf.db.upper() |                 conf.db = conf.db.upper() | ||||||
| 
 | 
 | ||||||
|             if ',' in conf.db: |             if ',' in conf.db: | ||||||
|  | @ -469,7 +482,7 @@ class Databases(object): | ||||||
|         conf.db = safeSQLIdentificatorNaming(conf.db) |         conf.db = safeSQLIdentificatorNaming(conf.db) | ||||||
| 
 | 
 | ||||||
|         if conf.col: |         if conf.col: | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 conf.col = conf.col.upper() |                 conf.col = conf.col.upper() | ||||||
| 
 | 
 | ||||||
|             colList = conf.col.split(',') |             colList = conf.col.split(',') | ||||||
|  | @ -485,7 +498,7 @@ class Databases(object): | ||||||
|         colList = [_ for _ in colList if _] |         colList = [_ for _ in colList if _] | ||||||
| 
 | 
 | ||||||
|         if conf.tbl: |         if conf.tbl: | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 conf.tbl = conf.tbl.upper() |                 conf.tbl = conf.tbl.upper() | ||||||
| 
 | 
 | ||||||
|             tblList = conf.tbl.split(',') |             tblList = conf.tbl.split(',') | ||||||
|  | @ -593,7 +606,7 @@ class Databases(object): | ||||||
|                     query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) |                     query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) | ||||||
|                     query += condQuery |                     query += condQuery | ||||||
| 
 | 
 | ||||||
|                 elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                 elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                     query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) |                     query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) | ||||||
|                     query += condQuery |                     query += condQuery | ||||||
| 
 | 
 | ||||||
|  | @ -669,7 +682,7 @@ class Databases(object): | ||||||
|                                 if conf.getComments: |                                 if conf.getComments: | ||||||
|                                     _ = queries[Backend.getIdentifiedDbms()].column_comment |                                     _ = queries[Backend.getIdentifiedDbms()].column_comment | ||||||
|                                     if hasattr(_, "query"): |                                     if hasattr(_, "query"): | ||||||
|                                         if Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |                                         if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                                             query = _.query % (unsafeSQLIdentificatorNaming(conf.db.upper()), unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(name.upper())) |                                             query = _.query % (unsafeSQLIdentificatorNaming(conf.db.upper()), unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(name.upper())) | ||||||
|                                         else: |                                         else: | ||||||
|                                             query = _.query % (unsafeSQLIdentificatorNaming(conf.db), unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(name)) |                                             query = _.query % (unsafeSQLIdentificatorNaming(conf.db), unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(name)) | ||||||
|  | @ -735,7 +748,7 @@ class Databases(object): | ||||||
|                     query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) |                     query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db)) | ||||||
|                     query += condQuery |                     query += condQuery | ||||||
| 
 | 
 | ||||||
|                 elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                 elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                     query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) |                     query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) | ||||||
|                     query += condQuery |                     query += condQuery | ||||||
| 
 | 
 | ||||||
|  | @ -809,7 +822,7 @@ class Databases(object): | ||||||
|                     elif Backend.isDbms(DBMS.MONETDB): |                     elif Backend.isDbms(DBMS.MONETDB): | ||||||
|                         query = safeStringFormat(rootQuery.blind.query, (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db), index)) |                         query = safeStringFormat(rootQuery.blind.query, (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db), index)) | ||||||
|                         field = None |                         field = None | ||||||
|                     elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                     elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                         query = rootQuery.blind.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) |                         query = rootQuery.blind.query % (unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(conf.db.upper())) | ||||||
|                         query += condQuery |                         query += condQuery | ||||||
|                         field = None |                         field = None | ||||||
|  | @ -833,7 +846,7 @@ class Databases(object): | ||||||
|                         if conf.getComments: |                         if conf.getComments: | ||||||
|                             _ = queries[Backend.getIdentifiedDbms()].column_comment |                             _ = queries[Backend.getIdentifiedDbms()].column_comment | ||||||
|                             if hasattr(_, "query"): |                             if hasattr(_, "query"): | ||||||
|                                 if Backend.getIdentifiedDbms() in UPPER_CASE_IDENTIFIERS: |                                 if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(conf.db.upper()), unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(column.upper())) |                                     query = _.query % (unsafeSQLIdentificatorNaming(conf.db.upper()), unsafeSQLIdentificatorNaming(tbl.upper()), unsafeSQLIdentificatorNaming(column.upper())) | ||||||
|                                 else: |                                 else: | ||||||
|                                     query = _.query % (unsafeSQLIdentificatorNaming(conf.db), unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(column)) |                                     query = _.query % (unsafeSQLIdentificatorNaming(conf.db), unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(column)) | ||||||
|  | @ -850,7 +863,7 @@ class Databases(object): | ||||||
|                         if not onlyColNames: |                         if not onlyColNames: | ||||||
|                             if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO): |                             if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO): | ||||||
|                                 query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl), column, unsafeSQLIdentificatorNaming(conf.db)) |                                 query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl), column, unsafeSQLIdentificatorNaming(conf.db)) | ||||||
|                             elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                             elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                                 query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl.upper()), column, unsafeSQLIdentificatorNaming(conf.db.upper())) |                                 query = rootQuery.blind.query2 % (unsafeSQLIdentificatorNaming(tbl.upper()), column, unsafeSQLIdentificatorNaming(conf.db.upper())) | ||||||
|                             elif Backend.isDbms(DBMS.MSSQL): |                             elif Backend.isDbms(DBMS.MSSQL): | ||||||
|                                 query = rootQuery.blind.query2 % (conf.db, conf.db, conf.db, conf.db, column, conf.db, conf.db, conf.db, unsafeSQLIdentificatorNaming(tbl).split(".")[-1]) |                                 query = rootQuery.blind.query2 % (conf.db, conf.db, conf.db, conf.db, column, conf.db, conf.db, conf.db, unsafeSQLIdentificatorNaming(tbl).split(".")[-1]) | ||||||
|  | @ -935,7 +948,7 @@ class Databases(object): | ||||||
|         if not db or not table: |         if not db or not table: | ||||||
|             return None |             return None | ||||||
| 
 | 
 | ||||||
|         if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2): |         if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|             db = db.upper() |             db = db.upper() | ||||||
|             table = table.upper() |             table = table.upper() | ||||||
| 
 | 
 | ||||||
|  | @ -1027,7 +1040,7 @@ class Databases(object): | ||||||
|                 errMsg = "unable to retrieve the number of statements" |                 errMsg = "unable to retrieve the number of statements" | ||||||
|                 raise SqlmapNoneDataException(errMsg) |                 raise SqlmapNoneDataException(errMsg) | ||||||
| 
 | 
 | ||||||
|             plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |             plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|             indexRange = getLimitRange(count, plusOne=plusOne) |             indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|             for index in indexRange: |             for index in indexRange: | ||||||
|  |  | ||||||
|  | @ -43,6 +43,7 @@ from lib.core.exception import SqlmapUnsupportedFeatureException | ||||||
| from lib.core.settings import CHECK_ZERO_COLUMNS_THRESHOLD | from lib.core.settings import CHECK_ZERO_COLUMNS_THRESHOLD | ||||||
| from lib.core.settings import CURRENT_DB | from lib.core.settings import CURRENT_DB | ||||||
| from lib.core.settings import NULL | from lib.core.settings import NULL | ||||||
|  | from lib.core.settings import UPPER_CASE_DBMSES | ||||||
| from lib.request import inject | from lib.request import inject | ||||||
| from lib.utils.hash import attackDumpedTable | from lib.utils.hash import attackDumpedTable | ||||||
| from lib.utils.pivotdumptable import pivotDumpTable | from lib.utils.pivotdumptable import pivotDumpTable | ||||||
|  | @ -70,7 +71,7 @@ class Entries(object): | ||||||
|             conf.db = self.getCurrentDb() |             conf.db = self.getCurrentDb() | ||||||
| 
 | 
 | ||||||
|         elif conf.db is not None: |         elif conf.db is not None: | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 conf.db = conf.db.upper() |                 conf.db = conf.db.upper() | ||||||
| 
 | 
 | ||||||
|             if ',' in conf.db: |             if ',' in conf.db: | ||||||
|  | @ -86,7 +87,7 @@ class Entries(object): | ||||||
|         conf.db = safeSQLIdentificatorNaming(conf.db) |         conf.db = safeSQLIdentificatorNaming(conf.db) | ||||||
| 
 | 
 | ||||||
|         if conf.tbl: |         if conf.tbl: | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 conf.tbl = conf.tbl.upper() |                 conf.tbl = conf.tbl.upper() | ||||||
| 
 | 
 | ||||||
|             tblList = conf.tbl.split(',') |             tblList = conf.tbl.split(',') | ||||||
|  | @ -176,7 +177,7 @@ class Entries(object): | ||||||
|                     entries = [] |                     entries = [] | ||||||
|                     query = None |                     query = None | ||||||
| 
 | 
 | ||||||
|                     if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                     if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                         query = rootQuery.inband.query % (colString, tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) |                         query = rootQuery.inband.query % (colString, tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) | ||||||
|                     elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.MCKOI): |                     elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MAXDB, DBMS.MCKOI): | ||||||
|                         query = rootQuery.inband.query % (colString, tbl) |                         query = rootQuery.inband.query % (colString, tbl) | ||||||
|  | @ -285,7 +286,7 @@ class Entries(object): | ||||||
|                     infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) |                     infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) | ||||||
|                     logger.info(infoMsg) |                     logger.info(infoMsg) | ||||||
| 
 | 
 | ||||||
|                     if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                     if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                         query = rootQuery.blind.count % (tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) |                         query = rootQuery.blind.count % (tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper()))) | ||||||
|                     elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MCKOI): |                     elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.ACCESS, DBMS.FIREBIRD, DBMS.MCKOI): | ||||||
|                         query = rootQuery.blind.count % tbl |                         query = rootQuery.blind.count % tbl | ||||||
|  | @ -380,7 +381,7 @@ class Entries(object): | ||||||
| 
 | 
 | ||||||
|                     else: |                     else: | ||||||
|                         emptyColumns = [] |                         emptyColumns = [] | ||||||
|                         plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |                         plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|                         indexRange = getLimitRange(count, plusOne=plusOne) |                         indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|                         if len(colList) < len(indexRange) > CHECK_ZERO_COLUMNS_THRESHOLD: |                         if len(colList) < len(indexRange) > CHECK_ZERO_COLUMNS_THRESHOLD: | ||||||
|  | @ -407,7 +408,7 @@ class Entries(object): | ||||||
| 
 | 
 | ||||||
|                                     if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO): |                                     if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO): | ||||||
|                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), conf.db, conf.tbl, sorted(colList, key=len)[0], index) |                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), conf.db, conf.tbl, sorted(colList, key=len)[0], index) | ||||||
|                                     elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY): |                                     elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.DERBY, DBMS.ALTIBASE): | ||||||
|                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper())), index) |                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), tbl.upper() if not conf.db else ("%s.%s" % (conf.db.upper(), tbl.upper())), index) | ||||||
|                                     elif Backend.isDbms(DBMS.SQLITE): |                                     elif Backend.isDbms(DBMS.SQLITE): | ||||||
|                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), tbl, index) |                                         query = rootQuery.blind.query % (agent.preprocessField(tbl, column), tbl, index) | ||||||
|  |  | ||||||
|  | @ -34,6 +34,7 @@ from lib.core.exception import SqlmapMissingMandatoryOptionException | ||||||
| from lib.core.exception import SqlmapUserQuitException | from lib.core.exception import SqlmapUserQuitException | ||||||
| from lib.core.settings import CURRENT_DB | from lib.core.settings import CURRENT_DB | ||||||
| from lib.core.settings import METADB_SUFFIX | from lib.core.settings import METADB_SUFFIX | ||||||
|  | from lib.core.settings import UPPER_CASE_DBMSES | ||||||
| from lib.request import inject | from lib.request import inject | ||||||
| from lib.utils.brute import columnExists | from lib.utils.brute import columnExists | ||||||
| from lib.utils.brute import tableExists | from lib.utils.brute import tableExists | ||||||
|  | @ -63,7 +64,7 @@ class Search(object): | ||||||
|             values = [] |             values = [] | ||||||
|             db = safeSQLIdentificatorNaming(db) |             db = safeSQLIdentificatorNaming(db) | ||||||
| 
 | 
 | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 db = db.upper() |                 db = db.upper() | ||||||
| 
 | 
 | ||||||
|             infoMsg = "searching database" |             infoMsg = "searching database" | ||||||
|  | @ -170,7 +171,7 @@ class Search(object): | ||||||
|             values = [] |             values = [] | ||||||
|             tbl = safeSQLIdentificatorNaming(tbl, True) |             tbl = safeSQLIdentificatorNaming(tbl, True) | ||||||
| 
 | 
 | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 tbl = tbl.upper() |                 tbl = tbl.upper() | ||||||
|                 conf.db = conf.db.upper() if conf.db else conf.db |                 conf.db = conf.db.upper() if conf.db else conf.db | ||||||
| 
 | 
 | ||||||
|  | @ -393,7 +394,7 @@ class Search(object): | ||||||
|             conf.db = origDb |             conf.db = origDb | ||||||
|             conf.tbl = origTbl |             conf.tbl = origTbl | ||||||
| 
 | 
 | ||||||
|             if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.DERBY): |             if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|                 column = column.upper() |                 column = column.upper() | ||||||
|                 conf.db = conf.db.upper() if conf.db else conf.db |                 conf.db = conf.db.upper() if conf.db else conf.db | ||||||
|                 conf.tbl = conf.tbl.upper() if conf.tbl else conf.tbl |                 conf.tbl = conf.tbl.upper() if conf.tbl else conf.tbl | ||||||
|  | @ -602,7 +603,7 @@ class Search(object): | ||||||
|             logger.warn(warnMsg) |             logger.warn(warnMsg) | ||||||
| 
 | 
 | ||||||
|     def search(self): |     def search(self): | ||||||
|         if Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2): |         if Backend.getIdentifiedDbms() in UPPER_CASE_DBMSES: | ||||||
|             for item in ('db', 'tbl', 'col'): |             for item in ('db', 'tbl', 'col'): | ||||||
|                 if getattr(conf, item, None): |                 if getattr(conf, item, None): | ||||||
|                     setattr(conf, item, getattr(conf, item).upper()) |                     setattr(conf, item, getattr(conf, item).upper()) | ||||||
|  |  | ||||||
|  | @ -128,7 +128,7 @@ class Users(object): | ||||||
|                 errMsg = "unable to retrieve the number of database users" |                 errMsg = "unable to retrieve the number of database users" | ||||||
|                 raise SqlmapNoneDataException(errMsg) |                 raise SqlmapNoneDataException(errMsg) | ||||||
| 
 | 
 | ||||||
|             plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |             plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|             indexRange = getLimitRange(count, plusOne=plusOne) |             indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|             for index in indexRange: |             for index in indexRange: | ||||||
|  | @ -293,7 +293,7 @@ class Users(object): | ||||||
| 
 | 
 | ||||||
|                     passwords = [] |                     passwords = [] | ||||||
| 
 | 
 | ||||||
|                     plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |                     plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|                     indexRange = getLimitRange(count, plusOne=plusOne) |                     indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|                     for index in indexRange: |                     for index in indexRange: | ||||||
|  | @ -541,7 +541,7 @@ class Users(object): | ||||||
| 
 | 
 | ||||||
|                 privileges = set() |                 privileges = set() | ||||||
| 
 | 
 | ||||||
|                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2) |                 plusOne = Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.DB2, DBMS.ALTIBASE) | ||||||
|                 indexRange = getLimitRange(count, plusOne=plusOne) |                 indexRange = getLimitRange(count, plusOne=plusOne) | ||||||
| 
 | 
 | ||||||
|                 for index in indexRange: |                 for index in indexRange: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user