@@ -1136,21 +1136,63 @@ def _setHTTPProxy():
11361136
11371137 proxyHandler .__init__ (proxyHandler .proxies )
11381138
1139- def _setSafeUrl ():
1139+ def _setSafeVisit ():
11401140 """
1141- Check and set the safe URL options.
1141+ Check and set the safe visit options.
11421142 """
1143- if not conf .safeUrl :
1143+ if not any (( conf .safeUrl , conf . safeReqFile )) :
11441144 return
11451145
1146- if not re .search ("^http[s]*://" , conf .safeUrl ):
1147- if ":443/" in conf .safeUrl :
1148- conf .safeUrl = "https://" + conf .safeUrl
1146+ if conf .safeReqFile :
1147+ checkFile (conf .safeReqFile )
1148+
1149+ raw = readCachedFileContent (conf .safeReqFile )
1150+ match = re .search (r"\A([A-Z]+) ([^ ]+) HTTP/[0-9.]+\Z" , raw [:raw .find ('\n ' )])
1151+
1152+ if match :
1153+ kb .safeReq .method = match .group (1 )
1154+ kb .safeReq .url = match .group (2 )
1155+ kb .safeReq .headers = {}
1156+
1157+ for line in raw [raw .find ('\n ' ) + 1 :].split ('\n ' ):
1158+ line = line .strip ()
1159+ if line and ':' in line :
1160+ key , value = line .split (':' , 1 )
1161+ value = value .strip ()
1162+ kb .safeReq .headers [key ] = value
1163+ if key == HTTP_HEADER .HOST :
1164+ if not value .startswith ("http" ):
1165+ scheme = "http"
1166+ if value .endswith (":443" ):
1167+ scheme = "https"
1168+ value = "%s://%s" % (scheme , value )
1169+ kb .safeReq .url = urlparse .urljoin (value , kb .safeReq .url )
1170+ else :
1171+ break
1172+
1173+ post = None
1174+
1175+ if '\r \n \r \n ' in raw :
1176+ post = raw [raw .find ('\r \n \r \n ' ) + 4 :]
1177+ elif '\n \n ' in raw :
1178+ post = raw [raw .find ('\n \n ' ) + 2 :]
1179+
1180+ if post and post .strip ():
1181+ kb .safeReq .post = post
1182+ else :
1183+ kb .safeReq .post = None
11491184 else :
1150- conf .safeUrl = "http://" + conf .safeUrl
1185+ errMsg = "invalid format of a safe request file"
1186+ raise SqlmapSyntaxException , errMsg
1187+ else :
1188+ if not re .search ("^http[s]*://" , conf .safeUrl ):
1189+ if ":443/" in conf .safeUrl :
1190+ conf .safeUrl = "https://" + conf .safeUrl
1191+ else :
1192+ conf .safeUrl = "http://" + conf .safeUrl
11511193
11521194 if conf .safeFreq <= 0 :
1153- errMsg = "please provide a valid value (>0) for safe frequency (--safe-freq) while using safe URL feature "
1195+ errMsg = "please provide a valid value (>0) for safe frequency (--safe-freq) while using safe visit features "
11541196 raise SqlmapSyntaxException (errMsg )
11551197
11561198def _setPrefixSuffix ():
@@ -1791,6 +1833,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
17911833 kb .responseTimes = []
17921834 kb .resumeValues = True
17931835 kb .safeCharEncode = False
1836+ kb .safeReq = AttribDict ()
17941837 kb .singleLogFlags = set ()
17951838 kb .reduceTests = None
17961839 kb .stickyDBMS = False
@@ -2265,8 +2308,12 @@ def _basicOptionValidation():
22652308 errMsg = "option '--safe-post' requires usage of option '--safe-url'"
22662309 raise SqlmapSyntaxException (errMsg )
22672310
2268- if conf .safeFreq and not conf .safeUrl :
2269- errMsg = "option '--safe-freq' requires usage of option '--safe-url'"
2311+ if conf .safeFreq and not any ((conf .safeUrl , conf .safeReqFile )):
2312+ errMsg = "option '--safe-freq' requires usage of option '--safe-url' or '--safe-req'"
2313+ raise SqlmapSyntaxException (errMsg )
2314+
2315+ if conf .safeReqFile and any ((conf .safeUrl , conf .safePost )):
2316+ errMsg = "option '--safe-req' is incompatible with option '--safe-url' and option '--safe-post'"
22702317 raise SqlmapSyntaxException (errMsg )
22712318
22722319 if conf .csrfUrl and not conf .csrfToken :
@@ -2416,7 +2463,7 @@ def init():
24162463 _setHTTPAuthentication ()
24172464 _setHTTPProxy ()
24182465 _setDNSCache ()
2419- _setSafeUrl ()
2466+ _setSafeVisit ()
24202467 _setGoogleDorking ()
24212468 _setBulkMultipleTargets ()
24222469 _setSitemapTargets ()
0 commit comments