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

Skip to content

Commit 84bc264

Browse files
committed
Minor adjustment on private request
1 parent fced29a commit 84bc264

3 files changed

Lines changed: 15 additions & 16 deletions

File tree

lib/core/agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def payload(self, place=None, parameter=None, value=None, newValue=None, where=N
191191

192192
if kb.postHint == POST_HINT.JSON and not isNumber(newValue) and '"%s"' % _ not in paramString:
193193
newValue = '"%s"' % self.addPayloadDelimiters(newValue)
194-
elif kb.postHint == POST_HINT.JSON_LIKE and not isNumber(newValue) and "'%s'" % _ not in paramString:
194+
elif kb.postHint == POST_HINT.JSON_LIKE and not isNumber(newValue) and re.search(r"['\"]%s['\"]" % re.escape(_), paramString) is None:
195195
newValue = "'%s'" % self.addPayloadDelimiters(newValue)
196196
else:
197197
newValue = self.addPayloadDelimiters(newValue)

lib/core/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from thirdparty.six import unichr as _unichr
1919

2020
# sqlmap version (<major>.<minor>.<month>.<monthly commit>)
21-
VERSION = "1.4.7.23"
21+
VERSION = "1.4.7.24"
2222
TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable"
2323
TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34}
2424
VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)
@@ -817,7 +817,7 @@
817817
JSON_RECOGNITION_REGEX = r'(?s)\A(\s*\[)*\s*\{.*"[^"]+"\s*:\s*("[^"]*"|\d+|true|false|null|\[).*\}\s*(\]\s*)*\Z'
818818

819819
# Regular expression used for detecting JSON-like POST data
820-
JSON_LIKE_RECOGNITION_REGEX = r"(?s)\A(\s*\[)*\s*\{.*'[^']+'\s*:\s*('[^']+'|\d+).*\}\s*(\]\s*)*\Z"
820+
JSON_LIKE_RECOGNITION_REGEX = r"(?s)\A(\s*\[)*\s*\{.*('[^']+'|\"[^\"]+\"|\w+)\s*:\s*('[^']+'|\"[^\"]+\"|\d+).*\}\s*(\]\s*)*\Z"
821821

822822
# Regular expression used for detecting multipart POST data
823823
MULTIPART_RECOGNITION_REGEX = r"(?i)Content-Disposition:[^;]+;\s*name="

lib/core/target.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def process(match, repl):
120120
else:
121121
break
122122
if kb.customInjectionMark in retVal:
123-
hintNames.append((retVal.split(kb.customInjectionMark)[0], match.group("name")))
123+
hintNames.append((retVal.split(kb.customInjectionMark)[0], match.group("name").strip('"\'') if kb.postHint == POST_HINT.JSON_LIKE else match.group("name")))
124124

125125
return retVal
126126

@@ -145,6 +145,7 @@ def process(match, repl):
145145
if choice == 'Q':
146146
raise SqlmapUserQuitException
147147
elif choice == 'Y':
148+
kb.postHint = POST_HINT.JSON
148149
if not (kb.processUserMarks and kb.customInjectionMark in conf.data):
149150
conf.data = getattr(conf.data, UNENCODED_ORIGINAL_VALUE, conf.data)
150151
conf.data = conf.data.replace(kb.customInjectionMark, ASTERISK_MARKER)
@@ -159,8 +160,6 @@ def process(match, repl):
159160
_ = re.sub(r'(\A|,|\s+)(-?\d[\d\.]*\b)', r'\g<0>%s' % kb.customInjectionMark, _)
160161
conf.data = conf.data.replace(match.group(0), match.group(0).replace(match.group(2), _))
161162

