OpenLiteSpeed 1.9.3 - 高危 - 远程 - 权限残留 - HTTP/1 重复 Cookie 绕过 litespeed_role 403;lsphp 仍获取 HTTP_COOKIE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openlitespeed-dup-cookie-litespeed-role
类别: 权限残留 可达性: 远程
OpenLiteSpeed 1.9.3(edbe7f7db12577e905291955a6d416200942fb8b)对单个 Cookie: litespeed_role= 仍然返回 403(即 1.8.2.1 的拦截逻辑)。HTTP/1 重复的 Cookie 不会返回 400。而 Host / Content-Length / Transfer-Encoding / Authorization 的重复则会返回 400。第二个 Cookie 行被降级为未知头,litespeed_role= 扫描永远不会执行,IS_BL_COOKIE 保持未设置,而 lsphp 仍然会收到 HTTP_COOKIE。LSAPI 采用后者优先:PHP 的 $_SERVER['HTTP_COOKIE'] 是第二行。
HTTP/2 已经会扫描每一个 Cookie 头。这个残留问题属于 HTTP/1.1。实验环境并未填充 $_COOKIE['litespeed_role']。不是 WordPress ATO。不是 RCE。
| ID | 暂无 CVE |
| 类别 | 权限残留(1.8.2.1 的 litespeed_role= 403 跳过) |
| 可达性 | 远程(未认证的 HTTP/1.1) |
| CWE | CWE-693、CWE-436 |
| CVSS | 高危:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| 产品 | OpenLiteSpeed |
| 受影响版本 | 1.9.3(edbe7f7);HTTP/1.1 加 lsphp |
| 认证 | 无 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18750 |
在一个 HTTP/1.1 请求中发送两个 Cookie 头。第一个无害。第二个携带 litespeed_role=。OpenLiteSpeed 在单个 Cookie 头以及每个 HTTP/2 Cookie 头上都会对该名称返回 403。重复的 HTTP/1 Cookie 会跳过 403。lsphp 仍然会在 HTTP_COOKIE 中看到该角色。
解析 HTTP_COOKIE 的应用会拿到 1.8.2.1 控制逻辑本应阻止其到达 worker 的值。仅读取 $_COOKIE['litespeed_role'] 的应用在本实验环境中并未看到它。
在 Caddy 和 lighttpd 之后,对 v1.9.3 进行了二十次源码搜寻。1.8.2.1 的拦截逻辑是在第一个公共 Cookie 上执行 memmem(..., "litespeed_role=", 15)。重复 Cookie 不在 400 列表中。
走过的弯路:以为 urllib 能发送两个 Cookie 头(它会将它们合并);以为官方 docker 会监听 8088(Hub 镜像监听的是 80);以为 $_COOKIE 会遵循 HTTP_COOKIE 的后者优先(LSAPI 从第一个头填充了 cookie 表)。
cd lab
./run.sh
镜像 litespeedtech/openlitespeed:1.9.3-lsphp84。Oracle lab/www/cookie.php。原始 HTTP/1.1 socket。绑定回环地址。
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
像 HTTP/2 已经做的那样扫描每一个 HTTP/1 Cookie 头,或者像 Host 返回 400 那样对重复 Cookie 返回 400。
edbe7f7db12577e905291955a6d416200942fb8b)src/http/httpreq.cpp 重复的公共头、首个 Cookie 的 litespeed_role= 扫描、IS_BL_COOKIE 403src/http/httpcgitool.cpp 将未知头导出为 HTTP_COOKIElitespeed_role cookie