1111
1212from xml .etree import ElementTree as ET
1313
14+ from lib .core .common import getCompiledRegex
1415from lib .core .common import getInjectionCase
1516from lib .core .common import randomInt
1617from lib .core .common import randomStr
2021from lib .core .data import queries
2122from lib .core .datatype import advancedDict
2223from lib .core .exception import sqlmapNoneDataException
24+ from lib .core .settings import PAYLOAD_DELIMITER
2325
2426class Agent :
2527 """
@@ -54,18 +56,17 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, negativ
5456 falseValue = ""
5557 negValue = ""
5658 retValue = ""
57- newValue = urlencode (newValue ) if place != "URI" else newValue
5859
5960 if negative or kb .unionNegative :
6061 negValue = "-"
6162 elif falseCond or kb .unionFalseCond :
6263 randInt = randomInt ()
63- falseValue = urlencode ( " AND %d=%d" % (randInt , randInt + 1 ) )
64+ falseValue = " AND %d=%d" % (randInt , randInt + 1 )
6465
6566 # After identifing the injectable parameter
6667 if kb .injPlace == "User-Agent" :
6768 retValue = kb .injParameter .replace (kb .injParameter ,
68- "%s%s" % (negValue , kb .injParameter + falseValue + newValue ))
69+ self . addPayloadDelimiters ( "%s%s" % (negValue , kb .injParameter + falseValue + newValue ) ))
6970 elif kb .injParameter :
7071 paramString = conf .parameters [kb .injPlace ]
7172 paramDict = conf .paramDict [kb .injPlace ]
@@ -76,21 +77,21 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, negativ
7677 iterator = root .getiterator (kb .injParameter )
7778
7879 for child in iterator :
79- child .text = "%s%s" % (negValue , value + falseValue + newValue )
80+ child .text = self . addPayloadDelimiters (negValue + value + falseValue + newValue )
8081
8182 retValue = ET .tostring (root )
8283 elif kb .injPlace == "URI" :
8384 retValue = paramString .replace ("*" ,
84- "%s%s" % (negValue , falseValue + newValue ))
85+ self . addPayloadDelimiters ( "%s%s" % (negValue , falseValue + newValue ) ))
8586 else :
8687 retValue = paramString .replace ("%s=%s" % (kb .injParameter , value ),
87- "%s=%s%s " % (kb .injParameter , negValue , value + falseValue + newValue ))
88+ "%s=%s" % (kb .injParameter , self . addPayloadDelimiters ( negValue + value + falseValue + newValue ) ))
8889
8990 # Before identifing the injectable parameter
9091 elif parameter == "User-Agent" :
91- retValue = value .replace (value , newValue )
92+ retValue = value .replace (value , self . addPayloadDelimiters ( newValue ) )
9293 elif place == "URI" :
93- retValue = value .replace ("*" , "%s" % newValue .replace (value , str ()))
94+ retValue = value .replace ("*" , self . addPayloadDelimiters ( "%s" % newValue .replace (value , str () )))
9495 else :
9596 paramString = conf .parameters [place ]
9697
@@ -99,12 +100,12 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, negativ
99100 iterator = root .getiterator (parameter )
100101
101102 for child in iterator :
102- child .text = newValue
103+ child .text = self . addPayloadDelimiters ( newValue )
103104
104105 retValue = ET .tostring (root )
105106 else :
106107 retValue = paramString .replace ("%s=%s" % (parameter , value ),
107- "%s=%s" % (parameter , newValue ))
108+ "%s=%s" % (parameter , self . addPayloadDelimiters ( newValue ) ))
108109
109110 return retValue
110111
@@ -604,5 +605,60 @@ def forgeCaseStatement(self, expression):
604605
605606 return queries [kb .dbms ].case .query % expression
606607
608+ def addPayloadDelimiters (self , inpStr ):
609+ """
610+ Adds payload delimiters around the input string
611+ """
612+ retVal = inpStr
613+
614+ if inpStr :
615+ retVal = "%s%s%s" % (PAYLOAD_DELIMITER , inpStr , PAYLOAD_DELIMITER )
616+
617+ return retVal
618+
619+ def removePayloadDelimiters (self , inpStr , urlencode_ = True ):
620+ """
621+ Removes payload delimiters from inside the input string
622+ """
623+ retVal = inpStr
624+
625+ if inpStr :
626+ if urlencode_ :
627+ regObj = getCompiledRegex ("(?P<result>%s.*?%s)" % (PAYLOAD_DELIMITER , PAYLOAD_DELIMITER ))
628+
629+ for match in regObj .finditer (inpStr ):
630+ retVal = retVal .replace (match .group ("result" ), urlencode (match .group ("result" )[1 :- 1 ]))
631+ else :
632+ retVal = retVal .replace (PAYLOAD_DELIMITER , '' )
633+
634+ return retVal
635+
636+ def extractPayload (self , inpStr ):
637+ """
638+ Extracts payload from inside of the input string
639+ """
640+ retVal = None
641+
642+ if inpStr :
643+ regObj = getCompiledRegex ("(?P<result>%s.*?%s)" % (PAYLOAD_DELIMITER , PAYLOAD_DELIMITER ))
644+ match = regObj .search (inpStr )
645+
646+ if match :
647+ retVal = match .group ("result" )[1 :- 1 ]
648+
649+ return retVal
650+
651+ def replacePayload (self , inpStr , payload ):
652+ """
653+ Replaces payload inside the input string with a given payload
654+ """
655+ retVal = inpStr
656+
657+ if inpStr :
658+ regObj = getCompiledRegex ("(?P<result>%s.*?%s)" % (PAYLOAD_DELIMITER , PAYLOAD_DELIMITER ))
659+ retVal = regObj .sub ("%s%s%s" % (PAYLOAD_DELIMITER , payload , PAYLOAD_DELIMITER ), inpStr )
660+
661+ return retVal
662+
607663# SQL agent
608664agent = Agent ()
0 commit comments