162-
kb.postHint = POST_HINT.JSON
163-
164163
elif re.search(JSON_LIKE_RECOGNITION_REGEX, conf.data):
165164
message = "JSON-like data found in %s body. " % conf.method
166165
message += "Do you want to process it? [Y/n/q] "
@@ -169,13 +168,16 @@ def process(match, repl):
169168
if choice == 'Q':
170169
raise SqlmapUserQuitException
171170
elif choice == 'Y':
171+
kb.postHint = POST_HINT.JSON_LIKE
172172
if not (kb.processUserMarks and kb.customInjectionMark in conf.data):
173173
conf.data = getattr(conf.data, UNENCODED_ORIGINAL_VALUE, conf.data)
174174
conf.data = conf.data.replace(kb.customInjectionMark, ASTERISK_MARKER)
175-
conf.data = re.sub(r"('(?P<name>[^']+)'\s*:\s*'[^']+)'", functools.partial(process, repl=r"\g<1>%s'" % kb.customInjectionMark), conf.data)
176-
conf.data = re.sub(r"('(?P<name>[^']+)'\s*:\s*)(-?\d[\d\.]*\b)", functools.partial(process, repl=r"\g<0>%s" % kb.customInjectionMark), conf.data)
177-
178-
kb.postHint = POST_HINT.JSON_LIKE
175+
if '"' in conf.data:
176+
conf.data = re.sub(r'((?P<name>"[^"]+"|\w+)\s*:\s*"[^"]+)"', functools.partial(process, repl=r'\g<1>%s"' % kb.customInjectionMark), conf.data)
177+
conf.data = re.sub(r'((?P<name>"[^"]+"|\w+)\s*:\s*)(-?\d[\d\.]*\b)', functools.partial(process, repl=r'\g<0>%s' % kb.customInjectionMark), conf.data)
178+
else:
179+
conf.data = re.sub(r"((?P<name>'[^']+'|\w+)\s*:\s*'[^']+)'", functools.partial(process, repl=r"\g<1>%s'" % kb.customInjectionMark), conf.data)
180+
conf.data = re.sub(r"((?P<name>'[^']+'|\w+)\s*:\s*)(-?\d[\d\.]*\b)", functools.partial(process, repl=r"\g<0>%s" % kb.customInjectionMark), conf.data)
179181

180182
elif re.search(ARRAY_LIKE_RECOGNITION_REGEX, conf.data):
181183
message = "Array-like data found in %s body. " % conf.method
@@ -185,12 +187,11 @@ def process(match, repl):
185187
if choice == 'Q':
186188
raise SqlmapUserQuitException
187189
elif choice == 'Y':
190+
kb.postHint = POST_HINT.ARRAY_LIKE
188191
if not (kb.processUserMarks and kb.customInjectionMark in conf.data):
189192
conf.data = conf.data.replace(kb.customInjectionMark, ASTERISK_MARKER)
190193
conf.data = re.sub(r"(=[^%s]+)" % DEFAULT_GET_POST_DELIMITER, r"\g<1>%s" % kb.customInjectionMark, conf.data)
191194

192-
kb.postHint = POST_HINT.ARRAY_LIKE
193-
194195
elif re.search(XML_RECOGNITION_REGEX, conf.data):
195196
message = "SOAP/XML data found in %s body. " % conf.method
196197
message += "Do you want to process it? [Y/n/q] "
@@ -199,13 +200,12 @@ def process(match, repl):
199200
if choice == 'Q':
200201
raise SqlmapUserQuitException
201202
elif choice == 'Y':
203+
kb.postHint = POST_HINT.SOAP if "soap" in conf.data.lower() else POST_HINT.XML
202204
if not (kb.processUserMarks and kb.customInjectionMark in conf.data):
203205
conf.data = getattr(conf.data, UNENCODED_ORIGINAL_VALUE, conf.data)
204206
conf.data = conf.data.replace(kb.customInjectionMark, ASTERISK_MARKER)
205207
conf.data = re.sub(r"(<(?P<name>[^>]+)( [^<]*)?>)([^<]+)(</\2)", functools.partial(process, repl=r"\g<1>\g<4>%s\g<5>" % kb.customInjectionMark), conf.data)
206208

207-
kb.postHint = POST_HINT.SOAP if "soap" in conf.data.lower() else POST_HINT.XML
208-
209209
elif re.search(MULTIPART_RECOGNITION_REGEX, conf.data):
210210
message = "Multipart-like data found in %s body. " % conf.method
211211
message += "Do you want to process it? [Y/n/q] "
@@ -214,13 +214,12 @@ def process(match, repl):
214214
if choice == 'Q':
215215
raise SqlmapUserQuitException
216216
elif choice == 'Y':
217+
kb.postHint = POST_HINT.MULTIPART
217218
if not (kb.processUserMarks and kb.customInjectionMark in conf.data):
218219
conf.data = getattr(conf.data, UNENCODED_ORIGINAL_VALUE, conf.data)
219220
conf.data = conf.data.replace(kb.customInjectionMark, ASTERISK_MARKER)
220221
conf.data = re.sub(r"(?si)((Content-Disposition[^\n]+?name\s*=\s*[\"']?(?P<name>[^\"'\r\n]+)[\"']?).+?)((%s)+--)" % ("\r\n" if "\r\n" in conf.data else '\n'), functools.partial(process, repl=r"\g<1>%s\g<4>" % kb.customInjectionMark), conf.data)
221222

222-
kb.postHint = POST_HINT.MULTIPART
223-
224223
if not kb.postHint:
225224
if kb.customInjectionMark in conf.data: # later processed
226225
pass

0 commit comments

Comments
 (0)