1313
1414from lib .core .common import getCompiledRegex
1515from lib .core .common import getErrorParsedDBMSes
16+ from lib .core .common import getIdentifiedDBMS
1617from lib .core .common import isDBMSVersionAtLeast
1718from lib .core .common import isTechniqueAvailable
1819from lib .core .common import randomInt
@@ -33,13 +34,6 @@ class Agent:
3334 This class defines the SQL agent methods.
3435 """
3536
36- def __init__ (self ):
37- kb .misc = advancedDict ()
38- kb .misc .delimiter = randomStr (length = 6 )
39- kb .misc .start = ":%s:" % randomStr (length = 3 , lowercase = True )
40- kb .misc .stop = ":%s:" % randomStr (length = 3 , lowercase = True )
41- kb .misc .space = ":%s:" % randomStr (length = 1 , lowercase = True )
42-
4337 def payloadDirect (self , query ):
4438 if query .startswith ("AND " ):
4539 query = query .replace ("AND " , "SELECT " , 1 )
@@ -211,8 +205,8 @@ def cleanupPayload(self, payload, origvalue=None, query=None):
211205 payload = payload .replace ("[ORIGVALUE]" , origvalue )
212206
213207 if "[INFERENCE]" in payload :
214- if kb . dbms is not None :
215- inference = queries [kb . dbms ].inference
208+ if getIdentifiedDBMS () is not None :
209+ inference = queries [getIdentifiedDBMS () ].inference
216210
217211 if "dbms_version" in inference :
218212 if isDBMSVersionAtLeast (inference .dbms_version ):
@@ -223,11 +217,6 @@ def cleanupPayload(self, payload, origvalue=None, query=None):
223217 inferenceQuery = inference .query
224218
225219 payload = payload .replace ("[INFERENCE]" , inferenceQuery )
226-
227- elif hasattr (kb .misc , "testedDbms" ) and kb .misc .testedDbms is not None :
228- inferenceQuery = queries [kb .misc .testedDbms ].inference .query
229- payload = payload .replace ("[INFERENCE]" , inferenceQuery )
230-
231220 else :
232221 errMsg = "invalid usage of inference payload without "
233222 errMsg += "knowledge of underlying DBMS"
@@ -275,17 +264,17 @@ def nullAndCastField(self, field):
275264
276265 # SQLite version 2 does not support neither CAST() nor IFNULL(),
277266 # introduced only in SQLite version 3
278- if kb . dbms == DBMS .SQLITE :
267+ if getIdentifiedDBMS () == DBMS .SQLITE :
279268 return field
280269
281270 if field .startswith ("(CASE" ):
282271 nulledCastedField = field
283272 else :
284- nulledCastedField = queries [kb . dbms ].cast .query % field
285- if kb . dbms == DBMS .ACCESS :
286- nulledCastedField = queries [kb . dbms ].isnull .query % (nulledCastedField , nulledCastedField )
273+ nulledCastedField = queries [getIdentifiedDBMS () ].cast .query % field
274+ if getIdentifiedDBMS () == DBMS .ACCESS :
275+ nulledCastedField = queries [getIdentifiedDBMS () ].isnull .query % (nulledCastedField , nulledCastedField )
287276 else :
288- nulledCastedField = queries [kb . dbms ].isnull .query % nulledCastedField
277+ nulledCastedField = queries [getIdentifiedDBMS () ].isnull .query % nulledCastedField
289278
290279 return nulledCastedField
291280
@@ -324,7 +313,7 @@ def nullCastConcatFields(self, fields):
324313
325314 fields = fields .replace (", " , "," )
326315 fieldsSplitted = fields .split ("," )
327- dbmsDelimiter = queries [kb . dbms ].delimiter .query
316+ dbmsDelimiter = queries [getIdentifiedDBMS () ].delimiter .query
328317 nulledCastedFields = []
329318
330319 for field in fieldsSplitted :
@@ -383,13 +372,13 @@ def getFields(self, query):
383372 def simpleConcatQuery (self , query1 , query2 ):
384373 concatenatedQuery = ""
385374
386- if kb . dbms == DBMS .MYSQL :
375+ if getIdentifiedDBMS () == DBMS .MYSQL :
387376 concatenatedQuery = "CONCAT(%s,%s)" % (query1 , query2 )
388377
389- elif kb . dbms in ( DBMS .PGSQL , DBMS .ORACLE , DBMS .SQLITE ):
378+ elif getIdentifiedDBMS () in ( DBMS .PGSQL , DBMS .ORACLE , DBMS .SQLITE ):
390379 concatenatedQuery = "%s||%s" % (query1 , query2 )
391380
392- elif kb . dbms in (DBMS .MSSQL , DBMS .SYBASE ):
381+ elif getIdentifiedDBMS () in (DBMS .MSSQL , DBMS .SYBASE ):
393382 concatenatedQuery = "%s+%s" % (query1 , query2 )
394383
395384 return concatenatedQuery
@@ -431,7 +420,7 @@ def concatQuery(self, query, unpack=True):
431420 concatenatedQuery = query
432421 fieldsSelectFrom , fieldsSelect , fieldsNoSelect , fieldsSelectTop , fieldsSelectCase , _ , fieldsToCastStr = self .getFields (query )
433422
434- if kb . dbms == DBMS .MYSQL :
423+ if getIdentifiedDBMS () == DBMS .MYSQL :
435424 if fieldsSelectCase :
436425 concatenatedQuery = concatenatedQuery .replace ("SELECT " , "CONCAT('%s'," % kb .misc .start , 1 )
437426 concatenatedQuery += ",'%s')" % kb .misc .stop
@@ -444,7 +433,7 @@ def concatQuery(self, query, unpack=True):
444433 elif fieldsNoSelect :
445434 concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb .misc .start , concatenatedQuery , kb .misc .stop )
446435
447- elif kb . dbms in ( DBMS .PGSQL , DBMS .ORACLE , DBMS .SQLITE ):
436+ elif getIdentifiedDBMS () in ( DBMS .PGSQL , DBMS .ORACLE , DBMS .SQLITE ):
448437 if fieldsSelectCase :
449438 concatenatedQuery = concatenatedQuery .replace ("SELECT " , "'%s'||" % kb .misc .start , 1 )
450439 concatenatedQuery += "||'%s'" % kb .misc .stop
@@ -457,10 +446,10 @@ def concatQuery(self, query, unpack=True):
457446 elif fieldsNoSelect :
458447 concatenatedQuery = "'%s'||%s||'%s'" % (kb .misc .start , concatenatedQuery , kb .misc .stop )
459448
460- if kb . dbms == DBMS .ORACLE and " FROM " not in concatenatedQuery and ( fieldsSelect or fieldsNoSelect ):
449+ if getIdentifiedDBMS () == DBMS .ORACLE and " FROM " not in concatenatedQuery and ( fieldsSelect or fieldsNoSelect ):
461450 concatenatedQuery += " FROM DUAL"
462451
463- elif kb . dbms in (DBMS .MSSQL , DBMS .SYBASE ):
452+ elif getIdentifiedDBMS () in (DBMS .MSSQL , DBMS .SYBASE ):
464453 if fieldsSelectTop :
465454 topNum = re .search ("\ASELECT\s+TOP\s+([\d]+)\s+" , concatenatedQuery , re .I ).group (1 )
466455 concatenatedQuery = concatenatedQuery .replace ("SELECT TOP %s " % topNum , "TOP %s '%s'+" % (topNum , kb .misc .start ), 1 )
@@ -511,13 +500,13 @@ def forgeInbandQuery(self, query, position, count, comment, prefix, suffix, char
511500 """
512501
513502 if query .startswith ("SELECT " ):
514- query = query [len ("SELECT " ):]
503+ query = query [len ("SELECT " ):]
515504
516505 inbandQuery = self .prefixQuery ("UNION ALL SELECT " , prefix = prefix )
517506
518507 if query .startswith ("TOP" ):
519- topNum = re .search ("\ATOP\s+([\d]+)\s+" , query , re .I ).group (1 )
520- query = query [len ("TOP %s " % topNum ):]
508+ topNum = re .search ("\ATOP\s+([\d]+)\s+" , query , re .I ).group (1 )
509+ query = query [len ("TOP %s " % topNum ):]
521510 inbandQuery += "TOP %s " % topNum
522511
523512 intoRegExp = re .search ("(\s+INTO (DUMP|OUT)FILE\s+\' (.+?)\' )" , query , re .I )
@@ -526,7 +515,7 @@ def forgeInbandQuery(self, query, position, count, comment, prefix, suffix, char
526515 intoRegExp = intoRegExp .group (1 )
527516 query = query [:query .index (intoRegExp )]
528517
529- if kb . dbms == DBMS .ORACLE and inbandQuery .endswith (" FROM DUAL" ):
518+ if getIdentifiedDBMS () == DBMS .ORACLE and inbandQuery .endswith (" FROM DUAL" ):
530519 inbandQuery = inbandQuery [:- len (" FROM DUAL" )]
531520
532521 for element in range (count ):
@@ -546,7 +535,7 @@ def forgeInbandQuery(self, query, position, count, comment, prefix, suffix, char
546535 conditionIndex = query .index (" FROM " )
547536 inbandQuery += query [conditionIndex :]
548537
549- if kb . dbms == DBMS .ORACLE or DBMS . ORACLE in getErrorParsedDBMSes () :
538+ if getIdentifiedDBMS () == DBMS .ORACLE :
550539 if " FROM " not in inbandQuery :
551540 inbandQuery += " FROM DUAL"
552541
@@ -565,7 +554,7 @@ def forgeInbandQuery(self, query, position, count, comment, prefix, suffix, char
565554 else :
566555 inbandQuery += char
567556
568- if kb . dbms == DBMS .ORACLE :
557+ if getIdentifiedDBMS () == DBMS .ORACLE :
569558 inbandQuery += " FROM DUAL"
570559
571560 inbandQuery = self .suffixQuery (inbandQuery , comment , suffix )
@@ -595,21 +584,21 @@ def limitQuery(self, num, query, field=None):
595584 """
596585
597586 limitedQuery = query
598- limitStr = queries [kb . dbms ].limit .query
587+ limitStr = queries [getIdentifiedDBMS () ].limit .query
599588 fromIndex = limitedQuery .index (" FROM " )
600589 untilFrom = limitedQuery [:fromIndex ]
601590 fromFrom = limitedQuery [fromIndex + 1 :]
602591 orderBy = False
603592
604- if kb . dbms in ( DBMS .MYSQL , DBMS .PGSQL , DBMS .SQLITE ):
605- limitStr = queries [kb . dbms ].limit .query % (num , 1 )
593+ if getIdentifiedDBMS () in ( DBMS .MYSQL , DBMS .PGSQL , DBMS .SQLITE ):
594+ limitStr = queries [getIdentifiedDBMS () ].limit .query % (num , 1 )
606595 limitedQuery += " %s" % limitStr
607596
608- elif kb . dbms == DBMS .FIREBIRD :
609- limitStr = queries [kb . dbms ].limit .query % (num + 1 , num + 1 )
597+ elif getIdentifiedDBMS () == DBMS .FIREBIRD :
598+ limitStr = queries [getIdentifiedDBMS () ].limit .query % (num + 1 , num + 1 )
610599 limitedQuery += " %s" % limitStr
611600
612- elif kb . dbms == DBMS .ORACLE :
601+ elif getIdentifiedDBMS () == DBMS .ORACLE :
613602 if " ORDER BY " in limitedQuery and "(SELECT " in limitedQuery :
614603 orderBy = limitedQuery [limitedQuery .index (" ORDER BY " ):]
615604 limitedQuery = limitedQuery [:limitedQuery .index (" ORDER BY " )]
@@ -621,7 +610,7 @@ def limitQuery(self, num, query, field=None):
621610 limitedQuery = limitedQuery % fromFrom
622611 limitedQuery += "=%d" % (num + 1 )
623612
624- elif kb . dbms in (DBMS .MSSQL , DBMS .SYBASE ):
613+ elif getIdentifiedDBMS () in (DBMS .MSSQL , DBMS .SYBASE ):
625614 forgeNotIn = True
626615
627616 if " ORDER BY " in limitedQuery :
@@ -635,7 +624,7 @@ def limitQuery(self, num, query, field=None):
635624 limitedQuery = limitedQuery .replace ("DISTINCT %s" % notDistinct , notDistinct )
636625
637626 if limitedQuery .startswith ("SELECT TOP " ) or limitedQuery .startswith ("TOP " ):
638- topNums = re .search (queries [kb . dbms ].limitregexp .query , limitedQuery , re .I )
627+ topNums = re .search (queries [getIdentifiedDBMS () ].limitregexp .query , limitedQuery , re .I )
639628
640629 if topNums :
641630 topNums = topNums .groups ()
@@ -681,7 +670,7 @@ def forgeCaseStatement(self, expression):
681670 @rtype: C{str}
682671 """
683672
684- return queries [kb . dbms if kb . dbms else kb . misc . testedDbms ].case .query % expression
673+ return queries [getIdentifiedDBMS () ].case .query % expression
685674
686675 def addPayloadDelimiters (self , inpStr ):
687676 """
0 commit comments