@@ -822,7 +822,6 @@ def getTables(self, bruteForce=None):
822822 if Backend .getIdentifiedDbms () == DBMS .MSSQL :
823823 query = safeStringFormat (query , conf .db )
824824 value = inject .getValue (query , blind = False )
825-
826825 value = filter (lambda x : x , value )
827826
828827 if value :
@@ -904,12 +903,43 @@ def getTables(self, bruteForce=None):
904903
905904 return kb .data .cachedTables
906905
906+ def getSchema (self ):
907+ pushValue (conf .db )
908+ pushValue (conf .tbl )
909+
910+ conf .db = None
911+ conf .tbl = None
912+
913+ self .getTables ()
914+
915+ infoMsg = "fetched tables: "
916+ infoMsg += ", " .join (["%s" % ", " .join ("%s%s%s" % (db , ".." if \
917+ Backend .isDbms (DBMS .MSSQL ) or Backend .isDbms (DBMS .SYBASE ) \
918+ else "." , t ) for t in tbl ) for db , tbl in \
919+ kb .data .cachedTables .items ()])
920+ logger .info (infoMsg )
921+
922+ for db , tables in kb .data .cachedTables .items ():
923+ for tbl in tables :
924+ conf .db = db
925+ conf .tbl = tbl
926+
927+ self .getColumns ()
928+
929+ conf .tbl = popValue ()
930+ conf .db = popValue ()
931+
932+ return kb .data .cachedColumns
933+
907934 def getColumns (self , onlyColNames = False ):
908935 bruteForce = False
909936
910937 if not conf .tbl :
911- errMsg = "missing table parameter"
912- raise sqlmapMissingMandatoryOptionException , errMsg
938+ warnMsg = "missing table parameter, sqlmap will enumerate "
939+ warnMsg += "the whole database management system schema"
940+ logger .warn (warnMsg )
941+
942+ return self .getSchema ()
913943
914944 if "." in conf .tbl :
915945 if not conf .db :
@@ -954,7 +984,10 @@ def getColumns(self, onlyColNames=False):
954984 if db == conf .db and table == conf .tbl :
955985 columns [colName ] = colType
956986
957- kb .data .cachedColumns [conf .db ] = {conf .tbl : columns }
987+ if conf .db in kb .data .cachedColumns :
988+ kb .data .cachedColumns [conf .db ][conf .tbl ] = columns
989+ else :
990+ kb .data .cachedColumns [conf .db ] = {conf .tbl : columns }
958991
959992 return kb .data .cachedColumns
960993
@@ -1019,8 +1052,11 @@ def getColumns(self, onlyColNames=False):
10191052 else :
10201053 columns [name ] = columnData [1 ]
10211054
1022- table [conf .tbl ] = columns
1023- kb .data .cachedColumns [conf .db ] = table
1055+ if conf .db in kb .data .cachedColumns :
1056+ kb .data .cachedColumns [conf .db ][conf .tbl ] = columns
1057+ else :
1058+ table [conf .tbl ] = columns
1059+ kb .data .cachedColumns [conf .db ] = table
10241060
10251061 if not kb .data .cachedColumns and not conf .direct :
10261062 infoMsg = "fetching number of columns "
@@ -1112,8 +1148,11 @@ def getColumns(self, onlyColNames=False):
11121148 columns [column ] = None
11131149
11141150 if columns :
1115- table [conf .tbl ] = columns
1116- kb .data .cachedColumns [conf .db ] = table
1151+ if conf .db in kb .data .cachedColumns :
1152+ kb .data .cachedColumns [conf .db ][conf .tbl ] = columns
1153+ else :
1154+ table [conf .tbl ] = columns
1155+ kb .data .cachedColumns [conf .db ] = table
11171156
11181157 if not kb .data .cachedColumns :
11191158 errMsg = "unable to retrieve the columns "
0 commit comments