1414import tempfile
1515import time
1616
17- from lib .core .common import dataToSessionFile
17+ from lib .core .common import Backend
1818from lib .core .common import hashDBRetrieve
1919from lib .core .common import intersect
2020from lib .core .common import paramToDict
3737from lib .core .option import authHandler
3838from lib .core .option import __setDBMS
3939from lib .core .option import __setKnowledgeBaseAttributes
40- from lib .core .session import resumeConfKb
4140from lib .core .settings import CUSTOM_INJECTION_MARK_CHAR
4241from lib .core .settings import HOST_ALIASES
4342from lib .core .settings import REFERER_ALIASES
4443from lib .core .settings import RESULTS_FILE_FORMAT
4544from lib .core .settings import SOAP_REGEX
45+ from lib .core .settings import SUPPORTED_DBMS
4646from lib .core .settings import UNENCODED_ORIGINAL_VALUE
4747from lib .core .settings import UNICODE_ENCODING
48+ from lib .core .settings import UNKNOWN_DBMS_VERSION
4849from lib .core .settings import URI_INJECTABLE_REGEX
4950from lib .core .settings import USER_AGENT_ALIASES
5051from lib .utils .hashdb import HashDB
@@ -243,78 +244,79 @@ def __resumeHashDBValues():
243244 if injection not in kb .injections :
244245 kb .injections .append (injection )
245246
246- def __setOutputResume ():
247+ __resumeDBMS ()
248+ __resumeOS ()
249+
250+ def __resumeDBMS ():
247251 """
248- Check and set the output text file and the resume functionality.
252+ Resume stored DBMS information from HashDB
249253 """
250254
251- if not conf .sessionFile :
252- conf .sessionFile = "%s%ssession" % (conf .outputPath , os .sep )
253-
254- logger .info ("using '%s' as a session file" % conf .sessionFile )
255-
256- if os .path .exists (conf .sessionFile ):
257- if not conf .flushSession :
258- try :
259- readSessionFP = codecs .open (conf .sessionFile , "r" , UNICODE_ENCODING , 'replace' )
260- __url_cache = set ()
261- __expression_cache = {}
255+ value = hashDBRetrieve (HASHDB_KEYS .DBMS )
262256
263- for line in readSessionFP .readlines (): # xreadlines doesn't return unicode strings when codec.open() is used
264- if line .count ("][" ) == 4 :
265- line = line .split ("][" )
266-
267- if len (line ) != 5 :
268- continue
257+ if not value :
258+ return
269259
270- url , _ , _ , expression , value = line
260+ dbms = value .lower ()
261+ dbmsVersion = [UNKNOWN_DBMS_VERSION ]
262+ _ = "(%s)" % ("|" .join ([alias for alias in SUPPORTED_DBMS ]))
263+ _ = re .search ("%s ([\d\.]+)" % _ , dbms , re .I )
264+
265+ if _ :
266+ dbms = _ .group (1 ).lower ()
267+ dbmsVersion = [_ .group (2 )]
268+
269+ if conf .dbms :
270+ if conf .dbms .lower () != dbms :
271+ message = "you provided '%s' as back-end DBMS, " % conf .dbms
272+ message += "but from a past scan information on the target URL "
273+ message += "sqlmap assumes the back-end DBMS is %s. " % dbms
274+ message += "Do you really want to force the back-end "
275+ message += "DBMS value? [y/N] "
276+ test = readInput (message , default = "N" )
277+
278+ if not test or test [0 ] in ("n" , "N" ):
279+ conf .dbms = None
280+ Backend .setDbms (dbms )
281+ Backend .setVersionList (dbmsVersion )
282+ else :
283+ infoMsg = "resuming back-end DBMS '%s' " % dbms
284+ logger .info (infoMsg )
271285
272- if not value :
273- continue
286+ Backend . setDbms ( dbms )
287+ Backend . setVersionList ( dbmsVersion )
274288
275- if url [0 ] == "[" :
276- url = url [1 :]
289+ def __resumeOS ():
290+ """
291+ Resume stored OS information from HashDB
292+ """
277293
278- value = value . rstrip ( ' \r \n ' ) # Strips both chars independently
294+ value = hashDBRetrieve ( HASHDB_KEYS . OS )
279295
280- if url not in ( conf . url , conf . hostname ) :
281- continue
296+ if not value :
297+ return
282298
283- if url not in __url_cache :
284- kb .resumedQueries [url ] = {}
285- kb .resumedQueries [url ][expression ] = value
286- __url_cache .add (url )
287- __expression_cache [url ] = set (expression )
299+ os = value
288300
289- resumeConfKb (expression , url , value )
301+ if os and os != 'None' :
302+ infoMsg = "resuming back-end DBMS operating system '%s' " % os
303+ logger .info (infoMsg )
290304
291- if expression not in __expression_cache [url ]:
292- kb .resumedQueries [url ][expression ] = value
293- __expression_cache [url ].add (value )
294- elif len (value ) >= len (kb .resumedQueries [url ][expression ]):
295- kb .resumedQueries [url ][expression ] = value
305+ if conf .os and conf .os .lower () != os .lower ():
306+ message = "you provided '%s' as back-end DBMS operating " % conf .os
307+ message += "system, but from a past scan information on the "
308+ message += "target URL sqlmap assumes the back-end DBMS "
309+ message += "operating system is %s. " % os
310+ message += "Do you really want to force the back-end DBMS "
311+ message += "OS value? [y/N] "
312+ test = readInput (message , default = "N" )
296313
297- if kb .injection .place is not None and kb .injection .parameter is not None :
298- kb .injections .append (kb .injection )
299- except IOError , msg :
300- errMsg = "unable to properly open the session file (%s)" % msg
301- raise sqlmapFilePathException , errMsg
302- else :
303- readSessionFP .close ()
314+ if not test or test [0 ] in ("n" , "N" ):
315+ conf .os = os
304316 else :
305- try :
306- os .remove (conf .sessionFile )
307- logger .info ("flushing session file" )
308- except OSError , msg :
309- errMsg = "unable to flush the session file (%s)" % msg
310- raise sqlmapFilePathException , errMsg
317+ conf .os = os
311318
312- try :
313- conf .sessionFP = codecs .open (conf .sessionFile , "a" , UNICODE_ENCODING )
314- dataToSessionFile ("\n [%s]\n " % time .strftime ("%X %x" ))
315- except IOError :
316- errMsg = "unable to write on the session file specified"
317- raise sqlmapFilePathException , errMsg
319+ Backend .setOs (conf .os )
318320
319321def __setResultsFile ():
320322 """
@@ -435,7 +437,6 @@ def initTargetEnv():
435437
436438 conf .paramDict = {}
437439 conf .parameters = {}
438- conf .sessionFile = None
439440 conf .hashDBFile = None
440441
441442 __setKnowledgeBaseAttributes (False )
@@ -445,7 +446,6 @@ def initTargetEnv():
445446def setupTargetEnv ():
446447 __createTargetDirs ()
447448 __setRequestParams ()
448- __setOutputResume ()
449449 __setHashDB ()
450450 __resumeHashDBValues ()
451451 __setResultsFile ()
0 commit comments