服务热线
15527777548/18696195380
发布时间:2022-05-07
简要描述:
前言告别脚本小子系列是本公众号的一个集代码审计、安全研究和漏洞复现的专题,意在帮助大家更深入的理解漏洞原理和掌握漏洞挖掘的思路和技巧。系列课程包含多篇文章,往期内容...
告别脚本小子系列是本公众号的一个集代码审计、安全研究和漏洞复现的专题,意在帮助大家更深入的理解漏洞原理和掌握漏洞挖掘的思路和技巧。系列课程包含多篇文章,往期内容如下:
往期内容回顾
1
方法名 | 方法介绍 |
__wakeup | 在调用unsearialize()时,自动执行该方法。属于反序列化Source之一。 |
__destruct | 析构函数,在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。属于反序列化Source之一。 |
__toString | 一个类被当成字符串时自动调用该方法。属于反序列化利用链中常见魔术方法之一。 |
__call | 在对象中调用不可访问的方法时触发,即当调用对象中不存在的方法会自动调用该方法。属于反序列化利用链中常见魔术方法之一。 |
__set | 给不可访问的属性赋值时自动调用该方法。属于特定场景下反序列化利用链会用到的方法。 |
__get | 读取不可访问属性的值时自动调用该方法。属于特定场景下反序列化利用链会用到的方法。 |
__invoket | 当尝试以调用函数的方式调用一个对象时自动调用该方法。属于特定场景下反序列化利用链会用到的方法。 |
因为PHP魔术方法的存在,为反序列化利用链的构造增加很多思路,可以通过特定魔术方法拓宽反序列化利用链。与PHP不同的是,JAVA并没有严格意义上的魔术方法,但是其实JAVA里面有一些类似的方法,如表4.2所示。
表4.2 JAVA中经常会被自动调用的方法
方法名 | 方法介绍 |
readObject | 在反序列化的过程中会自动调用改方法,属于反序列化的入口Source。 |
toString | 把对象当成字符串来操作是会自动调用该方法。 |
hashCode | 返回该对象的hash值,集合类操作时会调用此方法。 |
equals | 对象进行比较、排序、查找时可能可能调用此方法。 |
finalize | 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 |
JAVA没有魔术方法,只有一些经常会使用到的方法。JAVA在构造反序列化利用链时比PHP更加灵活,因为JDK代码大多数情况下还是JAVA编写的,可以方便的通过调试技巧来确定不同类方法之间的相互调用。
3) 类加载机制不同
在PHP中要调用某个类必须要引入,PHP引入类文件常见的是这四种方式require、require_once、inclue、include_once。在反序列化的过程中,反序列化利用链中的每一个类也都必须是显式引入的,即必须通过上面四个函数中的某一个引入对应的类文件。如果不引入,就会报错,如图4.2所示。
图4.2 PHP反序列化之前必须显式引入
与PHP的类加载机制不同,JAVA中类加载只与classpath有关,只要是在classpath中的类就能被直接调用。JAVA中并不要求在调用类之前进行显式引入,一般来说项目jar包中的类都可以任意调用。
我想这应该是JAVA出现的反序列化漏洞要远远多于PHP反序列化漏洞的原因之一。
4) 应用场景不同
PHP一般用于中小型项目,项目一般比较简单,代码较少。传统PHP项目是直接编写代码,现在的PHP项目会采用一些主流的PHP框架。但是PHP项目中很少使用其他第三方的组件(其实现在已经慢慢开始流行使用composer来加载第三方组件了)。JAVA一般用于大型项目,项目结构和功能复杂,代码较多。JAVA项目中一般会引入大量第三方jar包,而第三方jar包通常是反序列化利用链的重要组成部分。
JAVA反序列化是经典的JAVA漏洞,上面的文章分析的都是JDK中最常见的序列化和反序列化方式。但是JAVA中还有其他的序列化和反序列化方式,包括:基于Externalizable接口的序列化和反序列化、基于fastjson的序列化与反序列化、基于XStream的序列化与反序列化、基于jackson的序列化与反序列化等。每一种序列化与反序列化都可能出现对应的反序列化漏洞,而这也是研究反序列化漏洞的重要组成部分。后续我们的课程也会持续更新这部分的内容,感兴趣的小伙伴可以点一个关注。
原文链接
上一篇:网络安全的公司有哪些?
下一篇:网络安全专业术语英文缩写对照表
如果您有任何问题,请跟我们联系!
联系我们