渗透测试发现 WebDAV 的远程代码执行漏洞,主要是服务器未禁止除 get 和 post 以外的 HTTP 方法,如 PUT 、DELETE、OPTIONS 方法等。 如下所示:
对于 Tomcat 8 服务器,解决方法是在项目的web.xml中添加安全访问策略。为方便拷贝,代码如下:
<!-- 禁用非安全方法 加上auth-constraint验证 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>NoAccess</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/>
</security-constraint>
<!-- GET/POST 不需auth-constraint 此段可去掉 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>AllowedMethods</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
- security-constraint 限制对指定资源的访问。
- web-resource-collection 指定资源集合,可定义 URL 或 HTTP 方法,若不指定HTTP方法则应用于所有HTTP方法。
- web-resource-name 资源名称,随意取。
- http-method 指定一个HTTP方法。
- auth-constraint 指定可以访问该资源集合的用户角色,若未指定则所有角色都不可访问。
- role-name 指定角色名称。
- user-data-constraint 配置如何保护在客户端和Web容器之间传递的数据。
- transport-guarantee 需指定以下三个之一:
NONE,不需要传输保证。
INTEGRAL,服务器和客户端之间的数据必须以某种方式发送,而且在传送中不能改变。
CONFIDENTIAL,传输的数据必须是加密的数据。
一般安全套接字层(SSL)用于INTEGRAL或CONFIDENTIAL。 - login-config 指定验证方法、领域名和表单验证机制所需的特性。
BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令。
DIGEST(摘要验证):通过HTTP验证,需要提供摘要编码字符串的用户口令。
FORM(表单验证):在网页的表单上要求提供密码。
CLIENT-CERT(客户端证书验证):以客户端证书来确认用户的身份。
通过security-constraint和login-config配合实现禁用。配置在应用的web.xml中只针对该应用,配置在tomcat下的web.xml应用于所有应用。
tip:在server.xml中,还需要把Connector 的allowTrace属性设为"true" ,来允许支持trace方法再通过上面配置才能关闭 trace 方法,allowTrace的默认值是 false。
扩展:HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
- GET 请求指定的页面信息,并返回实体主体。
- HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。