@@ -103,104 +103,108 @@ def resume(expression, payload):
103103 This function can be called to resume part or entire output of a
104104 SQL injection query output.
105105 """
106+ try :
107+ if "sqlmapfile" in expression or "sqlmapoutput" in expression :
108+ return None
106109
107- if "sqlmapfile" in expression or "sqlmapoutput" in expression :
108- return None
109-
110- condition = (
111- kb .resumedQueries and conf .url in kb .resumedQueries .keys ()
112- and expression in kb .resumedQueries [conf .url ].keys ()
113- )
110+ condition = (
111+ kb .resumedQueries and conf .url in kb .resumedQueries .keys ()
112+ and expression in kb .resumedQueries [conf .url ].keys ()
113+ )
114114
115- if not condition :
116- return None
115+ if not condition :
116+ return None
117117
118- resumedValue = kb .resumedQueries [conf .url ][expression ]
118+ resumedValue = kb .resumedQueries [conf .url ][expression ]
119119
120- if not resumedValue :
121- return None
120+ if not resumedValue :
121+ return None
122122
123- resumedValue = resumedValue .replace ("__NEWLINE__" , "\n " ).replace ("__TAB__" , "\t " )
123+ resumedValue = resumedValue .replace ("__NEWLINE__" , "\n " ).replace ("__TAB__" , "\t " )
124124
125- if resumedValue [- 1 ] == "]" :
126- resumedValue = resumedValue [:- 1 ]
125+ if resumedValue [- 1 ] == "]" :
126+ resumedValue = resumedValue [:- 1 ]
127127
128- infoMsg = "read from file '%s': " % conf .sessionFile
129- logValue = re .findall ("__START__(.*?)__STOP__" , resumedValue , re .S )
128+ infoMsg = "read from file '%s': " % conf .sessionFile
129+ logValue = re .findall ("__START__(.*?)__STOP__" , resumedValue , re .S )
130130
131- if logValue :
132- logValue = ", " .join ([value .replace ("__DEL__" , ", " ) for value in logValue ])
133- else :
134- logValue = resumedValue
131+ if logValue :
132+ logValue = ", " .join ([value .replace ("__DEL__" , ", " ) for value in logValue ])
133+ else :
134+ logValue = resumedValue
135135
136- if "\n " in logValue :
137- infoMsg += "%s..." % logValue .split ("\n " )[0 ]
138- else :
139- infoMsg += logValue
136+ if "\n " in logValue :
137+ infoMsg += "%s..." % logValue .split ("\n " )[0 ]
138+ else :
139+ infoMsg += logValue
140140
141- logger .info (infoMsg )
141+ logger .info (infoMsg )
142142
143- return resumedValue
143+ return resumedValue
144144
145- # If we called this function without providing a payload it means that
146- # we have called it from lib/request/inject __goInband() function
147- # in UNION query (inband) SQL injection so we return to the calling
148- # function so that the query output will be retrieved taking advantage
149- # of the inband SQL injection vulnerability.
150- if not payload :
151- return None
145+ # If we called this function without providing a payload it means that
146+ # we have called it from lib/request/inject __goInband() function
147+ # in UNION query (inband) SQL injection so we return to the calling
148+ # function so that the query output will be retrieved taking advantage
149+ # of the inband SQL injection vulnerability.
150+ if not payload :
151+ return None
152152
153- if not kb .dbms :
154- return None
153+ if not kb .dbms :
154+ return None
155155
156- substringQuery = queries [kb .dbms ].substring
157- select = re .search ("\ASELECT " , expression , re .I )
156+ substringQuery = queries [kb .dbms ].substring
157+ select = re .search ("\ASELECT " , expression , re .I )
158158
159- _ , length , regExpr = queryOutputLength (expression , payload )
159+ _ , length , regExpr = queryOutputLength (expression , payload )
160160
161- if not length :
162- return None
161+ if not length :
162+ return None
163163
164- if len (resumedValue ) == int (length ):
165- infoMsg = "read from file '%s': " % conf .sessionFile
166- infoMsg += "%s" % resumedValue .split ("\n " )[0 ]
167- logger .info (infoMsg )
164+ if len (resumedValue ) == int (length ):
165+ infoMsg = "read from file '%s': " % conf .sessionFile
166+ infoMsg += "%s" % resumedValue .split ("\n " )[0 ]
167+ logger .info (infoMsg )
168168
169- dataToSessionFile ("[%s][%s][%s][%s][%s]\n " % (conf .url , kb .injPlace , conf .parameters [kb .injPlace ], expression , replaceNewlineTabs (resumedValue )))
169+ dataToSessionFile ("[%s][%s][%s][%s][%s]\n " % (conf .url , kb .injPlace , conf .parameters [kb .injPlace ], expression , replaceNewlineTabs (resumedValue )))
170170
171- return resumedValue
172- elif len (resumedValue ) < int (length ):
173- infoMsg = "resumed from file '%s': " % conf .sessionFile
174- infoMsg += "%s..." % resumedValue .split ("\n " )[0 ]
175- logger .info (infoMsg )
171+ return resumedValue
172+ elif len (resumedValue ) < int (length ):
173+ infoMsg = "resumed from file '%s': " % conf .sessionFile
174+ infoMsg += "%s..." % resumedValue .split ("\n " )[0 ]
175+ logger .info (infoMsg )
176176
177- dataToSessionFile ("[%s][%s][%s][%s][%s" % (conf .url , kb .injPlace , conf .parameters [kb .injPlace ], expression , replaceNewlineTabs (resumedValue )))
177+ dataToSessionFile ("[%s][%s][%s][%s][%s" % (conf .url , kb .injPlace , conf .parameters [kb .injPlace ], expression , replaceNewlineTabs (resumedValue )))
178178
179- if select :
180- newExpr = expression .replace (regExpr , safeStringFormat (substringQuery , (regExpr , len (resumedValue ) + 1 , int (length ))), 1 )
181- else :
182- newExpr = safeStringFormat (substringQuery , (expression , len (resumedValue ) + 1 , int (length )))
179+ if select :
180+ newExpr = expression .replace (regExpr , safeStringFormat (substringQuery , (regExpr , len (resumedValue ) + 1 , int (length ))), 1 )
181+ else :
182+ newExpr = safeStringFormat (substringQuery , (expression , len (resumedValue ) + 1 , int (length )))
183183
184- missingCharsLength = int (length ) - len (resumedValue )
184+ missingCharsLength = int (length ) - len (resumedValue )
185185
186- infoMsg = "retrieving pending %d query " % missingCharsLength
187- infoMsg += "output characters"
188- logger .info (infoMsg )
186+ infoMsg = "retrieving pending %d query " % missingCharsLength
187+ infoMsg += "output characters"
188+ logger .info (infoMsg )
189189
190- start = time .time ()
191- count , finalValue = bisection (payload , newExpr , length = missingCharsLength )
190+ start = time .time ()
191+ count , finalValue = bisection (payload , newExpr , length = missingCharsLength )
192192
193- debugMsg = "performed %d queries in %d seconds" % (count , calculateDeltaSeconds (start ))
194- logger .debug (debugMsg )
193+ debugMsg = "performed %d queries in %d seconds" % (count , calculateDeltaSeconds (start ))
194+ logger .debug (debugMsg )
195195
196- if len (finalValue ) != ( int (length ) - len (resumedValue ) ):
197- warnMsg = "the total length of the query is not "
198- warnMsg += "right, sqlmap is going to retrieve the "
199- warnMsg += "query value from the beginning now"
200- logger .warn (warnMsg )
196+ if len (finalValue ) != ( int (length ) - len (resumedValue ) ):
197+ warnMsg = "the total length of the query is not "
198+ warnMsg += "right, sqlmap is going to retrieve the "
199+ warnMsg += "query value from the beginning now"
200+ logger .warn (warnMsg )
201201
202- return None
202+ return None
203203
204- return "%s%s" % (resumedValue , finalValue )
204+ return "%s%s" % (resumedValue , finalValue )
205205
206- return None
206+ return None
207+ except :
208+ errMsg = "invalid resume value for expression: '%s'" % expression
209+ logger .error (errMsg )
210+ return None
0 commit comments