首页 未命名正文

Tomcat执行任意代码漏洞,请检查!

最近有朋友在后台反馈 Tomcat 的漏洞,

到 Tomcat 的mail-list查看电子邮件,果然,电子邮件组的官方公告已经发布。

这次我们分析了两个 CVE 中的一个漏洞比官方公告更有影响力,除了 Windows 除了平台,其他平台也受到另一种使用形式的影响,并具体执行任何代码的风险。因此,请在此描述您的应用程序。如有影响,请尽快修复。

免责声明

本文仅进行技术分析和漏洞提醒,任何基于此的行为都与本文无关。

漏洞描述

9月19日晚,Apache Tomcat 官方公告称 所有 Windows 在平台上打开 HTTP PUT *** 支持, 有执行远程代码的风险。漏洞代码: CVE-2017-12615

官方描述如下:

详细说明:

我们很久以前的文章介绍过,Tomcat 包含两个默认 Servlet,一是 DefaultServlet,一个是 JspServlet。这两个 Servlet 都是在 Tomcat 默认的 web.xml 包含在内,自定义web.xml 进行 merge,所以每个应用都会有这两个 Servlet。

由于每个 Servlet 都可以设置一些初始化参数(init-param) ,所以默认web.xml 包含一些常用的,如是否允许文件列表,是否允许debug,fileEncoding,sendFile大小 等等。可以设置是否允许HTTP PUT *** 。

参数配置:readOnly,主要用于对方HTTP 的 PUT / DELETE *** 是否被拒绝。

  • <init-param>
  • <param-name>readOnly</param-name>
  • <param-value>false</param-value>
  • </init-param>
  • readOnly 默认是true,也就是说,默认没有启用PUT、DELETE这些 *** 。如果一些朋友的容器因为应用程序依赖而打开readOnly ,一定要注意!

    在 DefaultServlet 的 PUT在处理逻辑中,将首先判断readOnly

    对于 DefaultServlet 的mapping 配置如下:

    此时,如果要求URL 类似:

    请求 *** : PUT

  • 请求 *** :PUT
  • path:http://xxx/context/abc.jsp/
  • data:使用raw格式<%out.println("HelloWorld");%>
  • 使用Postman可轻松构建一个(使用 *** 可参考:Web开发神器之PostMan,接口测试不再担心)

    PUT 实际处理内容时,会提取并写作

  • if(this.resources.write(path,(InputStream)resourceInputStream,true)){
  • if(resource.exists()){
  • resp.setStatus(204);
  • }else{
  • resp.setStatus(201);
  • }
  • }else{
  • resp.sendError(409);
  • }
  • 虽然这里的路径是abc.jsp由于文件名称规范的限制,在实际处理过程中会进行处理,***一个/ 会被处理,所以创建了一个名字abc.jsp的文件,文件内容就是我们传来的raw 内容。这里的内容可以随意写。

    当PUT请求返回后,再次请求 abc.jsp,此时 raw随机写的内容将被执行,即我们前面提到的任何代码执行的风险。

    Apache Tomcat 官方描述为 Windows 如果要求,平台上的漏洞也是命名问题url里是以abc.jsp 这样的 PUT 请求,到达 DefaultServlet 处理时,创建文件仍然会过滤掉 的空间,风险相同。

    解决方案:

    要理这个问题需要 readOnly 设置为 true,或者保持初始值,而不是web.xml增加配置。

    【本文为51CTO专栏作者“侯树成”请通过作者微信微信官方账号转载原稿。『Tomcat那些事儿』获取授权】

    戳这里,看作者更好的文章

       
    版权声明

    本文仅代表作者观点,不代表本站立场。
    本文系作者授权发表,未经许可,不得转载。