Web安全之Java反序列化
2021/5/19 22:27:18
本文主要是介绍Web安全之Java反序列化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JAVA反序列化
漏洞原理:
序列化可以将对象变成可以传输的字符串,方便数据保存传输,反序列化就是将字符串还原成对象。如果web应用没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被控制,就会造成代码执行,getshell等一系列不可控的后果。
JAVA中的api实现
位置:
java.io.ObjectOutputStream
java.io.ObjectInputStream
序列化过程:
ObjectOutputStream类中的writeObject()方法:
对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中,按java的标准约定是给文件一个.ser扩展名
ObjectInputStreaml类中的readObject()方法:
从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回.
java序列化标志:
rO0AB开头,为java序列化base64加密后的数据.
aced开头,java序列化后的16进制数据.
简单实例Demo:
Main.java: package serializeDemo; import java.io.*; import java.io.Serializable; public class Main { public static void main(String[] args) throws Exception{ serializePerson(); //Person person=deserializePerson(); // System.out.print(person); } private static void serializePerson() throws IOException{ Person person = new Person("name:mrob0t",18); ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(new File("D:/person.txt")) ); oos.writeObject(person); System.out.println("person序列化成功!"); oos.close(); } private static Person deserializePerson() throws Exception{ ObjectInputStream ois = new ObjectInputStream( new FileInputStream(new File("D:/person.txt")) ); Person person=(Person)ois.readObject(); System.out.println("person对象反序列化成功"); return person; } } Person.java: package serializeDemo; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 3604972003323896788L; public Person(String n, int a){ String name; int age; name=n; age=a; } }
漏洞检测与利用:
黑盒检测:
a. 从流量中发现序列化的痕迹,关键字:ac ed 00 05,rO0AB b. Java RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是1099端口
白盒代码审计:
关注以下函数:
ObjectInputStream.readObject ObjectInputStream.readUnshared XMLDecoder.readObject Yaml.load XStream.fromXML ObjectMapper.readValue JSON.parseObject
利用:
payload生成器-ysoserial
自定义工具或脚本
这篇关于Web安全之Java反序列化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)