OpenLiteSpeed 1.9.3 – Hoch – Remote – Privilegien-Rest – HTTP/1 doppeltes Cookie umgeht litespeed_role 403; lsphp erhält weiterhin HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
Klasse: Privilegien-Überbleibsel Reichweite: Remote
OpenLiteSpeed 1.9.3 (edbe7f7db12577e905291955a6d416200942fb8b) liefert weiterhin 403 bei einem einzelnen Cookie: litespeed_role= (der 1.8.2.1-Block). Ein doppelter Cookie-Header in HTTP/1 ist kein 400. Host / Content-Length / Transfer-Encoding / Authorization-Duplikate hingegen schon. Die zweite Cookie-Zeile wird zu „unknown“ herabgestuft, der litespeed_role=-Scan läuft nie, IS_BL_COOKIE bleibt ungesetzt, und lsphp erhält weiterhin HTTP_COOKIE. LSAPI last-wins: PHPs $_SERVER['HTTP_COOKIE'] ist die zweite Zeile.
HTTP/2 scannt bereits jeden Cookie-Header. Dieses Überbleibsel betrifft HTTP/1.1. Das Lab hat $_COOKIE['litespeed_role'] nicht befüllt. Kein WordPress-ATO. Kein RCE.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (1.8.2.1 litespeed_role= 403-Skip) |
| Reichweite | Remote (unauthentifiziertes HTTP/1.1) |
| CWE | CWE-693, CWE-436 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produkt | OpenLiteSpeed |
| Betroffen | 1.9.3 (edbe7f7); HTTP/1.1 plus lsphp |
| Auth | keine |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18750 |
Zwei Cookie-Header in einer einzigen HTTP/1.1-Anfrage senden. Der erste ist harmlos. Der zweite trägt litespeed_role=. OpenLiteSpeed liefert 403 für diesen Namen bei einem einzelnen Cookie-Header und bei jedem HTTP/2-Cookie-Header. Ein doppelter HTTP/1-Cookie umgeht die 403. lsphp sieht die Rolle weiterhin in HTTP_COOKIE.
Apps, die HTTP_COOKIE parsen, erhalten den Wert, den die 1.8.2.1-Kontrolle vom Worker fernhalten sollte. Apps, die nur $_COOKIE['litespeed_role'] lesen, sahen ihn in diesem Lab nicht.
Zwanzig Quellcode-Suchen in v1.9.3 nach Caddy und lighttpd. Der 1.8.2.1-Block ist memmem(..., "litespeed_role=", 15) auf dem ersten gemeinsamen Cookie. Ein doppelter Cookie steht nicht in der 400-Liste.
Irrwege: urllib für fähig zu halten, zwei Cookie-Header zu senden (es führt sie zusammen); zu erwarten, dass das offizielle Docker auf 8088 lauscht (das Hub-Image nutzt 80); zu erwarten, dass $_COOKIE dem Last-wins von HTTP_COOKIE folgt (LSAPI füllte die Cookie-Tabelle aus dem ersten Header).
cd lab
./run.sh
Image litespeedtech/openlitespeed:1.9.3-lsphp84. Oracle lab/www/cookie.php. Rohe HTTP/1.1-Sockets. Bind 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
Jeden HTTP/1-Cookie-Header so scannen, wie es HTTP/2 bereits tut, oder doppelte Cookies mit 400 beantworten, so wie Host mit 400 beantwortet wird.
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp doppelte gängige Header, litespeed_role=-Scan im ersten Cookie, IS_BL_COOKIE 403src/http/httpcgitool.cpp Export unbekannter Header als HTTP_COOKIElitespeed_role-Cookie