From bce9db1af5aeef873c3c9a8104755c55f2a1f550 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Fri, 15 Jul 2016 00:10:41 +0200 Subject: [PATCH] Adding support for --columns too (Issue #2025) --- lib/core/settings.py | 2 +- plugins/generic/databases.py | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/core/settings.py b/lib/core/settings.py index efd323af5..c9e092330 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -19,7 +19,7 @@ from lib.core.enums import OS from lib.core.revision import getRevisionNumber # sqlmap version (...) -VERSION = "1.0.7.20" +VERSION = "1.0.7.21" REVISION = getRevisionNumber() STABLE = VERSION.count('.') <= 2 VERSION_STRING = "sqlmap/%s#%s" % (VERSION, "stable" if STABLE else "dev") diff --git a/plugins/generic/databases.py b/plugins/generic/databases.py index 82f845acb..aae07ec6a 100644 --- a/plugins/generic/databases.py +++ b/plugins/generic/databases.py @@ -8,6 +8,7 @@ See the file 'doc/COPYING' for copying permission from lib.core.agent import agent from lib.core.common import arrayizeValue from lib.core.common import Backend +from lib.core.common import extractRegexResult from lib.core.common import filterPairValues from lib.core.common import flattenValue from lib.core.common import getLimitRange @@ -19,6 +20,7 @@ from lib.core.common import isTechniqueAvailable from lib.core.common import parseSqliteTableSchema from lib.core.common import popValue from lib.core.common import pushValue +from lib.core.common import randomStr from lib.core.common import readInput from lib.core.common import safeSQLIdentificatorNaming from lib.core.common import singleTimeWarnMessage @@ -41,6 +43,7 @@ from lib.core.settings import CURRENT_DB from lib.request import inject from lib.techniques.brute.use import columnExists from lib.techniques.brute.use import tableExists +from lib.techniques.union.use import unionUse class Databases: """ @@ -539,7 +542,22 @@ class Databases: infoMsg += "in database '%s'" % unsafeSQLIdentificatorNaming(conf.db) logger.info(infoMsg) - values = inject.getValue(query, blind=False, time=False) + values = None + if Backend.isDbms(DBMS.MSSQL) and isTechniqueAvailable(PAYLOAD.TECHNIQUE.UNION): + expression = query + kb.dumpColumns = [] + kb.rowXmlMode = True + + for column in extractRegexResult(r"SELECT (?P.+?) FROM", query).split(','): + kb.dumpColumns.append(randomStr().lower()) + expression = expression.replace(column, "%s AS %s" % (column, kb.dumpColumns[-1]), 1) + + values = unionUse(expression) + kb.rowXmlMode = False + kb.dumpColumns = None + + if values is None: + values = inject.getValue(query, blind=False, time=False) if Backend.isDbms(DBMS.MSSQL) and isNoneValue(values): index, values = 1, []