| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 从某比赛题目ezgadgets复现看java反序列化 -> 正文阅读 |
|
[Java知识库]从某比赛题目ezgadgets复现看java反序列化 |
我们平常在使用ysoserial这样的工具时,并不会太在意payload是如何生成的。反正工具一把梭就完事了,但是出题人总是想尽办法不让我们使用工具。所以没办法,只能自己写了。 题目复现给出源码结构如下 controller作为控制器,并且只有一个class,那么漏洞点肯定在这里面。给出代码如下 readObject是典型的java反序列化,这里的输入流可控。我们传入data后,会将数据直接存放到ObjectInputStream对象中。 这里直接使用ysoserial,很容易发现存在一个问题,就是这里不但有反序列化,还有如下语句。
这里要求我们传入的流必须包含两个正确的信息,只有两个信息正确才能进行反序列化。 那么这里就需要自己去构造了。既然有readUTF,那么就有writeUTF,只要按顺序写入就行。那么如何构造呢? 要利用readObject,首先想到使用TemplateImpl类来构造POC,但本人尝试未成功。
于是换了一个利用链,就是CC5的BadAttributeValueExpException利用链,调用栈如下
先使用反射获取类来调用calc
这里就出现了问题,输出流的write顺序是和要求的顺序不符合的。如果运行代码至writeUTF()时就会出现错误。 同理,调换writeObject的顺序就会阻止报错,但生成的payload不满足读取条件。明明要先进行readUTF的操作,但是先进行了writeObject。存放的方式可不是用栈来存储的。 再往下看,发现toStringBean这个类继承至ClassLoader类,同时实现了Serializable的接口。 反序列化的重要特点就是可以重写某个类,对这个类进行实例化。然后调用这个类里面,可利用的defineClass实现对任意类的加载,clazz.newInstance()实现对任意类的实例化。 那么编写一个恶意类Evil.java,去实现对Runtime的调用。 修改刚才的代码,通过toStringBean的Setter实现字节码的传入。将编译好的恶意类文件Evil.class,加载到ClassByte变量,实现服务端代码对Evil类的实例化。 最后得到输出的base64格式的字节流,传入即可调出计算器 可以拿ysoserial生成的代码进行比较,可以发现有很多类似的地方。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:18:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |