HTTP request smuggling - gachikuku/portswigger GitHub Wiki
Practitioner lab:
HTTP request smuggling, basic CL.TE vulnerability
Practitioner lab:
HTTP request smuggling, basic CL.TE vulnerability
-
Temporary solution (hopefully *sigh*)
See discusion
-
Detailed approach
- Using nix make a nix development environment
Save file as
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { # nativeBuildInputs is usually what you want -- tools you need to run nativeBuildInputs = with pkgs.buildPackages; [ python312Full python312Packages.pip git ]; }
shell.nix
and run the commandnix-shell shell.nix
. - Follow the CONTRIBUTING.md found in mitmproxy.
- Make the following changes to this path
mitmproxy/blob/main/mitmproxy/proxy/layers/http/_http1.py
--- _http1.py 2025-01-12 00:26:39 +++ modified_http1.py 2025-01-12 00:27:13 @@ -247,10 +247,10 @@ yield commands.SendData(self.conn, raw) elif isinstance(event, ResponseData): assert self.response - if "chunked" in self.response.headers.get("transfer-encoding", "").lower(): - raw = b"%x\r\n%s\r\n" % (len(event.data), event.data) - else: - raw = event.data + #if "chunked" in self.response.headers.get("transfer-encoding", "").lower(): + #raw = b"%x\r\n%s\r\n" % (len(event.data), event.data) + + raw = event.data if raw: yield commands.SendData(self.conn, raw) elif isinstance(event, ResponseEndOfMessage): @@ -261,7 +261,7 @@ and "chunked" in self.response.headers.get("transfer-encoding", "").lower() ): - yield commands.SendData(self.conn, b"0\r\n\r\n") + yield commands.SendData(self.conn, b"") yield from self.mark_done(response=True) elif isinstance(event, ResponseProtocolError): if not (self.conn.state & ConnectionState.CAN_WRITE): @@ -372,16 +372,15 @@ yield commands.SendData(self.conn, raw) elif isinstance(event, RequestData): assert self.request - if "chunked" in self.request.headers.get("transfer-encoding", "").lower(): - raw = b"%x\r\n%s\r\n" % (len(event.data), event.data) - else: - raw = event.data + #if "chunked" in self.request.headers.get("transfer-encoding", "").lower(): + #raw = b"%x\r\n%s\r\n" % (len(event.data), event.data) + raw = event.data if raw: yield commands.SendData(self.conn, raw) elif isinstance(event, RequestEndOfMessage): assert self.request if "chunked" in self.request.headers.get("transfer-encoding", "").lower(): - yield commands.SendData(self.conn, b"0\r\n\r\n") + yield commands.SendData(self.conn, b"") elif http1.expected_http_body_size(self.request, self.response) == -1: yield commands.CloseTcpConnection(self.conn, half_close=True) yield from self.mark_done(request=True)
- Follow the lab's solution.
- Using nix make a nix development environment