文章总结: 本文分析WordPress订餐插件VikAppointments的CVE-2026-87115任意文件删除漏洞,CVSS9.1,未认证攻击者可删除服务器任意文件,删wp-config.php可致RCE。根因是File字段处理未校验路径,建议升级至1.2.22并移除File字段,检查关键文件完整性。 综合评分: 90 文章分类: 漏洞分析,红队,WEB安全,代码审计
(9.1分) CVE-2026-87115:WordPress订餐插件任意文件删除
红队安全圈 红队安全圈
红队安全圈
2026年10月4日 20:00 重庆
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
WordPress 预订插件 VikAppointments 任意文件删除漏洞(CVSS 9.1):未认证可删服务器任意文件,删掉 wp-config.php 就能打成 RCE。源码级拆解根因 + 检测命令 + 实战技巧。
01 引言
WordPress 预订插件 VikAppointments(Services Booking Calendar)出了一个任意文件删除漏洞,编号 CVE-2026-87115,CVSS 9.1。未认证攻击者可以删掉服务器上的任意文件——删对了文件(比如 wp-config.php)就能直接打成 RCE。漏洞 10 月 2 日刚披露,已确认补丁,1.2.22 修复。
这个洞最值钱的地方是它的触发面:整个利用只需要会话里带一个表单 token(插件页面正常浏览就有),不需要登录、不需要任何权限。
02 漏洞速览
CVE 编号CVE-2026-87115
影响产品VikAppointments(WordPress 插件)
影响版本所有版本,含 1.2.21
漏洞类型路径穿越(CWE-22)任意文件删除
危害等级CVSS 9.1(Critical)
利用前提未认证 + 有效 token;确认页有 File 字段
在野利用暂无报告 / 暂无公开 PoC
修复版本1.2.22
03 漏洞成因
根因在 File 类型自定义字段的处理代码里。插件给订单确认页(confirmapp)提供文件上传字段,处理逻辑在 VAPCustomFieldFile 类的 extract 方法,两个关键动作:
第一,extract 从请求里读一个 old_ 前缀的参数,值是之前上传的旧文件名:
$old = $input->getString(
‘old_’ . $this->getID(), ”
);
第二,只要用户同时上传了新文件,代码就认为该清理旧文件,直接拼路径删除:
if ($old) {
// unlink the previous files
foreach ((array) $old as $tmp) {
unlink(VAPCUSTOMERS_UPLOADS .
DIRECTORY_SEPARATOR . $tmp);
}
}
问题一眼可见:$old 的值完全由客户端控制,拼进路径前没有做任何校验——没有 basename() 剥离目录、没有 realpath() 归一化比对、没有限制在 VAPCUSTOMERS_UPLOADS 目录内。传一个 ../ 的相对路径,unlink 的落点就跳出上传目录,实现任意文件删除。
整个利用门槛低到离谱:确认页的表单里就有防 CSRF 的 token(普通访客都能拿到),再带上一个合法的新文件上传和精心构造的 old_vapcfN 参数即可。唯一的环境条件是站点管理员在确认页短代码上发布过 File 类型字段——这个字段安装时默认不创建,所以可利用面比理论范围窄,但预约类站点配上传字段的不少见。
04 利用价值判断
这个洞对红队的实际价值在于文件删除到 RCE 的链路:
删 wp-config.php 是经典玩法——WordPress 发现配置文件缺失会跳转到安装向导,攻击者可以接管安装过程,指向自己控制的数据库服务器,之后装个带后门的主题或插件就拿到 webshell。
其他高价值目标包括 .htaccess(改写解析规则)、站点根目录的 index.php,以及备份文件删除后诱发的恢复流程滥用。
风险评级:AV:N/AC:L/PR:N/UI:N——网络可达、低复杂度、无需权限、无需用户交互。I:H/A:H 的组合意味着这是一把纯破坏加接管的武器。唯一限制是环境前提(确认页有 File 字段)和需要 token(脚本自动化时先 GET 一次表单就能拿到)。
05 影响范围
受影响:VikAppointments 所有版本,包括最新的 1.2.21。
已修复:1.2.22(补丁已发布)。
这个插件是 VikWP 家的预约订座方案,酒店、诊所、租车、服务预约类站点用得多,装机量不算顶级但也不小。跑预约业务的站点值得立刻自查。
06 检测与排查
判断是否受影响:确认页面(带 confirmapp 的 URL)上存在文件上传字段,且插件版本 <= 1.2.21,即处于风险范围。
1. 升级到 1.2.22 或更高
2. 暂时把确认页短代码上的 File 类型自定义字段下掉(消除触发条件)
3. 检查关键文件完整性:wp-config.php、.htaccess、index.php 的 mtime 是否有异常
4. 上传目录外层有没有最近的删除痕迹(默认在 wp-content/uploads 下)
07 实战技巧
1. 枚举目标站点是否用 VikAppointments:看页面源码里的特征(VAP 前缀的 CSS/JS 路径,或 option=com_vikappointments 参数)。
2. 找确认页:带 view=confirmapp 的 URL 就是目标端点,抓一次正常预约流程的请求,拿到 token 和文件字段名(old_ 后面拼的是字段 ID,形如 old_vapcf1)。
3. 验证而非破坏:测试时别真删 wp-config.php,删一个自己上传的探测文件,确认 unlink 落点可控就够了。
4. 授权测试外的环境别碰:文件删除是破坏性操作,删错了没有撤销。防守方对应加检测:old_ 参数带路径穿越特征、以及 POST 到 confirmapp 的 multipart 请求里同时带文件和 old_ 参数的组合,都值得告警。
08 红队视角
这个洞是教科书级的”删除即接管”范式,和历史上几次著名的文件删除链一脉相承。单独看只是破坏,配上 WordPress 的重装逻辑就是未认证 RCE。
防御的真正教训不是打补丁,而是设计层面:任何接受客户端提供的文件路径再执行 unlink 的代码,都必须先 basename() 归一化并强制锁死在指定目录内。这类洞在 WordPress 插件里反复出现,写插件的值得把这条检查清单固化进 CI。
对红队来说,任意文件删除在攻击面盘点时经常被低估——它不像 RCE/SQLi 那样一眼显眼,但在 WordPress 语境下它的上限就是 RCE。看到 unlink、rmdir、file_exists 组合接受用户输入,值得多花十分钟。这个插件去年还有过未认证 SQL 注入(<= 1.2.20),出洞频率不低,长期不管的预约站点建议评估下线。
09 POC 链接
https://www.wordfence.com/threat-intel/vulnerabilities/id/75fc5df5-a774-4fe1-8452-d35ba7b69081
https://plugins.trac.wordpress.org/changeset?reponame=&old=3721264%40vikappointments&new=3721264%40vikappointments
说明:漏洞详情页与官方修复代码变更集。
如果文章对您有收获,欢迎关注、点赞、推荐、转发。
— END —
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队安全圈 红队安全圈 红队安全圈《(9.1分) CVE-2026-87115:WordPress订餐插件任意文件删除》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论