0%

不安全的HTTP方法

今天尝试了下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:将会暴露服务器中间件的相关信息

漏洞测试实践

  • 准备材料:
  1. 下载Tomcat7.0.xx,安装curl7.64.0
  • 修改Tomcat配置文件信息
  1. 打开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>
  • 漏洞实践
  1. 通过PUT和DELETE上传和删除文件

修复方案

  1. 关闭除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>
  2. web.xml中修改或添加readonly属性的值为true
    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>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>