前言
最近在学习帆软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
上进行利用