forked from sqlmapproject/sqlmap
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_request_basic.py
More file actions
142 lines (112 loc) · 5.3 KB
/
Copy pathtest_request_basic.py
File metadata and controls
142 lines (112 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env python
"""
Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org)
See the file 'LICENSE' for copying permission
Unit coverage for PURE functions in lib/request/basic.py.
These exercise getHeuristicCharEncoding (with its kb.cache.encoding memoization)
and decodePage's charset + HTML-entity decoding branches, in isolation - WITHOUT
touching the network, the DBMS or any interactive prompt.
stdlib unittest only (no pytest / no pip); works on Python 2.7 and 3.x.
"""
import os
import sys
import unittest
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _testutils import bootstrap
bootstrap()
from lib.core.data import conf, kb
class TestBasicHeuristicCharEncoding(unittest.TestCase):
def test_ascii(self):
from lib.request.basic import getHeuristicCharEncoding
self.assertEqual(getHeuristicCharEncoding(b"<html></html>"), "ascii")
def test_cache_hit_returns_same(self):
from lib.request.basic import getHeuristicCharEncoding
page = b"<html>hello world</html>"
first = getHeuristicCharEncoding(page)
# second call for identical page must come back identical (and from cache)
self.assertEqual(getHeuristicCharEncoding(page), first)
key = (len(page), hash(page))
self.assertEqual(kb.cache.encoding.get(key), first)
class TestBasicDecodePage(unittest.TestCase):
"""decodePage charset + HTML-entity decoding branches."""
def setUp(self):
self._old_encoding = conf.encoding
self._old_null = conf.nullConnection
conf.nullConnection = False
def tearDown(self):
conf.encoding = self._old_encoding
conf.nullConnection = self._old_null
def test_html_entity_amp(self):
from lib.request.basic import decodePage
from lib.core.common import getText
conf.encoding = None
self.assertEqual(
getText(decodePage(b"<html>foo&bar</html>", None, "text/html; charset=utf-8")),
"<html>foo&bar</html>",
)
def test_numeric_hex_entity_tab(self):
from lib.request.basic import decodePage
from lib.core.common import getText
conf.encoding = None
self.assertEqual(getText(decodePage(b"	", None, "text/html; charset=utf-8")), "\t")
def test_numeric_hex_entity_letter(self):
from lib.request.basic import decodePage
from lib.core.common import getText
conf.encoding = None
self.assertEqual(getText(decodePage(b"J", None, "text/html; charset=utf-8")), "J")
def test_unicode_entity(self):
from lib.request.basic import decodePage
conf.encoding = None
self.assertEqual(decodePage(b"™", None, "text/html; charset=utf-8"), u"\u2122")
def test_empty_page(self):
from lib.request.basic import decodePage
from lib.core.common import getText
# empty page short-circuits to getUnicode(page)
self.assertEqual(getText(decodePage(b"", None, "text/html")), "")
class TestForgeHeadersCookieMerge(unittest.TestCase):
"""A domain-scoped jar cookie (Domain=example.com -> '.example.com') must merge into the
request for the apex host, not be dropped by a naive endswith() domain check."""
_CONF = ("cj", "hostname", "httpHeaders", "loadCookies", "cookieDel", "parameters", "csrfToken", "safeUrl")
_KB = ("mergeCookies", "testMode", "injection")
def setUp(self):
self._c = dict((k, conf.get(k)) for k in self._CONF)
self._k = dict((k, kb.get(k)) for k in self._KB)
def tearDown(self):
for k, v in self._c.items():
conf[k] = v
for k, v in self._k.items():
kb[k] = v
def _jar_with_domain_cookie(self):
try:
from http.cookiejar import CookieJar, Cookie
except ImportError:
from cookielib import CookieJar, Cookie
# a domain-scoped cookie the jar stores as '.example.com' (domain_specified=True),
# exactly as it would after Set-Cookie: sid=NEW; Domain=example.com
cookie = Cookie(version=0, name="sid", value="NEW", port=None, port_specified=False,
domain=".example.com", domain_specified=True, domain_initial_dot=True,
path="/", path_specified=True, secure=False, expires=None, discard=True,
comment=None, comment_url=None, rest={})
cj = CookieJar()
cj.set_cookie(cookie)
return cj
def test_domain_cookie_merged_on_apex_host(self):
from lib.request.basic import forgeHeaders
from lib.core.enums import PLACE, HTTP_HEADER
from lib.core.datatype import AttribDict
conf.cj = self._jar_with_domain_cookie()
conf.hostname = "example.com" # apex host == cookie domain
conf.httpHeaders = [(HTTP_HEADER.COOKIE, "sid=OLD")]
conf.loadCookies = False
conf.cookieDel = None
conf.parameters = {}
conf.csrfToken = conf.safeUrl = None
kb.mergeCookies = True
kb.testMode = False
kb.injection = AttribDict()
kb.injection.place = PLACE.GET
headers = forgeHeaders()
# before the fix the domain cookie was skipped for the apex host, leaving 'sid=OLD'
self.assertEqual(headers.get(HTTP_HEADER.COOKIE), "sid=NEW")
if __name__ == "__main__":
unittest.main(verbosity=2)