自定义博客皮肤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)
  • 收藏
  • 关注

原创 静态分析-RIPS-源码解析记录-03

既然有源码可以debug,那么直接跑测试用例,来跟踪处理逻辑感觉比直接看代码理逻辑更快一些,尤其是涉及到了扫描阶段,不然不容易弄清某刻某个变量的取值。对于所有漏洞而言,都是由sink点到source点检测是否有过滤函数,那么sink和source之间到底隔了多远,中间函数之间,类之间有何种复杂的联系也决定了当前静态检测算法提供的功能能不能正确实现正确的回溯,对测试用例列举的越详细,就能够提升阅读源码的效率。

2024-05-10 09:20:40 546

原创 静态分析-RIPS-源码解析记录-02

这部分主要分析scanner.php的逻辑,在token流重构完成后,此时ini_get是否包含auto_prepend_file或者auto_append_file取出的文件路径将和tokens数组结合,每一个文件都为一个包含require+文件名的token数组接着回到main.php中,此时调用scanner的parse开始解析,这里的一个设计点问题就是要扫描漏洞,此时已经需要准备好的有哪些东西。

2024-05-08 13:18:36 559 1

原创 静态分析-RIPS-源码解析记录-01

token流扫描重构部分,这一部分主要利用php的token解析api解析出来的token流,对其中的特定token进行删除、替换、对于特定的语法结构进行重构,保持php语法结构上的一致性解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main.php中开始调用new scanner的对象,准备开始扫描漏洞,此时在scanner的构造函数中完成token流的解析这里主要在scanner这个类的构造函数里面完整待扫描的文件的token解析,主要由以下四个步骤完成。

2024-05-07 14:01:41 941

原创 Java openrasp记录-02

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

2024-05-06 12:31:24 792

原创 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 907

原创 Java Instrumentation插桩技术

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

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

原创 JAVA ASM总结篇-03

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

2024-04-19 19:10:01 835

原创 JAVA ASM总结篇-02

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

2024-04-18 13:19:34 707

原创 JAVA ASM总结篇-01

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

2024-04-17 13:22:43 1149

原创 JAVA 动态代理机制

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

2024-04-16 09:32:59 701

原创 从JDK源码学习HashSet和HashTable

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

2024-04-15 09:31:18 1147

原创 从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 1131

原创 从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 1346

原创 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 754

原创 javaweb codereview记录-04

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

2024-04-09 13:38:41 393

原创 javaweb codereview记录-03

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

2024-04-07 23:34:38 878

原创 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 289

原创 javaweb codereview记录-01

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

2024-04-07 23:20:10 164

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

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

2024-04-06 14:46:43 1026 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 764

空空如也

空空如也

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

TA关注的人

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