昨天写了一篇Tomcat漏洞PUT方法任意写入文件漏洞(CVE-2017-12615) 的复现文章,今天决定近这两天把Tomcat常见的漏洞全部再次过一遍,就当复习回顾了。
漏洞简介
- CVE-2020-1938漏洞
国家信息安全漏洞共享平台发布了Apache Tomcat上的文件包含漏洞。通知中表示攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件,如:webapp配置文件或源代码等。
影响版本:
-
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开启了http和AJP两种协议的处理,由于“javax.servlet.include.request_uri”,“javax.servlet.include.path_info”,“javax.servlet.include.servlet_path” 这三个参数可控,所以导致文件读取以及文件包含漏洞。不过注意,可读取的文件也仅限于webapps/ROOT目录。
题目环境
在vulfocus演示环境自行搜索。
解题过程
利用脚本读取web.xml文件
发现可行,然后根据题目给出的提示,要去包含flag.png这个文件,于是继续利用脚本包含即可
Flag
动态flag。
总结与拓展
总结
1.漏洞原理
Tomcat开启了http和AJP两种协议的处理,由于“javax.servlet.include.request_uri”,“javax.servlet.include.path_info”,“javax.servlet.include.servlet_path” 这三个参数可控,所以导致文件读取以及文件包含漏洞,当然内容也仅限制webapps/ROOT目录。
2. 利用方法:
利用脚本读取/包含文件。
拓展知识与一些疑问
- Tomcat的简易架构图
从图中可以看出,Tomcat最顶层的容器是Server,其中包含至少一个或者多个Service,一个Service有多个Connector和一个Container组成。这两个组件的作用为:
(1)Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
(2)Container用于封装和管理Servlet,以及具体处理Request请求;
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。
此次漏洞产生的位置便是8009 AJP协议。
- 为什么是asdf.jsp
起初对脚本中的asdf产生了疑问,最后看了原理之后,才发现,这里的asdf可以是任意字母只要Servlet中没有就可以,如果没有就会启动DefaultServlet。
如果是要进行文件包含的话,那么就要使用asdf.jsp这样就会走jspServlet。