@@ -416,10 +416,6 @@ def forgeInbandQuery(self, query, exprPosition=None):
416416 conditionIndex = query .index (" FROM " )
417417 inbandQuery += query [conditionIndex :]
418418
419- if " ORDER BY " in inbandQuery and "(SELECT " in inbandQuery :
420- orderIndex = inbandQuery .index (" ORDER BY " )
421- inbandQuery += inbandQuery [orderIndex :].replace (")" , "" )
422-
423419 if kb .dbms == "Oracle" :
424420 if " FROM " not in inbandQuery :
425421 inbandQuery += " FROM DUAL"
@@ -461,19 +457,20 @@ def limitQuery(self, num, query, field):
461457 limitStr = queries [kb .dbms ].limit % (num , 1 )
462458 limitedQuery += " %s" % limitStr
463459
464- # TODO: fix Partial UNION query SQL injection technique for Oracle
465460 elif kb .dbms == "Oracle" :
461+ if " ORDER BY " in limitedQuery and "(SELECT " in limitedQuery :
462+ limitedQuery = limitedQuery [:limitedQuery .index (" ORDER BY " )]
463+
466464 if query .startswith ("SELECT " ):
467465 limitedQuery = "%s FROM (%s, %s" % (untilFrom , untilFrom , limitStr )
468466 else :
469- limitedQuery = "%s FROM (SELECT %s, %s" % (untilFrom , field , limitStr )
467+ limitedQuery = "%s FROM (SELECT %s, %s" % (untilFrom , ", " . join ( f for f in field ) , limitStr )
470468 limitedQuery = limitedQuery % fromFrom
471469 limitedQuery += "=%d" % (num + 1 )
472470
473471 elif kb .dbms == "Microsoft SQL Server" :
474- if re .search (" ORDER BY " , limitedQuery , re .I ):
475- untilOrderChar = limitedQuery .index (" ORDER BY " )
476- limitedQuery = limitedQuery [:untilOrderChar ]
472+ if " ORDER BY " in limitedQuery :
473+ limitedQuery = limitedQuery [:limitedQuery .index (" ORDER BY " )]
477474
478475 limitedQuery = limitedQuery .replace ("SELECT " , (limitStr % 1 ), 1 )
479476 limitedQuery = "%s WHERE %s " % (limitedQuery , field )
0 commit comments