免责声明: 此仓库仅用于教育目的和负责任的披露。该漏洞已负责任地向厂商报告并已修复。请勿利用此信息在未经授权的情况下攻击系统。
在 EventPrime WordPress 插件(版本 <= 4.2.8.1)中发现了一个 未认证的任意文件上传 漏洞。该缺陷允许任何未认证访客将文件直接上传到 WordPress 的 uploads 目录,并在媒体库中创建附件记录。
该漏洞源于一个特定的 AJAX 端点被显式注册为 nopriv(公开可访问),且缺少授权检查和适当的文件内容验证。攻击者可以利用此端点耗尽存储空间、向媒体库发送垃圾文件,或上传伪装成图片的恶意载荷。
<= 4.2.8.1根本原因是不安全的 AJAX 钩子注册与不充分的文件验证相结合。
1. 不安全的 AJAX 端点注册:
在 includes/class-eventprime-event-calendar-management.php 中,插件注册了 upload_file_media 操作。大约在第 557 行,它在操作映射中设置 {upload_file_media: true},其中 true 表示支持 _nopriv。因此,钩子 gwp_ajax_nopriv_ep_upload_file_media 被注册,使得端点对所有人可用。
2. 缺乏授权及 Nonce 检查:
处理函数 upload_file_media()(位于 includes/class-ep-ajax.php 的第 1659-1697 行)没有使用 current_user_can() 检查上传权限,也没有验证安全 nonce。
3. 有缺陷的验证逻辑:
该处理程序仅根据客户端提供的文件名验证文件扩展名(例如 jpg/jpeg/png/gif)(第 1661-1664 行)。它没有执行严格的服务器端内容验证(如 getimagesize() 或 wp_check_filetype_and_ext())。这意味着重命名为 harmless.jpg 的恶意脚本或其他文件类型将在 WordPress 尝试生成元数据之前被写入磁盘。
4. 持久化:
文件通过 move_uploaded_file() 直接保存到 wp_upload_dir()['path'],并通过 wp_insert_attachment() 创建 WordPress 附件。
1. 准备载荷: 在本地机器上创建一个名为 poc.jpg 的示例图片文件。
2. 执行请求: 向公开 AJAX 端点发送一个 multipart/form-data POST 请求,不带任何会话 cookie:
curl -i \
-F "[email protected];filename=poc.jpg" \
"http://TARGET_SITE/wp-admin/admin-ajax.php?action=ep_upload_file_media"
3. 观察响应: 服务器将响应 200 OK,并返回一个包含新创建的附件 ID 的 JSON 对象:
{"success":true,"data":{"attachment_id":117}}
4. 验证:
wp-content/uploads/<year>/<month>/poc.jpg。要解决此漏洞,开发者必须:
nopriv 声明。current_user_can('upload_files') 确保只有获得授权的特权用户可以上传。check_ajax_referer() 以防止 CSRF 攻击。wp_handle_upload()),这些函数会执行更严格的 MIME 类型和内容检查。