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

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

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

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

工具目录

分类

查看所有分类
Loading categories
givewp-cve-2026-82222-rce-lab — # 授权 Docker 实验室及干净 PoC,用于验证 GiveWP 4.16.5.1 中的 CVE-2026-82222 RCE 及 4.16.7.2 修复版本。 | Kitploit
工具/GitHubGitHub/dinosn/givewp-cve-2026-82222-rce-lab
漏洞分析漏洞利用Web应用程序漏洞利用学习与教育实验室与实践
GitHubdinosn/givewp-cve-2026-82222-rce-lab

givewp-cve-2026-82222-rce-lab

# 授权 Docker 实验室及干净 PoC,用于验证 GiveWP 4.16.5.1 中的 CVE-2026-82222 RCE 及 4.16.7.2 修复版本。

查看仓库
19小时4分前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-82222 — GiveWP 仅标记 RCE 验证实验室

用于在隔离的 Docker 实验室中复现和验证 CVE-2026-82222 的安全研究材料。

如需直接 RCE PoC 和 URL 扫描,请使用 CVE-2026-8222-RCE.py

结论

状态:在所提供的实验室中已验证

GiveWP 4.16.5.1 允许最初未经身份验证的攻击者持久化一个 PHP 对象图,通过 GiveWP 会话处理将其复活,并以 WordPress Web 服务器用户身份 执行一个固定的标记命令。

测试阳性结果:

root@kitploit:~
GiveWP:    4.16.5.1
WordPress: 6.6.2
PHP:       8.1.30
Result:    /tmp/CVE-2026-82222-RCE-GETBAG created by www-data

端到端结果也在未经插桩的原始 GiveWP 4.16.5.1 源码上成功复现。GiveWP 4.16.7.2 在测试配置中阻止了 HTTP 载体,并在直接控制期间独立阻止了终端小工具。

这证明了在 WordPress 容器内实现了命令执行。它并不证明 root 访问、容器逃逸、横向移动或主机沦陷。

安全边界

仅在你拥有或明确授权测试的系统上使用本仓库。

