Bug report
Bug description:
Vulnerability Description
The send_header method in Lib/http/server.py writes headers directly to the output stream without checking for line breaks. When user-controlled input is passed to send_header, an attacker can inject CRLF sequences (\r\n) to terminate the current header and inject new headers or manipulate the response.
Vulnerable Code:
defsend_header(self, keyword, value):
"""Send a MIME header to the headers buffer."""ifself.request_version!='HTTP/0.9':
ifnothasattr(self, '_headers_buffer'):
self._headers_buffer= []
self._headers_buffer.append(
("%s: %s\r\n"% (keyword, value)).encode('latin-1', 'strict'))
# No validation for \r or \n characters!
Attack Scenarios
Scenario 1: Set-Cookie Injection (Session Fixation)
Vulnerable Application:
fromhttp.serverimportBaseHTTPRequestHandler, HTTPServerfromurllib.parseimportparse_qs, urlparseclassVulnerableHandler(BaseHTTPRequestHandler):
defdo_GET(self):
query=parse_qs(urlparse(self.path).query)
custom_val=query.get('val', [''])[0]
self.send_response(200)
# VULNERABLE: Direct injection into headerself.send_header('X-Custom', custom_val)
self.end_headers()
self.wfile.write(b"Hello World")Attack URL:
http://localhost:8000/?val=test%0d%0aSet-Cookie:%20pwned=true
Result:
HTTP/1.0 200 OKServer: BaseHTTP/0.6 Python/3.xDate: ...X-Custom: testSet-Cookie: pwned=true
Impact: Attacker can inject session cookies, leading to session fixation attacks.
Scenario 2: Location Header Injection (Malicious Redirect)
Attack URL:
http://localhost:8000/?val=test%0d%0ALocation:%20http://evil.com/
Result:
HTTP/1.0 200 OKServer: BaseHTTP/0.6 Python/3.xDate: ...X-Custom: testLocation: http://evil.com/
Impact:
- Users are redirected to malicious websites
- Phishing attacks
- Open redirect vulnerabilities
- Cache poisoning (if cached responses include the injected Location header)
Verified Test Results:
✓ LOCATION HEADER INJECTION CONFIRMED!
Injected Location: http://evil.com/
✓ MALICIOUS REDIRECT CONFIRMED!
Browser would redirect to: http://evil.com/
✓ MALICIOUS REDIRECT SUCCESSFUL!
Attack Vector
- Type: Remote
- Prerequisites:
- Application uses
http.server.BaseHTTPRequestHandler - User input is reflected in HTTP headers via
send_header() - Common patterns: query parameters, user-agent reflection, custom headers
- Complexity: Low - Simple URL manipulation
- Authentication: Not required
Impact
- Session Fixation: Inject
Set-Cookie headers to control user sessions - Malicious Redirects: Inject
Location headers to redirect users to attacker-controlled sites - Cache Poisoning: Inject headers that affect cached responses
- Cross-Site Scripting (XSS): Inject headers that enable XSS attacks
- Web Cache Deception: Manipulate cache behavior via injected headers
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Linked PRs
Bug report
Bug description:
Vulnerability Description
The
send_headermethod inLib/http/server.pywrites headers directly to the output stream without checking for line breaks. When user-controlled input is passed tosend_header, an attacker can inject CRLF sequences (\r\n) to terminate the current header and inject new headers or manipulate the response.Vulnerable Code:
Attack Scenarios
Scenario 1: Set-Cookie Injection (Session Fixation)
Vulnerable Application:
Attack URL:
Result:
Impact: Attacker can inject session cookies, leading to session fixation attacks.
Scenario 2: Location Header Injection (Malicious Redirect)
Attack URL:
Result:
Impact:
Verified Test Results:
Attack Vector
http.server.BaseHTTPRequestHandlersend_header()Impact
Set-Cookieheaders to control user sessionsLocationheaders to redirect users to attacker-controlled sitesCPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Linked PRs