Groovy方法注入

Groovy元编程实践
//分类注入
//1
class Req{
    static def get(String self){
        self.toURL().text
    }
}
use(Req){
    println "https://www.baidu.com/".get()
}
//2
@groovy.lang.Category(String)
class StringUtil{
    def get(){
       toURL().text
    }
}
//加载顺序右后到先 StringUtil-Req-本身的方法
use(Req,StringUtil){
    println "https://www.baidu.com/".get()

}

//直接给类注入方法
String.metaClass.get = {
    delegate.toString().toURL().text
}
println "https://www.baidu.com/".get()

//给类注入静态方法
def str = "https://www.baidu.com/"
String.metaClass.'static'.printClass = {
    println delegate
}
String.printClass()

//注入构造函数
String.metaClass.constructor = {
    Calendar calendar->
        new String(calendar.getTime().toString())
}
println new String(Calendar.instance)

//多方法一起注入
String.metaClass{
    get = {
        delegate.toString().toURL().text
    }

    'static'{
        printlnClass = {
            println delegate
        }
    }

    constructor = {
        Calendar calendar->
            new String(calendar.getTime().toString())
    }
}

//另一种写法
def emc = new ExpandoMetaClass(String)
emc.get = {
    delegate.toString().toURL().text
}
emc.initialize()
String.metaClass = emc
println str.get()
println String.metaClass //groovy.lang.ExpandoMetaClass
//制空 回到最开始 就调用不到get方法了
String.metaClass = null
println String.metaClass // groovy.runtime.HandleMetaClass

//混合方法注入
class Get{
    def get(String url){
        url.toString().toURL().text
    }
}
//String.mixin(Get)
String.metaClass.mixin(Get)
println "".get("https://www.baidu.com/")


Groovy 表达式注入漏洞是一种常见的表达式语言注入漏洞,通常发生在应用程序动态拼接 Groovy 表达式并对其进行求值时。攻击者通过在输入中构造恶意的 Groovy 表达式,利用程序未对输入内容进行充分过滤或校验的缺陷,使得恶意表达式被解析和执行,从而可能导致敏感信息泄露、系统资源被操控,甚至远程代码执行。 ### Groovy 表达式注入漏洞原理 Groovy 是一种动态脚本语言,广泛用于 Java 平台的应用中,其语法灵活,支持表达式的动态执行。Groovy 提供了 `Eval` 类和 `GroovyShell` 等类来解析和执行字符串形式的表达式。如果程序在拼接用户输入到 Groovy 表达式中,而没有对输入内容进行严格的校验,攻击者便可能注入恶意代码。 例如,以下代码片段展示了使用 `GroovyShell` 执行用户输入的场景: ```groovy def shell = new GroovyShell() def result = shell.evaluate("userInput") ``` 当 `userInput` 是用户可控的内容时,攻击者可能输入类似 `"new File('/etc/passwd').text"` 的表达式,从而读取服务器上的敏感文件。这种行为通常违背了最小权限原则,并且可能导致系统被进一步入侵 [^3]。 ### 防御方法 针对 Groovy 表达式注入漏洞,可以从以下几个方面进行防御: 1. **避免动态拼接用户输入到表达式中** 尽量避免将用户输入直接拼接到 Groovy 表达式中进行求值。可以使用静态表达式或预定义的逻辑来替代动态执行。 2. **严格校验和过滤输入内容** 对用户输入的内容进行严格的白名单校验,确保输入仅包含预期的字符或格式。例如,使用正则表达式限制输入为数字或特定范围的字符串。 3. **使用安全的表达式求值方式** 如果必须动态执行表达式,应使用安全的求值方式,避免使用 `GroovyShell` 或 `Eval` 等易受攻击的类。可以考虑使用安全的表达式解析库,或者限制表达式执行的上下文权限。 4. **限制执行环境的权限** 在执行动态表达式时,确保运行环境的权限最小化。例如,可以通过沙盒机制限制表达式访问系统资源,防止其执行危险操作。 5. **引入安全框架或库** 使用专门的安全框架或库来处理表达式执行,例如 Apache Commons JEXL 或 Spring Expression Language(SpEL),并确保这些库的版本为最新,以修复已知的安全漏洞。 6. **定期进行安全测试和代码审计** 对涉及表达式执行的代码进行定期的安全测试和代码审计,识别潜在的注入漏洞并及时修复。 通过上述方法,可以有效降低 Groovy 表达式注入漏洞的风险,提高系统的安全性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值