所提供的 PoC 有意进行了限制:

  • 它仅执行 touch /tmp/CVE-2026-82222-RCE-GETBAG。
  • 它不提供任意命令选项。
  • 它不创建 shell、回调、持久化或权限提升。
  • 除非操作者提供明确的 --allow-authorized-non-loopback 标志,否则拒绝非回环目标。
  • Docker 仅将 WordPress 发布在 127.0.0.1 上。
  • Compose 项目名称派生自检出路径,因此一个克隆不会拆除另一个克隆的容器或卷。
  • 实验室使用原始官方插件源码;它不对易受攻击的目标进行插桩或修补。
  • HTTP 测试会创建一个一次性的捐赠者用户、元数据和 GiveWP 会话行。测试后请使用附带的重置命令。

    快速开始

    要求:

    • 带 Compose v2 的 Docker
    • Python 3.10 或更高版本
    • curl
    • unzip
    • sha256sum 或 shasum
    • 可访问 downloads.wordpress.org 以获取官方插件归档

    运行完整的易受攻击/已修补矩阵:

    root@kitploit:~
    ./lab verify
    

    该命令:

    1. 从 WordPress.org 下载 GiveWP 4.16.5.1 和 4.16.7.2。
    2. 验证两个 SHA-256 哈希值。
    3. 构建一个全新的仅回环 WordPress 6.6.2/PHP 8.1 实验室,并明确禁用正常的 WordPress 注册。
    4. 测试原始 4.16.5.1,并要求 Web 用户创建标记。
    5. 使用原始 4.16.7.2 构建第二个全新实验室。
    6. 要求 HTTP 标记保持不存在。
    7. 在直接控制中绕过入口,并确认已修补的 ProviderForwarder 终端也拒绝字符串可调用。

    已修补的实验室在结束时保持运行。使用以下命令移除它:

    root@kitploit:~
    ./lab reset
    

    要使用另一个回环端口:

    root@kitploit:~
    LAB_PORT=8099 ./lab verify
    

    预期证据

    易受攻击的控制必须以具体的终端证据结束:

    root@kitploit:~
    [PASS] E1: unauthenticated registration issued auth cookie
    [PASS] E3: serialized graph persisted in own last_name
    [PASS] E4: donation-form nonce obtained
    [PASS] E5: session write reached expected post-sink HTTP status=500
    [PASS] E6: session read/destruction trigger completed
    marker present and owned by the WordPress web user
    RESULT: VULNERABLE CONTROL CONFIRMED
    

    已修补的控制必须显示:

    root@kitploit:~
    [PASS] P1: patched registration gate blocked auth cookie
    DIRECT_MARKER=absent
    HTTP marker absent and direct terminal gadget blocked
    RESULT: PATCHED CONTROL CONFIRMED
    

    没有标记的 HTTP 500、存储的载荷、异常或检测器命中 不被接受为 RCE 证据。

    手动实验室生命周期

    启动并测试易受攻击的版本:

    root@kitploit:~
    ./lab start vulnerable
    ./lab test
    

    启动并测试已修补的版本:

    root@kitploit:~
    ./lab start patched
    ./lab test
    

    检查当前状态:

    root@kitploit:~
    ./lab status
    

    移除容器、卷、测试用户、会话和标记状态:

    root@kitploit:~
    ./lab reset
    

    缓存的插件 ZIP 和提取的资源会被保留以加快重新运行。使用以下命令同时移除这些确切生成的资源:

    root@kitploit:~
    ./lab reset --purge-assets
    

    受影响和已测试的版本

    版本评估
    GiveWP 4.16.5.1端到端复现 RCE
    GiveWP 4.16.6–4.16.7.1报告受影响;此处未逐一复现
    GiveWP 4.16.7.2已复现已修补的阴性对照
    后续版本未逐一测试;请更新到最新的受支持版本

    公开公告将 4.16.7.1 及之前的版本列为受影响。本仓库仅直接证明其阳性/阴性测试矩阵中的两个版本。

    参考:

    • Patchstack 公告
    • CVE-2026-82222
    • GiveWP 加固提交
    • GiveWP 官方插件页面

    根本原因

    该漏洞利用结合了多种行为:

    1. GiveWP 4.16.5.1 暴露了一个注册操作,即使在正常 WordPress 注册被禁用时也会创建并认证一个低权限捐赠者。
    2. 该用户可以在自己的名字元数据中持久化序列化数据。
    3. Give\Helpers\Utils::maybeSafeUnserialize() 使用 allowed_classes => false,产生 __PHP_Incomplete_Class,但后续的序列化保留了原始的类名和属性。
    4. 该对象图存储在 GiveWP 购买会话中。
    5. 后续不受限制的 maybe_unserialize() 复活了随附的类。
    6. 自动析构进入一个完整的 POP 链,最终调用 system()。

    HTTP 载体中需要四个字面命名空间反斜杠。两次有效的剥离过程将其从 4 -> 2 -> 1 减少。载荷不含 NUL 字节,并且已验证 PHP 8.1.30 能为私有 Session::$attributeName 属性水合纯序列化名称。

    完整 POP 链

    root@kitploit:~
    TCPDF::__destruct()
      -> TCPDF::_destroy(true)
      -> foreach ($this->imagekeys as $file)
      -> Symfony Session::getIterator()
      -> Session::getAttributeBag()
      -> Session::getBag($this->attributeName)
      -> $this->storage->getBag($attributeName)
      -> DonationFactory->__call('getBag', [$attributeName])
      -> call_user_func_array('system', [$attributeName])
      -> system('touch /tmp/CVE-2026-82222-RCE-GETBAG')
    

    攻击者控制的对象图:

    root@kitploit:~
    TCPDF
    ├── file_id = unique request identifier
    └── imagekeys = Give\Vendors\Symfony\Component\HttpFoundation\Session\Session
        ├── attributeName = fixed marker command
        └── storage = Give\TestData\Factories\DonationFactory
            └── loadedProviders["getBag"] = "system"
    

    关键的隐藏转换是 PHP 隐式的 IteratorAggregate 分发。TCPDF::$imagekeys 是无类型的,因此分配一个 Symfony Session 会导致 foreach 调用 Session::getIterator()。

    标记命令在 Symfony 强制执行 getAttributeBag(): AttributeBagInterface 返回类型之前执行。由此产生的 TypeError 和 HTTP 500 是后置效应。

    早期尝试遗漏了什么

    被拒绝的候选对象图使用了:

    root@kitploit:~
    TCPDF::$objcopy
      -> DonationFactory::$loadedProviders['__destruct'] = 'system'
    

    该对象图无法工作。TCPDF::_destroy() 仅 unset objcopy;PHP 不会将自动析构路由到 __call('__destruct', ...)。

    缺失的操作是:

    root@kitploit:~
    foreach ($this->imagekeys as $file) {
    

    早期的审查跟踪了析构函数和显式方法调用,但没有递归检查 foreach 触发的隐式对象协议。Symfony Session 提供了缺失的桥梁:

    • foreach 调用 getIterator()。
    • getIterator() 到达 getBag($attributeName)。
    • 攻击者控制的 storage 是一个 DonationFactory。
    • 未定义的 getBag 调用 ProviderForwarder::__call()。
    • loadedProviders['getBag'] = 'system' 选择可调用对象。
    • attributeName 提供命令参数。

    源码证据

    相关的 GiveWP 4.16.5.1 位置:

    组件位置
    受保护的初始反序列化src/Helpers/Utils.php:203-217,237-241
    捐赠载体includes/process-donation.php:157
    GiveWP 会话持久化includes/class-give-session.php:364-368,489-508
    不受限制的会话复活includes/class-give-session.php:347-350
    TCPDF 析构函数vendor/tecnickcom/tcpdf/tcpdf.php:2050-2052
    攻击者控制的迭代vendor/tecnickcom/tcpdf/tcpdf.php:7885-7907
    Symfony 迭代器桥梁vendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:134-136
    Symfony getBag 桥梁vendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:259-283
    终端可调用对象src/TestData/Framework/ProviderForwarder.php:19-23
    GiveWP Composer 自动加载器give.php:624-625

    官方发布哈希值:

    root@kitploit:~
    give.4.16.5.1.zip
    95fc6709b6ed284074bf09be096e28d6299fd4a103848c2b1c3bf8a5772cf98c
    
    give.4.16.7.2.zip
    c5bc98da2abb748c64d31a43679ff5f223092dfff6d214132a55dcbc948e91ae
    

    实验室在每次全新启动前都会从已验证的 ZIP 中重新提取每个插件,将其无修改地复制到 WordPress 中,并将部署的完整插件文件树与已验证的源码进行字节比较。三个官方 Docker 基础镜像也固定在其多架构清单摘要上。

    为什么 4.16.7.2 阻止了该链

    GiveWP 4.16.7.2 在注册、序列化输入处理、会话复活、数据迁移和小工具加固方面增加了独立的防御。

    终端加固要求解析出的对象实现预期的提供者契约:

    root@kitploit:~
    if ( ! $provider instanceof Contract\Provider ) {
        return null;
    }
    

    因此,攻击者控制的字符串 system 被拒绝。本仓库中的直接控制绕过 HTTP 载体,并验证仅凭这一终端防御就足以使其标记保持不存在。

    检查真实部署

    单独的阴性 PoC 结果不证明站点已修补。WAF、不同的路由、禁用的注册、缺失的旧版表单、会话配置或禁用的 PHP 命令函数都可能在一个仍然易受攻击的代码库上阻止标记。

    推荐的验证流程:

    1. 记录已部署的 GiveWP 版本和源码修订号。
    2. 备份或快照 WordPress 站点和数据库。
    3. 将该快照恢复到隔离的暂存环境中。
    4. 禁用不必要的出站网络访问。
    5. 针对克隆运行此仅标记验证器。
    6. 将 GiveWP 更新到最新的受支持版本,其中 4.16.7.2 是包含已测试修复的最低版本。
    7. 重复相同的测试并要求标记不存在。
    8. 独立验证已安装的插件版本和已修补的源码。

    版本检查:

    root@kitploit:~
    wp plugin get give --fields=name,status,version
    

    修复和事件审查

    将 GiveWP 更新到最新的受支持版本。更新后:

    • 在适用的情况下清除 PHP opcode 缓存。
    • 确认没有旧版 GiveWP 副本仍然处于活动状态或可通过 Web 访问。
    • 审查意外的 WordPress 或捐赠者账户。
    • 在用户元数据和 GiveWP 会话中搜索序列化的 TCPDF、Symfony Session 或 loadedProviders 对象图。
    • 关联同一会话中的注册、个人资料更改、捐赠请求和后续 HTTP 500 响应。
    • 调查意外的 Web 服务器子进程或文件系统更改。

    如果暴露于互联网的易受攻击安装包含对象注入痕迹,请将其视为潜在沦陷,而不仅仅是更新插件。

    仓库布局

    root@kitploit:~
    .
    ├── .github/workflows/validate.yml
    ├── .gitignore
    ├── README.md
    ├── SECURITY.md
    ├── docker-compose.yml
    ├── lab
    ├── poc
    │   ├── direct-pop-control.php
    │   └── poc.py
    └── scripts
        └── fetch-assets.sh
    

    未提交的内容:

    root@kitploit:~
    official plugin ZIPs
    extracted GiveWP source
    instrumented target source
    cookies or session data
    runtime evidence/logs
    internal target addresses or reusable credentials
    obsolete objcopy payloads
    historical validation output
    

    验证边界

    声明状态
    持久化 PHP 对象注入载体已验证
    随附类的复活已验证
    完整的库存 POP 链已验证
    以 Web 用户身份执行的固定标记已验证
    针对原始 4.16.5.1 的复现已验证
    针对原始 4.16.7.2 的阴性对照已验证
    每个中间受影响版本均已测试未测试
    Root 权限未声明
    容器逃逸未测试
    主机沦陷未测试

    证据标准刻意严格:只有通过未修改的库存链产生的可观察命令标记才被标记为 RCE。HTTP 接受、序列化、异常和检测器命中均为中间证据。

    下载工具