OpenLiteSpeed 1.9.3 - Alta - Remota - Privilegio residuo - Cookie duplicato HTTP/1 salta litespeed_role 403; lsphp riceve comunque HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
Classe: Residuo di privilegio Portata: Remota
OpenLiteSpeed 1.9.3 (edbe7f7db12577e905291955a6d416200942fb8b) restituisce ancora 403 per un singolo Cookie: litespeed_role= (il blocco della 1.8.2.1). Un Cookie duplicato in HTTP/1 non è 400. Host / Content-Length / Transfer-Encoding / Authorization duplicati lo sono. La seconda riga Cookie viene declassata a sconosciuta, la scansione di litespeed_role= non viene mai eseguita, IS_BL_COOKIE resta non impostato, e lsphp riceve comunque HTTP_COOKIE. LSAPI last-wins: $_SERVER['HTTP_COOKIE'] in PHP è la seconda riga.
HTTP/2 scansiona già ogni header Cookie. Questo residuo è HTTP/1.1. Il lab non ha popolato $_COOKIE['litespeed_role']. Non è un ATO di WordPress. Non è RCE.
| ID | nessuna CVE al momento |
| Classe | Residuo di privilegio (skip del 403 su litespeed_role= della 1.8.2.1) |
| Portata | Remota (HTTP/1.1 non autenticato) |
| CWE | CWE-693, CWE-436 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Prodotto | OpenLiteSpeed |
| Affetto | 1.9.3 (edbe7f7); HTTP/1.1 più lsphp |
| Auth | nessuna |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18750 |
Inviare due header Cookie su una singola richiesta HTTP/1.1. Il primo è innocuo. Il secondo trasporta litespeed_role=. OpenLiteSpeed restituisce 403 per quel nome su un singolo header Cookie e su ogni header Cookie HTTP/2. Un Cookie HTTP/1 duplicato salta il 403. lsphp vede comunque il ruolo in HTTP_COOKIE.
Le app che analizzano HTTP_COOKIE ottengono il valore che il controllo della 1.8.2.1 doveva tenere lontano dal worker. Le app che leggono solo $_COOKIE['litespeed_role'] non lo hanno visto in questo lab.
Venti ricerche nel sorgente della v1.9.3 dopo Caddy e lighttpd. Il blocco della 1.8.2.1 è memmem(..., "litespeed_role=", 15) sul primo Cookie comune. Un Cookie duplicato non è nella lista dei 400.
Vicoli ciechi: considerare urllib capace di inviare due header Cookie (li unisce); aspettarsi che il docker ufficiale ascolti sulla 8088 (l'immagine su Hub è sulla 80); aspettarsi che $_COOKIE segua il last-wins di HTTP_COOKIE (LSAPI ha riempito la tabella dei cookie dal primo header).
cd lab
./run.sh
Immagine litespeedtech/openlitespeed:1.9.3-lsphp84. Oracle lab/www/cookie.php. Socket HTTP/1.1 grezzi. Bind su loopback.
SUCCESS openlitespeed-dup-cookie-litespeed-role single-cookie=403 dummy=200 dup-cookie=200 php-sees-role=yes how=php-http-cookie OLS-DUP-COOKIE-LITESPEED-ROLE-WITNESS
Scansionare ogni header Cookie HTTP/1 come già fa HTTP/2, oppure restituire 400 per un Cookie duplicato come si fa 400 per Host.
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp header comuni duplicati, scansione litespeed_role= sul primo Cookie, 403 IS_BL_COOKIEsrc/http/httpcgitool.cpp esportazione di header sconosciuti come HTTP_COOKIElitespeed_role