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

6.2 KiB
Raw Blame History

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:
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)

: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:
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

{{#include ../../banners/hacktricks-training.md}}