最近有朋友反馈Tomcat后台漏洞,查看了Tomcat邮件列表中的邮件。果然,官方邮件群已经发了公告。这次我们分析两个CVE漏洞之一。该漏洞的影响比官方公布的还要广泛。除了Windows平台,其他平台也受到另一种利用方式的影响,具体是执行任意代码的风险,所以在这里描述一下,朋友们,检查一下自己的应用,如果受到影响,请尽快修复.免责声明本文仅作技术分析和漏洞预警,任何基于此的行为与本文无关。漏洞描述9月19日晚间,ApacheTomcat官方宣布所有启用HTTPPUT方法支持的Windows平台均存在远程代码执行风险。漏洞代码:CVE-2017-12615官方描述如下:详细描述:我们在之前的文章中介绍过,Tomcat默认包含两个Servlets来处理特定的请求,一个是DefaultServlet,一个是JspServlet。这两个Servlet包含在Tomcat默认的web.xml中,并与自定义的web.xml合并,所以每个应用都会有这两个Servlet。由于每个Servlet都可以设置一些初始化参数(init-param),默认的web.xml中包含了一些常用的,比如是否允许文件列表,是否调试,fileEncoding,sendFile的大小等。其中,你可以设置是否允许HTTPPUT方法。参数配置项:readOnly,主要用于是否拒绝HTTP的PUT/DELETE方法。readOnlyfalsereadOnly默认为true,即不开启PUT和DELETE默认方法。如果有朋友的容器因为应用依赖的原因开启了readOnly,一定要注意!!!我们看,在DefaultServlet的PUT处理逻辑中,首先会判断readOnly到DefaultServlet的映射配置如下:此时,如果请求URL是这样的:Requestmethod:PUTrequestmethod:PUTpath:http://xxx/context/abc.jsp/data:Userawformat<%out.println("HelloWorld");%>使用Postman轻松构造一个(使用方法可以参考:PostMan,web开发神器,你不用再也不用担心接口测试了)当真正处理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中随机写入的内容,这就是我们前面提到的任意代码执行的风险。ApacheTomcat官方描述的Windows平台漏洞也是一个命名问题。如果url是abc.jsp%20这样的PUT请求,到达DefaultServlet处理时,文件创建还是会过滤掉%20的空间,风险同上。解决方法:解决这个问题,需要将readOnly设置为true,或者保持初始值不在web.xml中添加配置。【本文为专栏作家“侯书城”原创稿件,转载请通过作者微信公众号“Tomcat物语”获得授权】点此查看本作者更多好文