
Drupal 11.4.8 - 높음 - 원격 - XSS - AttributeXss가 여전히 HTMX 속성을 허용함
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
분류: 저장형 XSS 도달 범위: 원격
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011은 Xss::attributes()에서 HTMX 속성을 차단했습니다. 링크 및 메뉴 속성은 AttributeXss::sanitizeAttributes를 거치며, 이 스킵 목록은 여전히 style과 on*만 제거합니다.
Link 필드(또는 메뉴 링크)를 설정할 수 있는 콘텐츠 편집자는 hx-on-click 또는 data-hx-on-click을 저장할 수 있습니다. Standard와 BigPipe는 core/htmx를 로드합니다. 관리자나 다른 뷰어가 해당 노드를 열고 링크를 클릭하면, HTMX가 저장된 JS를 사이트 오리진에서 실행합니다.
| ID | 아직 CVE 없음 |
| 분류 | 저장형 XSS (HTMX 이벤트 속성) |
| 도달 범위 | 원격 (인증된 Link 필드 / 메뉴 작성자; 피해자가 조회 후 클릭) |
| CWE | CWE-79 |
| CVSS | High: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| 제품 | Drupal core |
| 영향받는 버전 | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| 인증 | Link 필드(또는 메뉴 링크)를 작성할 수 있는 인증된 사용자. 피해자가 페이지를 조회하고 클릭. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
작성자: 링크 options.attributes(Link 필드, 메뉴 링크, JSON:API)를 설정할 수 있는 콘텐츠 편집자. 피해자: 페이지가 HTMX를 로드하는 모든 사람(Standard + BigPipe는 core/htmx를 로드), 링크를 클릭하는 사이트 관리자 포함.
| 권한 | 메서드 / 경로 | 종류 | 랩 검증 또는 추론 |
|---|---|---|---|
| 링크에 HTMX 이벤트 속성 저장 | POST /jsonapi/node/article에 field_link.options.attributes.hx-on-click 및 data-hx-on-click 사용 | 저장된 필드의 무결성 | 랩 검증. JSON:API 201, 저장된 속성에 여전히 hx-on-click 포함 |
노드 <a>에 해당 속성 출력 | LinkFormatter -> AttributeXss::sanitizeAttributes | HTML 무결성 | 랩 검증. GET /node/1 HTML에 hx-on-click과 마커 window['DRUPAL-HTMX-ATTR-WITNESS']=1 포함 |
| 피해자가 클릭할 때 해당 JS를 피해자 오리진에서 실행 | HTMX가 hx-on-* 바인딩 | 피해자 세션 무결성 | HTMX와 페이지의 core/htmx 로드에서 추론. 랩은 브라우저 클릭을 구동하지 않음 |
| 뷰어로서 행동(세션 쿠키, 관리자 UI 클릭) | 동일한 저장형 XSS | 피해자 세션 무결성 | 추론. 랩은 HTML에 속성이 남는 것까지만 확인 |
부정: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | 차단됨 | 랩 검증 차단됨. xss_keeps_hx=False |
| 링크의 비인증 쓰기 | 세션 없는 JSON:API | 차단됨 | 랩은 먼저 uid 1로 로그인함. 계정 없는 외부인은 필드를 설정할 수 없음 |
| PHP RCE / LPE | 해당 없음 | 차단됨 | 이 잔여물은 서버의 PHP가 아닌 브라우저 JS임 |
동일 핀 잔여물: Move Block sibling markup.
SA-CORE-2026-011 이후 drupal/drupal 11.4.8을 핀했습니다. 다섯 가지 탐색: XSS/HTMX, file/MIME/oEmbed, JSON:API/unserialize/SQLi, auth/CSRF/Host, REST/media/Views. JSON:API 접근, EntityQuery IN 키(SA-004), 직렬화 필드 POI(SA-005), rebuild.php Host(SA-007)는 패치된 상태로 유지됩니다. HTMX 스킵 목록은 Xss.php에만 적용되었습니다.
$skip = (
in_array($attribute_name, ['style', 'srcdoc']) ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, 'data-hx') ||
str_starts_with($attribute_name, 'hx') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
AttributeXss.php 잔여물:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
호출자에는 LinkFormatter.php와 MenuLinkContent::getUrlObject()가 포함됩니다.
이미 기록된 잘못된 방향: Xss::filter를 잔여물로 취급(이는 대조군임); 비인증 JSON:API 쓰기; PHP RCE; 리버스 셸. 극적인 것들. 오라클은 노드 HTML에 남은 속성과 core/htmx 로드 여부입니다.
python3 drupal-htmx-attr-Abraxas-Labs.py
또는
cd lab
./run.sh
대상은 오직 http://127.0.0.1:19480. 라이브 drupal:11.4.8-apache, Standard 프로필, 랩을 위해 JSON:API 쓰기 활성화. Compose 프로젝트 drupal-htmx-attr.
SUCCESS drupal-htmx-attr how=live write=jsonapi nid=1 hx-on-click=kept jsonapi-stored=1 xss-filter=stripped htmx=loaded marker=1 version=11.4.8 DRUPAL-HTMX-ATTR-WITNESS
hx / data-hx / srcdoc 거부 목록을 AttributeXss에 복사하세요. 클래스 docblock에 이미 명시된 대로 Xss에 통합하세요.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.