Skip to content

Commit 058f63a

Browse files
committed
Patch for annoying retrieval of columns during dump (if -C used)
1 parent 03da24b commit 058f63a

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

plugins/generic/databases.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ def getTables(self, bruteForce=None):
370370

371371
return kb.data.cachedTables
372372

373-
def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None):
373+
def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None, dumpMode=False):
374374
self.forceDbmsEnum()
375375

376376
if conf.db is None or conf.db == CURRENT_DB:
@@ -517,10 +517,6 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None):
517517
condQueryStr = "%%s%s" % colCondParam
518518
condQuery = " AND (%s)" % " OR ".join(condQueryStr % (condition, unsafeSQLIdentificatorNaming(col)) for col in sorted(colList))
519519

520-
infoMsg += "for table '%s' " % unsafeSQLIdentificatorNaming(tbl)
521-
infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db)
522-
logger.info(infoMsg)
523-
524520
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB):
525521
query = rootQuery.inband.query % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db))
526522
query += condQuery
@@ -534,7 +530,14 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None):
534530
elif Backend.getIdentifiedDbms() in (DBMS.SQLITE, DBMS.FIREBIRD):
535531
query = rootQuery.inband.query % tbl
536532

537-
values = inject.getValue(query, blind=False, time=False)
533+
if dumpMode and colList:
534+
values = [(_,) for _ in colList]
535+
else:
536+
infoMsg += "for table '%s' " % unsafeSQLIdentificatorNaming(tbl)
537+
infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db)
538+
logger.info(infoMsg)
539+
540+
values = inject.getValue(query, blind=False, time=False)
538541

539542
if Backend.isDbms(DBMS.MSSQL) and isNoneValue(values):
540543
index, values = 1, []
@@ -612,10 +615,6 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None):
612615
condQueryStr = "%%s%s" % colCondParam
613616
condQuery = " AND (%s)" % " OR ".join(condQueryStr % (condition, unsafeSQLIdentificatorNaming(col)) for col in sorted(colList))
614617

615-
infoMsg += "for table '%s' " % unsafeSQLIdentificatorNaming(tbl)
616-
infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db)
617-
logger.info(infoMsg)
618-
619618
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.HSQLDB):
620619
query = rootQuery.blind.count % (unsafeSQLIdentificatorNaming(tbl), unsafeSQLIdentificatorNaming(conf.db))
621620
query += condQuery
@@ -639,22 +638,31 @@ def getColumns(self, onlyColNames=False, colTuple=None, bruteForce=None):
639638
parseSqliteTableSchema(value)
640639
return kb.data.cachedColumns
641640

642-
count = inject.getValue(query, union=False, error=False, expected=EXPECTED.INT, charsetType=CHARSET_TYPE.DIGITS)
643-
644641
table = {}
645642
columns = {}
646643

647-
if not isNumPosStrValue(count):
648-
if Backend.isDbms(DBMS.MSSQL):
649-
count, index, values = 0, 1, []
650-
while True:
651-
query = rootQuery.blind.query3 % (conf.db, tbl, index)
652-
value = unArrayizeValue(inject.getValue(query, union=False, error=False))
653-
if isNoneValue(value) or value == " ":
654-
break
655-
else:
656-
columns[safeSQLIdentificatorNaming(value)] = None
657-
index += 1
644+
if dumpMode and colList:
645+
count = 0
646+
for value in colList:
647+
columns[safeSQLIdentificatorNaming(value)] = None
648+
else:
649+
infoMsg += "for table '%s' " % unsafeSQLIdentificatorNaming(tbl)
650+
infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db)
651+
logger.info(infoMsg)
652+
653+
count = inject.getValue(query, union=False, error=False, expected=EXPECTED.INT, charsetType=CHARSET_TYPE.DIGITS)
654+
655+
if not isNumPosStrValue(count):
656+
if Backend.isDbms(DBMS.MSSQL):
657+
count, index, values = 0, 1, []
658+
while True:
659+
query = rootQuery.blind.query3 % (conf.db, tbl, index)
660+
value = unArrayizeValue(inject.getValue(query, union=False, error=False))
661+
if isNoneValue(value) or value == " ":
662+
break
663+
else:
664+
columns[safeSQLIdentificatorNaming(value)] = None
665+
index += 1
658666

659667
if not columns:
660668
errMsg = "unable to retrieve the %scolumns " % ("number of " if not Backend.isDbms(DBMS.MSSQL) else "")

plugins/generic/entries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def dumpTable(self, foundData=None):
103103

104104
if foundData is None:
105105
kb.data.cachedColumns = {}
106-
self.getColumns(onlyColNames=True)
106+
self.getColumns(onlyColNames=True, dumpMode=True)
107107
else:
108108
kb.data.cachedColumns = foundData
109109

0 commit comments

Comments
 (0)