Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a5b2366

Browse files
committed
Implemented a better way to deal with % characters in parameters' value. Minor code restyle.
1 parent d664f03 commit a5b2366

8 files changed

Lines changed: 30 additions & 40 deletions

File tree

lib/controller/controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def start():
149149

150150
if setCookieAsInjectable:
151151
conf.httpHeaders.append(("Cookie", cookieStr))
152-
conf.parameters["Cookie"] = cookieStr
152+
conf.parameters["Cookie"] = cookieStr.replace("%", "%%")
153153
__paramDict = paramToDict("Cookie", cookieStr)
154154

155155
if __paramDict:

lib/core/common.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ def dataToStdout(data):
229229

230230

231231
def dataToSessionFile(data):
232+
if not conf.sessionFile:
233+
return
234+
232235
conf.sessionFP.write(data)
233236
conf.sessionFP.flush()
234237

@@ -494,7 +497,7 @@ def parseTargetUrl():
494497
conf.port = 80
495498

496499
if __urlSplit[3]:
497-
conf.parameters["GET"] = __urlSplit[3]
500+
conf.parameters["GET"] = __urlSplit[3].replace("%", "%%")
498501

499502
conf.url = "%s://%s:%d%s" % (conf.scheme, conf.hostname, conf.port, conf.path)
500503

lib/core/session.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ def setString():
4040
"""
4141

4242
condition = (
43-
conf.sessionFile and ( not kb.resumedQueries
44-
or ( kb.resumedQueries.has_key(conf.url) and
45-
not kb.resumedQueries[conf.url].has_key("String") ) )
43+
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
44+
not kb.resumedQueries[conf.url].has_key("String") )
4645
)
4746

4847
if condition:
@@ -59,8 +58,7 @@ def setInjection():
5958
kb.injParameter = conf.agent
6059

6160
condition = (
62-
kb.injPlace and kb.injParameter and
63-
conf.sessionFile and ( not kb.resumedQueries
61+
kb.injPlace and kb.injParameter and ( not kb.resumedQueries
6462
or ( kb.resumedQueries.has_key(conf.url) and
6563
( not kb.resumedQueries[conf.url].has_key("Injection point")
6664
or not kb.resumedQueries[conf.url].has_key("Injection parameter")
@@ -82,9 +80,8 @@ def setParenthesis(parenthesisCount):
8280
"""
8381

8482
condition = (
85-
conf.sessionFile and ( not kb.resumedQueries
86-
or ( kb.resumedQueries.has_key(conf.url) and
87-
not kb.resumedQueries[conf.url].has_key("Parenthesis") ) )
83+
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
84+
not kb.resumedQueries[conf.url].has_key("Parenthesis") )
8885
)
8986

