WEB 漏洞-反序列化之 PHP&JAVA 全解(下)
Java中的序列化原理
- 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
- 从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。
源代码分析
- 调用序列化方法,将反序列化的的结果返回给person变量,输出person变量
- 序列化方法,创建一个person的对象,创建一个文件输出流(指向person.txt的文件),命名为oos,将person对象的写入到文件输出流中
Java 反序列化及命令执行代码测试
- 使用exec方法执行字符串命令并返回一个process对象
- 获取命令(process)的输入流给reader对象
- 读取输入流的内容,打印输出(反序列化)
- 运行结果,把ipconfig命令的执行结果给对象化了,然后又在输入流里面读取出来,打印输出
WebGoat_Javaweb 靶场反序列化测试
启动靶场,需要指定的jdk11版本
- 输入框内接受序列化的对象,并且将它反序列化(更改序列化的对象,将页面延迟5秒)
- 接受参数,base64解密,反序列化读取,返回读取的对象
- 获取输出流,赋值给一个对象,然后写入输出流(序列化),返回base64编码
- 这里存在命令执行(在调用读取输入流的时候,也就是读取反序列化的数据,并且把它当做命令执行)
- 漏洞分析:这里会将反序列化的数据进行读取,再进行命令执行。
- 序列化标志参考(可以确定是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
- 看工具的组建在源代码内是否出现过
- 这里源代码出现了组件
- 生成payload(报错了,我Java环境感觉有问题)
java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-master-8eb5cbfbf6-1.jar ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin
- 如果生成了payload,再进行base64加密,将文本的代码复制到反序列化窗口,发现计算器被打开
课程资源
最后一次更新于2022-03-09 14:35
0 条评论