先感谢一下scz大佬给的博客推荐,受宠若惊+10086。
心血来潮有这么个想法,验证一下。
只讨论思路,工具木有~
前言
-
看了很多师傅们在研究针对Java中间件+Java反序列化漏洞回显的研究:
- https://xz.aliyun.com/t/7740
- https://xz.aliyun.com/t/7348
- https://paper.seebug.org/1233/
- (。。。应该还有挺多,就不翻了)
-
又看到了c0ny1师傅的作品:《java内存对象搜索辅助工具》
配合IDEA在Java应用运行时,对内存中的对象进行搜索。比如可以可以用挖掘request对象用于回显等场景。
…
按照经验来讲Web中间件是多线程的应用,一般requst对象都会存储在线程对象中,可以通过
Thread.currentThread()
或Thread.getThreads()
获取。 -
并且目前回显思路主要是基于加载类,执行static块或者构造方法(原生反序列化、FastJson、Jackson一类的都有):
- TemplatesImpl类的反序列化链,内嵌类的bytecode,defineClass。
- 其他反序列化链使用URLClassLoader进行远程加载类。
- JNDI远程加载类。
所以想到: 我们能否写单个类,让它能够触发时,使用2的思路去寻找request和response,从request中获取命令参数,然后向Response中写入呢?
先说结论: 可以实现,在Tomcat、Jetty和Weblogic中都可使用(只测了这三,个人觉得其它Java中间件也没差),还测试了Shiro、Fastjson、Jackson反序列化的场景。
Tomcat6+Shiro会报java.io.StreamCorruptedException: invalid type code:
错误,很迷,有空再解决吧。
精简后的编译完的class文件大小在2800-2900B左右,Shiro反序列化用的Cookie值大小可以控制在5000字节左右,勉强可以接受。
响应时间一般在3S内。
基本思路
javax.servlet.http.HttpServletRequest
javax.servlet.http.HTTPServletResponse
- java类中间件的request和response分别实现以上两个接口
- 从Thread.currentThread()起始搜索实现了如上两个接口的对象
- 通过HttpServletRequest的getHeader方法可以获取到请求头
- 通过HTTPServletResponse的getWriter方法可以获取到响应的Writer(开始用的ServletResponse的getOutputStream接口,但是会报重复获取的OutputStream的错误,此处就改为使用getWriter了)
- 都搜索到后,该执行执行,该输出输出
初始代码
有点多,都贴上有水字数的嫌疑,还是贴gist链接吧。┓( ´∀` )┏
https://gist.github.com/fnmsd/89118c2967cd53c244389564d2f8b368
编译完的class 3888字节,好吉利~
-
为了类能小一些,没有做c0ny1师傅那么细致的搜索分类和剪枝。
-
为了方便,纯粹使用深度优先搜索(DFS),依次搜索字段
-
然而接下来为了瘦身,各种先定逻辑还得继续砍砍砍
**PS:**在搜索Tomcat的Request过程中,不知道为何会搜出一个并非当前Request的对象,所以这里限制了Request必须包含cmd头,才认为找到了真的Request,Response目前没有发现这个问题。