OpenLiteSpeed 1.9.3 - Alta - Remoto - Privilégio remanescente - Cookie duplicado HTTP/1 ignora litespeed_role 403; lsphp ainda recebe HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
Classe: Privilégio remanescente Alcance: Remoto
OpenLiteSpeed 1.9.3 (edbe7f7db12577e905291955a6d416200942fb8b) ainda retorna 403 para um único Cookie: litespeed_role= (o bloqueio da 1.8.2.1). Cookie duplicado em HTTP/1 não retorna 400. Host / Content-Length / Transfer-Encoding / Authorization duplicados retornam. A segunda linha Cookie é rebaixada para desconhecida, a varredura de litespeed_role= nunca é executada, IS_BL_COOKIE permanece não definido, e o lsphp ainda recebe HTTP_COOKIE. LSAPI last-wins: $_SERVER['HTTP_COOKIE'] do PHP é a segunda linha.
HTTP/2 já varre todos os cabeçalhos Cookie. Este resquício é HTTP/1.1. O laboratório não populou $_COOKIE['litespeed_role']. Não é ATO do WordPress. Não é RCE.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente (bloqueio 403 de litespeed_role= da 1.8.2.1) |
| Alcance | Remoto (HTTP/1.1 não 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 |
| Produto | OpenLiteSpeed |
| Afetado | 1.9.3 (edbe7f7); HTTP/1.1 com lsphp |
| Autenticação | nenhuma |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | somente 127.0.0.1:18750 |
Enviar dois cabeçalhos Cookie em uma única requisição HTTP/1.1. O primeiro é inofensivo. O segundo carrega litespeed_role=. O OpenLiteSpeed retorna 403 para esse nome em um único cabeçalho Cookie e em todos os cabeçalhos Cookie HTTP/2. Cookie HTTP/1 duplicado ignora o 403. O lsphp ainda vê o papel em HTTP_COOKIE.
Aplicações que analisam HTTP_COOKIE recebem o valor que o controle da 1.8.2.1 deveria manter fora do worker. Aplicações que apenas leem $_COOKIE['litespeed_role'] não o viram neste laboratório.
Vinte buscas no código-fonte da v1.9.3 após Caddy e lighttpd. O bloqueio da 1.8.2.1 é memmem(..., "litespeed_role=", 15) no primeiro Cookie comum. Cookie duplicado não está na lista de 400.
Caminhos errados: tratar o urllib como capaz de enviar dois cabeçalhos Cookie (ele os mescla); esperar que o docker oficial escutasse na 8088 (a imagem do Hub é a 80); esperar que $_COOKIE seguisse o last-wins de HTTP_COOKIE (o LSAPI preencheu a tabela de cookies a partir do primeiro cabeçalho).
cd lab
./run.sh
Imagem litespeedtech/openlitespeed:1.9.3-lsphp84. Oráculo lab/www/cookie.php. Sockets HTTP/1.1 brutos. Bind no 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
Varrer todos os cabeçalhos Cookie HTTP/1 da mesma forma que o HTTP/2 já faz, ou retornar 400 para Cookie duplicado da mesma forma que Host retorna 400.
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp cabeçalhos comuns duplicados, varredura de litespeed_role= no primeiro Cookie, 403 de IS_BL_COOKIEsrc/http/httpcgitool.cpp exportação de cabeçalho desconhecido como HTTP_COOKIElitespeed_role da 1.8.2.1