38-WEB漏洞-反序列化之PHP&JAVA全解(下)

WEB漏洞-反序列化之PHP&JAVA全解(下)

  • 一、Java中API实现
  • 二、序列化理解
  • 三、案例演示
    • 3.1、本地
    • 3.2、Java 反序列化及命令执行代码测试
    • 3.3、WebGoat_Javaweb 靶场反序列化测试
    • 3.4、2020-网鼎杯-朱雀组-Web-think_java 真题复现
  • 四、涉及资源

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第1张图片

一、Java中API实现

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第2张图片

二、序列化理解

  • 序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
  • 反序列化:从存储区中读取该数据,并将其还原为对象的过程,成为反序列化。

三、案例演示

3.1、本地

1、主函数:

  • 调用序列化方法
  • 将反序列化的的结果返回给person变量
  • 输出person变量

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第3张图片

2、序列化方法:

  • 创建一个person的对象
  • 创建一个文件输出流(指向person.txt的文件),命名为oos
  • 将person对象的写入到文件输出流中

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第4张图片

3、反序列化方法:

  • 创建一个文件输入流(指向person.txt的文件),命名为ois
  • 从到文件输入流中读取person对象的信息
  • 返回person对象(直接显示会乱码,一般用base64加密输出)

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第5张图片
4、运行结果:
38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第6张图片

3.2、Java 反序列化及命令执行代码测试

1、源代码分析:

  • 使用exec方法执行字符串命令并返回一个process对象
  • 获取命令(process)的输入流给reader对象
  • 读取输入流的内容,打印输出(反序列化)

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第7张图片

2、运行结果:
38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第8张图片

3.3、WebGoat_Javaweb 靶场反序列化测试

1、启动靶场:
38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第9张图片

2、进入靶场:
38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第10张图片

3、理论分析:

  • 输入框内接受序列化的对象,并且将它反序列化(更改序列化的对象,将页面延迟5秒)
    38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第11张图片

4、源代码分析:

  • 使用IDEA打开jar文件(https://www.cnblogs.com/liaowenhui/p/17353156.html)
  • 可以使用解压软件打开,再找到对应的jar文件解压出来后再使用IDEA打开。
    38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第12张图片

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第13张图片

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第14张图片

  • 接受参数,base64解密,反序列化读取,返回读取的对象

  • 获取输出流,赋值给一个对象,然后写入输出流(序列化),返回base64编码
    38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第15张图片

  • 这里存在命令执行(在调用读取输入流的时候,也就是读取反序列化的数据,并且把它当做命令执行)
    38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第16张图片

5、漏洞分析:这里会将反序列化的数据进行读取,再进行命令执行。

  • rO0ABXQAVklmIHlvdSBkZXNlcmlhbGl6ZSBtZSBkb3duLCBJIHNoYWxsIGJlY29tZSBtb3JlIHBvd2VyZnVsIHRoYW4geW91IGNhbiBwb3NzaWJseSBpbWFnaW5l是序列化后加密形成
  • 序列化标志参考(可以确定是base64加密),因此要攻击,要如何构造payload?考虑对方的回显?==》反弹shell(解决回显)
  • 思路:要执行ipconfig =》序列化 =》base64加密 =》rO0AB格式字符串 =》payload
#补充知识点
下方的特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么他就是这一段java序列化的16进制。|

6、 使用工具将命令构造成序列化语句

  • 命令分析
    • 生成组件,打开本地的计算器,保存到payload.bin文件中
    • 为什么要保存?还要进行base64加密
java  -Dhibernate5  -cp  hibernate-core-5.4.9.Final.jar;
ysoserial-master-30099844c6-1.jar
ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin
  • 如何判断组件
    • 看工具的组建在源代码内是否出现过
    • 这里源代码出现了组件
java -jar ysoserial-all.jar

38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第17张图片
38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第18张图片

  • 生成payload:
java  -Dhibernate5  -cp  hibernate-core-5.4.9.Final.jar;ysoserial-master-8eb5cbfbf6-1.jar ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin
  • 生成了payload,利用Python程序base64加密
    38-WEB漏洞-反序列化之PHP&JAVA全解(下)_第19张图片

  • 将加密后文本的代码复制到反序列化窗口,发现本地的计算器被打开。

3.4、2020-网鼎杯-朱雀组-Web-think_java 真题复现

https://blog.csdn.net/qq_36585338/article/details/128121566

四、涉及资源

  • https://github.com/frohoff/ysoserial/releases
  • https://github.com/WebGoat/WebGoat/releases
  • https://github.com/NickstaDB/SerializationDumper/releases/tag/1.12

你可能感兴趣的:(小迪安全,web安全,学习,前端,php,java)