价值1250美元的ERPNext模版注入漏洞
字数 1320 2025-08-18 11:38:08
ERPNext 服务器端模板注入(SSTI)漏洞分析与防御
漏洞概述
ERPNext是由Frappé Technologies Pvt开发的企业资源规划(ERP)软件,在其用户配置文件页面存在服务器端模板注入(Server-Side Template Injection, SSTI)漏洞。攻击者可以通过在first name或last name字段注入恶意模板代码,导致服务器执行任意代码,获取敏感信息甚至完全控制系统。
漏洞发现过程
初始发现
- 测试人员在first name字段输入
{{7*7}},last name字段输入{{8*8}} - 页面呈现结果为49和64,确认存在模板注入漏洞
- 通过Portswigger博客资源确认使用的模板引擎为Jinja2
漏洞验证
-
文件读取:
- 设置first name为特定模板代码,成功读取服务器文件
- 示例代码(未在原文中完整展示,但效果是读取文件)
-
文件写入:
- 设置first name为特定模板代码,成功在文件系统上写入文件
- 示例代码(未在原文中完整展示)
-
敏感信息泄露:
- 成功读取SSH RSA私钥等敏感信息
漏洞利用技术
Jinja2模板注入
ERPNext使用Jinja2作为模板引擎,攻击者可利用以下技术:
-
基本验证:
{{7*7}} // 返回49确认漏洞 -
文件系统访问:
{{ ''.__class__.__mro__[1].__subclasses__() }}通过遍历Python对象模型访问危险函数和类
-
命令执行:
{{ config.__class__.__init__.__globals__['os'].popen('id').read() }}
漏洞修复过程
第一次修复尝试
- 开发团队将包含字符串
.__的名称列入黑名单 - 不足:简单的黑名单方式,
{{7*7}}仍会被执行
第二次修复
- 实施了更严格的输入过滤和转义机制
- 完全阻止了模板语法的执行
其他发现的安全问题
- 跨站脚本(XSS):在电子邮件响应中发现多个XSS漏洞
- SQL注入:发现一个SQL注入漏洞
- 其他SSTI:发现另一个SSTI漏洞
防御建议
开发人员防御措施
-
输入验证:
- 对所有用户输入进行严格验证
- 使用白名单而非黑名单策略
-
输出编码:
- 对所有动态内容进行适当的HTML编码
-
模板安全:
- 使用模板引擎的沙箱模式
- 限制模板中可以访问的对象和方法
-
最小权限原则:
- Web应用运行账户应具有最小必要权限
系统管理员措施
- 及时应用安全补丁
- 定期进行安全审计
- 监控异常活动
漏洞报告与奖励
- 漏洞通过负责任的方式披露给厂商
- Frappé Technologies修复漏洞并支付$1250奖金
- 分配了CVE编号(原文未提供具体编号)
学习资源
- Portswigger SSTI文章:https://portswigger.net/blog/server-side-template-injection
- Jinja2官方文档:http://jinja.pocoo.org/
- OWASP SSTI防御指南:https://owasp.org/www-community/attacks/Server-Side_Template_Injection
总结
ERPNext的SSTI漏洞展示了模板注入攻击的严重性,攻击者可以完全控制系统。防御需要多层防护,包括输入验证、输出编码和最小权限原则。对于开源项目贡献者,ERPNext是一个良好的安全研究目标。