hacktricks/src/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md

101 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTTP/2 Düşürmelerinde İstek Smuggling'i
{{#include ../../banners/hacktricks-training.md}}
HTTP/2 genellikle klasik istek-smuggling'e karşı bağışık olarak kabul edilir çünkü her DATA çerçevesinin uzunluğu açıktır. **Bu koruma, bir ön uç proxy'si isteği HTTP/1.x'e “düşürdüğünde” kaybolur ve bunu arka uca iletir.** İki farklı ayrıştırıcı (HTTP/2 ön ucu ve HTTP/1 arka ucu) bir isteğin nerede bittiği ve diğerinin nerede başladığı konusunda anlaşmaya çalıştığında, tüm eski senkronizasyon bozulma numaraları geri gelir - artı birkaç yeni numara.
---
## Düşürmelerin Nedenleri
1. Tarayıcılar zaten HTTP/2 konuşuyor, ancak birçok eski köken altyapısı hala yalnızca HTTP/1.1'i anlıyor.
2. Bu nedenle, ters proxy'ler (CDN'ler, WAF'lar, yük dengeleyiciler) TLS + HTTP/2'yi kenarda sonlandırır ve **her isteği HTTP/1.1 olarak yeniden yazar**.
3. Çeviri adımı, kökenin gövde uzunluğunu belirleyebilmesi için *her ikisini de* `Content-Length` **veya** `Transfer-Encoding: chunked` başlıklarını oluşturmak zorundadır.
Ön uç HTTP/2 çerçeve uzunluğuna **güvendiğinde** ancak arka uç CL veya TE'ye güvendiğinde, bir saldırgan bunların anlaşmazlık yaşamasını sağlayabilir.
---
## İki Dominant Temel Sınıf
| Varyant | Ön uç uzunluğu | Arka uç uzunluğu | Tipik yük |
|---------|-----------------|-----------------|-----------------|
| **H2.TE** | HTTP/2 çerçevesi | `Transfer-Encoding: chunked` | Son `0\r\n\r\n` gönderilmeyen ekstra bir chunked mesaj gövdesi ekleyin, böylece arka uç saldırgan tarafından sağlanan “sonraki” isteği bekler. |
| **H2.CL** | HTTP/2 çerçevesi | `Content-Length` | Gerçek gövdeden *daha küçük* bir CL gönderin, böylece arka uç sınırın ötesine geçerek sonraki isteği okur. |
> Bunlar, klasik TE.CL / CL.TE ile ruhsal olarak aynıdır, sadece HTTP/2 bir ayrıştırıcıyı değiştirmiştir.
---
## Düşürme Zincirini Tanımlama
1. **ALPN** kullanarak bir TLS el sıkışmasında (`openssl s_client -alpn h2 -connect host:443`) veya **curl**:
```bash
curl -v --http2 https://target
```
Eğer `* Using HTTP2` görünüyorsa, kenar H2 konuşuyor demektir.
2. HTTP/2 üzerinden kasıtlı olarak hatalı bir CL/TE isteği gönderin (Burp Repeater artık HTTP/2'yi zorlamak için bir açılır menüye sahiptir). Eğer yanıt bir HTTP/1.1 hatası olan `400 Bad chunk` ise, kenarın trafiği bir HTTP/1 ayrıştırıcısı için dönüştürdüğüne dair kanıtınız var demektir.
---
## Sömürü İş Akışı (H2.TE örneği)
```http
:method: POST
:path: /login
:scheme: https
:authority: example.com
content-length: 13 # ignored by the edge
transfer-encoding: chunked
5;ext=1\r\nHELLO\r\n
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
```
1. **Ön uç** tam olarak 13 bayt okur (`HELLO\r\n0\r\n\r\nGE`), isteğin tamamlandığını düşünür ve bu kadarını orijine iletir.
2. **Arka uç** TE başlığına güvenir, *ikinci* `0\r\n\r\n` görünene kadar okumaya devam eder ve böylece saldırganın ikinci isteğinin ön ekini (`GET /admin …`) tüketir.
3. Kalan (`GET /admin …`) kurbanın arkasında bekleyen *yeni* bir istek olarak işlenir.
Kaçırılan isteği şunlarla değiştirin:
* `POST /api/logout` oturum sabitlemeyi zorlamak için
* `GET /users/1234` kurbana özgü bir kaynağı çalmak için
---
## h2c smuggling (düz metin yükseltmeleri)
2023'te yapılan bir çalışma, bir ön ucun HTTP/1.1 `Upgrade: h2c` başlığını düz metin HTTP/2'yi destekleyen bir arka uca iletmesi durumunda, bir saldırganın yalnızca HTTP/1.1'i doğrulayan bir kenar üzerinden *ham* HTTP/2 çerçevelerini tünelleme yapabileceğini göstermiştir. Bu, başlık normalizasyonunu, WAF kurallarını ve hatta TLS sonlandırmasını atlar.
Ana gereksinimler:
* Kenar, **her iki** `Connection: Upgrade` ve `Upgrade: h2c` başlıklarını değiştirmeden iletmelidir.
* Orijin, HTTP/2'ye geçiş yapmalı ve istek kuyruklama yeteneklerini sağlayan bağlantı yeniden kullanım anlamlarını korumalıdır.
Hafifletme basittir WebSocket'ler hariç, kenarda `Upgrade` başlığını kaldırın veya sabit kodlayın.
---
## Dikkate değer gerçek dünya CVE'leri (2022-2025)
* **CVE-2023-25690** Apache HTTP Server mod_proxy yeniden yazma kuralları, istek bölme ve kaçırma için zincirlenebilir. (2.4.56'da düzeltildi)
* **CVE-2023-25950** HTX ayrıştırıcısının hatalı bir şekilde işlediği boru hatlı isteklerde HAProxy 2.7/2.6 istek/yanıt kaçırma.
* **CVE-2022-41721** Go `MaxBytesHandler`, kalan gövde baytlarının **HTTP/2** çerçeveleri olarak işlenmesine neden olarak protokoller arası kaçırmayı sağladı.
---
## Araçlar
* **Burp Request Smuggler** v1.26'dan itibaren otomatik olarak H2.TE/H2.CL ve gizli ALPN desteğini test eder. Uzantı seçeneklerinde “HTTP/2 probing”i etkinleştirin.
* **h2cSmuggler** düz metin yükseltme saldırısını otomatikleştirmek için Bishop Fox tarafından oluşturulan Python PoC:
```bash
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
```
* **curl**/`hyper` manuel yükler oluşturma: `curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`.
---
## Savunma önlemleri
1. **Uçtan uca HTTP/2** düşürme çevirisini tamamen ortadan kaldırın.
2. **Uzunluk gerçeğinin tek kaynağı** düşürme sırasında, *her zaman* geçerli bir `Content-Length` **ve** **kaldırın** herhangi bir kullanıcı tarafından sağlanan `Content-Length`/`Transfer-Encoding` başlıklarını.
3. **Yol öncesi normalleştirme** başlık sanitizasyonunu *yol verme/yazma mantığından önce* uygulayın.
4. **Bağlantı izolasyonu** kullanıcılar arasında arka uç TCP bağlantılarını yeniden kullanmayın; “her bağlantıda bir istek” kuyruk tabanlı istismarları bozar.
5. **WebSocket hariç `Upgrade` başlığını kaldırın** h2c tünellemesini önler.
---
## Referanslar
* PortSwigger Research “HTTP/2: The Sequel is Always Worse” <https://portswigger.net/research/http2>
* Bishop Fox “h2c Smuggling: request smuggling via HTTP/2 clear-text” <https://bishopfox.com/blog/h2c-smuggling-request>
{{#include ../../banners/hacktricks-training.md}}