Apache Tomcat任意文件读取漏洞和命令执行漏洞源码分析(CVE-2020-1938)
Apache Tomcat任意文件读取漏洞和命令执行漏洞源码分析(CVE-2020-1938)
环境准备
在分析Apache Tomcat源码漏洞之前,我们先需要使用Idea配置Tomcat源码,请参考:https://blog.csdn.net/SouthWind0/article/details/105147406
漏洞分析
Tomcat在默认的conf/server.xml中配置了2个Connector,一个默认监听8080端口处理HTTP请求,另外一个默认监听8009端口处理AJP请求。
Tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest()方法将ajp里的内容取出,并设置成request对象的属性。既然如此,我们先在调用prepareRequest()方法的地方下一个断点。
跟进到Decode extra attributes这个位置,也就是获取解析属性和设置属性的地方。可以看到它循环获取数据后,又设置成request对象下面的三个Attribute属性,这意味着我们可以控制这三个属性。
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
继续跟进,可以看到封装成了对应的request之后,它将要接着走servlet的映射。
通过走不同的映射,产生了两种类型的漏洞,如下所示。关于映射请参考,Tomcat的DefaultServlet和JspServlet一文,地址:
https://blog.csdn.net/SouthWind0/article/details/105147262。
(1)任意文件读取
AJP请求:
forwardrequest 2 "HTTP/1.1" "/123.png" 127.0.0.1 127.0.0.1 porto 8009 false "Cookie:AAAA=BBBB","Accept-Encoding:identity" "javax.servlet.include.request_uri:/","javax.servlet.include.path_info:log/test.jsp","javax.servlet.include.servlet_path:/"
我们发送上面的AJP请求,因为/123.png将走DefaultServlet,关键请求参数如下:
javax.servlet.include.request_uri: /
javax.servlet.include.path_info: log/test.jsp
javax.servlet.include.servlet_path: /
Debug源码如下:
接着调用容器来处理
在HttpServlet中调用doGet()方法
跟进,来到了org.apache.catalina.servlets.DefaultServlet的doGet()方法中,doGet()方法又调用serveResource()方法进行资源读取操作。
跟进到serveResource()方法中,可以看到它使用getRelativePath()方法来获取资源的相对路径。
既然到了门口,我们去看看getRelativePath()方法,可以看到,由于我们的AJP请求设置javax.servlet.include.request_uri属性值为/不为null,那么资源的相对路径构造如下:
= javax.servlet.include.path_info + javax.servlet.include.path_info
= / + log/test.jsp
= /log/test.jsp
返回来,我们已经通过getRelativePath()方法获取资源的相对路径,那么接着就需要读取资源了。接着往下走,可以看到通过getResources()方法就可以获取到对应路径的资源了。
值得一提的是,跟进这个方法,可以发现有趣的事情,如果路径存在./或../则会返回null,这样就解释了为什么我们无法跳出webapps目录来读取文件了。
继续往下走,最后资源对象的内容随着resourceBody被写入了ostream流对象中返回给客户端。
成功读取文件内容,我们请求的是/123.png,返回的是/log/test.jsp的内容。
(2)任意文件包含(代码执行)
AJP请求:
forwardrequest 2 "HTTP/1.1" "/123.jsp" 127.0.0.1 127.0.0.1 porto 8009 false "Cookie:AAAA=BBBB","Accept-Encoding:identity" "javax.servlet.include.request_uri:/","javax.servlet.include.path_info:log/test.txt","javax.servlet.include.servlet_path:/"
我们发送上面的AJP请求,因为/123.jsp将走JspServlet,关键请求参数如下:
RequestUri:/123.jsp
javax.servlet.include.request_uri: /
javax.servlet.include.path_info: log/test.txt
javax.servlet.include.servlet_path: /
Debug源码如下:
接着调用容器来处理
在HttpServlet中调用service()方法
跟进,接着来到了org.apache.jasper.servlet.JspServlet的service()方法中,jspUri为jsp文件的相对路径,之后jspUri被传入serviceJspFile()方法。
跟进serviceJspFile()方法,可以看到我们可以控制的jspUri被封装成了一个JspServletWrapper,并添加到了Jsp运行上下文JspRuntimeContext中,最后wrapper.service()会编译执行test.txt。这样导致了test.txt被当作jsp文件编译执行,代码执行漏洞产生。
成功执行恶意代码,我们访问的是/123.jsp,返回的是把/log/test.txt当作jsp文件执行后的内容。
test.txt的文件内容:
注意
需要注意的是RequestUri:/,此时会走JspServlet;而RequestUri:/123,此时会走DefaultServlet。
相关文章
- Apache配置PHP
- org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found.的问题解决办法
- 如何在 CentOS/RHEL 中为 Apache Tomcat 绑定 IPv4 地址
- org.apache.kafka.common.KafkaException: Socket server failed to bind to 114.115.20.100:9092: Cannot
- Apache与Tomcat负载均衡配置
- CVE-2020-9484: Apache Tomcat Session 反序列化代码执行漏洞通告
- Apache Tomcat任意文件上传漏洞(CVE-2017-12615)
- Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现 和处理
- Tomcat(二):tomcat配置文件server.xml详解和部署简介
- Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包
- Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口
- Apache Curator与Zookeeper版本兼容性异常:org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode =Unimplemented
- How LinkedIn customizes Apache Kafka for 7 trillion messages per day
- Apache Flink ML 2.2.0 发布公告
- Apache Flink Time & Window 深度解析
- 建议 Solr 用户更新 Apache POI
- Java修改服务器(tomcat)响应头 Server:Apache-Coyote/1.1
- Tomcat启动报错org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]”
- ubuntu 下 apache+tomcat整合_(mod-jk方法)[转]
- eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules
- Apache+php在windows下的安装和配置
- apache开源项目--Apache Drill
- apache开源项目--Apache POI
- Apache+tomcat+mod_jk+centos6.2负载均衡集群配置--转载
- Apache的order、allow、deny
- 解决SpringBoot文件上传报错:org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException