diff --git a/lib/core/patch.py b/lib/core/patch.py index 94185d048..432d6a68c 100644 --- a/lib/core/patch.py +++ b/lib/core/patch.py @@ -6,6 +6,7 @@ See the file 'LICENSE' for copying permission """ import codecs +import random import lib.controller.checks import lib.core.common @@ -25,6 +26,7 @@ from lib.core.common import isListLike from lib.core.common import readInput from lib.core.common import shellExec from lib.core.common import singleTimeWarnMessage +from lib.core.compat import xrange from lib.core.convert import stdoutEncode from lib.core.data import conf from lib.core.option import _setHTTPHandlers @@ -46,6 +48,7 @@ def dirtyPatches(): if six.PY3: if not hasattr(_http_client.HTTPConnection, "__send_output"): _http_client.HTTPConnection.__send_output = _http_client.HTTPConnection._send_output + def _send_output(self, *args, **kwargs): if conf.chunked and "encode_chunked" in kwargs: kwargs["encode_chunked"] = False @@ -100,3 +103,35 @@ def pympTempLeakPatch(tempDir): multiprocessing.util.get_temp_dir = lambda: tempDir except: pass + +def unisonRandom(): + """ + Unifying random generated data across different Python versions + """ + + def _lcg(): + global _rand + a = 1140671485 + c = 128201163 + m = 2 ** 24 + _rand = (a * _rand + c) % m + return _rand + + def _randint(a, b): + _ = a + (_lcg() % (b - a + 1)) + return _ + + def _choice(seq): + return seq[_randint(0, len(seq) - 1)] + + def _sample(population, k): + return [_choice(population) for _ in xrange(k)] + + def _seed(seed): + global _rand + _rand = seed + + random.choice = _choice + random.randint = _randint + random.sample = _sample + random.seed = _seed diff --git a/lib/core/settings.py b/lib/core/settings.py index 074f3961a..78f5f2b77 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -18,7 +18,7 @@ from lib.core.enums import OS from thirdparty.six import unichr as _unichr # sqlmap version (...) -VERSION = "1.4.2.16" +VERSION = "1.4.2.17" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE) diff --git a/lib/core/testing.py b/lib/core/testing.py index 3dbec7f5f..0eff43f49 100644 --- a/lib/core/testing.py +++ b/lib/core/testing.py @@ -33,6 +33,7 @@ from lib.core.data import kb from lib.core.data import logger from lib.core.data import paths from lib.core.data import queries +from lib.core.patch import unisonRandom _rand = 0 @@ -201,44 +202,12 @@ def fuzzTest(): count += 1 -def dirtyPatchRandom(): - """ - Unifying random generated data across different Python versions - """ - - def _lcg(): - global _rand - a = 1140671485 - c = 128201163 - m = 2 ** 24 - _rand = (a * _rand + c) % m - return _rand - - def _randint(a, b): - _ = a + (_lcg() % (b - a + 1)) - return _ - - def _choice(seq): - return seq[_randint(0, len(seq) - 1)] - - def _sample(population, k): - return [_choice(population) for _ in xrange(k)] - - def _seed(seed): - global _rand - _rand = seed - - random.choice = _choice - random.randint = _randint - random.sample = _sample - random.seed = _seed - def smokeTest(): """ Runs the basic smoke testing of a program """ - dirtyPatchRandom() + unisonRandom() content = open(paths.ERRORS_XML, "r").read() for regex in re.findall(r'', content): diff --git a/lib/request/dns.py b/lib/request/dns.py index 629f43112..af6244c9e 100644 --- a/lib/request/dns.py +++ b/lib/request/dns.py @@ -49,16 +49,16 @@ class DNSQuery(object): retVal = b"" if self._query: - retVal += self._raw[:2] # Transaction ID - retVal += b"\x85\x80" # Flags (Standard query response, No error) - retVal += self._raw[4:6] + self._raw[4:6] + b"\x00\x00\x00\x00" # Questions and Answers Counts - retVal += self._raw[12:(12 + self._raw[12:].find(b"\x00") + 5)] # Original Domain Name Query - retVal += b"\xc0\x0c" # Pointer to domain name - retVal += b"\x00\x01" # Type A - retVal += b"\x00\x01" # Class IN - retVal += b"\x00\x00\x00\x20" # TTL (32 seconds) - retVal += b"\x00\x04" # Data length - retVal += b"".join(struct.pack('B', int(_)) for _ in resolution.split('.')) # 4 bytes of IP + retVal += self._raw[:2] # Transaction ID + retVal += b"\x85\x80" # Flags (Standard query response, No error) + retVal += self._raw[4:6] + self._raw[4:6] + b"\x00\x00\x00\x00" # Questions and Answers Counts + retVal += self._raw[12:(12 + self._raw[12:].find(b"\x00") + 5)] # Original Domain Name Query + retVal += b"\xc0\x0c" # Pointer to domain name + retVal += b"\x00\x01" # Type A + retVal += b"\x00\x01" # Class IN + retVal += b"\x00\x00\x00\x20" # TTL (32 seconds) + retVal += b"\x00\x04" # Data length + retVal += b"".join(struct.pack('B', int(_)) for _ in resolution.split('.')) # 4 bytes of IP return retVal @@ -114,7 +114,7 @@ class DNSServer(object): with self._lock: for _ in self._requests: - if prefix is None and suffix is None or re.search(b"%s\..+\.%s" % (prefix, suffix), _, re.I): + if prefix is None and suffix is None or re.search(b"%s\\..+\\.%s" % (prefix, suffix), _, re.I): retVal = _ self._requests.remove(_) break