嵌入式 Tomcat 的 Context.docBase 是不是存在安全问题?
Posted
技术标签:
【中文标题】嵌入式 Tomcat 的 Context.docBase 是不是存在安全问题?【英文标题】:Are there security concerns with embedded Tomcat's Context.docBase?嵌入式 Tomcat 的 Context.docBase 是否存在安全问题? 【发布时间】:2022-01-17 21:49:00 【问题描述】:创建org.apache.catalina.Context
时,需要指定“docBase”参数。 docBase 应该是一个现有目录。如果上下文不是现有的、可访问的目录,则上下文创建失败。
java 文档将此参数描述为“上下文的基本目录,用于静态文件。必须存在,相对于服务器主目录”。 Tomcat 对那个目录做了什么?它可能会从该位置提供文件吗?如果我不想提供静态文件,该参数的最安全值是多少?
例如,在我可以编写的最简单的嵌入式 Tomcat 服务器中,File(".").getAbsolutePath()
参数是否有可能被恶意客户端用于从当前目录中检索文件?
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
/**
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.56</version>
</dependency>
*/
public class OneServlet
public static void main(String[] args)
Tomcat tomcat = new Tomcat();
tomcat.setPort(9000);
tomcat.getConnector();
var context = tomcat.addContext("", new File(".").getAbsolutePath());
Tomcat.addServlet(context, "servlet", new HttpServlet()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
resp.getWriter().write("Hello world");
);
context.addServletMappingDecoded("/", "servlet");
try
tomcat.start();
tomcat.getServer().await();
catch (LifecycleException e)
e.printStackTrace();
【问题讨论】:
【参考方案1】:在传统部署中,docBase
指向您的 WAR 文件的根目录或带有扩展 WAR 文件的目录。它是解析 ServletContext#getResource
调用的基本 URL,也是 DefaultServlet
的根。
在您的情况下,使用new File(".").getAbsoluteFile()
确实允许攻击者检索所有文件,假设他们可以猜出他们的名称并且请求没有被您的一个 servlet 截获。它不会发生,因为您调用 Tomcat#addContext
而不是 Tomcat#addWebapp
,这会阻止 Tomcat 将默认的 web.xml
应用到您的应用程序(即没有 DefaultServlet
)。
但是,更安全的选择是将null
用作docBase
。在现代 Tomcat 上,这将导致创建一个空的内存资源集(参见source code)。
【讨论】:
以上是关于嵌入式 Tomcat 的 Context.docBase 是不是存在安全问题?的主要内容,如果未能解决你的问题,请参考以下文章
使用embeded tomcat进行嵌入式javaee开发-启动tomcat
Spring Boot嵌入式Tomcat能否访问定义的spring.tomcat.basedir的webapps文件夹