@@ -285,7 +285,7 @@ def getFields(self, query):
285285 if query .startswith ("SELECT " ) and "(SELECT " in query :
286286 fieldsSelectFrom = None
287287
288- return fieldsSelectFrom , fieldsSelect , fieldsNoSelect , fieldsToCastList , fieldsToCastStr
288+ return fieldsSelectFrom , fieldsSelect , fieldsNoSelect , fieldsSelectTop , fieldsToCastList , fieldsToCastStr
289289
290290
291291 def concatQuery (self , query ):
@@ -317,7 +317,7 @@ def concatQuery(self, query):
317317 concatQuery = ""
318318 query = query .replace (", " , "," )
319319
320- fieldsSelectFrom , fieldsSelect , fieldsNoSelect , _ , fieldsToCastStr = self .getFields (query )
320+ fieldsSelectFrom , fieldsSelect , fieldsNoSelect , fieldsSelectTop , _ , fieldsToCastStr = self .getFields (query )
321321 castedFields = self .nullCastConcatFields (fieldsToCastStr )
322322 concatQuery = query .replace (fieldsToCastStr , castedFields , 1 )
323323
@@ -348,7 +348,11 @@ def concatQuery(self, query):
348348 concatQuery += " FROM DUAL"
349349
350350 elif kb .dbms == "Microsoft SQL Server" :
351- if fieldsSelectFrom :
351+ if fieldsSelectTop :
352+ topNum = re .search ("\ASELECT\s+TOP\s+([\d]+)\s+" , concatQuery , re .I ).group (1 )
353+ concatQuery = concatQuery .replace ("SELECT TOP %s " % topNum , "TOP %s '%s'+" % (topNum , temp .start ), 1 )
354+ concatQuery = concatQuery .replace (" FROM " , "+'%s' FROM " % temp .stop , 1 )
355+ elif fieldsSelectFrom :
352356 concatQuery = concatQuery .replace ("SELECT " , "'%s'+" % temp .start , 1 )
353357 concatQuery = concatQuery .replace (" FROM " , "+'%s' FROM " % temp .stop , 1 )
354358 elif fieldsSelect :
@@ -393,6 +397,11 @@ def forgeInbandQuery(self, query, exprPosition=None):
393397
394398 inbandQuery = self .prefixQuery (" UNION ALL SELECT " )
395399
400+ if query .startswith ("TOP" ):
401+ topNum = re .search ("\ATOP\s+([\d]+)\s+" , query , re .I ).group (1 )
402+ query = query [len ("TOP %s " % topNum ):]
403+ inbandQuery += "TOP %s " % topNum
404+
396405 if not exprPosition :
397406 exprPosition = kb .unionPosition
398407
@@ -472,10 +481,17 @@ def limitQuery(self, num, query, field):
472481 if " ORDER BY " in limitedQuery :
473482 limitedQuery = limitedQuery [:limitedQuery .index (" ORDER BY " )]
474483
475- limitedQuery = limitedQuery .replace ("SELECT " , (limitStr % 1 ), 1 )
476- limitedQuery = "%s WHERE %s " % (limitedQuery , field )
477- limitedQuery += "NOT IN (%s" % (limitStr % num )
478- limitedQuery += "%s %s)" % (field , fromFrom )
484+ if not limitedQuery .startswith ("SELECT TOP " ):
485+ limitedQuery = limitedQuery .replace ("SELECT " , (limitStr % 1 ), 1 )
486+ limitedQuery = "%s WHERE %s " % (limitedQuery , field )
487+ limitedQuery += "NOT IN (%s" % (limitStr % num )
488+ limitedQuery += "%s %s)" % (field , fromFrom )
489+ else :
490+ topNums = re .search ("\ASELECT\s+TOP\s+([\d]+)\s+.+?\s+FROM\s+.+?\s+WHERE\s+.+?\s+NOT\s+IN\s+\(SELECT\s+TOP\s+([\d]+)\s+" , limitedQuery , re .I ).groups ()
491+ quantityTopNums = topNums [0 ]
492+ limitedQuery = limitedQuery .replace ("SELECT TOP %s" % quantityTopNums , "SELECT TOP 1" , 1 )
493+ startTopNums = topNums [1 ]
494+ limitedQuery = limitedQuery .replace (" (SELECT TOP %s" % startTopNums , " (SELECT TOP %d" % num )
479495
480496 return limitedQuery
481497
0 commit comments