@@ -99,9 +99,9 @@ def __goInferenceProxy(expression, fromUser=False, expected=None, batch=False, r
9999 parameter through a bisection algorithm.
100100 """
101101
102- if kb .injection .data [1 ].vector is not None :
103- vector = agent .cleanupPayload (kb .injection .data [1 ].vector )
104- kb .pageTemplate = getPageTemplate (kb .injection .data [1 ].templatePayload , kb .injection .place )
102+ if kb .technique and kb . injection .data [kb . technique ].vector is not None :
103+ vector = agent .cleanupPayload (kb .injection .data [kb . technique ].vector )
104+ kb .pageTemplate = getPageTemplate (kb .injection .data [kb . technique ].templatePayload , kb .injection .place )
105105 else :
106106 vector = queries [kb .misc .testedDbms ].inference .query
107107 kb .pageTemplate = kb .originalPage
@@ -336,6 +336,72 @@ def __goError(expression, resumeValue=True):
336336
337337 return result
338338
339+ def __goTimeBlind (expression , resumeValue = True ):
340+ """
341+ Retrieve the output of a SQL query taking advantage of an error-based
342+ SQL injection vulnerability on the affected parameter.
343+ """
344+
345+ result = None
346+
347+ if conf .direct :
348+ return direct (expression ), None
349+
350+ condition = (
351+ kb .resumedQueries and conf .url in kb .resumedQueries .keys ()
352+ and expression in kb .resumedQueries [conf .url ].keys ()
353+ )
354+
355+ if condition and resumeValue :
356+ result = resume (expression , None )
357+
358+ if not result :
359+ result = timeBlindUse (expression )
360+ dataToSessionFile ("[%s][%s][%s][%s][%s]\n " % (conf .url , kb .injection .place , conf .parameters [kb .injection .place ], expression , replaceNewlineTabs (result )))
361+
362+ return result
363+
364+ def timeBlindUse (expression ):
365+ """
366+ Retrieve the output of a SQL query taking advantage of an error SQL
367+ injection vulnerability on the affected parameter.
368+ """
369+
370+ output = None
371+ import pdb
372+ pdb .set_trace ()
373+ vector = agent .cleanupPayload (kb .injection .data [5 ].vector )
374+ query = unescaper .unescape (vector )
375+ query = agent .prefixQuery (query )
376+ query = agent .suffixQuery (query )
377+ check = "%s(?P<result>.*?)%s" % (kb .misc .start , kb .misc .stop )
378+
379+ _ , _ , _ , _ , _ , _ , fieldToCastStr = agent .getFields (expression )
380+ nulledCastedField = agent .nullAndCastField (fieldToCastStr )
381+
382+ if kb .dbms == DBMS .MYSQL :
383+ nulledCastedField = nulledCastedField .replace ("AS CHAR)" , "AS CHAR(100))" ) # fix for that 'Subquery returns more than 1 row'
384+
385+ expression = expression .replace (fieldToCastStr , nulledCastedField , 1 )
386+ expression = unescaper .unescape (expression )
387+ expression = safeStringFormat (query , expression )
388+
389+ debugMsg = "query: %s" % expression
390+ logger .debug (debugMsg )
391+
392+ payload = agent .payload (newValue = expression )
393+ reqBody , _ = Request .queryPage (payload , content = True )
394+ output = extractRegexResult (check , reqBody , re .DOTALL | re .IGNORECASE )
395+
396+ if output :
397+ output = output .replace (kb .misc .space , " " )
398+
399+ if conf .verbose > 0 :
400+ infoMsg = "retrieved: %s" % replaceNewlineTabs (output , stdout = True )
401+ logger .info (infoMsg )
402+
403+ return output
404+
339405def __goInband (expression , expected = None , sort = True , resumeValue = True , unpack = True , dump = False ):
340406 """
341407 Retrieve the output of a SQL query taking advantage of an inband SQL
@@ -365,7 +431,7 @@ def __goInband(expression, expected=None, sort=True, resumeValue=True, unpack=Tr
365431
366432 return data
367433
368- def getValue (expression , blind = True , inband = True , error = True , fromUser = False , expected = None , batch = False , unpack = True , sort = True , resumeValue = True , charsetType = None , firstChar = None , lastChar = None , dump = False , suppressOutput = False ):
434+ def getValue (expression , blind = True , inband = True , error = True , time = True , fromUser = False , expected = None , batch = False , unpack = True , sort = True , resumeValue = True , charsetType = None , firstChar = None , lastChar = None , dump = False , suppressOutput = False ):
369435 """
370436 Called each time sqlmap inject a SQL query on the SQL injection
371437 affected parameter. It can call a function to retrieve the output
@@ -379,7 +445,7 @@ def getValue(expression, blind=True, inband=True, error=True, fromUser=False, ex
379445
380446 if conf .direct :
381447 value = direct (expression )
382- elif kb .booleanTest is not None or kb .errorTest is not None or kb .unionTest is not None :
448+ elif kb .booleanTest is not None or kb .errorTest is not None or kb .unionTest is not None or kb . timeTest is not None :
383449 expression = cleanQuery (expression )
384450 expression = expandAsteriskForColumns (expression )
385451 value = None
@@ -412,6 +478,10 @@ def getValue(expression, blind=True, inband=True, error=True, fromUser=False, ex
412478 kb .technique = 1
413479 value = __goInferenceProxy (expression , fromUser , expected , batch , resumeValue , unpack , charsetType , firstChar , lastChar )
414480
481+ if time and kb .timeTest and not value :
482+ kb .technique = 5
483+ value = __goInferenceProxy (expression , fromUser , expected , batch , resumeValue , unpack , charsetType , firstChar , lastChar )
484+
415485 kb .unionNegative = oldParamNegative
416486
417487 if value and isinstance (value , basestring ):
0 commit comments