Tomcat安全
1、Tomcat简介
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现。
因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
一些目录:
- bin -------- 存放Tomcat的脚本文件,例如启动、关闭
- conf -------- Tomcat的配置文件,例如server.xml和web.xml
- lib --------- 存放Tomcat运行需要的库文件(JAR包)
- logs -------- 存放Tomcat执行时的LOG文件
- temp ------- 存放Tomcat运行时所产生的临时文件
- webapps ---------- Web发布目录,默认情况下把Web应用文件放于此目录
- work ------------- 存放jsp编译后产生的class文件
重要文件的作用:
- server.xml ------------- 配置tomcat启动的端口号、host主机、Context等
- web.xml ------------- 部署描述文件,这个web.xml中描述了一些默认的servlet,部署每个webapp时,都会调用这个文件,配置该web应用的默认servlet
- tomcat-users.xml --------- tomcat的用户密码与权限
- xxx.war ---------- Java Web项目包,内部包含所有项目文件,例如:java、静态文件、xml等
2、Tomcat漏洞
CVE-2017-12615任意文件上传
影响版本:Tomcat 7.0.0 ~ 7.0.79
影响说明:上传webshell,任意文件上传
环境说明:Tomcat 8.5.19
漏洞原理:CVE-2017-12615漏洞称之为Tomcat PUT方法任意写文件,类似IIS的PUT上传漏洞。该漏洞可以利用HTTP的PUT方法直接上传webshell到目标服务器,从而获取权限。该漏洞是高危漏洞,在Tomcat的web.xml默认情况下不存在该漏洞,但是一但开发者或运维人员手动将web.xml中的readonly设置为false,可以通过PUT/DELETE进行文件操控。
补充知识:
web.xml中包含下面配置:
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
在Java中有DefaultServlet、JspServlet负责处理文件
DefaultServlet:处理非jsp、jspx文件
JspServlet:处理jsp、jspx文件
这个漏洞的根本是通过构造特殊后缀名,绕过了tomcat检测,让它用DefaultServlet的逻辑去处理请求,从而上传jsp文件。
windows绕过方法:
1、利用/shell.jsp::$DATA的方式绕过
2、/shell.jsp%20,空格绕过
3、/shell.jsp/,Tomcat在处理文件时会删除最后的/
Linux绕过方法:
1、/shell.jsp/,Tomcat在处理文件时会删除最后的/
漏洞复现:传送门
CVE-2020-1983任意文件读取
影响版本:
Apache Tomcat 9.x < 9.0.31
Apache Tomcat 8.x < 8.5.51
Apache Tomcat 7.x < 7.0.100
Apache Tomcat 6.x
影响说明:读取webapp下的所有文件
环境说明:Tomcat 9.0.30
补充知识:
Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。
Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:
1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;
一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接,示意图如下(Engine、Host、Context下边会说到):多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由 Server 控制。
Tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议(1.1版本)端口,默认监听地址:0.0.0.0:8080,另外一个就是默认的8009 AJP协议(1.3版本)端口,默认监听地址为:0.0.0.0:8009,两个端口默认均监听在外网IP。
漏洞复现:传送门
CVE-2020-10487任意命令执行
该漏洞可以任意文件类型解析为jsp,从而达到任意命令执行的效果。但漏洞需要配合文件上传漏洞才可利用,假设目标服务器已经有了一个shell.png,里面内容是执行任意命令。
漏洞复现:传送门
弱口令漏洞
Tomcat支持在管理界面部署项目,也就是部署war包。在tomcat-users.xml中定义了tomcat用户的信息和权限。
访问http://127.0.0.1:8080/manager/html,打开管理界面,输入用户名密码后即可登录后台,使用【WAR file to deploy】功能上传。上传后访问一句话木马即可
漏洞复现:传送门