今天尝试了下Tomcat之前的关于不安全HTTP方法漏洞的实践方法,确实可以通过PUT、DELETE完成文件的上传和删除操作(但是这个必须得保证tomcat中readonly属性必须设置为false,才能执行),因此在这进行了记录,并补充了补救的措施,具体的实践步骤和解决方案如下
基础知识
- HTTP请求方法 HTTP1.0定义了三种请求方法: GET、POST、HEAD HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定页面信息,返回实体主体 |
2 | HEAD | 类似于GET,只是返回的信息中没有具体的内容,用户获取头部报文 |
3 | POST | 向指定资源提交数据处理请求(表单提交或者上传文件)。数据包含在请求体中。POST请求会导致新的资源的建立或者原有资源的修改 |
4 | PUT | 从客户端向服务端传送的数据取代指定的文档内容 |
5 | DELETE | 请求服务器删除指定的资源 |
6 | CONNECT | 预留给能够将连接改为管道方式的代理服务器 |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求,主要用于测试和诊断 |
确认自己的漏洞入口是否开启
使用curl执行命令curl -v -X OPTIONS your-website-url -I
,如果输出结果中显示Allow中包含PUT、DELETE等,说明就存在漏洞
漏洞的应用
- DELETE:能够删除服务器上面的文件信息,造成恶意攻击
- PUT:通过PUT方法可以上传文件替换对应的服务器文件或者挂马文件,实现服务的攻击
- OPTIONS:将会暴露服务器中间件的相关信息
漏洞测试实践
- 准备材料:
- 下载Tomcat7.0.xx,安装curl7.64.0
- 修改Tomcat配置文件信息
- 打开
TOMCAT_HOME/conf/web.xml
文件,在org.apache.catalina.servlets.DefaultServlet
下添加readonly属性,添加完的效果如下所示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<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>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 漏洞实践
- 通过PUT和DELETE上传和删除文件
修复方案
- 关闭除GET和POST之外的其他请求协议 在项目为web.xml中,或者
TOMCAT_HOME\conf\web.xml
中添加如下代码,这里需要解释下:项目的XML文件,只能修复本项目的漏洞,tomcat的配置文件web.xml能够修复该Tomcat所有项目对应的漏洞1
2
3
4
5
6
7
8
9
10
11
12<security-constraint>
<web-resource-collection>
<web-resource-name>fortune</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint></auth-constraint>
</security-constraint> web.xml
中修改或添加readonly属性的值为true1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<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>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>