Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit edac0b2

Browse files
committed
Added switch --schema to enumerate DBMS schema and now --columns does not require a mandatory table (-T) anymore, instead it will act as an alias for --schema
1 parent d3ed326 commit edac0b2

5 files changed

Lines changed: 65 additions & 15 deletions

File tree

lib/controller/action.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,11 @@ def action():
9090
if conf.getTables:
9191
conf.dumper.dbTables(conf.dbmsHandler.getTables())
9292

93-
if conf.commonTables:
94-
conf.dumper.dbTables(tableExists(paths.COMMON_TABLES))
95-
9693
if conf.getColumns:
9794
conf.dumper.dbTableColumns(conf.dbmsHandler.getColumns())
9895

99-
if conf.commonColumns:
100-
conf.dumper.dbTableColumns(columnExists(paths.COMMON_COLUMNS))
96+
if conf.getSchema:
97+
conf.dumper.dbTableColumns(conf.dbmsHandler.getSchema())
10198

10299
if conf.dumpTable:
103100
conf.dumper.dbTableValues(conf.dbmsHandler.dumpTable())
@@ -114,6 +111,13 @@ def action():
114111
if conf.sqlShell:
115112
conf.dbmsHandler.sqlShell()
116113

114+
# Brute force options
115+
if conf.commonTables:
116+
conf.dumper.dbTables(tableExists(paths.COMMON_TABLES))
117+
118+
if conf.commonColumns:
119+
conf.dumper.dbTableColumns(columnExists(paths.COMMON_COLUMNS))
120+
117121
# User-defined function options
118122
if conf.udfInject:
119123
conf.dbmsHandler.udfInjectCustom()

lib/core/optiondict.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
"getDbs": ("boolean", "Databases"),
9393
"getTables": ("boolean", "Tables"),
9494
"getColumns": ("boolean", "Columns"),
95+
"getSchema": "boolean",
9596
"dumpTable": "boolean",
9697
"dumpAll": "boolean",
9798
"search": "boolean",

lib/parse/cmdline.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ def cmdLineParser():
276276
enumeration.add_option("--columns", dest="getColumns", action="store_true",
277277
default=False, help="Enumerate DBMS database table columns")
278278

279+
enumeration.add_option("--schema", dest="getSchema", action="store_true",
280+
default=False, help="Enumerate DBMS schema")
281+
279282
enumeration.add_option("--dump", dest="dumpTable", action="store_true",
280283
default=False, help="Dump DBMS database table entries")
281284

plugins/generic/enumeration.py

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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 "

sqlmap.conf

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,11 +306,14 @@ getDbs = False
306306
getTables = False
307307

308308
# Enumerate back-end database management system database table columns.
309-
# Requires: tbl
310-
# Optional: db, col
309+
# Optional: db, tbl, col
311310
# Valid: True or False
312311
getColumns = False
313312

313+
# Enumerate back-end database management system schema.
314+
# Valid: True or False
315+
getSchema = False
316+
314317
# Dump back-end database management system database table entries.
315318
# Requires: tbl and/or col
316319
# Optional: db

0 commit comments

Comments
 (0)