跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

  • 0

Tomcat PUT方法任意写文件漏洞复现(CVE-2017-12615)


HACK1949

问题

Tomcat PUT方法任意写文件漏洞复现(CVE-2017-12615)

5ff1112a15d13.png

版本信息

Tomcat测验版本:7.0.79

漏洞影响悉数的 Tomcat 版本:Apache Tomcat 7.0.0 - 7.0.79 (windows环境)

漏洞剖析

在tomcat官网下载一个Tomcat7的源码压缩包,打开来慢慢看看里边的.xml文件与java代码。

关键装备

装备文件途径

apache-tomcat-7.0.10-src\conf\web.xml

DefaultServlet类处理除了JSP文件以外的静态资源




readonly默认为true,在(CVE-2017-12615)的状况下为false。


servlet-name:default对应的是servlet-class:DefaultServlet

defaultorg.apache.catalina.servlets.DefaultServletdebug0listingsfalsereadonlyfalse1

JspServlet类负责JSP文件的汇编与运转




servlet-name:jsp对应的是servlet-class:JspServlet

jsporg.apache.jasper.servlet.JspServletforkfalsexpoweredByfalse3

servlet-mapping主要是截获恳求的:

    1. 假如url-pattern界说的是途径,那么以后一切对这个途径下资源的恳求都会由servlet-name中界说的servlet处理;
    2. 假如你的url-pattern界说的是资源格局例如*.jsp等,那么对于一切符合这种格局的资源的恳求都由指定的servlet处理。

这儿说明了/类型的资源都由servlet-name:default处理,*.jsp与*.jspx类型的资源都由servlet-name:jsp处理







  default/jsp*.jspjsp*.jspx

代码剖析

DefaultServlet.java文件途径

apache-tomcat-7.0.10-src\\java\\org.apache\\catalina\\servlets\\DefaultServlet.java

受影响的doPut函数

/**
 * Process a PUT request for the specified resource.
 *
 * @param req The servlet request we are processing
 * @param resp The servlet response we are creating
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet-specified error occurs
 */
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    if (readOnly) {
        resp.sendError(HttpServletResponse.SC_FORBIDDEN);
        return;
    }

    String path = getRelativePath(req);

    boolean exists = true;
    try {
        resources.lookup(path);
    } catch (NamingException e) {
        exists = false;
    }

    boolean result = true;

    // Temp. content file used to support partial PUT
    File contentFile = null;

    Range range = parseContentRange(req, resp);

    InputStream resourceInputStream = null;

    // Append data specified in ranges to existing content for this
    // resource - create a temp. file on the local filesystem to
    // perform this operation
    // Assume just one range is specified for now
    if (range != null) {
        contentFile = executePartialPut(req, range, path);
        resourceInputStream = new FileInputStream(contentFile);
    } else {
        resourceInputStream = req.getInputStream();
    }

    try {
        Resource newResource = new Resource(resourceInputStream);
        // FIXME: Add attributes
        if (exists) {
            resources.rebind(path, newResource);
        } else {
            resources.bind(path, newResource);
        }
    } catch(NamingException e) {
        result = false;
    }

    if (result) {
        if (exists) {
            resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
        } else {
            resp.setStatus(HttpServletResponse.SC_CREATED);
        }
    } else {
        resp.sendError(HttpServletResponse.SC_CONFLICT);
    }

}

动态调试

进入doPut函数,上传的文件名为12w3.jsp/,能够看到readOnly==false

1608899103_5fe5da1f646f3c9c9299e.png!sma

因为12w3.jsp/不存在服务器中,所以调用bind函数进行写入。进入resources.bind函数

1608899194_5fe5da7a2342ce15443fc.png!sma进入dirContext.bind函数

1608899327_5fe5daff7dbdb708d4034.png!small?1608899326982

进入bind函数

1608899356_5fe5db1ce7c2f04d496ff.png!small?1608899356500

传入的name参数为/12w3.jsp/,在File函数中会将name中的/去除,进入File函数进行检查

1608899374_5fe5db2ee47a591f7dcb8.png!small?1608899374467

child==/12w3.jsp/,由fs.normalize函数处理,进入fs.normalize函数

1608899458_5fe5db823abf801db1856.png!small?1608899457822

normalize(path)函数中调用normalize(path, len, off)函数对/进行处理,进入normalize(path, len, off)函数

1608899474_5fe5db9219e78cc2a65a2.png!small?1608899473737

normalize(path, len, off)函数对path处理完后,返回\12w3.jsp

1608899492_5fe5dba444bcd8720547c.png!small?1608899491812

从File函数中出来,把name==/12w3.jsp/传进rebind函数,进入rebind函数

1608899596_5fe5dc0ce96d744cdfcbb.png!small?1608899596500

在rebind函数中调用File函数获得完整途径F:\\Tomcat\\apache-tomcat-7.0.79\\webapps\\ROOT\\12w3.jsp

1608899616_5fe5dc20060a4c5a264f3.png!small

将文件内容写入F:\\Tomcat\\apache-tomcat-7.0.79\\webapps\\ROOT\\12w3.jsp文件

1608899696_5fe5dc7087f089c3c5b41.png!small?1608899696106

上传完结。

漏洞使用

访问Tomcat主页,抓包

1608899855_5fe5dd0fa91b68c201170.png!small?1608899856461

右击,挑选send to repeater

1608899876_5fe5dd24d84e0f0303962.png!small?1608899876380

修正红框中的内容:

  1. 将GET恳求改为PUT
  2. 增加文件名backdoor.jsp/(注意后面要增加/)
  3. 增加文件内容

1608900007_5fe5dda7491a1bcb9125d.png!small?1608900006933

1608900013_5fe5ddadb1bda7c2c1069.png!small?1608900013230

点击send发送。检查response,文件创建成功。

1608900134_5fe5de2685a30ba14e816.png!small?1608900134310

检查Tomcat根目录,多了一个backdoor.jsp,上传成功。

1608900147_5fe5de339b725ec089d64.png!small?1608900147241

链接帖子
意见的链接
分享到其他网站

这个问题有0个答案

推荐的帖子

此问题没有答案

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...