Apache Tomcat 默认示例目录不安全配置漏洞
- 1. 漏洞基础信息
- 2. 漏洞影响范围
- 3. 漏洞攻击手法
- 3.1 examples 目录操纵 Session
- 3.2 XSS 风险
- 3.3 CookieExample 信息泄露
- 4. 漏洞修复
- 4.1 在生产环境中,移除可能造成信息泄漏的目录(推荐)
- 4.2 通过配置禁止访问
1. 漏洞基础信息
- 组件简介: Apache Tomcat 是由 Apache 软件基金会开源的 Servlet 容器与 Web 服务器,是目前 Java Web 领域使用最广泛的中间件之一。Tomcat 在默认安装包中自带了 examples(示例应用)、docs(在线文档)、manager(应用管理后台)、host-manager(虚拟主机管理)等 Web 应用,方便开发者学习和运维使用
- 漏洞类型:不安全配置 / 信息泄露 / 越权访问(CWE-16、CWE-200、CWE-552)
- 漏洞危害等级:中危 ~ 高危(取决于业务系统是否依赖共享 Session)
- 漏洞本质: Tomcat 默认部署后,源码包 Web 根目录下包含 servlets-examples(示例 Servlet)与 tomcat-docs(在线文档)目录,可通过 /examples/ 与 /docs/ 路径在公网直接访问。examples 中包含的 Session、Cookie 操纵示例代码允许任意访问者通过 HTTP 参数读写服务端 Session 与 Cookie
2. 漏洞影响范围
受影响版本:默认安装且未清理示例目录的全版本 Tomcat(5.x ~ 10.x)
示例目录暴露的高危端点:
3. 漏洞攻击手法
3.1 examples 目录操纵 Session
在现实生产环境中,我们很难知道服务器后端的 Session 中是通过什么参数(Name)和值(Value)来判断用户登录状态的。所以就是我们根本很难利用该页面来进行任意用户伪造,只是说理论上是可行的
session样例(/examples/servlets/servlet/SessionExample)允许用户对session进行操纵。因为session可能是全局通用的,所以用户可能可以通过操纵session获取管理员权限
SessionExample代码实现本质上是:
StringdataName=request.getParameter("dataname");StringdataValue=request.getParameter("datavalue");if(dataName!=null&&dataValue!=null){session.setAttribute(dataName,dataValue);}只要访问 SessionExample 并传入dataname和datavalue,Tomcat 就会把它写入到 Session。
此时,如果另一个 Web 应用使用 Session 并依赖某个字段判定用户身份:
session.setAttribute("login","admin")则攻击者绕过登录校验。
3.2 XSS 风险
很多 Tomcat Examples 示例页面会存在XSS漏洞,需要进一步测试验证
GET /examples/servlets/servlet/RequestParamExample?firstname=<script>alert(document.cookie)</script>&lastname=test可借助 XSS 实现钓鱼跳板等攻击行为
3.3 CookieExample 信息泄露
路径:/examples/servlets/servlet/CookieExample
有时候会有意想不到的收获
4. 漏洞修复
4.1 在生产环境中,移除可能造成信息泄漏的目录(推荐)
1、找到Tomcat的安装目录,如 /usr/local/tomcat,以这个目录为例
2、进入 webapps 目录
3、删除以下目录和文件:
- ROOT/ - 此文件夹是 Tomcat 的默认根应用目录,如果存在测试页面,可能会泄露 Tomcat 版本、服务器信息,默认页包含 “Apache Tomcat” 标识
- 未部署自定义业务:ROOT 目录里只有 Tomcat 自带的测试页,此时删除整个 ROOT 目录无影响
- 已部署自定义业务:若已经将自己的业务服务部署到 ROOT 目录,ROOT 目录中包含业务代码 + Tomcat 默认测试页,此时仅需删除测试页文件,常见测试文件如下:
(1)index.jsp Tomcat 默认欢迎页(访问 http://ip:8080 看到的测试页)
(2)index.html 备用欢迎页(部分 Tomcat 版本自带)
(3)tomcat.png/tomcat.svg 测试页上的 Tomcat 图标
(4)tomcat.css 测试页的样式文件
(5)RELEASE-NOTES.txt Tomcat 版本更新记录(可能会泄露 Tomcat 版本信息)
(6)NOTICE/LICENSE Tomcat 版权 / 许可声明(可能会泄露版本相关信息)
- docs/ - Tomcat 文档,泄露 Tomcat 版本、配置说明(生产环境也应考虑移除)
- examples/ - 包含 JSP/Servlet/websocket 示例代码,攻击者可通过示例分析漏洞、构造攻击
- manager/ - 管理后台,若弱密码 / 未授权访问,可部署恶意应用、操控服务器
- host-manager/(如有)- 主机管理后台,风险同 manager 目录
4、重启Tomcat服务后,尝试访问以下URL,应返回 404(未找到) 状态码或 302 跳转到默认页面:
- http://your-server:port/examples/
- http://your-server:port/docs/
- http://your-server:port/manager/html/
- http://your-server:port(没有默认的 tomcat 测试页面)
4.2 通过配置禁止访问
如果由于某些原因无法删除文件,可以通过配置来禁止外部访问。
例如,使用Tomcat的 Context 配置:
在 conf/server.xml 或 conf/context.xml 中,为应用配置一个无法访问的规则
<?xml version="1.0" encoding="UTF-8"?><Context><!-- 禁止外部访问 examples 应用 --><ValveclassName="org.apache.catalina.valves.RemoteAddrValve"path="/examples"allow="127.0.0.1|::1"deny="*"denyStatus="403"/><!-- 禁止外部访问 docs 应用 --><ValveclassName="org.apache.catalina.valves.RemoteAddrValve"path="/docs"allow="127.0.0.1|::1"deny="*"denyStatus="403"/><!-- 禁止外部访问 manager/host-manager 应用 --><ValveclassName="org.apache.catalina.valves.RemoteAddrValve"path="/manager"allow="127.0.0.1|::1"deny="*"denyStatus="403"/><ValveclassName="org.apache.catalina.valves.RemoteAddrValve"path="/host-manager"allow="127.0.0.1|::1"deny="*"denyStatus="403"/><WatchedResource>WEB-INF/web.xml</WatchedResource><WatchedResource>${catalina.base}/conf/web.xml</WatchedResource></Context>只允许来自本机 (127.0.0.1) 的请求,其他所有外部IP的请求都会被拒绝