abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
类别: 存储型 XSS 可达性: 远程
Drupal 核心 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 | 高危:8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| 产品 | Drupal 核心 |
| 受影响版本 | 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 推断。实验未驱动浏览器点击 |
| 以查看者身份操作(会话 cookie、管理员 UI 点击) | 同一存储型 XSS | 受害者会话的完整性 | 推断。实验止于属性保留在 HTML 中 |
否定项:Xss::filter | Xss::filter('<a ... hx-on-click=...>') | 已关闭 | 实验验证已关闭。xss_keeps_hx=False |
| 未认证写入链接 | 无会话的 JSON:API | 已关闭 | 实验先以 uid 1 登录。无账户的陌生人无法设置该字段 |
| PHP RCE / LPE | 不适用 | 已关闭 | 此遗留问题是浏览器 JS,而非服务器上的 PHP |
同一版本遗留问题:Move Block sibling markup。
在 SA-CORE-2026-011 之后,我锁定了 drupal/drupal 11.4.8。进行了五次搜寻:XSS/HTMX、文件/MIME/oEmbed、JSON:API/unserialize/SQLi、认证/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;反向 shell。都是表演。判定依据是属性保留在节点 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 中。如类文档块所述,将其合并到 Xss 中。
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。