前言
最近在学习帆软channel接口的二次反序列化绕过相关知识,再对这个漏洞进行武器化的时候,本想通过pen4uin师傅的JEG这个工具直接生成一条tomcat下可回显的命令执行利用链进行利用,但是生成的利用链在帆软FineBi 1.1.18下无法利用成功,我的找到的版本不能调试,打上断点就是灰色斜杠,不知道具体原因,加上此前也对这类回显没有过研究,借此机会,学习一下命令执行回显的艺术。
Request对象
此前对命令执行回显了解甚少,拜读各位师傅文章,了解到几种回显的方式,最优雅的方式就是去获取Request对象进行回显,获取Request对象,再通过Request对象获取Response对象,反射调用addHeader或者doWrite方法进行回显。那么回显的关键就是在tomcat中如何去找到并获取Request对象。
这里本地写了个demo,模拟帆软的反序列化漏洞点,用tomcat部署了起来,打上断点进行调试。
![]() |
|---|
主要就是线程中找到存放Request对象全局变量,不班门弄斧了,这点师傅们早已得出了结论。
用idea执行表达式得功能 执行 Thread.getThreads(),获取所有线程。
![]() |
|---|
在线程名为http-nio-8081-Acceptor-0里面有一个属性名target的NioEndpoint$Acceptor对象,NioEndpoint$Acceptor对象里面存放一个属性名为this$0的NioEndpoint对象,this$0里面存放一个属性名为handler的AbstractProtocol$ConnectionHandler对象,handler里面存放了一个属性global的RequestGroupInfo对象,在global里面存放了一个processors的ArrayList对象,processors存放着RequestInfo对象,RequestInfo对象中存放着Request对象。
很绕,直接看图。
![]() |
|---|
1 | Thread.getThreads() |
通过如上的链条,一步步反射去获取最终的Request对象,然后拿到Respone对象,addHeader或者doWrite方法进行回显。
坑点
在反射获取handler属性的时候,会报错java.lang.NoSuchFieldException
![]() |
|---|
解决办法是需要从父类的父类当中获取
![]() |
|---|
最终通过代码执行获取并回显的代码如下
1 | package example2; |
序列化,在demo上进行利用
![]() |
|---|
在帆软5.1.18上进行利用
![]() |
|---|






