自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 JDK高版本下JNDI注入绕过

只启用RMI服务时,这时候RMI客户端能够去打服务端,有两种情况,第一种就是利用服务端本地的gadget,具体要看服务端pom.xml文件比如yso中yso工具中已经集合了很多gadget chain本地利用yso的打rmi注册表的模块此时在jdk1.7.0_21和jdk1.7.0_25以及jdk1.8.0上都可以成功,然而在一次攻击内网rmi服务的深思这篇文章中说到jdk8u121以后进行了一定的限制 jdk1.8.0_121测试如下:这种防御机制即JEP290,在jdk8u121提出的,简单来说就

2024-05-22 12:27:53 1265

原创 JAVA JNDI反序列化总结篇-01

命名系统是一组关联的上下文,而上下文是包含零个或多个绑定的对象,每个绑定都有一个原子名(实际上就是给绑定的对象起个名字,方便查找该绑定的对象), 使用JNDI的好处就是配置统一的管理接口,下层可以使用RMI、LDAP或者CORBA来访问目标服务要获取初始上下文,需要使用初始上下文工厂比如JNDI+RMI比如JNDI+LDAP。

2024-05-16 19:31:40 931

原创 Java RMI反序列化总结篇-01

放一张seebug的图, 所以客户端要访问远程对象就由服务端首先把远程对象注册到注册表,然后客户端先访问注册表拿到远程对象的stub以后,此时就可以像访问本地一样调用远程对象方法,底层由stub再接受客户端的参数和方法,然后就是stub作为代理再帮客户端请求服务端,把参数和方法都发送到服务端,服务端接收到参数和方法后,在服务端进行执行,再把返回结果给客户端的stub,stub再给客户端,所以客户端实际上看不到底层的通信逻辑,这种架构设计已经屏蔽了底层通信。

2024-05-14 19:09:02 1219

原创 Java openrasp记录-02

若nodetect为false,则要探测一些服务器的标志文件去判断目标服务器种类拿到Installer的实例,后面则要根据不同服务器种类去修改相应的服务器的shell启动脚本添加加载rasp的配置项。之前分析到rasp在初始化js插件时将会把plugins下的js文件加载到v8引擎中,来实现热部署,这部分检测逻辑代码太多啦,这里对于不同语言使用js来实现检测逻辑,从而实现通用检测,我只关心java相关的漏洞检查,除了下面列出的一些CVE,还包括java的一些通用漏洞的检测,这部分单独将进行研究。

2024-05-06 12:31:24 939

原创 Java openrasp记录-01

一个hook ognl、spel、MVEL表达式注入的例子用的是asm5进行字节码修改采用premain进行插桩,重写transform方法expClassList是要hook的类,这里定义在MethodHookDesc这里判断hook点通过类名,具体其中的方法名,以及方法的描述符其中expClassList中定义了具体要hook的类,就mvel、ognl、spel三种ognl对应的是parseExpression这个方法,其中expressoin参数是具体解析的表达式。

2024-04-25 23:41:58 1014

原创 Java Instrumentation插桩技术

写这篇总结写看了不少文章,也将相关的链接放到下面,如果想多了解可以点开学习,不过大多数还是得去jdk源码中的注释或者jdk官方文档去查看类的定义去理解某个类的设计意义及用法,文中不免有表述不清,若有不对,还请指出~

2024-04-24 12:32:20 1901 2

原创 JAVA ASM总结篇-03

ClassVisitor的visitMethod能够访问到类中某个方法的一些入口信息,那么针对具体方法中字节码的访问是由MethodVisitor来进行的访问顺序如下,其中visitCode和visitMaxs仅调用一次,标志方法字节码访问的开始和结束MethodVisitor如何获得:1.ClassReader中传入的ClassVisitor中返回的MethodVisitor2.直接调用ClassWriter.visitMethod返回MethodVisitor。

2024-04-19 19:10:01 930

原创 JAVA ASM总结篇-02

那么此时在堆中为该class1的对象a分配了内存空间,此时地址存在栈中,那么此时操作数栈顶就是两个相同的地址空间,通常在调用对象调用其类中方法前肯定要调用其init实例化,那么init要用一次操作数栈中的地址,此时弹出一次地址参与方法调用,那么此时只剩下一个初始化结束过后的对象地址,后面只需要再将该栈中的地址放入局部变量表,该地址的对象已经完成了实例化操作,那么后面每次调用只需要从局部变量表从取到该对象的地址,即可任意调用其类中的方法。执行栈与操作数栈不一样,操作数栈包含在执行栈中。

2024-04-18 13:19:34 731

原创 JAVA ASM总结篇-01

核心还是理解好asm处理字节码的过程以及信任链如何构造,然后再根据需求去找asm具体操作的api,对着asm指南编写代码。

2024-04-17 13:22:43 1914

原创 JAVA 动态代理机制

代理模式是Java中常用的设计模式,主要由公共接口、被代理类和代理类等三部分组成,代理类持有被代理类的实类,代理为执行具体的类方法。其中代理类与被代理类有同样的接口。代理类的对象本身并不真正实现服务,而是通过调用被代理类对象的方法来提供特定的服务。代理分为静态代理和动态代理,编译时能确定被代理的类就是静态, 在运行过程中确定要被代理的类则是动态代理。

2024-04-16 09:32:59 736

原创 从JDK源码学习HashSet和HashTable

Java中的集合(Collection)有三类,一类是List,一类是Queue,再有一类就是Set。前两个集合内的元素是有序的,元素可以重复;最后一个集合内的元素无序,但元素不可重复。Set:1.用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。

2024-04-15 09:31:18 1184

原创 从JDK源码学习HashMap

1.在算key的hash时将key的hashcode和与hashcode的高16位做异或降低hash冲突概率2.HashMap 的 bucket (数组)大小一定是2的n次方,便于后面等效取模以及resize时定节点分布(low或者high)3.HashMap 在 put 的元素数量大于 Capacity * LoadFactor(默认16 * 0.75)=12 之后会进行扩容,负载因子大于0.75则会减小空间开销,

2024-04-13 13:09:59 1170

原创 从JDK源码学习ArrayList

①.初始不指定容量时设置为10②.每次扩充为实际长度的1.5倍与所需最小容量比较③.arraylist是非线程安全的④.其最大值为2的31次-1⑤.为避免连续扩容消耗内存,能初始化容量大小尽量指定容量⑥.为啥会非线程安全,因为方法内部并非原子操作Java集合之HashMap源码解析(JDK8) - 知乎hashmapJava集合之JDK1.8LinkedHashMap源码解析 - 知乎Java集合之JDK1.8HashSet源码解析 - 知乎hashset。

2024-04-10 23:48:25 1994

原创 javaweb codereview记录-05

应用程序利用url与远程通信的所有类的超类jdk1.8中支持的协议包括以上这些,gopher在jdk8中取消了。java中默认对(http|https)做了一些事情,比如:默认启用了透明NTLM认证默认跟随跳转httpURLconnection可能jdk7低版本可能在win机器上导致ntlmrelay攻击使用URLconnection的子类可能只适合http|https,对ssrf也有一定的限制HttpClientRequestokhttp。

2024-04-10 23:42:09 776

原创 javaweb codereview记录-04

之前在p牛的知识星球中也学过反射机制调用Runtime来执行命令时需要用getruntime来返回Runtime类的实例,因为Runtime类设计是单例模式,并且该类的构造方法是私有的,因此无法直接通过newinstance来实例化该类,因此除了通过getRuntime来返回类的实例来调用该类的方法外,还可以通过反射直接获取该类的构造方法并且设置访问属性来实例化该类。

2024-04-09 13:38:41 416

原创 javaweb codereview记录-03

实际上就是ClassLoader将会调用loadclass来尝试加载类,首先将会在jvm中尝试加载我们想要加载的类,如果jvm中没有的话,将调用自身的findclass,此时要是findclass重写了,并且传入了我们想要加载的类的字节码,那么应该调用defineclass在jvm中加载该类,最后返回java.lang.class类对象。那么既然类加载器是所有的类加载器的父类,我们可以来定义其子类从而实现加载任意字节码,当然加载恶意class也是可以的,重写findclass,遵循双亲委派机制。

2024-04-07 23:34:38 898

原创 javaweb codereview记录-02

JDK<1.7.40实际上修复就是检查文件名中是否包含\u0000,包含则为非法路径find usages看一下可以看到跟文件名相关的函数基本上都调用了此函数来进行校验,比如这里用java1.6进行测试,用\u0000就进行了成功的截断用大于1.7.40的肯定会报错,这里修复的话如果考虑到jdk兼容问题,最好的方法就是添加fileName.indexOf('\u0000')的判断如下面的代码所示,如果filename是从url中获取的并且用户可控就可能造成任意文件读取。

2024-04-07 23:23:28 319

原创 javaweb codereview记录-01

上面这段代码实际上我们只要拿到MethodHandles.lookup 类的对象即可来调用任意类中的方法,这里当然还要注意要调用的方法的返回值的类型也就是MethodType.methodType()中需要指定的目标方法的类型,那么第二个参数肯定就是目标函数的入口参数的类型了,和反射调用传值貌似差不多,获取方法的时候都是传入口参数的类型。当然这种配置方式可以配置在文件中,也可以在代码中以@符号来定义注解,效果一样。来处理一些较为复杂的服务器端的业务逻辑。中配置Action地址和对应的处理类。

2024-04-07 23:20:10 187

原创 JAVA安全漫谈1-8笔记

classloader就是java的类加载器,告诉虚拟机如何加载这个类。默认情况下根据类名来加载类,类名必须是完整路径{}括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!其实初始化块就是构造器的补充,初始化快是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!好处是可以提高初始化块的复用,提高整个应用的可维护性。

2024-04-06 14:46:43 1203 2

原创 Java安全入门基础知识篇-01

intell常用快捷键:ctrl+n 快速查找定位类的位置ctrl+q 快速查看某个类的文档信息shift + F6 快速类、变量重命名ctrl + i 在当前类实现接口的方法ctrl + o 复写基类的方法alt+insert 快速设置类的方法ctrl+shift+a 快速查找各种类,变量,操作ctrl+alt+b 定位抽象方法的实现ctrl+alt+v 反射提取出类的对象ctrl+/ 注释/取消单行ctrl+shift+/ 注释多行shift+F1 浏览器中打开当前元素对应的文档。

2024-04-04 18:04:09 819

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除