Fastjson
特点:速度快、使用广泛、测试完备、使用简单、功能完备
使用方法
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
工程:fastjson-vul
对象类:User.java
测试类:JsonTest.java
结果
序列化的时候,会调用成员变量的get方法,私有成员变量不会被序列化
反序列化的时候,会调用成员变量的set方法,public修饰的成员全部自动赋值
反序列化方法
JSON.parseObject() 返回实际类型对象 √
User user1 = JSON.parseObject(serializedStr, User.class);
JSON.parse() 返回JsonObject对象
Object obj1 =JSON.parse(serializedStr);
type自省
{name= 'wuya', age=66, flag=true, sex='boy',address='null'}
子类中包含接口或抽象类的时候,类型丢失
{"@type":"com.wuya.test.User","age":33,"flag":false,"name":"wuya"}
漏洞原理
流程
- 序列化字符准备类名、dataSourceName属性和autoCommit属性
- JdbcRowSetImpl反序列化,调用
JdbcRowSetImpl的setAutoCommit() - setAutoCommit()调用connect()
- connect()调用lookup()连接到LDAP/RMI服务器
- 下载恶意代码到本地,执行,攻击发生
Fastjson在序列化的时候,会调用成员变量的get方法,私有成员变量不会被序列。
Fastjson在反序列化的时候,会调用成员变量的set方法,public修饰的成员全部自动赋值。
原理:由于它在反序列一个对象的时候会去自动调用这个对象的set方法,所以如果这个set方法中有一些危险的操作,那么就会导致漏洞的产生。
利用思路:上面说了在fastjson反序列化的时候会自动调用对象的set方法,所以我们就有了利用思路,如果我们可以找到一个类,并且这个类中有set方法,这个类的set方法中有一些敏感操作,并且每次运行任意java代码的时候又必须调用这个类,那我们就可以利用这个漏洞了。