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

5.7 KiB
Raw Blame History

Request Smuggling in HTTP/2 Downgrades

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

HTTP/2 kwa ujumla inachukuliwa kuwa haina hatari kwa request-smuggling ya jadi kwa sababu urefu wa kila DATA frame ni wazi. Ulinzi huo unakosekana mara tu proxy ya mbele “inaporomosha” ombi hilo hadi HTTP/1.x kabla ya kulipeleka kwa nyuma. Wakati parser mbili tofauti (HTTP/2 front-end na HTTP/1 back-end) zinapojaribu kukubaliana juu ya mahali ambapo ombi moja linamalizika na lingine linaanza, hila zote za zamani za desync zinarejea pamoja na chache mpya.


Kwa nini kuporomoka kunatokea

  1. Vivinjari tayari vinazungumza HTTP/2, lakini miundombinu ya zamani ya asili bado inelewa tu HTTP/1.1.
  2. Reverse-proxies (CDNs, WAFs, load-balancers) kwa hivyo huweka mwisho TLS + HTTP/2 kwenye ukingo na kuandika upya kila ombi kama HTTP/1.1 kwa asili.
  3. Hatua ya tafsiri inahitaji kuunda zote Content-Length na/au Transfer-Encoding: chunked vichwa ili asili iweze kubaini urefu wa mwili.

Wakati wowote front-end inatilia maanani urefu wa frame ya HTTP/2 lakini back-end inatilia maanani CL au TE, mshambuliaji anaweza kuwafanya wasikubaliane.


Daraja mbili kuu za primitive

Variant Front-end length Back-end length Typical payload
H2.TE HTTP/2 frame Transfer-Encoding: chunked Weka ujumbe wa mwili wa chunked wa ziada ambao 0\r\n\r\n wa mwisho haujatumwa, hivyo back-end inasubiri ombi la “next” lililotolewa na mshambuliaji.
H2.CL HTTP/2 frame Content-Length Tuma ndogo CL kuliko mwili halisi, hivyo back-end inasoma zaidi ya mpaka katika ombi linalofuata.

Hizi ni sawa kwa roho na TE.CL / CL.TE za jadi, tu na HTTP/2 ikichukua nafasi ya mmoja wa waandishi.


Kutambua mchain ya kuporomoka

  1. Tumia ALPN katika handshake ya TLS (openssl s_client -alpn h2 -connect host:443) au curl:
curl -v --http2 https://target

Ikiwa * Using HTTP2 inaonekana, ukingo unazungumza H2. 2. Tuma ombi la CL/TE lililokusudiwa vibaya kupitia HTTP/2 (Burp Repeater sasa ina dropdown ya kulazimisha HTTP/2). Ikiwa jibu ni kosa la HTTP/1.1 kama 400 Bad chunk, una uthibitisho kwamba ukingo umebadilisha trafiki kwa parser ya HTTP/1 chini.


Mchakato wa unyakuzi (mfano wa H2.TE)

: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. Front-end inasoma byte 13 tu (HELLO\r\n0\r\n\r\nGE), inadhani ombi limekamilika na kupeleka kiasi hicho kwa asili.
  2. Back-end inategemea kichwa cha TE, inaendelea kusoma hadi inapoona ya pili 0\r\n\r\n, hivyo inatumia prefix ya ombi la pili la mshambuliaji (GET /admin …).
  3. Kiasi kilichobaki (GET /admin …) kinachukuliwa kama ombi jipya lililoorodheshwa nyuma ya la mwathirika.

Badilisha ombi lililofichwa na:

  • POST /api/logout kulazimisha kurekebisha kikao
  • GET /users/1234 kuiba rasilimali maalum ya mwathirika

h2c smuggling (mabadiliko ya wazi)

Utafiti wa mwaka 2023 ulibaini kwamba ikiwa front-end inapita kichwa cha HTTP/1.1 Upgrade: h2c kwa back-end inayounga mkono HTTP/2 ya wazi, mshambuliaji anaweza kupitisha raw HTTP/2 frames kupitia edge ambayo ilithibitisha tu HTTP/1.1. Hii inakwepa kawaida ya kichwa, sheria za WAF na hata kumaliza TLS.

Mahitaji muhimu:

  • Edge inapeleka zote Connection: Upgrade na Upgrade: h2c bila kubadilishwa.
  • Asili inaongeza kwa HTTP/2 na inashikilia semantics za kurejelea muunganisho ambazo zinawezesha kuorodhesha maombi.

Kuzuia ni rahisi ondoa au uweke kichwa cha Upgrade kwa edge isipokuwa kwa WebSockets.


CVEs za kutambulika katika ulimwengu halisi (2022-2025)

  • CVE-2023-25690 Sheria za mod_proxy za Apache HTTP Server zinaweza kuunganishwa kwa ajili ya kugawanya na kuficha maombi. (imekamilishwa katika 2.4.56)
  • CVE-2023-25950 HAProxy 2.7/2.6 kuficha maombi/jibu wakati parser ya HTX iliposhughulikia vibaya maombi yaliyoandikwa kwa mfululizo.
  • CVE-2022-41721 Go MaxBytesHandler ilisababisha byte za mwili zilizobaki kuchambuliwa kama HTTP/2 frames, ikiruhusu kuficha kwa njia ya itifaki tofauti.

Zana

  • Burp Request Smuggler tangu v1.26 inajaribu kiotomatiki H2.TE/H2.CL na msaada wa ALPN uliofichwa. Wezesha “HTTP/2 probing” katika chaguzi za nyongeza.
  • h2cSmuggler Python PoC na Bishop Fox ili kuendesha shambulio la mabadiliko ya wazi:
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
  • curl/hyper kuunda payloads za mikono: curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target.

Hatua za kujihami

  1. HTTP/2 kutoka mwisho hadi mwisho ondolea kabisa tafsiri ya kudondosha.
  2. Chanzo kimoja cha ukweli wa urefu unaposhuka, daima tengeneza Content-Length halali na ondoa kichwa chochote kilichotolewa na mtumiaji Content-Length/Transfer-Encoding.
  3. Sanitiza kabla ya njia tumia usafi wa kichwa kabla ya mantiki ya kuelekeza/kurekebisha.
  4. Kutengwa kwa muunganisho usitumie muunganisho wa TCP wa back-end kati ya watumiaji; “ombio moja kwa muunganisho” inashinda unyanyasaji wa msingi wa orodha.
  5. Ondoa Upgrade isipokuwa WebSocket inazuia h2c tunnelling.

Marejeleo

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