某系统 - Java Filter内部反射功能完成远程代码执行

倾旋
倾旋
技术分享|2021-12-1|最后更新: 2023-6-22|
type
status
date
slug
summary
tags
category
icon
password
URL

0x00 Java Servlet API 之 Filter

Filter,字面意思有过滤的意思,其实在Servlet API中,它就是充当了一个过滤器,2000年,Sun公司在Servlet 2.3规范中添加了Filter功能,并在Servlet 2.4中对Filter进行了细节上的补充。每一个Java Servlet Web都可以设置多个Filter,开发人员可以通过web.xml配置Filter的过滤范围。Filter的实现主要通过Servlet API中提供的Filter接口定义的方法,其实就三个方法。

0x01 Filter中的FilterChain

通常开发人员会使用web.xml来配置当前站点的各种信息,例如:Servlet、Filter、Listener、显示名称、描述…等其他信息,关于web.xml的格式定义,oracle官方有一个非常详细的说明
假设漏洞环境中的web.xml定义了分别有LoaderFilterStaticFilter,都在com.web.包下:
FilterChain:Filter由于URL的匹配模式设置会形成一条链,最先由第一个符合URL匹配的Filter先执行doFilter,在doFilter中可以根据获得的ServletRequest、ServletResponse、FilterChain进行其他动作,当doFilter中调用FilterChain的doFilter方法时,其实就是将ServletRequest、ServletResponse继续传给下一个Filter对象,这样就形成了一个链式结构,如果直接在doFilter中进行return或不掉用FilterChain的doFilter,那么ServletRequest、ServletResponse就不会继续流向下一个Filter。
上面的配置文件表示了StaticFilter、LoaderFilter都覆盖了所有的URL,但是StaticFilter要比LoaderFilter优先,最先映射的优先级越高,在StaticFilter的doFilter方法中调用FilterChian.doFilter才会继续执行LoaderFilter.doFilter。

0x02 静态资源文件的Filter

一般情况下网站拥有许多静态资源是前台与后台公用的,例如jquery这种js库文件前后台都需要使用,但后台与前台也要做权限区分,不能让用户在未授权的情况下还能访问登录管理员的接口,因此需要编写一个优先级较高的Filter将URL中以静态资源文件扩展名结尾的资源进行提前放行,如果不是静态资源则让他跳转到登录页面。
上面的StaticFilter就是简单实现了这个功能:
上面的代码仅仅是模拟了访问静态资源会让页面响应YES,如果URL的扩展名中不是excludedExt其中的某一个,那么页面不会响应YES。其实Filter微小的配置改动有时候能产生巨大的影响,包括其中也漏洞挖掘的利用条件。

0x03 Filter中的反射

这个是审计某个系统的看到的大致代码,觉得非常有意思,开发者在单独的一个Servlet中实现了一个反射的功能用于随时调用框架内的任意对象方法,这里我模拟成在LoaderFilter中实现。
LoaderFilter的doFilter主要功能是从HttpServletRequest对象中拿到class、method两个参数,然后将class的值当作对象的名称,对其进行反射加载,调用method方法。其实根据参数类型可以看出,LoaderFilter主要是为了可以调用某个符合Servlet方法的对象。

0x04 利用静态资源Filter绕过权限检测进行任意对象的反射

了解清楚Filter的过滤过程,那么就可以利用StaticFilter满足在为授权的情况下,调用LoaderFilter去执行任意Servlet对象的doGet、doPost方法,如果某个Servlet的方法存在漏洞,就可以达到完美利用。
构造URL:http://localhost/MyWeb_war/test.css?class=com.web.IndexServlet&method=doGet
notion image
执行效果:
notion image

0x05 文件解压缩目录穿越问题

许多时候一些Java Web开发者对于压缩包内的文件名可信程度非常高,这就出现了许多由非常规压缩文件名导致的路径穿越漏洞,很多办公类的系统好像大多都有类似问题,危害其实最大的是利用路径穿越解压功能(其实就是任意目录写)可以让Webshell写入到一个能够执行的目录。
常见的库:
危险的写法:
ZipCreater主要应用于跨目录的文件上传漏洞的利用,它能够快速进行压缩包生成,evilarc.py不支持修改已有的压缩包,但ZipCreater可以。
假设/tmp/payload文件夹内的文件列表如下:
使用ZipCreater可以生成跨目录的文件名:
exploit.zip内容如下:
使用ZipCreater可以生成跨目录的文件名:
exploit.zip内容如下:
©2021-2024 倾旋. All rights reserved.