OpenLiteSpeed 1.9.3 - Alta - Remota - Privilegio residual - Cookie duplicado en HTTP/1 omite el 403 de litespeed_role; lsphp aún recibe HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
Clase: Resto de privilegio Alcance: Remoto
OpenLiteSpeed 1.9.3 (edbe7f7db12577e905291955a6d416200942fb8b) sigue devolviendo 403 ante un único Cookie: litespeed_role= (el bloqueo de 1.8.2.1). El Cookie duplicado en HTTP/1 no es 400. Host / Content-Length / Transfer-Encoding / Authorization duplicados sí lo son. La segunda línea Cookie se degrada a desconocida, el escaneo de litespeed_role= nunca se ejecuta, IS_BL_COOKIE permanece sin establecer, y lsphp sigue recibiendo HTTP_COOKIE. LSAPI last-wins: $_SERVER['HTTP_COOKIE'] de PHP es la segunda línea.
HTTP/2 ya escanea cada cabecera Cookie. Este resto es HTTP/1.1. El laboratorio no pobló $_COOKIE['litespeed_role']. No es ATO de WordPress. No es RCE.
| ID | sin CVE todavía |
| Clase | Resto de privilegio (omisión del 403 de litespeed_role= de 1.8.2.1) |
| Alcance | Remoto (HTTP/1.1 no autenticado) |
| 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 |
| Producto | OpenLiteSpeed |
| Afectado | 1.9.3 (edbe7f7); HTTP/1.1 más lsphp |
| Autenticación | ninguna |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18750 |
Enviar dos cabeceras Cookie en una sola petición HTTP/1.1. La primera es inofensiva. La segunda lleva litespeed_role=. OpenLiteSpeed devuelve 403 ante ese nombre en una única cabecera Cookie y en cada cabecera Cookie de HTTP/2. El Cookie duplicado en HTTP/1 omite el 403. lsphp sigue viendo el rol en HTTP_COOKIE.
Las aplicaciones que analizan HTTP_COOKIE obtienen el valor que el control de 1.8.2.1 debía mantener fuera del worker. Las aplicaciones que solo leen $_COOKIE['litespeed_role'] no lo vieron en este laboratorio.
Veinte búsquedas en el código fuente de v1.9.3 tras Caddy y lighttpd. El bloqueo de 1.8.2.1 es memmem(..., "litespeed_role=", 15) sobre la primera Cookie común. El Cookie duplicado no está en la lista de 400.
Caminos equivocados: tratar urllib como capaz de enviar dos cabeceras Cookie (las fusiona); esperar que el docker oficial escuche en 8088 (la imagen del Hub es 80); esperar que $_COOKIE siga el last-wins de HTTP_COOKIE (LSAPI llenó la tabla de cookies desde la primera cabecera).
cd lab
./run.sh
Imagen litespeedtech/openlitespeed:1.9.3-lsphp84. Oráculo lab/www/cookie.php. Sockets HTTP/1.1 en crudo. Enlace a 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
Escanear cada cabecera Cookie de HTTP/1 tal como ya hace HTTP/2, o devolver 400 ante Cookie duplicado tal como Host devuelve 400.
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp cabeceras comunes duplicadas, escaneo de litespeed_role= en la primera Cookie, 403 de IS_BL_COOKIEsrc/http/httpcgitool.cpp exportación de cabecera desconocida como HTTP_COOKIElitespeed_role