1.删除webapps里面自带文件(关闭manage页面等)
删除webapps目录中的docs、examples、host-manager、manager等正式环境用不着的目录,这一步就可以解决大部分漏洞。有的网站没删除manager页面,并且管理员弱口令,导致直接Getshell
项目安全检查时,tomcat的管理界面老是作为安全漏洞出现,想解决这个问题也很简单。
刚打开tomcat 8080界面,后面不加后缀的话,默认访问的是tomcat管理页面
想要去掉默认该界面,重命名tomcat目录下的ROOT,并新建空文件夹命名为ROOT就可以了
删除webapps目录下的自带项目
2.禁止显示目录和文件列表
打开 tomcat的安装目录/conf/web.xml 文件,找到如下代码
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
显示文件列表
<param-value>true</param-value>
中,如果值为true
,则显示
不显示文件列表
<param-value>true</param-value>
中,如果值为false
,则不显示文件列表
上面相同的路径,再次访问结果如下
3.禁止显示异常调试信息(高危)
在各个常用的web站点中,经常会发现这样一个功能:当一个页面出错后,会自动跳转到一个页面上进行错误信息的提示。
描述
当请求处理期间发生运行时错误时,Apache Tomcat 将向请求者显示调试信息。建议不要向请求者提供此类调试信息。
加固建议
在 Tomcat 根目录下的 conf/web.xml 文件里面的 web-app 添加子节点:java.lang.Throwable/error.jsp,在 webapps 目录下创建 error.jsp,定义自定义错误信息
操作时建议做好记录或备份
conf/web.xml修改如下
如下代码中,我们将报错、服务器500以及404都跳转到了 error.jsp文件
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp </location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp </location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.jsp </location>
</error-page>
建议
<error-page>
<exception-type>java.lang.Exception </exception-type>
<location>/error.jsp </location>
</error-page>
更改为
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp </location>
</error-page>
关于 java.lang.Exception与java.lang.Throwable的区别
上图来自:https://blog.csdn.net/qq_43661841/article/details/103758527
下面的知识点内容转自:https://blog.csdn.net/weixin_38750084/article/details/88746931
-
Throwable是java.lang包中一个专门用来处理异常的类。它有两个子类,即Error 和Exception,它们分别用来处理两组异常。
-
Error用来处理程序运行环境方面的异常,比如,虚拟机错误、装载错误和连接错误,这类异常主要是和硬件有关的,而不是由程序本身抛出的。
-
Exception是Throwable的一个主要子类。Exception下面还有子类,其中一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。
-
Exception 子类下面的另一部分子类对应于Java程序中的非运行时异常的处理(在下图中将它们直接属于Exception了),这些异常也称为显式异常。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。
一些主要子类对应的异常处理功能简要说明如下:-
ArithmeticException——由于除数为0引起的异常;
-
ArrayStoreException——由于数组存储空间不够引起的异常;
-
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;
-
IllegalMonitorStateException——监控器状态出错引起的异常;
-
NegativeArraySizeException—一数组长度是负数,则产生异常;
-
NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常;
-
OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常;
-
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常;
-
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;
-
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
-
ClassNotFoundException——未找到指定名字的类或接口引起异常;
-
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;
-
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述;
-
NoSuchMethodException一所调用的方法未找到,引起异常;
-
Illega1AccessExcePtion—一试图访问一个非public方法;
-
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;
-
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;
-
NumberFormatException——字符的UTF代码数据格式有错引起异常;
-
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;
-
FileNotFoundException——未找到指定文件引起异常;
-
EOFException——未完成输入操作即遇文件结束引起异常。
-
Error类和Exception类的父类都是throwable类,他们的区别是:
-
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
-
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
-
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
-
错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,“Error” 和 "Exception"之间有啥区别?我觉得挺有意思,但是似乎又不能脱口而出。查找了一番资料之后,稍微总结了一下。 1) error都是继承自父类java.lang.Error,而exception都继承自java.lang.Exception.
error.jsp 文件内容如下
<%@ page language="java"
contentType="text/html;charset=UTF-8"
session="true"
isErrorPage="true"
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>error</title>
</head>
<body>
<h1>程序出现错误,请联系管理员处理!</h1>
</body>
</html>
我们再访问一个不存在的项目的时候,就不报404,而是跳转到错误处理页了。
4. tomcat禁用不安全的HTTP方法
修改应用中的web.xml就只针对本应用起作用,修改tomcat中的web.xml就可以对启动在该tomcat下所有的应用起作用。
在应用的web.xml
或者tomcat自己的web.xml
中添加以下配置:
<!-- 禁用不安全的http方法 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>DENY METHOD</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>DELETE</http-method>
<http-method>PATCH</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint></auth-constraint>
</security-constraint>
- url-pattern 参数定义了你要禁用的链接,默认是/*
- http-method参数包含了你要禁用的HTTP方法
此处也可以按如下所示进行更改
<security-constraint>
<web-resource-collection><!-- 白名单配置-->
<url-pattern>/*</url-pattern>
<http-method-omission>GET</http-method-omission>
<http-method-omission>POST</http-method-omission>
</web-resource-collection>
<auth-constraint />
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
- http-method-omission:参数包含了你允许的HTTP方法
== 先启用了, 我们才能禁用它, 否则禁用会失效 ==
另外需要修改下server.xml,即允许TRACE访问:
<Connector port="8080" protocol="HTTP/1.1" allowTrace="true" connectionTimeout="20000"
redirectPort="8443" />
allowTrace="true"
代表开启 TRACE方法
http方法的补充说明
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 向指定资源位置上传其最新内容。
DELETE 请求服务器删除Request-URI所标识的资源。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
HTTP的访问中,一般常用的两个方法是:GET和POST。其实主要是针对DELETE等方法的禁用。
注意:如果不起效果
-
我们并不需要修改web-app协议(这个我的是不需要的,如果你tomcat有问题,可以试试)
-
有的时候我们配置了会不生效,这时候你需要找下,你的web项目是不是自定义了403页面,我们不生效的原因就是这个!我们需要做的就是注释掉它(有的时候我们是为了屏蔽tomcat版本,但是没办法,屏蔽了就是不生效),这样就生效了!!
<!--
<error-page>
<error-code>403</error-code>
<location>/authorizationFailure.html</location>
</error-page>
-->
5.禁用8005端口
telnet localhost 8005 然后输入 SHUTDOWN 就可以关闭 Tomcat,为了安全我们要禁用该功能
tomcat监听的关闭端口,就是说这个端口负责监听关闭tomcat的请求。
当执行shutdown.sh关闭tomcat就是链接8005端口执行SHUTDOWN命令;由此,我们直接用telnet向8005端口执行SHUTDOWN来关闭tomcat,这也是比较正统的关闭方式,如果这个端口没被监听,那么sh脚本就是无效的。
<Server port="-1" shutdown="SHUTDOWN">
注意:更改以后 shutdown.bat 命令失效
补充:Tomcat8005、8009、8080三个端口的含义是什么?
Tomcat8005、8009、8080三个端口的含义是什么?
在Tomcat Web服务器中,8005、8009和8080这三个端口分别代表以下含义:
-
8005:该端口用于处理Tomcat Web服务器的SHUTDOWN命令。当Tomcat服务器需要关闭时,可以通过向该端口发送SHUTDOWN命令来关闭服务器。默认情况下,此端口只能在本地访问,因此只有在与Tomcat服务器在同一台机器上时,才能使用SHUTDOWN命令来关闭Tomcat服务器。
-
8009:该端口通常用于将Tomcat服务器与Apache HTTP服务器进行连接。如果您希望使用Apache服务器来处理动态请求,可以使用该端口将Tomcat服务器与Apache服务器集成。默认情况下,此端口只能在本地访问。
-
8080:该端口是Tomcat服务器默认的HTTP连接端口。当用户通过Web浏览器访问Tomcat服务器时,将使用此端口作为默认的HTTP连接端口。您可以在Tomcat服务器配置文件中更改此端口号。
需要注意的是,8005、8009和8080这三个端口都可以在Tomcat服务器配置文件中进行修改,以便满足特定的需求。
该知识转自:https://blog.csdn.net/Small_Casee/article/details/130745372
6.更改tomcat服务器默认端口
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8"
redirectPort="8443" />
默认port="8080"
改为port="3728"
7.开启日志记录 | 安全审计(Tomcat 8.5.68自动配置)
描述
Tomcat需要保存输出日志,以便于排除错误和发生安全事件时,进行分析和定位
加固建议
1、修改Tomcat根目录下的conf/server.xml文件。
2、取消Host节点下Valve节点的注释(如没有则添加)。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
3、重新启动Tomcat
操作时建议做好记录或备份
8.禁止自动部署 | 服务配置
先部署,然后停止,修改配置,再重启
描述
配置自动部署,容易被部署恶意或未经测试的应用程序,应将其禁用
加固建议
修改Tomcat 根目录下的配置文件conf/server.xml,将host节点的autoDeploy属性设置为“false”,如果host的deployOnStartup属性(如没有deployOnStartup配置可以忽略)为“true”,则也将其更改为“false”
<Host name="localhost"
autoDeploy="false" deployOnStartup="false">
</Host>
操作时建议做好记录或备份
关于禁止自动部署的详细说明:https://blog.csdn.net/weixin_38094135/article/details/101242394
9. 避免为 tomcat 配置 manager-gui 弱口令 | 访问控制
此处与第1个一起看
描述
tomcat-manger 是 Tomcat 提供的 web 应用热部署功能,该功能具有较高权限,会直接控制 Tomcat 应用,应尽量避免使用此功能。如有特殊需求,请务必确保为该功能配置了强口令
加固建议
编辑 Tomcat 根目录下的配置文件 conf/tomcat-user.xml,修改 user 节点的 password 属性值为复杂密码, 密码应符合复杂性要求:
1、长度 8 位以上
2、包含以下四类字符中的三类字符:
英文大写字母 (A 到 Z)
英文小写字母 (a 到 z)
10 个基本数字 (0 到 9)
非字母字符 (例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱密码,如:abcd.1234 、admin@123 等
操作时建议做好记录或备份
拓展
此节内容来自:https://blog.csdn.net/weixin_45253622/article/details/114433601
Tomcat管理页面弱口令页面Getshell
Tomcat安装完成后,点击页面的 Manager App 处会弹出输入用户名和密码的认证框。
我们也可以直接访问:http://127.0.0.1:8080/manager/html
来访问该管理页面。
但是默认情况下,该页面只允许 tomcat 本机访问,其他主机访问时会显示403。
这时,只需要修改 webapps\manager\META-INF\context.xml
文件,注释下如下行即可。
此时,需要我们输入用户名和密码进行登录。我们可以尝试一下该页面常见的几个弱口令:
用户名:admin tomcat manager
密码:admin 123456 tomcat s3cret manager admin123
该页面的认证账户和密码存在于 Tomcat\conf\tomcat-users.xml
,如下:
10.限制服务器平台信息泄漏(高危)
限制服务器平台信息泄漏服务配置
描述
限制服务器平台信息泄漏会使攻击者更难确定哪些漏洞会影响服务器平台。
Tomcat报错页面泄漏Apache Tomcat/7.0.68相关版本号信息,是攻击者攻击的途径之一。因此实际当中建议去掉版本号信息。
加固建议
windows
1、进入到tomcat/lib目录下,用电脑自带解压软件打开catalina.jar 进入到\org\apache\catalina\util目录下
2、编辑ServerInfo.properties文件,编辑最后三行,去掉版本号等信息
3、改完后自动跳出提示,点击“是”自动更新catalina.jar重新打包。
此节内容来自:https://blog.csdn.net/qq_34823218/article/details/108228280
操作时建议做好记录或备份
linux
-
进入tomcat的lib目录找到catalina.jar文件
-
unzip catalina.jar之后会多出两个文件夹
- 进入org/apache/catalina/util 编辑配置文件ServerInfo.properties
- 修改为
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Nov 7 2016 20:05:27 UTC
- 将修改后的信息压缩回jar包
cd /tomcat/lib
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
- 重启tomcat