From 71d0b1bcd70dbb3ac8dacfe363dbc91dbbd065e8 Mon Sep 17 00:00:00 2001 From: Miroslav Stampar Date: Wed, 3 Nov 2010 21:51:36 +0000 Subject: [PATCH] several bug fixes --- doc/THANKS | 2 +- lib/controller/checks.py | 7 +++- lib/request/comparison.py | 73 +++++++++++++++++++++------------------ lib/request/connect.py | 8 ++--- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/doc/THANKS b/doc/THANKS index 20b15198e..f4e5b70f1 100644 --- a/doc/THANKS +++ b/doc/THANKS @@ -423,7 +423,7 @@ Sylphid for suggesting some features ToR - for reporting a minor bug + for reporting several bugs == Organizations == diff --git a/lib/controller/checks.py b/lib/controller/checks.py index 43392e4ce..45ecc8a91 100644 --- a/lib/controller/checks.py +++ b/lib/controller/checks.py @@ -104,7 +104,7 @@ def heuristicCheckSqlInjection(place, parameter, value): payload = "%s%s%s" % (prefix, randomStr(length=10, alphabet=['"', '\'', ')', '(']), postfix) payload = agent.payload(place, parameter, value, payload) - Request.queryPage(payload, place) + Request.queryPage(payload, place, raise404=False) result = wasLastRequestError() infoMsg = "(error based) heuristics shows that %s " % place @@ -153,6 +153,9 @@ def checkDynamicContent(firstPage, secondPage): This function checks if the provided pages have dynamic content. If they are dynamic, proper markings will be made. """ + + if kb.nullConnection: + return infoMsg = "searching for dynamic content" logger.info(infoMsg) @@ -245,6 +248,7 @@ def checkStability(): if test: conf.string = test + kb.nullConnection = None else: raise sqlmapSilentQuitException @@ -254,6 +258,7 @@ def checkStability(): if test: conf.regex = test + kb.nullConnection = None else: raise sqlmapSilentQuitException else: diff --git a/lib/request/comparison.py b/lib/request/comparison.py index cd5b8ea61..df7f25394 100644 --- a/lib/request/comparison.py +++ b/lib/request/comparison.py @@ -18,48 +18,53 @@ from lib.core.data import logger from lib.core.session import setMatchRatio def comparison(page, headers=None, getSeqMatcher=False, pageLength=None): + if page is None and pageLength is None: + return None + regExpResults = None - # String to be excluded before calculating page hash - if conf.eString and conf.eString in page: - index = page.index(conf.eString) - length = len(conf.eString) - pageWithoutString = page[:index] - pageWithoutString += page[index+length:] - page = pageWithoutString + if page: + # String to be excluded before calculating page hash + if conf.eString and conf.eString in page: + index = page.index(conf.eString) + length = len(conf.eString) + pageWithoutString = page[:index] + pageWithoutString += page[index+length:] + page = pageWithoutString - # Regular expression matches to be excluded before calculating page hash - if conf.eRegexp: - regExpResults = re.findall(conf.eRegexp, page, re.I | re.M) + # Regular expression matches to be excluded before calculating page hash + if conf.eRegexp: + regExpResults = re.findall(conf.eRegexp, page, re.I | re.M) - if regExpResults: - for regExpResult in regExpResults: - index = page.index(regExpResult) - length = len(regExpResult) - pageWithoutRegExp = page[:index] - pageWithoutRegExp += page[index+length:] - page = pageWithoutRegExp + if regExpResults: + for regExpResult in regExpResults: + index = page.index(regExpResult) + length = len(regExpResult) + pageWithoutRegExp = page[:index] + pageWithoutRegExp += page[index+length:] + page = pageWithoutRegExp - # String to match in page when the query is valid - if conf.string: - return conf.string in page + # String to match in page when the query is valid + if conf.string: + return conf.string in page - # Regular expression to match in page when the query is valid - if conf.regexp: - return re.search(conf.regexp, page, re.I | re.M) is not None + # Regular expression to match in page when the query is valid + if conf.regexp: + return re.search(conf.regexp, page, re.I | re.M) is not None - # Dynamic content lines to be excluded before calculating page hash - for item in kb.dynamicMarkings: - prefix, postfix = item - if prefix is None: - page = re.sub('(?s)^.+%s' % postfix, postfix, page) - elif postfix is None: - page = re.sub('(?s)%s.+$' % prefix, prefix, page) - else: - page = re.sub('(?s)%s.+%s' % (prefix, postfix), '%s%s' % (prefix, postfix), page) + # Dynamic content lines to be excluded before calculating page hash + if not kb.nullConnection: + for item in kb.dynamicMarkings: + prefix, postfix = item + if prefix is None: + page = re.sub('(?s)^.+%s' % postfix, postfix, page) + elif postfix is None: + page = re.sub('(?s)%s.+$' % prefix, prefix, page) + else: + page = re.sub('(?s)%s.+%s' % (prefix, postfix), '%s%s' % (prefix, postfix), page) - if not pageLength and page: - pageLength = len(page) + if not pageLength: + pageLength = len(page) if kb.locks.seqLock: kb.locks.seqLock.acquire() diff --git a/lib/request/connect.py b/lib/request/connect.py index be0a33f58..c72d6e7c0 100644 --- a/lib/request/connect.py +++ b/lib/request/connect.py @@ -214,10 +214,10 @@ class Connect: except urllib2.HTTPError, e: if e.code == 401: errMsg = "not authorized, try to provide right HTTP " - errMsg += "authentication type and valid credentials" + errMsg += "authentication type and valid credentials (%d)" % e.code raise sqlmapConnectionException, errMsg elif e.code == 404 and raise404: - errMsg = "page not found" + errMsg = "page not found (%d)" % e.code raise sqlmapConnectionException, errMsg else: try: @@ -285,7 +285,7 @@ class Connect: return page, responseHeaders @staticmethod - def queryPage(value=None, place=None, content=False, getSeqMatcher=False, silent=False, method=None, auxHeaders=None, response=False): + def queryPage(value=None, place=None, content=False, getSeqMatcher=False, silent=False, method=None, auxHeaders=None, response=False, raise404 = None): """ This method calls a function to get the target url page content and returns its page MD5 hash or a boolean value in case of @@ -302,7 +302,7 @@ class Connect: page = None pageLength = None uri = None - raise404 = place != "URI" + raise404 = place != "URI" if raise404 is None else raise404 toUrlencode = { "GET": True, "POST": True, "Cookie": conf.cookieUrlencode, "User-Agent": True, "URI": False } if not place: