Skip to content

Commit d60f117

Browse files
committed
Fixes #1065
1 parent a211764 commit d60f117

3 files changed

Lines changed: 11 additions & 5 deletions

File tree

src/core/injections/controller/controller.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ def heuristic_request(url, http_request_method, check_parameter, payload, whites
119119
settings.USER_DEFINED_POST_DATA = checks.remove_tags(settings.USER_DEFINED_POST_DATA)
120120
data = settings.USER_DEFINED_POST_DATA.encode(settings.DEFAULT_CODEC)
121121
if settings.INJECT_TAG in url:
122-
tmp_url = checks.process_injectable_value(payload, url)
122+
# Encode query string, preserving delimiters and configured parameter delimiter
123+
encoded_payload = _urllib.parse.quote(payload, safe=settings.SAFE_QUERY)
124+
tmp_url = checks.process_injectable_value(encoded_payload, url)
123125
else:
124126
tmp_url = checks.remove_tags(tmp_url)
125127
url = checks.remove_tags(url)

src/core/requests/headers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ def encode_non_ascii_url(request):
4949
url = request.get_full_url()
5050
parts = _urllib.parse.urlsplit(url)
5151
# Encode path, preserving '/', '*', and '%' to avoid over-encoding
52-
path = _urllib.parse.quote(parts.path, safe="*%/")
52+
path = _urllib.parse.quote(parts.path, safe=settings.SAFE_PATH)
5353
# Encode query string, preserving delimiters and configured parameter delimiter
54-
query = _urllib.parse.quote(parts.query, safe="*=?/%" + settings.URL_PARAM_DELIMITER)
54+
query = _urllib.parse.quote(parts.query, safe=settings.SAFE_QUERY + settings.URL_PARAM_DELIMITER)
5555
# Reconstruct the full URL with encoded path and query
5656
request.full_url = _urllib.parse.urlunsplit((parts.scheme, parts.netloc, path, query, parts.fragment))
5757

src/utils/settings.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def sys_argv_errors():
261261
DESCRIPTION = "The command injection exploiter"
262262
AUTHOR = "Anastasios Stasinopoulos"
263263
VERSION_NUM = "4.1"
264-
REVISION = "117"
264+
REVISION = "118"
265265
STABLE_RELEASE = False
266266
VERSION = "v"
267267
if STABLE_RELEASE:
@@ -321,6 +321,11 @@ def sys_argv_errors():
321321
VALUE_BOUNDARIES = r'[\\/](.+?)[\\/]'
322322
INJECT_INSIDE_BOUNDARIES = None
323323

324+
# Safe characters to keep unescaped in URL paths
325+
SAFE_PATH = "*%/"
326+
# Safe characters to keep unescaped in query strings
327+
SAFE_QUERY = SAFE_PATH + "=?"
328+
324329
# Default (windows) target host's python interpreter
325330
WIN_PYTHON_INTERPRETER = "python.exe"
326331
WIN_CUSTOM_PYTHON_INTERPRETER = "C:\\Python27\\python.exe"
@@ -1390,5 +1395,4 @@ class END_LINE:
13901395
USE_PCRE_E_MODIFIER = None
13911396
PCRE_MODIFIER = "/e"
13921397

1393-
13941398
# eof

0 commit comments

Comments
 (0)