目录

  • 前言:
  • 2、项目配置
  • 3、编写“java 反序列化漏洞”后端代码
  • 4、编写“java 反序列化漏洞”前端代码
  • 5、运行测试

前言:

本篇文章在上一篇文章基础上,学习了解 java 反序列化漏洞的基础知识后,现在开始进行漏洞环境的代码实现。

2、项目配置

编写 application.properties

spring.thymeleaf.prefix = classpath:/templates/

pom.xml 导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>java_Deserialization</artifactId><version>0.0.1-SNAPSHOT</version><name>java_Deserialization</name><description>java_Deserialization</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- springboot 热部署 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><!-- 防止二进制文件被编译 --><nonFilteredFileExtensions><nonFilteredFileExtension>dat</nonFilteredFileExtension><nonFilteredFileExtension>swf</nonFilteredFileExtension><nonFilteredFileExtension>xml</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins></build></project>

3、编写“java 反序列化漏洞”后端代码

java 反序列化漏洞复现起来可能相较于 sql 注入更加难一些,代码量也会更多一点

首先就是想好构造一个什么样的漏洞环境,经过自己查找相关资料,考虑到自己的能力以及时间等问题,与小组成员讨论过后,决定采用代码审计,并且最终提交 flag 的方式来达到对 java 反序列化漏洞的训练的目的。

想要完成这个漏洞实验,得到 flag,要求用户首先可以看懂 java 序列化的代码,然后同时自己可以根据给出的序列化代码,编写出反序列化代码,进而得到 flag。

根据上述思路,编写的部分源码如下:

java_deser.java

package com.example.java_deserialization.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.Optional;@Controller
public class java_deser {@RequestMapping("/java_deser")public void java_derser_start(String flag){flag Flag = new flag("1234abc");//flagSystem.out.println("被序列化对象:"+Flag.toString());//将对象转换为二进制字节数组(序列化)Optional<byte[]> bytes = ByteArrayUtils.objectToBytes(Flag);System.out.println(bytes);byte[] ret = bytes.get();//序列化后的反序列化是新的对象String r1 = ByteArrayUtils.toHexString(ret);System.out.println("序列化后转换字节数组-16进制表示:"+r1);}
}

indexController.java

package com.example.java_deserialization.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class indexController {@RequestMapping(value={"/","/index.html"})public String index(){return "index";}@RequestMapping(value={"/java_deser_index"})public String index_java_deser(){return "java_deser";}
}

测试 java 序列化与反序列化、编码文件 test.java

package com.example.java_deserialization.controller;import java.io.*;
import java.util.Base64;public class test {/*** 字符串转换成为16进制(无需Unicode编码)* @param str* @return*/public static String str2HexStr(String str) {char[] chars = "0123456789ABCDEF".toCharArray();StringBuilder sb = new StringBuilder("");byte[] bs = str.getBytes();int bit;for (int i = 0; i < bs.length; i++) {bit = (bs[i] & 0x0f0) >> 4;sb.append(chars[bit]);bit = bs[i] & 0x0f;sb.append(chars[bit]);// sb.append(' ');}return sb.toString().trim();}/*** 16进制直接转换成为字符串(无需Unicode解码)* @param hexStr* @return*/public static String hexStr2Str(String hexStr) {String str = "0123456789ABCDEF";char[] hexs = hexStr.toCharArray();byte[] bytes = new byte[hexStr.length() / 2];int n;for (int i = 0; i < bytes.length; i++) {n = str.indexOf(hexs[2 * i]) * 16;n += str.indexOf(hexs[2 * i + 1]);bytes[i] = (byte) (n & 0xff);}return new String(bytes);//Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());}public static void main(String[] args) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object_hex.txt"));//将对象序列化到文件sjava_DeserializationController person = new java_DeserializationController("flag{0123abcd}", 23);oos.writeObject(person);//读取文件FileInputStream fis = null;File file = new File("object_hex.txt");fis = new FileInputStream(file);byte[] b = new byte[(int)file.length()];while (fis.read(b) != -1) {}System.out.println(new String(b));String hexStr = test.str2HexStr(new String(b));System.out.println(hexStr);System.out.println(test.hexStr2Str(hexStr));//写入文件String data =test.hexStr2Str(hexStr);File file1 =new File("object_hex1.txt");//if file doesnt exists, then create itif(!file1.exists()){file1.createNewFile();}//true = append fileFileWriter fileWritter = new FileWriter(file1.getName(),true);fileWritter.write(data);fileWritter.close();}}

4、编写“java 反序列化漏洞”前端代码

index.html:用做主界面,点击跳转到 java 反序列化漏洞环境界面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>java序列化与反序列化</title>
</head>
<body>
<input type="button" value="java反序列化"onclick="javascrtpt:window.location.href='http://localhost:8080/java_deser'" />
</body>
</html>

java_deser.html:java 反序列化漏洞界面,可以查看源码,提交 flag,查看答案。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>java反序列化</title>
</head>
<body><p>java反序列化漏洞(源码分析),部分序列化代码如下:
</p><input type="button" value="点击执行java序列化代码"onclick="javascrtpt:window.location.href='http://localhost:8080/java_deser'" /><p>序列化后转化为字符数组形式,16进制表示为:(你需要自己编写代码,把该序列化后的字符反序列化,即可得到flag)
</p><form action="http://localhost:8080/java_deser_test" method="get">输入flag: <input type="text" name="id" /><input type="submit" value="提交" />
</form><form action="http://localhost:8080/answer_code" method="get">(没做出来的话)输入序列化后的16进制形式,查看答案: <input type="text" name="id" /><input type="submit" value="查看" />
</form></body>
</html>

answe_code.java:答案查询代码

package com.example.java_deserialization.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class answer_code {@RequestMapping("/answer_code")public void answer_mathod(@RequestParam(value = "id",required = false) String r1, Model model){byte[] r2 = ByteArrayUtils.toByteArray(r1);flag Flag1 = (flag) ByteArrayUtils.bytesToObject(r2).get();System.out.println("反序列化后对象:"+Flag1.toString());}
}

5、运行测试

启动项目

java 反序列化漏洞环境主界面

生成的十六进制编码格式

反序列化

可以看到成功反序列化,并得到 flag

山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十)-Java反序列化漏洞(2)相关推荐

  1. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二)-docker安装与学习

    目录 前言: 一.docker安装 1.centos7使用yum安装 二.命令行创建 docker 容器测试 前言: 项目实训立项通过后的几天均在学习 docker 的相关知识,上一篇文章也简单记述了 ...

  2. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(六)-SQL注入数字型

    目录 前言: 一.SQL 注入漏洞简介 1.简介 2.危害 3.利用 4.防范 二.相关配置 三.编写"SQL 注入漏洞-数字型注入"后端代码 1.使用 springboot 框架 ...

  3. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(八)-RCE漏洞

    目录 前言: 1.RCE 漏洞简介 1.1.简介 1.2.危害 1.3.利用 1.3.1.漏洞挖掘 1.3.2.windows下管道符 1.3.3.linux下管道符 1.4.防范 2.相关配置 3. ...

  4. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(七)-SQL注入字符型

    目录 前言: 一.简介 二.项目配置 三.代码编写 四.运行测试 前言: 前面完成了 SQL 注入漏洞的数字型输入,其实 SQL 注入漏洞还有很多其他类型的注入,例如:字符型注入.宽字节注入等,相应的 ...

  5. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十三)-任意文件下载漏洞(1)

