Request Smuggling in HTTP/2 Downgrades

Reading time: 6 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

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

VariantFront-end lengthBack-end lengthTypical payload
H2.TEHTTP/2 frameTransfer-Encoding: chunkedWeka 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.CLHTTP/2 frameContent-LengthTuma 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:
bash
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)

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

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks