价值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字段注入恶意模板代码,导致服务器执行任意代码,获取敏感信息甚至完全控制系统。

漏洞发现过程

初始发现

  1. 测试人员在first name字段输入{{7*7}},last name字段输入{{8*8}}
  2. 页面呈现结果为49和64,确认存在模板注入漏洞
  3. 通过Portswigger博客资源确认使用的模板引擎为Jinja2

漏洞验证

  1. 文件读取

    • 设置first name为特定模板代码,成功读取服务器文件
    • 示例代码(未在原文中完整展示,但效果是读取文件)
  2. 文件写入

    • 设置first name为特定模板代码,成功在文件系统上写入文件
    • 示例代码(未在原文中完整展示)
  3. 敏感信息泄露

    • 成功读取SSH RSA私钥等敏感信息

漏洞利用技术

Jinja2模板注入

ERPNext使用Jinja2作为模板引擎,攻击者可利用以下技术:

  1. 基本验证

    {{7*7}}  // 返回49确认漏洞
    
  2. 文件系统访问

    {{ ''.__class__.__mro__[1].__subclasses__() }}
    

    通过遍历Python对象模型访问危险函数和类

  3. 命令执行

    {{ config.__class__.__init__.__globals__['os'].popen('id').read() }}
    

漏洞修复过程

第一次修复尝试

  1. 开发团队将包含字符串.__的名称列入黑名单
  2. 不足:简单的黑名单方式,{{7*7}}仍会被执行

第二次修复

  1. 实施了更严格的输入过滤和转义机制
  2. 完全阻止了模板语法的执行

其他发现的安全问题

  1. 跨站脚本(XSS):在电子邮件响应中发现多个XSS漏洞
  2. SQL注入:发现一个SQL注入漏洞
  3. 其他SSTI:发现另一个SSTI漏洞

防御建议

开发人员防御措施

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 使用白名单而非黑名单策略
  2. 输出编码

    • 对所有动态内容进行适当的HTML编码
  3. 模板安全

    • 使用模板引擎的沙箱模式
    • 限制模板中可以访问的对象和方法
  4. 最小权限原则

    • Web应用运行账户应具有最小必要权限

系统管理员措施

  1. 及时应用安全补丁
  2. 定期进行安全审计
  3. 监控异常活动

漏洞报告与奖励

  1. 漏洞通过负责任的方式披露给厂商
  2. Frappé Technologies修复漏洞并支付$1250奖金
  3. 分配了CVE编号(原文未提供具体编号)

学习资源

  1. Portswigger SSTI文章:https://portswigger.net/blog/server-side-template-injection
  2. Jinja2官方文档:http://jinja.pocoo.org/
  3. OWASP SSTI防御指南:https://owasp.org/www-community/attacks/Server-Side_Template_Injection

总结

ERPNext的SSTI漏洞展示了模板注入攻击的严重性,攻击者可以完全控制系统。防御需要多层防护,包括输入验证、输出编码和最小权限原则。对于开源项目贡献者,ERPNext是一个良好的安全研究目标。

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作为模板引擎,攻击者可利用以下技术: 基本验证 : 文件系统访问 : 通过遍历Python对象模型访问危险函数和类 命令执行 : 漏洞修复过程 第一次修复尝试 开发团队将包含字符串 .__ 的名称列入黑名单 不足 :简单的黑名单方式, {{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是一个良好的安全研究目标。