9087
if condition:
@@ -101,9 +98,9 @@ def setDbms(dbms):
10198
"""
10299

103100
condition = (
104-
conf.sessionFile and ( not kb.resumedQueries
101+
not kb.resumedQueries
105102
or ( kb.resumedQueries.has_key(conf.url) and
106-
not kb.resumedQueries[conf.url].has_key("DBMS") ) )
103+
not kb.resumedQueries[conf.url].has_key("DBMS") )
107104
)
108105

109106
if condition:
@@ -133,11 +130,10 @@ def setUnion(comment=None, count=None, position=None):
133130

134131
if comment and count:
135132
condition = (
136-
conf.sessionFile and ( not kb.resumedQueries
137-
or ( kb.resumedQueries.has_key(conf.url) and
133+
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
138134
( not kb.resumedQueries[conf.url].has_key("Union comment")
139135
or not kb.resumedQueries[conf.url].has_key("Union count")
140-
) ) )
136+
) )
141137
)
142138

143139
if condition:
@@ -149,10 +145,9 @@ def setUnion(comment=None, count=None, position=None):
149145

150146
elif position:
151147
condition = (
152-
conf.sessionFile and ( not kb.resumedQueries
153-
or ( kb.resumedQueries.has_key(conf.url) and
148+
not kb.resumedQueries or ( kb.resumedQueries.has_key(conf.url) and
154149
( not kb.resumedQueries[conf.url].has_key("Union position")
155-
) ) )
150+
) )
156151
)
157152

158153
if condition:

lib/core/target.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def __setRequestParams():
6666
raise sqlmapSyntaxException, errMsg
6767

6868
if conf.data:
69-
conf.parameters["POST"] = conf.data
69+
conf.parameters["POST"] = conf.data.replace("%", "%%")
7070
__paramDict = paramToDict("POST", conf.data)
7171

7272
if __paramDict:
@@ -75,7 +75,7 @@ def __setRequestParams():
7575

7676
# Perform checks on Cookie parameters
7777
if conf.cookie:
78-
conf.parameters["Cookie"] = conf.cookie
78+
conf.parameters["Cookie"] = conf.cookie.replace("%", "%%")
7979
__paramDict = paramToDict("Cookie", conf.cookie)
8080

8181
if __paramDict:
@@ -86,7 +86,7 @@ def __setRequestParams():
8686
if conf.httpHeaders:
8787
for httpHeader, headerValue in conf.httpHeaders:
8888
if httpHeader == "User-Agent":
89-
conf.parameters["User-Agent"] = headerValue
89+
conf.parameters["User-Agent"] = headerValue.replace("%", "%%")
9090

9191
condition = not conf.testParameter
9292
condition |= "User-Agent" in conf.testParameter

lib/request/connect.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ def getPage(**kwargs):
8787
get = conf.parameters["GET"]
8888

8989
if get:
90-
get = urlencode(get)
90+
get = urlencode(get).replace("%%", "%")
9191
url = "%s?%s" % (url, get)
9292
requestMsg += "?%s" % get
9393
elif conf.method == "POST":
9494
if conf.parameters.has_key("POST") and not post:
9595
post = conf.parameters["POST"]
9696

97-
post = urlencode(post)
97+
post = urlencode(post).replace("%%", "%")
9898

9999
requestMsg += " HTTP/1.1"
100100

@@ -113,7 +113,7 @@ def getPage(**kwargs):
113113
if not cookieStr:
114114
cookieStr = "Cookie: "
115115

116-
cookie = str(cookie)
116+
cookie = str(cookie).replace("%%", "%")
117117
index = cookie.index(" for ")
118118

119119
cookieStr += "%s; " % cookie[8:index]

lib/request/inject.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ def __getFieldsProxy(expression):
5555
def __goInference(payload, expression):
5656
start = time.time()
5757

58-
if conf.sessionFile:
59-
dataToSessionFile("[%s][%s][%s][%s][" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression))
58+
dataToSessionFile("[%s][%s][%s][%s][" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression))
6059

6160
if ( conf.eta or conf.threads > 1 ) and kb.dbms:
6261
_, length, _ = queryOutputLength(expression, payload)
@@ -326,7 +325,7 @@ def __goInband(expression):
326325

327326
output = re.findall(regExpr, output, re.S)
328327

329-
if conf.sessionFile and ( partial or not condition ):
328+
if partial or not condition:
330329
logOutput = "".join(["__START__%s__STOP__" % replaceNewlineTabs(value) for value in output])
331330
dataToSessionFile("[%s][%s][%s][%s][%s]\n" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression, logOutput))
332331

lib/techniques/inference/blind.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,7 @@ def getChar(idx):
9292
queriesCount[0] += 1
9393
limit = ((maxValue + minValue) / 2)
9494

95-
# TODO: find a cleaner way to do this
96-
forgedPayload = payload.replace("%", "%%", 1) % (expressionUnescaped, idx, limit)
97-
forgedPayload = forgedPayload.replace("%%", "%")
95+
forgedPayload = payload % (expressionUnescaped, idx, limit)
9896

9997
result = Request.queryPage(forgedPayload)
10098

@@ -175,8 +173,7 @@ def downloadThread():
175173

176174
assert index[0] == length
177175

178-
if conf.sessionFile:
179-
dataToSessionFile(replaceNewlineTabs(value))
176+
dataToSessionFile(replaceNewlineTabs(value))
180177

181178
if conf.verbose in ( 1, 2 ) and not showEta:
182179
dataToStdout("\r[%s] [INFO] retrieved: %s" % (time.strftime("%X"), value))
@@ -195,8 +192,7 @@ def downloadThread():
195192

196193
value += val
197194

198-
if conf.sessionFile:
199-
dataToSessionFile(replaceNewlineTabs(val))
195+
dataToSessionFile(replaceNewlineTabs(val))
200196

201197
if showEta:
202198
etaProgressUpdate(time.time() - charStart, index)
@@ -210,7 +206,6 @@ def downloadThread():
210206
infoMsg = "retrieved: %s" % value
211207
logger.info(infoMsg)
212208

213-
if conf.sessionFile:
214-
dataToSessionFile("]\n")
209+
dataToSessionFile("]\n")
215210

216211
return queriesCount[0], value

lib/utils/resume.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,17 +146,15 @@ def resume(expression, payload):
146146
infoMsg += "%s" % resumedValue.split("\n")[0]
147147
logger.info(infoMsg)
148148

149-
if conf.sessionFile:
150-
dataToSessionFile("[%s][%s][%s][%s][%s]\n" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression, resumedValue))
149+
dataToSessionFile("[%s][%s][%s][%s][%s]\n" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression, resumedValue))
151150

152151
return resumedValue
153152
elif len(resumedValue) < int(length):
154153
infoMsg = "resumed from file '%s': " % conf.sessionFile
155154
infoMsg += "%s..." % resumedValue.split("\n")[0]
156155
logger.info(infoMsg)
157156

158-
if conf.sessionFile:
159-
dataToSessionFile("[%s][%s][%s][%s][%s" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression, resumedValue))
157+
dataToSessionFile("[%s][%s][%s][%s][%s" % (conf.url, kb.injPlace, conf.parameters[kb.injPlace], expression, resumedValue))
160158

161159
if select:
162160
newExpr = expressionUnescaped.replace(regExpr, substringQuery % (regExpr, len(resumedValue) + 1, int(length)), 1)

0 commit comments

Comments
 (0)