项目安全扫描,报告:
启用了不安全的HTTP 方法
安全风险:
可能会在Web 服务器上上载、修改或删除Web 页面、脚本和文件。
可能原因:
Web 服务器或应用程序服务器是以不安全的方式配置的。
修订建议:
如果服务器不需要支持WebDAV,请务必禁用它,或禁止不必要的HTTP 方法。
WebDAV (Web-based Distributed Authoring and Versioning)是基于 HTTP 1.1 的一个通信协议。它为 HTTP 1.1 添加了一些扩展(就是在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法),使得应用程序可以直接将文件写到 Web Server 上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还可以支持对文件所做的版本控制。这个协议的出现极大地增加了 Web 作为一种创作媒体对于我们的价值。基于 WebDAV 可以实现一个功能强大的内容管理系统或者配置管理系统。
方法简介:
除标准的GET和POST方法外,HTTP请求还使用其他各种方法。许多这类方法主要用于完成不常见与特殊的任务。如果低权限用户可以访问这些方法,他们就能够以此向应用程序实施有效攻击。以下是一些值得注意的方法:
PUT 向指定的目录上载文件
DELETE 删除指定的资源
COPY 将指定的资源复制到Destination消息头指定的位置
MOVE 将指定的资源移动到Destination消息头指定的位置
SEARCH 在一个目录路径中搜索资源
PROPFIND 获取与指定资源有关的信息,如作者、大小与内容类型
TRACE 在响应中返回服务器收到的原始请求
其中几个方法属于HTTP协议的WebDAV(Web-based Distributed Authoring and Versioning)扩展。
渗透测试步骤:
使用OPTIONS方法列出服务器使用的HTTP方法。注意,不同目录中激活的方法可能各不相同。
许多时候,被告知一些方法有效,但实际上它们并不能使用。有时,即使OPTIONS请求返回的响应中没有列出某个方法,但该方法仍然可用。
手动测试每一个方法,确认其是否可用。
使用curl测试:
curl -v -X OPTIONS http://www.example.com/test/
查看响应的 Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
curl -v -T test.html http://www.example.com/test/test.html
看是否能上载来判断攻击是否生效。
找一个存在的页面,如test2.html
curl -X DELETE http://www.example.com/test/test2.html
如果删除成功,则攻击有效。
解决方案:
如tomcat,配置web.xml
<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>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
重启tomcat即可完成。
以上的代码添加到某一个应用中,也可以添加到tomcat的web.xml中,区别是添加到某一个应用只对某一个应用有效,如果添加到tomcat的web.xml中,则对tomcat下所有的应用有效。
配置web.xml来限制对某些servlet的请求
有时我们只希望通过认证的用户才能请求某些servlet的话,就可以在web.xml中来进行相应的配置,来达到此目的。
这就要用到<security-constraint></security-constraint>元素。
对于tomcat,中web.xml使用security-constraint元素需要在位于<Tomcat-installation-directory>/conf/tomcat-users.xml的XML文件中创建用户名和密码。比如下面的这个tomcat-users.xml文件:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,manager"/>
<user username="admin" password="admin" roles="admin"/>
</tomcat-users>
此XML片段包括一个tomcat-users根元素,它包含一个或多个role和user元素。
然后在Web应用程序的web.xml中创建security-constraint、login-config和security-role元素。
<security-constraint>
<web-resource-collection>
<web-resource-name>HelloServlet</web-resource-name>
<url-pattern>/HelloServlet</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>This applies only to the "tomcat" security role</description>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
其中security-constraint元素包含一个或多个web-resource-collection元素,它是描述Web应用程序中的哪些web资源受到指定安全限制的保护。http-method元素指定安全限制覆盖的HTTP方法。上面的例子中,当我们对/HelloServlet的GET或POST请求时将触发配置的安全机制。
auth-constraint元素用于描述允许访问Web组件的安全角色。此例中安全角色的例子有tomcat、manager、admin。而只有当作为admin角色的用户才可以访问HelloServlet。
Web应用程序通过login-config元素来认证用户,并确认该用户是否为正确的角色。
longin-config包含的transport-guarantee子元素用来指定认证方法,BASIC是一种常见的Web认证方式,浏览器给用户提示一个对话框,要求输入用户名和密码,随后Tomcat将给出的用户名和密码与tomcat-users.xml中的用户名和密码进行比较,然后使用前面的security-constraint配置来确定用户是否可访问受保护的servlet。
(除BASIC外,还可以是FORM、CLIENT-CERT、DIGEST等)
其实这种认证方法实际上有两个步骤:
1、检查提供的用户名和密码是否正确。
2、判断用户是否映射到特定的安全角色。例如,用户可能提供了正确的用户名和密码,但没有映射到特定的安全角色,也将被禁止访问特定的Web资源。
分享到:
相关推荐
例如,代码中的命名不得以下划线或美元符号开始或结束,避免使用拼音和英文混合的方式,以及直接使用中文命名,强调了类名使用大驼峰命名法(UpperCamelCase),而方法名、参数名、成员变量和局部变量使用小驼峰命名...
综合以上内容,可以看出《Java开发手册》是一份详尽的Java开发规范指南,它不仅仅关注代码编写的技术细节,还着重于软件开发的整体流程和质量,旨在提升软件开发的规范性、安全性和协作效率。对于Java开发者而言,...
例如,命名禁止以下划线或美元符号开始和结束,不使用拼音与英文混合或直接使用中文的方式,类名使用大驼峰命名法,方法名、参数名、成员变量、局部变量使用小驼峰命名法,常量全部大写且用下划线分隔。 常量定义:...
常量只定义一次,不再赋值,所以不需要命名规范(C)。不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护(D)。 6. 线程安全 SimpleDateFormat 是线程不安全的类(A)。一般不要定义 ...
书籍的版权信息、出版和版权声明清晰地表明了出版方、作者和版权信息,读者需要注意版权法规定的复制和传播的法律限制,以及合理使用法律规定的例外情况。出版社强调,未经出版社事先书面许可或通过版权 Clearance ...
- 禁止使用拼音与英文混合命名,更不应直接使用中文。 - 类名使用UpperCamelCase风格,遵循驼峰命名法。 - 方法名、参数名、成员变量、局部变量采用lowerCamelCase风格。 - 常量全大写,单词间用下划线连接。 ...
类名需要遵循大驼峰命名法,即首字母大写并连写,而方法名、参数名、成员变量等则使用小驼峰命名法,即首字母小写,后续单词首字母大写。常量的命名则需要全部使用大写字母,并且单词之间用下划线隔开。除此之外,还...
### Java编码规范详解 #### 1. 源文件规范 **1.1 文件名** - **规则**:源文件名必须与它所包含的顶级类名完全一致,包括大小写,并且文件扩展名为`.java`。 - **目的**:确保文件名与类名的一致性,便于开发人员...
- **Finalizers**: 禁止使用finalizer,因为它们可能导致不可预测的行为和性能问题。 - **Javadoc**: - 提供统一的格式和规范。 - 在适当的地方使用Javadoc来描述类、方法和参数的作用。 - 对于显而易见的方法,...
用,变量和方法可以通过设定一定的访问权限(见下面的例子)来允许或禁止其它对象对它的 访问。 我们先定义一个类 Point。 例子: class Point{ int x,y; String name = "a point"; Point(){ x = 0; y = 0; } Point( ...
具体到命名风格,该手册规定代码中的命名不能以下划线或美元符号开始或结束,禁止使用拼音与英文混合的方式,以及中文命名。类名要求使用大驼峰式命名法(UpperCamelCase),而方法名、参数名、成员变量、局部变量则...
Java反编译是将已经编译过的Java字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解已有的二进制代码、逆向工程、调试或学习第三方库的工作原理非常有用。XJad是这样一个工具,它专用于Java反编译,...
- 禁止使用通配符(如`import java.util.*;`)。 - 每个import语句单独一行,不受列限制约束。 - 进行分类,首先是静态import,然后是com.google imports(如果适用),接着是第三方库,按顶级包字母顺序分组。 ...