廖新喜
廖新喜(xxlegend),绿盟科技网络安全攻防实验室安全研究员,擅长代码审计,Web漏洞挖掘,拥有丰富的代码审计经验,曾在Pycon 2015 China大会上分享Python安全编码。安全行业从业六年,做过三年开发,先后担任绿盟科技极光扫描器的开发和开发代表。目前专注于Web漏洞挖掘、Java反序列化漏洞挖掘。曾向RedHat、Apache、Amazon和Oracle提交多份漏洞报告。2016年网络安全周接受央视专访。《谁动了我的VIP账号?》
廖新喜:这两年这个影响非常广,主持人也介绍了。我主要讲java json,也讲到Java防御。我来自绿盟科技,我叫廖新喜。首先介绍一下json,再介绍一下json安全特性,接着会介绍一下Fastjson,还会介绍一下Java反序列化防御。
json是什么东西,就是一个大的结构,有一些键值。
Gson是谷歌公司发布的一个开源代码的json库。这是GSON的事例,讲一个对象转化为JSON,有这样一个字符串。将这个对象转换为这个字符串。
Fastjson是由阿里巴巴开发,号称速度非常快。这是一个事例。
再看一下它的安全特性,首先我们看一下GSON,主要是用了默认的构造函数,如果没有找到的话会调用sun.misc.Unsafe生成一个实例,如果这个之内就需要程序员自己实现,需要这个基本类型就是需要反射执行调用,这一块应该不存在安全问题的,也是推荐使用的。
jackson的安全特性,无参默认构造方法,不会序列化非Public属性。这一块其实还有很多绕过,我们看一下Jackson阶层,序列化和反序列化非常相似,也需要一个无参的默认方法,也有Jackson特有的属性,它也有一个@type可以打开序列化以及反序列化的结构。
我们可以看一下json的阶层,这个阶层提供的方法就是parserconfig,主要保存这个Java一些配置,我们可以看到他在实现由javabean等等。还有parserconfig实现这个解析上下文,这就用到反序列化,反序列化实现又有几部分,我们主要应用这个Javabean。
Fastjson PoC,一个是基于Templatelmpl,还有基于JNDI。
简单解说一下一些方法来触发,field类型是不需要的,也在那个上面放了一个Demo。构造一个Templatelmpl,各个方法里面我们实现了一个计算器,复写几个方法,看一下PoC,主要是前面加入了黑名单。
这些辅助代码,如果这些辅助代码不会触发,从这个情况下可以触发我们的恶意情况。如果说你解析的时候比如说调用fastjson,需要打开……(英文),这个其他下可以触发我们的漏洞。
为什么会触发,就涉及到fastjson会调用…首先我的这个应用调层Fastjson会实体化,会调用slmpl的方法,或者打开了之后就不需要了,最后会调用json方法。
这是整个调用栈,这个调用栈还是挺简单的。
基于JNDI,之前的时候也讲到了,对于json这一块没有想到还会可以利用起来,可以看到JNDI是什么东西,是提供两种基本方法,我们可以看一下它的图,JNDI提供一个外部接口,主要是包括MI或者IDE。如果那个里面内容是我们可以控制的,直接可以切入。比如说可以切换参数,比如说切换我们自己控制的途径,切换到SDP自己控制的服务器。
RMI的这个服务端的代码,我会创建1099的一个服务,然后把那个放到外部服务器里面,通过RMI指向那个服务,指向那个STV服务,加载那个回来,会在RMI client上执行,基本上大部分都是这样的方式。
攻击流程:首先攻击者准备Rmi服务和wed服务,攻击者将Rmi绝对路径注入Lookup方法中,受害者JNDI接口会指想空寂者控制的RMI服务器,JNDI接口向执行构造函数,把那个加载进来进行识别化,识别化的过程中就会执行我们的恶意代码。
这是另外一种类型,比如说基于Field的类型,不适用setter方法,利用hashset,比如说阶层这个序列化的机制触发的,Fastjson默认处理Set类型都是通过hashset来实现,通过equals方法触发。一般通过Pieid类型都是利用Collecton来加载的。
这是调用栈。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!