Shiro反序列化漏洞
概述Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。
Shiro反序列化漏洞Shiro-550(Apache Shiro < 1.2.5)和Shiro-721( Apache Shiro < 1.4.2 )。这两个漏洞主要区别在于Shiro550使用已知密钥撞,后者Shiro721是使用登录后rememberMe={value}去爆破正确的key值进而反序列化,对比Shiro550条件只要有足够密钥库(条件比较低)、Shiro721需要登录(要求比较高鸡肋)。
Apache Shiro < 1.4.2默认使用AES/CBC/PKCS5Padding模式
Apache Shiro >= 1.4.2默认使用AES/GCM/PKCS5Padding模式
Shiro550原理Apache Shiro< =1.2.4提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对reme ...
Fastjson漏洞分析
Fastjson漏洞分析FastJson 是阿⾥巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,⽀持将 Java Bean 序列
化为 JSON 字符串,也可以从JSON字符串反序列化到 Java Bean
环境:
jdk1.8.0_u111
fastjson: 1.2.24
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
Fastjson的简单使用package org.example;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.api.scripting.JSObject;
public class demo1 {
...
CommonsCollections6
CommonsCollections6前言前几天搞的CC1没成功弹出计算器,后来查找发现,是jdk版本问题,8u71之后已修复不可利用,主要原因是 sun.reflect.annotation.AnnotationInvocationHandler#readObject 的逻辑变化了
CommonsCollections6 解决了高版本 Jdk 的利用问题,所以来学习一下(主要是懒得安装其低版本的jdk)
利用链的限制条件: JDK 版本:暂无限制、 CommonsCollections 3.1 - 3.2.1
利用链: Gadget chain:
java.io.ObjectInputStream.readObject()
java.util.HashSet.readObject()
java.util.HashMap.put()
java.util.HashMap.hash()
org.apache.commons.collectio ...
CommonCollections1
CommonCollections1前言Commons Collections是反序列化漏洞学习过程中不可缺少的一部分,Apache Commons Collections是Java中应用广泛的一个库,包括Weblogic、JBoss、WebSphere、Jenkins等知名大型Java应用都使用了这个库。
Apache Commons Collections 中提供了一个 Transformer 的类,这个接口的功能就是将一个对象转换为另外一个对象,CC 链都依赖于此
下面的是跟着大佬的脚步,一步一步分析,从零开始一层一层往上找链子
环境搭建然后下载sun包,点击zip
https://hg.openjdk.org/jdk8u/jdk8u/jdk/rev/af660750b2f4
下载后解压,把 jdk-af660750b2f4/src/share/classes/sun 放到jdk中src⽂件夹中,默认有个src.zip 需要先
解压
把src⽂件加载进来
创建一个Maven项目,不用选择任何Maven模板;在pom.xml中添加如下代码 ...
Java代理与动态代理
Java代理与动态代理代理代理是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。
静态代理静态代理是一种代理模式,它在程序运行之前就已经存在代理类的字节码文件,所以又称为编译时代理或者普通代理。在使用静态代理模式时,需要手动编写代理类,并在其中实现目标对象的方法调用。
下面举个例子: 黄*杰学长给学弟Tree买饭,买饭回来的路上还去买了奶茶
getrice.java 定义一个接口“买饭”
//抽象对象:买饭
public interface getrice {
public void Getrice();
}
Person.java 真实角色, 实现getrice接口
public class Person implements getrice {
public void Getrice() {
System.o ...
URLDNS利用链
URLDNS利用链URLDNS利用链是java原生的一条利用链,通常用来验证是否存在反序列化漏洞,因为是原生的,所以不存在版本限制
特点:
不限制jdk版本,使用Java内置类,对第三方依赖没有要求
目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞
URLDNS利用链,只能发起DNS请求,并不能进行其他利用
HashMapHashMap 是一个存储键值对的容器。 每个键与一个值关联。 HashMap中的键必须唯一。 HashMap在其他编程语言中称为关联数组或词典。 HashMaps占用更多内存,因为每个值还有一个键。 删除和插入操作需要固定的时间。 HashMaps可以存储空值。
基本用法:
创建对象
HashMap<String,Integer> hashMap = new HashMap<>();
添加键值对:
hashMap.put("aa",1);
hashMap.put("bb",2);
hashMap.put("cc",3);
put方法会覆盖原有的value,而另一种pu ...
Java序列化与反序列化
Java序列化与反序列化什么是序列化和反序列化序列化: 把Java对象转换为字节序列的过程
反序列化:把字节序列恢复为Java对象的过程
序列化和反序列化的意义序列化与反序列化的设计就是用来传输数据的。
当两个进程进行通信的时候,可以通过序列化反序列化来进行传输。
序列化的好处:
能够实现数据的持久化,通过序列化可以把数据永久的保存在硬盘上,也可以理解为通过序列化将数据保存在文件中。
利用序列化实现远程通信,在网络上传送对象的字节序列。
**序列化与反序列化应用的场景: **
想把内存中的对象保存到一个文件中或者是数据库当中。
用套接字在网络上传输对象。
通过 RMI 传输对象的时候。
常见的序列化和反序列化协议
XML&SOAP
XML 是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点,SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于 XML 为序列化和反序列化协议的结构化消息传递协议
JSON
Protobuf
实现序列化和反序列化的方法
java.io.ObjectOutputStream序列化: ...
JNDI注入学习
JNDI注入学习理解JNDIJNDI是Java命名和目录接口,是Java的一个目录服务应用程序接口,它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。——–维基百科
很官方,看不懂 建议看这篇文章理解 https://blog.csdn.net/wn084/article/details/80729230
通俗易懂的解释就是就是把资源取个名字,再根据名字来找资源,就像人的身份证或DNS中的域名与IP的关系
另一种理解:JNDI就是一组API接口。每一个对象都有一组唯一的键值绑定,将名字和对象绑定,可以通过名字检索指定的对象,而该对象可能存储在RMI、LDAP、CORBA等等。
JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等
Java Naming命名服务是一种键值对的绑定,使应用程序可以通过键检索值。
Java Directory目录服务是命名服务的自然扩展。这两者之间的区别在于目录服务中对象可以有属性,而命名服务中对象没有属性。因此,在目录服务中可以根据属性搜索对象。
JNDI允许你访问文件系统中的文件,定位远 ...
Java反射
java反射什么是java反射?Java反射机制是在运行状态时,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
Java反射的主要类
类:java.lang.Class;
构造器:java.lang.reflect.Constructor;
字段:java.lang.reflect.Field;
方法:java.lang.reflect.Method;
修饰符:java.lang.reflect.Modifier;
Java如何获取一个类JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息;因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息(下面用String类举例)
直接通过一个class的静态变量class获取
Class cls = String.class;
通过该实例变量提供的getClass()方法获取
Str ...
CVE-2022-39197学习笔记
CVE-2022-39197学习笔记前言该漏洞存在于Cobalt Strike的Beacon软件中,一个 XSS漏洞,允许远程攻击者在 Cobalt Strike 团队服务器上执行 HTML,并实现rce。
漏洞起点Cobalt Strike 接口建立在 Java Swing 框架之上。该框架为开发人员提供了用于 Java 程序的图形用户界面。
根据官方文档 所描述,在开头插入<html>标签后续的内容就会被格式化为html文档进行解析,也就是说支持html标签
测试demo:
import javax.swing.*;
public class test {
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("asdfas");
frame.setDefaultCloseOperation(JFrame ...