mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2025-02-03 13:14:13 +03:00
Major bug fix to --union-test
This commit is contained in:
parent
7effd0c301
commit
f5904d0bc0
|
@ -64,7 +64,7 @@ def action():
|
||||||
if conf.timeTest:
|
if conf.timeTest:
|
||||||
conf.dumper.technic("time based blind sql injection payload", timeTest())
|
conf.dumper.technic("time based blind sql injection payload", timeTest())
|
||||||
|
|
||||||
if conf.unionTest and not kb.unionPosition:
|
if conf.unionTest and kb.unionPosition is None:
|
||||||
conf.dumper.technic("valid union", unionTest())
|
conf.dumper.technic("valid union", unionTest())
|
||||||
|
|
||||||
# Enumeration options
|
# Enumeration options
|
||||||
|
|
|
@ -453,7 +453,7 @@ class Agent:
|
||||||
query = query[len("TOP %s " % topNum):]
|
query = query[len("TOP %s " % topNum):]
|
||||||
inbandQuery += "TOP %s " % topNum
|
inbandQuery += "TOP %s " % topNum
|
||||||
|
|
||||||
if not exprPosition:
|
if not isinstance(exprPosition, int):
|
||||||
exprPosition = kb.unionPosition
|
exprPosition = kb.unionPosition
|
||||||
|
|
||||||
intoRegExp = re.search("(\s+INTO (DUMP|OUT)FILE\s+\'(.+?)\')", query, re.I)
|
intoRegExp = re.search("(\s+INTO (DUMP|OUT)FILE\s+\'(.+?)\')", query, re.I)
|
||||||
|
|
|
@ -232,7 +232,7 @@ def setUnion(comment=None, count=None, position=None, negative=False, falseCond=
|
||||||
kb.unionComment = comment
|
kb.unionComment = comment
|
||||||
kb.unionCount = count
|
kb.unionCount = count
|
||||||
|
|
||||||
if position:
|
if position is not None:
|
||||||
condition = (
|
condition = (
|
||||||
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
|
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
|
||||||
( not kb.resumedQueries[conf.url].has_key("Union position")
|
( not kb.resumedQueries[conf.url].has_key("Union position")
|
||||||
|
|
|
@ -358,10 +358,10 @@ def getValue(expression, blind=True, inband=True, error=True, fromUser=False, ex
|
||||||
if not value:
|
if not value:
|
||||||
warnMsg = "for some reason(s) it was not possible to retrieve "
|
warnMsg = "for some reason(s) it was not possible to retrieve "
|
||||||
warnMsg += "the query output through error SQL injection "
|
warnMsg += "the query output through error SQL injection "
|
||||||
warnMsg += "technique, sqlmap is going %s" % ("inband" if inband and kb.unionPosition else "blind")
|
warnMsg += "technique, sqlmap is going %s" % ("inband" if inband and kb.unionPosition is not None else "blind")
|
||||||
logger.warn(warnMsg)
|
logger.warn(warnMsg)
|
||||||
|
|
||||||
if inband and kb.unionPosition and not value:
|
if inband and kb.unionPosition is not None and not value:
|
||||||
value = __goInband(expression, expected, sort, resumeValue, unpack, dump)
|
value = __goInband(expression, expected, sort, resumeValue, unpack, dump)
|
||||||
|
|
||||||
if not value:
|
if not value:
|
||||||
|
|
|
@ -107,24 +107,24 @@ def __unionConfirm():
|
||||||
|
|
||||||
# Assure that the above function found the exploitable full inband
|
# Assure that the above function found the exploitable full inband
|
||||||
# SQL injection position
|
# SQL injection position
|
||||||
if not isinstance(kb.unionPosition, int):
|
|
||||||
value = __unionPosition(falseCond=True)
|
|
||||||
|
|
||||||
# Assure that the above function found the exploitable partial
|
|
||||||
# (single entry) inband SQL injection position by appending
|
|
||||||
# a false condition after the parameter value
|
|
||||||
if not isinstance(kb.unionPosition, int):
|
if not isinstance(kb.unionPosition, int):
|
||||||
value = __unionPosition(negative=True)
|
value = __unionPosition(negative=True)
|
||||||
|
|
||||||
# Assure that the above function found the exploitable partial
|
# Assure that the above function found the exploitable partial
|
||||||
# (single entry) inband SQL injection position with negative
|
# (single entry) inband SQL injection position with negative
|
||||||
# parameter value
|
# parameter value
|
||||||
|
if not isinstance(kb.unionPosition, int):
|
||||||
|
value = __unionPosition(falseCond=True)
|
||||||
|
|
||||||
|
# Assure that the above function found the exploitable partial
|
||||||
|
# (single entry) inband SQL injection position by appending
|
||||||
|
# a false condition after the parameter value
|
||||||
if not isinstance(kb.unionPosition, int):
|
if not isinstance(kb.unionPosition, int):
|
||||||
return
|
return
|
||||||
else:
|
|
||||||
setUnion(negative=True)
|
|
||||||
else:
|
else:
|
||||||
setUnion(falseCond=True)
|
setUnion(falseCond=True)
|
||||||
|
else:
|
||||||
|
setUnion(negative=True)
|
||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ class Enumeration(GenericEnumeration):
|
||||||
else:
|
else:
|
||||||
dbs = [conf.db]
|
dbs = [conf.db]
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
for db in dbs:
|
for db in dbs:
|
||||||
if conf.excludeSysDbs and db in self.excludeDbsList:
|
if conf.excludeSysDbs and db in self.excludeDbsList:
|
||||||
infoMsg = "skipping system database '%s'" % db
|
infoMsg = "skipping system database '%s'" % db
|
||||||
|
@ -138,7 +138,7 @@ class Enumeration(GenericEnumeration):
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery["inband"]["query"] % db
|
query = rootQuery["inband"]["query"] % db
|
||||||
query += tblQuery
|
query += tblQuery
|
||||||
values = inject.getValue(query, blind=False, error=False)
|
values = inject.getValue(query, blind=False, error=False)
|
||||||
|
@ -223,7 +223,7 @@ class Enumeration(GenericEnumeration):
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery["inband"]["query"] % (db, db, db, db, db)
|
query = rootQuery["inband"]["query"] % (db, db, db, db, db)
|
||||||
query += " AND %s" % colQuery.replace("[DB]", db)
|
query += " AND %s" % colQuery.replace("[DB]", db)
|
||||||
values = inject.getValue(query, blind=False, error=False)
|
values = inject.getValue(query, blind=False, error=False)
|
||||||
|
|
|
@ -92,7 +92,7 @@ class Filesystem(GenericFilesystem):
|
||||||
binToHexQuery = urlencode(binToHexQuery, convall=True)
|
binToHexQuery = urlencode(binToHexQuery, convall=True)
|
||||||
inject.goStacked(binToHexQuery)
|
inject.goStacked(binToHexQuery)
|
||||||
|
|
||||||
if kb.unionPosition:
|
if kb.unionPosition is not None:
|
||||||
result = inject.getValue("SELECT %s FROM %s ORDER BY id ASC" % (self.tblField, hexTbl), sort=False, resumeValue=False, blind=False, error=False)
|
result = inject.getValue("SELECT %s FROM %s ORDER BY id ASC" % (self.tblField, hexTbl), sort=False, resumeValue=False, blind=False, error=False)
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
|
|
|
@ -36,7 +36,7 @@ class Enumeration(GenericEnumeration):
|
||||||
# Set containing the list of DBMS administrators
|
# Set containing the list of DBMS administrators
|
||||||
areAdmins = set()
|
areAdmins = set()
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if query2:
|
if query2:
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
condition = rootQuery.inband.condition2
|
condition = rootQuery.inband.condition2
|
||||||
|
@ -196,7 +196,7 @@ class Enumeration(GenericEnumeration):
|
||||||
colQuery = colQuery % column
|
colQuery = colQuery % column
|
||||||
|
|
||||||
for db in dbs.keys():
|
for db in dbs.keys():
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery.inband.query
|
query = rootQuery.inband.query
|
||||||
query += colQuery
|
query += colQuery
|
||||||
values = inject.getValue(query, blind=False, error=False)
|
values = inject.getValue(query, blind=False, error=False)
|
||||||
|
|
|
@ -135,7 +135,7 @@ class Enumeration:
|
||||||
condition = ( kb.dbms == "Microsoft SQL Server" and kb.dbmsVersion[0] in ( "2005", "2008" ) )
|
condition = ( kb.dbms == "Microsoft SQL Server" and kb.dbmsVersion[0] in ( "2005", "2008" ) )
|
||||||
condition |= ( kb.dbms == "MySQL" and not kb.data.has_information_schema )
|
condition |= ( kb.dbms == "MySQL" and not kb.data.has_information_schema )
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if condition:
|
if condition:
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
else:
|
else:
|
||||||
|
@ -194,7 +194,7 @@ class Enumeration:
|
||||||
|
|
||||||
logger.info(infoMsg)
|
logger.info(infoMsg)
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms == "Microsoft SQL Server" and kb.dbmsVersion[0] in ( "2005", "2008" ):
|
if kb.dbms == "Microsoft SQL Server" and kb.dbmsVersion[0] in ( "2005", "2008" ):
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
else:
|
else:
|
||||||
|
@ -393,7 +393,7 @@ class Enumeration:
|
||||||
"E": "EXECUTE"
|
"E": "EXECUTE"
|
||||||
}
|
}
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
condition = rootQuery.inband.condition2
|
condition = rootQuery.inband.condition2
|
||||||
|
@ -639,7 +639,7 @@ class Enumeration:
|
||||||
|
|
||||||
rootQuery = queries[kb.dbms].dbs
|
rootQuery = queries[kb.dbms].dbs
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
else:
|
else:
|
||||||
|
@ -708,7 +708,7 @@ class Enumeration:
|
||||||
|
|
||||||
rootQuery = queries[kb.dbms].tables
|
rootQuery = queries[kb.dbms].tables
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery.inband.query
|
query = rootQuery.inband.query
|
||||||
condition = rootQuery.inband.condition
|
condition = rootQuery.inband.condition
|
||||||
|
|
||||||
|
@ -906,7 +906,7 @@ class Enumeration:
|
||||||
infoMsg += "on database '%s'" % conf.db
|
infoMsg += "on database '%s'" % conf.db
|
||||||
logger.info(infoMsg)
|
logger.info(infoMsg)
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms in ( "MySQL", "PostgreSQL" ):
|
if kb.dbms in ( "MySQL", "PostgreSQL" ):
|
||||||
query = rootQuery.inband.query % (conf.tbl, conf.db)
|
query = rootQuery.inband.query % (conf.tbl, conf.db)
|
||||||
query += condQuery
|
query += condQuery
|
||||||
|
@ -1085,7 +1085,7 @@ class Enumeration:
|
||||||
|
|
||||||
entriesCount = 0
|
entriesCount = 0
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms == "Oracle":
|
if kb.dbms == "Oracle":
|
||||||
query = rootQuery.inband.query % (colString, conf.tbl.upper())
|
query = rootQuery.inband.query % (colString, conf.tbl.upper())
|
||||||
elif kb.dbms == "SQLite":
|
elif kb.dbms == "SQLite":
|
||||||
|
@ -1343,7 +1343,7 @@ class Enumeration:
|
||||||
dbQuery = "%s%s" % (dbCond, dbCondParam)
|
dbQuery = "%s%s" % (dbCond, dbCondParam)
|
||||||
dbQuery = dbQuery % db
|
dbQuery = dbQuery % db
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
if kb.dbms == "MySQL" and not kb.data.has_information_schema:
|
||||||
query = rootQuery.inband.query2
|
query = rootQuery.inband.query2
|
||||||
else:
|
else:
|
||||||
|
@ -1431,7 +1431,7 @@ class Enumeration:
|
||||||
tblQuery = "%s%s" % (tblCond, tblCondParam)
|
tblQuery = "%s%s" % (tblCond, tblCondParam)
|
||||||
tblQuery = tblQuery % tbl
|
tblQuery = tblQuery % tbl
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery.inband.query
|
query = rootQuery.inband.query
|
||||||
query += tblQuery
|
query += tblQuery
|
||||||
query += exclDbsQuery
|
query += exclDbsQuery
|
||||||
|
@ -1552,7 +1552,7 @@ class Enumeration:
|
||||||
colQuery = "%s%s" % (colCond, colCondParam)
|
colQuery = "%s%s" % (colCond, colCondParam)
|
||||||
colQuery = colQuery % column
|
colQuery = colQuery % column
|
||||||
|
|
||||||
if kb.unionPosition or conf.direct:
|
if kb.unionPosition is not None or conf.direct:
|
||||||
query = rootQuery.inband.query
|
query = rootQuery.inband.query
|
||||||
query += colQuery
|
query += colQuery
|
||||||
query += exclDbsQuery
|
query += exclDbsQuery
|
||||||
|
|
Loading…
Reference in New Issue
Block a user