Weblogic路由分析及内存马思考

系列 - Weblogic系列

这篇文章源于分析Weblogic XmlDecoder 反序列化漏洞过程中,对weblogic还有哪些内置服务和weblogic如何处理uri进行匹配进对应的servletContext等疑问进行分析记录

weblogic/socket/MuxableSocketDiscriminator.class对http请求进行初始化,并将报文协议包装为MuxableSocket对象

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571592-image-20230321113837-jrkbjzk.png

weblogic/servlet/internal/MuxableSocketHTTP.class 对http(s)原始报文进行解析

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230321115250-dj3ne65.png

获取到请求URI后会先从从服务器获取请求对应的ServletContext

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230321115927-2zlgwx2.png

内置服务如下

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230321130512-3059pzk.png

获取到对应的ServletContext后,对URI进行处理进行Serlvet匹配

weblogic/servlet/internal/WebAppServletContext.class#resolveDirectRequest

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230321130903-b0mmfd8.png

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230321130925-kbsm1st.png

上面就是weblogic对用户传入的URI进行servletContext、servlet匹配的大概过程了

通过上面的分析,发现weblogic也跟其他中间件相似,也是通过context上下文进行访问匹配控制。

文章以Servlet和Filter内存马原理为例,且为了更好地理解Weblogic处理Servlet和Filter的过程,本地打包一个测试服务,并上传至weblogic进行部署

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323182055-fk6x6cb.png

由于本地weblogic使用的环境问题,需要对web.xml进行修改

jdk1.6需要将web.xml内容修改如下

1
2
3
4
5
6
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">

</web-app>

部署过程不需要额外操作

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323182633-t3ujam8.png

完成部署后断点进行跟踪

weblogic/servlet/internal/MuxableSocketHTTP.class#resolveServletContext,servlet和filter都保存在目标servletContext中

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323183042-4e1e8ps.png

weblogic/servlet/internal/WebAppServletContext.class#wrapRun

在进入servlet前,程序会先判断是否存在Filter,且会提取出符合条件的Filter对象

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323184146-k0xk3yt.png

判断符合条件的Filter取决于FilterManager中的filterPatternList和filters,前者保存Filter实例对象,后者保存ServletMapping对象,用于与用户输入的uri进行匹配,进而提取合适的Filter实例对象

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323184448-k25i3wr.png

执行符合要求的Filter对象会执行doFilter方法,对数据进行处理(权限校验、字符编码等)

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323185214-h2mt0n3.png

若通过Filter,程序最终会进入符合要求的Servlet,对数据进行处理

https://mtnsmdbt.oss-cn-hangzhou.aliyuncs.com/blog/1679571593-image-20230323192826-yslet1v.png

1、由于servlet和filter都是基于servletContext,可以尝试使用反射获取指定servletContext上下文进行注入servet或filter内存马(应该比较好实现)

2、模拟部署操作,实现注入servletContext(猜测会难实现)

由于这篇文章用于了解Weblogic的执行逻辑,所以后面会专门出一篇文章对上述的想法尽可能的实现