先感谢一下scz大佬给的博客推荐,受宠若惊+10086。 心血来潮有这么个想法,验证一下。 只讨论思路,工具木有~ 看了很多师傅们在研究针对Java中间件+Java反序列化漏洞回显的研究: 又看到了c0ny1师傅的作品:《java内存对象搜索辅助工具》 配合IDEA在Java应用运行时,对内存中的对象进行搜索。比如可以可以用挖掘request对象用于回显等场景。 … 按照经验来讲Web中间件是多线程的应用,一般requst对象都会存储在线程对象中,可以通过 并且目前回显思路主要是基于加载类,执行static块或者构造方法(原生反序列化、FastJson、Jackson一类的都有): 所以想到: 我们能否写单个类,让它能够触发时,使用2的思路去寻找request和response,从request中获取命令参数,然后向Response中写入呢? 先说结论: 可以实现,在Tomcat、Jetty和Weblogic中都可使用(只测了这三,个人觉得其它Java中间件也没差),还测试了Shiro、Fastjson、Jackson反序列化的场景。 Tomcat6+Shiro会报 精简后的编译完的class文件大小在2800-2900B左右,Shiro反序列化用的Cookie值大小可以控制在5000字节左右,勉强可以接受。 响应时间一般在3S内。 javax.servlet.http.HttpServletRequest javax.servlet.http.HTTPServletResponse 有点多,都贴上有水字数的嫌疑,还是贴gist链接吧。┓( ´∀` )┏ https://gist.github.com/fnmsd/89118c2967cd53c244389564d2f8b368 编译完的class 3888字节,好吉利~ 为了类能小一些,没有做c0ny1师傅那么细致的搜索分类和剪枝。 为了方便,纯粹使用深度优先搜索(DFS),依次搜索字段 然而接下来为了瘦身,各种先定逻辑还得继续砍砍砍 **PS:**在搜索Tomcat的Request过程中,不知道为何会搜出一个并非当前Request的对象,所以这里限制了Request必须包含cmd头,才认为找到了真的Request,Response目前没有发现这个问题。 由于Nginx有Cookie 4096B长度的限制,Tomcat有8096B的长度限制(感谢c0ny1师傅),所以为了能使用Templates类的链,编译出的Class文件还是越小越好。 以下内容比较乱,是一个逐渐尝试减小Class文件的过程,没兴趣可以略过 整个分析过程使用classpy-0.4.jar来进行对Class文件的分析: https://github.com/zxh0/classpy 1.初始 3888字节 2.去掉可有可无的静态字段 3734字节 3640字节 删除多余逻辑的限制逻辑 3611字节 删除getModifiers的调用(删除一个方法大概60字节的样子?) 3551字节 减少了一个空判断,大概4字节 3547 减少局变量的定义 变为: 3525,少了22字节 去掉调试时用的printStackTrace 3488字节 删掉flush和waitFor 3451字节,貌似没少多少 删掉static块和start方法,只保留构造方法触发 3372 删除PrintWriter的变量赋值,删除Test by fnmsd字符串 3260 删除掉proc的定义,直接跟getInputStream一块调用 3220 合并Scanner相关逻辑为一句: 3130 以下本应有判断来进行的剪枝,改为使用异常处理兜着 去掉java.lang类的搜索剪枝 节省了toString和startsWith 3009 去掉数组包裹类型的为非primtive的判断 2962 去掉全部isPrimitive的判断 2917 去掉搜索时字段值为null的判断 2908 给类名、字段名、方法名、局部变量名都改为一个字符 2850 这里改局部变量其实不起作用。 去掉是否为静态字段的判断 2803(最终大小在2800-2900之间,不会差太多,后面不知道又改哪里了,到了2900左右) 最终结果代码(使用构造方法触发,也可以改成Static,都一样):https://gist.github.com/fnmsd/8165cedd9fe735d7ef438b2e977af327 由于都是new一个对象或者static块执行,所以偷了个懒,简单写了个jsp页面,可以看到没有任何的输出语句,只是new了一下对象: Weblogic(打包有点问题,页面没改成最简版的): Tomcat: Tomat8+Shiro反序列化 这里用的Jdk7u21的链(TemplatesImpl触发)来new我写的类,rememberMe长度5036 懒得部环境的同学,可以用Vulhub里面的Shiro环境,(SpringBoot用的嵌入式Tomcat9)但是那个得用CommonsBeanutils1的链。 这个用的我之前给Jackson提的链,可惜没混到CVE编号,嘤嘤嘤o(╥﹏╥)o 一点思考: 非HTTP的反序列化,搜Socket对象,然后从getOutputStream再往里写能不能行呢? 师傅们的研究: https://xz.aliyun.com/t/7740 https://xz.aliyun.com/t/7348 https://paper.seebug.org/1233/ … https://github.com/c0ny1/java-object-searcher https://gv7.me/articles/2020/semi-automatic-mining-request-implements-multiple-middleware-echo/ J2EE的接口文档: https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html前言
Thread.currentThread()
或Thread.getThreads()
获取。
java.io.StreamCorruptedException: invalid type code:
错误,很迷,有空再解决吧。基本思路
初始代码
为代码瘦身
static Class ReqC = HttpServletRequest.class; static Class RespC = HttpServletResponse.class; static int max_depth = 50;
if(depth > 50||(req!=null&&resp!=null)){ return; }
Class a = obj.getClass(); if(a.isPrimitive()||a.toString().startsWith("java.lang")){ return true; }
if(obj.getClass().isPrimitive()||obj.getClass().toString().startsWith("java.lang")){ return true; }
resp.getWriter().println(new Scanner(Runtime.getRuntime().exec(req.getHeader("cmd")).getInputStream()).useDelimiter("\A").next())
obj.getClass().toString().startsWith("java.lang")
obj.getClass().getComponentType().isPrimitive()
if((declaredField.getModifiers()&0x00000008) == 0)
瘦身总结
(前面传错了一个中间的bug版本,会重复执行重复回显,感谢l1nk3r师傅早早的帮我发现了)
测试
<%@ page import="aa.a" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% new a(); %>
Jetty:
3. Fastjson JNDI加载场景(这里用vulhub的fastjson/1.2.47-rce,SpringBoot用的嵌入式Tomcat9)
4. weblogic12+Jackson反序列化
其他
参考资料
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算