diff --git a/lib/request/redirecthandler.py b/lib/request/redirecthandler.py index c0ba766f0..30029b174 100644 --- a/lib/request/redirecthandler.py +++ b/lib/request/redirecthandler.py @@ -24,7 +24,17 @@ Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import urllib2 +from lib.core.exception import sqlmapConnectionException + class SmartRedirectHandler(urllib2.HTTPRedirectHandler): + # maximum number of redirections to any single URL + # this is needed because of the state that cookies introduce + max_repeats = 4 + + # maximum total number of redirections (regardless of URL) before + # assuming we're in a loop + max_redirections = 10 + def common_http_redirect(self, result, headers, code): if "location" in headers: result.redurl = headers.getheaders("location")[0].split("?")[0] @@ -36,9 +46,17 @@ class SmartRedirectHandler(urllib2.HTTPRedirectHandler): return result def http_error_301(self, req, fp, code, msg, headers): + self.infinite_loop_check(req) result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers) return self.common_http_redirect(result, headers, code) def http_error_302(self, req, fp, code, msg, headers): + self.infinite_loop_check(req) result = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) return self.common_http_redirect(result, headers, code) + + def infinite_loop_check(self, req): + if hasattr(req, 'redirect_dict') and (req.redirect_dict.get(req.get_full_url(), 0) >= self.max_repeats or len(req.redirect_dict) >= self.max_redirections): + errMsg = "infinite redirect loop detected (%s). " % ", ".join(item for item in req.redirect_dict.keys()) + errMsg += "please check all provided parameters and/or provide missing ones." + raise sqlmapConnectionException, errMsg