OpenLiteSpeed 1.9.3 - Élevée - À distance - Privilège résiduel - Un Cookie dupliqué en HTTP/1 contourne le 403 de litespeed_role ; lsphp reçoit toujours HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
Classe : Reliquat de privilège Portée : Distante
OpenLiteSpeed 1.9.3 (edbe7f7db12577e905291955a6d416200942fb8b) renvoie toujours un 403 pour un seul Cookie: litespeed_role= (le bloc 1.8.2.1). Un Cookie dupliqué en HTTP/1 n'est pas un 400. Les doublons Host / Content-Length / Transfer-Encoding / Authorization le sont. La seconde ligne Cookie est rétrogradée en inconnue, le scan litespeed_role= ne s'exécute jamais, IS_BL_COOKIE reste non défini, et lsphp reçoit toujours HTTP_COOKIE. LSAPI applique le dernier gagnant : $_SERVER['HTTP_COOKIE'] en PHP correspond à la seconde ligne.
HTTP/2 scanne déjà chaque en-tête Cookie. Ce reliquat concerne HTTP/1.1. Le labo n'a pas peuplé $_COOKIE['litespeed_role']. Pas d'ATO WordPress. Pas de RCE.
| ID | pas encore de CVE |
| Classe | Reliquat de privilège (contournement du 403 litespeed_role= de 1.8.2.1) |
| Portée | Distante (HTTP/1.1 non authentifié) |
| CWE | CWE-693, CWE-436 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produit | OpenLiteSpeed |
| Affecté | 1.9.3 (edbe7f7) ; HTTP/1.1 plus lsphp |
| Auth | aucune |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1:18750 uniquement |
Envoyer deux en-têtes Cookie dans une seule requête HTTP/1.1. Le premier est inoffensif. Le second porte litespeed_role=. OpenLiteSpeed renvoie un 403 pour ce nom sur un seul en-tête Cookie et sur chaque en-tête Cookie HTTP/2. Un Cookie HTTP/1 dupliqué contourne le 403. lsphp voit toujours le rôle dans HTTP_COOKIE.
Les applications qui analysent HTTP_COOKIE obtiennent la valeur que le contrôle 1.8.2.1 était censé garder hors du worker. Les applications qui ne lisent que $_COOKIE['litespeed_role'] ne l'ont pas vu dans ce labo.
Vingt recherches dans le code source de la v1.9.3 après Caddy et lighttpd. Le bloc 1.8.2.1 est memmem(..., "litespeed_role=", 15) sur le premier Cookie commun. Un Cookie dupliqué ne figure pas dans la liste des 400.
Fausses pistes : croire qu'urllib pouvait envoyer deux en-têtes Cookie (il les fusionne) ; s'attendre à ce que le docker officiel écoute sur 8088 (l'image du Hub est sur 80) ; s'attendre à ce que $_COOKIE suive le dernier gagnant de HTTP_COOKIE (LSAPI a rempli la table des cookies à partir du premier en-tête).
cd lab
./run.sh
Image litespeedtech/openlitespeed:1.9.3-lsphp84. Oracle lab/www/cookie.php. Sockets HTTP/1.1 bruts. Bind sur 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
Scanner chaque en-tête Cookie HTTP/1 comme le fait déjà HTTP/2, ou renvoyer un 400 pour un Cookie dupliqué comme Host renvoie un 400.
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp en-têtes communs dupliqués, scan litespeed_role= sur le premier Cookie, 403 IS_BL_COOKIEsrc/http/httpcgitool.cpp export d'en-tête inconnu en HTTP_COOKIElitespeed_role