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

QQ截图20220225090045.jpg

Java中的序列化原理

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

QQ截图20220225092051.jpg

源代码分析

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

QQ截图20220225092920.jpg

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

QQ截图20220225092954.jpg

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

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

QQ截图20220225094553.jpg

  • 运行结果,把ipconfig命令的执行结果给对象化了,然后又在输入流里面读取出来,打印输出

QQ截图20220225094627.jpg

WebGoat_Javaweb 靶场反序列化测试

启动靶场,需要指定的jdk11版本

QQ截图20220225100724.jpg

  • 输入框内接受序列化的对象,并且将它反序列化(更改序列化的对象,将页面延迟5秒)

QQ截图20220225100803.jpg

  • 接受参数,base64解密,反序列化读取,返回读取的对象
  • 获取输出流,赋值给一个对象,然后写入输出流(序列化),返回base64编码

QQ截图20220225100837.jpg

  • 这里存在命令执行(在调用读取输入流的时候,也就是读取反序列化的数据,并且把它当做命令执行)

QQ截图20220225100901.jpg

  • 漏洞分析:这里会将反序列化的数据进行读取,再进行命令执行。
  • 序列化标志参考(可以确定是base64加密),因此要攻击,要如何构造payload?考虑对方的回显?==》反弹shell(解决回显)
  • 思路:要执行ipconfig->序列化->base64加密->rO0AB格式字符串->payload
rO0ABXQAVklmIHlvdSBkZXNlcmlhbGl6ZSBtZSBkb3duLCBJIHNoYWxsIGJlY29tZSBtb3JlIHBvd2VyZnVsIHRoYW4geW91IGNhbiBwb3NzaWJseSBpbWFnaW5l

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

  • 生成组件,打开本地的计算器,还要进行base64加密,保存到payload.bin文件中
java  -Dhibernate5  -cp  hibernate-core-5.4.9.Final.jar;
ysoserial-master-30099844c6-1.jar
ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin
  • 看工具的组建在源代码内是否出现过

QQ截图20220225101314.jpg

  • 这里源代码出现了组件

QQ截图20220225101359.jpg

  • 生成payload(报错了,我Java环境感觉有问题)
java  -Dhibernate5  -cp  hibernate-core-5.4.9.Final.jar;ysoserial-master-8eb5cbfbf6-1.jar ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin

QQ截图20220225102545.jpg

  • 如果生成了payload,再进行base64加密,将文本的代码复制到反序列化窗口,发现计算器被打开

QQ截图20220225102625.jpg

课程资源