    目录 前言: 一.任意文件下载 1.任意文件下载漏洞简介 1.1.简介 1.2.危害 1.3.利用 1.4.防范 2.项目配置 前言: 前面的博客记录了关于文件上传漏洞的基础知识,以及基本的漏洞出现点 ...

  6. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十四)-任意文件下载漏洞(2)

    目录 前言: 3.编写"任意文件下载漏洞"后台 4.编写"任意文件下载漏洞"前台 5.运行测试 前言: 前面的博客记录学习任意文件下载漏洞相关知识,并思考如何构 ...

  7. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(三)

    目录 前言 主页面的实现 新增用户 修改用户信息 删除用户 查询用户 前言 首先我要完成的是系统中的用户管理功能,实现对用户的增删改查,以及利用Element-Ui完成对应前端页面的搭建,这篇文章记录 ...

  8. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二十二)-子域名查询

    目录 2.1.工具简介 2.2.后端实现代码 2.3.前端实现代码 2.1.工具简介 子域名是相对域名根来说的,如baidu.com是域名根,则1234.baidu.com为子域名不同服务级别,也就是 ...

  9. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二十三)-CMS识别

    目录 3.1.工具简介 3.2.后端实现代码 3.3.前端实现代码 3.1.工具简介 在对「靶标资产」进行渗透测试的前期,通常需要对「靶标资产」进行相关的信息收集,而对「靶标资产」进行Web指纹信息扫 ...

最新文章

  1. 面试官:如何做 API 接口防刷??
  2. 随机选取字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  3. 我是LinkedIn的SRE,我把LinkedIn搞挂了
  4. 脑机接口应用于驾驶员的疲劳状态检测综述
  5. iap如何初始化_IAP超级详解
  6. zeros什么意思_ma=zeros(n);是什么意思'
  7. OJ1046: 奇数的乘积(C语言)
  8. [容易]在二叉查找树中插入节点
  9. Python 波浪线与补码
  10. Centos和Ubuntu下定制普通用户访问权限
  11. Java编程:递归(迷宫问题、八皇后问题)
  12. 使用 Hibernate 二级缓存的步骤
  13. CTF入门之php文件包含
  14. Mac 下 Netty 4.1 代码编译与运行
  15. 从概念入手,了解AWS在Iaas、Paas,Saas层的服务
  16. 《人生哲理》一.我们必须活在当下!
  17. 肥猫学习日记---数据结构与算法(三)-----链表
  18. 开源项目Krita学习(一)
  19. ubuntu服务器dns修改,如何在 Ubuntu 16 中修改 DNS 服务器?
  20. 【Liunx_QT触摸屏不管用】

热门文章

  1. 网站关键词优化怎么做的(seo如何挖掘关键词)
  2. C语言约分-化为最简分数
  3. PS教程新手入门(四)--PS实用的技巧教程 批量修改图片尺寸(宽750px;高不限制)
  4. 怎么用matlab求特征向量,MATLAB用eig()函数求【特征值】【特征向量】【归一化
  5. 几个Gerrit代码检查checkstyle问题总结
  6. 计算机组装要哪些硬件,电脑配件,小编教你电脑组装需要哪些配件
  7. 【无人机摄影测量技术必备知识】地面像控点布设经验整理-大比例尺
  8. 安装好maya后运行不了并弹出如图的错误
  9. 服务器微信发送图片困难是什么原因导致的,微信接受的图片不清楚的原因是什么?怎么发清楚?...
  10. Swift 设置UISearchBar圆角以及背景颜色