@@ -71,7 +71,7 @@ def __goInference(payload, expression):
7171 return value
7272
7373
74- def __goInferenceFields (expression , expressionFields , expressionFieldsList , payload ):
74+ def __goInferenceFields (expression , expressionFields , expressionFieldsList , payload , expected = None ):
7575 outputs = []
7676
7777 for field in expressionFieldsList :
@@ -80,15 +80,20 @@ def __goInferenceFields(expression, expressionFields, expressionFieldsList, payl
8080 expressionReplaced = expression .replace (expressionFields , field , 1 )
8181 output = resume (expressionReplaced , payload )
8282
83- if not output :
83+ if not output or ( expected == "int" and not output .isdigit () ):
84+ if output :
85+ warnMsg = "expected value type %s, resumed '%s', " % (expected , output )
86+ warnMsg += "sqlmap is going to retrieve the value again"
87+ logger .warn (warnMsg )
88+
8489 output = __goInference (payload , expressionReplaced )
8590
8691 outputs .append (output )
8792
8893 return outputs
8994
9095
91- def __goInferenceProxy (expression , fromUser = False ):
96+ def __goInferenceProxy (expression , fromUser = False , expected = None ):
9297 """
9398 Retrieve the output of a SQL query characted by character taking
9499 advantage of an blind SQL injection vulnerability on the affected
@@ -108,7 +113,7 @@ def __goInferenceProxy(expression, fromUser=False):
108113
109114 output = resume (expression , payload )
110115
111- if output :
116+ if output and ( expected == None or ( expected == "int" and output . isdigit () ) ) :
112117 return output
113118
114119 if kb .dbmsDetected :
@@ -179,7 +184,7 @@ def __goInferenceProxy(expression, fromUser=False):
179184 count = resume (countedExpression , payload )
180185
181186 if not stopLimit :
182- if not count :
187+ if not count or not count . isdigit () :
183188 count = __goInference (payload , countedExpression )
184189
185190 if count .isdigit () and int (count ) > 0 :
@@ -268,15 +273,15 @@ def __goInferenceProxy(expression, fromUser=False):
268273 limitedExpr += "NOT IN (%s" % (limitStr % num )
269274 limitedExpr += "%s %s)" % (expressionFieldsList [0 ], fromFrom )
270275
271- output = __goInferenceFields (limitedExpr , expressionFields , expressionFieldsList , payload )
276+ output = __goInferenceFields (limitedExpr , expressionFields , expressionFieldsList , payload , expected )
272277 outputs .append (output )
273278
274279 return outputs
275280
276281 elif kb .dbms == "Oracle" and expression .startswith ("SELECT " ) and " FROM " not in expression :
277282 expression = "%s FROM DUAL" % expression
278283
279- outputs = __goInferenceFields (expression , expressionFields , expressionFieldsList , payload )
284+ outputs = __goInferenceFields (expression , expressionFields , expressionFieldsList , payload , expected )
280285
281286 returnValue = ", " .join ([output for output in outputs ])
282287 else :
@@ -285,7 +290,7 @@ def __goInferenceProxy(expression, fromUser=False):
285290 return returnValue
286291
287292
288- def __goInband (expression ):
293+ def __goInband (expression , expected = None ):
289294 """
290295 Retrieve the output of a SQL query taking advantage of an inband SQL
291296 injection vulnerability on the affected parameter.
@@ -304,7 +309,7 @@ def __goInband(expression):
304309 if condition :
305310 output = resume (expression , None )
306311
307- if not output :
312+ if not output or ( expected == "int" and not output . isdigit () ) :
308313 partial = True
309314
310315 if not output :
@@ -355,7 +360,7 @@ def __goInband(expression):
355360 return data
356361
357362
358- def getValue (expression , blind = True , inband = True , fromUser = False ):
363+ def getValue (expression , blind = True , inband = True , fromUser = False , expected = None ):
359364 """
360365 Called each time sqlmap inject a SQL query on the SQL injection
361366 affected parameter. It can call a function to retrieve the output
@@ -368,9 +373,9 @@ def getValue(expression, blind=True, inband=True, fromUser=False):
368373 value = None
369374
370375 if inband and conf .unionUse and kb .dbms :
371- value = __goInband (expression )
376+ value = __goInband (expression , expected )
372377
373378 if blind and not value :
374- value = __goInferenceProxy (expression , fromUser )
379+ value = __goInferenceProxy (expression , fromUser , expected )
375380
376381 return value
0 commit comments