OpenLiteSpeed 1.9.3 - 높음 - 원격 - 권한 잔여 - HTTP/1 중복 쿠키가 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 줄은 unknown으로 강등되고, 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 제어가 워커에서 차단하려 했던 값을 얻게 된다. $_COOKIE['litespeed_role']만 읽는 앱은 이 실습 환경에서 그 값을 보지 못했다.
Caddy와 lighttpd 이후 v1.9.3 소스를 스무 번 탐색했다. 1.8.2.1 차단은 첫 번째 공통 Cookie에 대한 memmem(..., "litespeed_role=", 15)이다. 중복 Cookie는 400 목록에 없다.
잘못된 방향: urllib이 두 개의 Cookie 헤더를 보낼 수 있다고 가정한 것(urllib은 이를 병합한다); 공식 docker가 8088에서 수신한다고 기대한 것(Hub 이미지는 80이다); $_COOKIE가 HTTP_COOKIE의 마지막 값 우선을 따를 것이라 기대한 것(LSAPI는 첫 번째 헤더로 쿠키 테이블을 채웠다).
cd lab
./run.sh
이미지 litespeedtech/openlitespeed:1.9.3-lsphp84. 오라클 lab/www/cookie.php. 원시 HTTP/1.1 소켓. 루프백 바인드.
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 unknown 헤더를 HTTP_COOKIE로 내보내기litespeed_role 쿠키