目录
5.会话Cookie中缺少secure/HttpOnly属性
前段时间收到了第三方发过来的网站安全评估报告,发现我所管理的很多项目有各种漏洞,总结下来如下,做个笔记以便后续自己写项目时注意避免和修正,也为后续有类似的问题有更快的解决,也给大家一种解决方案.
罗列 启用了不安全的HTTP方法,开启OPTIONS方法,错误页面Web应用服务器版本泄露,X-Frame-Options Header未配置,会话Cookie中缺少secure属性,会话Cookie中缺少HttpOnly属性,敏感目录,如何解决.
1.启用了不安全的HTTP方法
1)HTTP方法
HTTP目前有两个版本,HTTP1.0和HTTP1.1
HTTP1.0定义了三种请求方法:GET,POST,HEAD
HTTP1.1在1.0的基础上新增了五种请求方法:OPTIONS,PUT, DELETE,TRACE,CONNECT
WebDAV(也是一种协议)完全采用了HTTP1.1的方法,扩展了一些方法:例如Lock和Unlock(写文件锁定及解锁)等
2)解决方案
<!--方法1--如果是tomcat服务器启动的项目-->
tomcat服务器内的应用及(WEB-INF)下的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>
<!--方法2--如果是tomcat服务器启动的项目-->
直接修改tomcat的web.xml,插入代码同上.最终效果是一样的,不过是在外围tomca外围就处理了,对于webapps里面有多个项目来说,这样更简单.
<!--
补充说明:
<security-constraint>用于限制对资源的访问
<auth-constraint>用于限制那些角色可以访问资源,这里设置为空就是禁止所有角色用户访问
<url-pattern>指定需要验证的资源
<http-method>指定那些方法需要验证
-->
<!--方法3--如果是springboot项目,通过java -jar启动的,默认使用内嵌的tomcat-->
需要在Application.java这个启动类中加入代码,最终代码效果如下:
@EnableZuulProxy
//@EnableEurekaClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
//修改内嵌tomcat的请求类型限制
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {// 1
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
collection.addMethod("HEAD");
collection.addMethod("PUT");
collection.addMethod("DELETE");
collection.addMethod("OPTIONS");
collection.addMethod("TRACE");
collection.addMethod("COPY");
collection.addMethod("SEARCH");
collection.addMethod("PROPFIND");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
//如果需要禁用TRACE请求,需添加以下代码:
tomcat.addConnectorCustomizers(connector -> {
connector.setAllowTrace(true);
});
return tomcat;
}
}
2.开启OPTIONS方法
这个问题被包含在了上面的 启用了不安全的HTTP方法,通过上面的方式,解决了.
3.错误页面Web应用服务器版本泄露
<!-- 本次检出这个漏洞的均为nginx服务器,需要隐藏nginx版本信息 -->
第一步:在nginx的安装路径下找到配置文件nginx.conf,在http下加入"server_tokens off;"字段即可
http {
...
server_tokens off;
...
}
-------------------------------------------------------------------------------------
<!-- 第一步已经处理了问题.如果想进一步将 默认的错误页面定向到 指定页面,可以这么处理 -->
@第二步:
<!-- 如果使用的nginx服务器,在配置文件nginx.conf内的http下加入"proxy_intercept_errors on;"表示启用错误拦截
指定错误跳转文件,设置 error_page
-->
http {
...
proxy_intercept_errors on;
...
server {
...
error_page 404 /404.html
error_page 500 502 503 504 /50x.html
...
}
<!-- 如果未使用nginx服务器,使用tomcat启动的项目
在具体项目的WEB-INF下的web.xml或者直接tomcat下的conf/server.xml中加入如下代码
-->
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
4.X-Frame-Options Header未配置
<!-- 方法1:如果服务器中有nginx -->
在nginx的安装路径下找到配置文件nginx.conf,在http下加入"add_header X-Frame-Options SAMEORIGIN;"字段即可
http {
...
add_header X-Frame-Options SAMEORIGIN;
...
}
<!-- 方法2:如果服务器中没有nginx,且为非springboot项目 -->
需要在代码层面,定义过滤器Filter或者拦截器Servlet进行处理.
<!-- 自定义的Filter中 -->
public class XFOFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//在response设置header
if(resp.getHeader("X-Frame-Options")==null){
resp.addHeader("X-Frame-Options","SAMEORIGIN");
}
filterChain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
<!-- 将Filter载入项目中 -->
<!-- 如果项目有WEB-INF的web.xml文件 -->
<filter>
<filter-name>XFOFilter</filter-name>
<filter-class>项目自定义的Filter package.XFOFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XFOFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 如果无web.xml文件,为springboot项目,则通过java代码加载配置 -->
在Filter.java上加入注解@WebFilter
在Application.java上加入注解@ServletComponentScan
5.会话Cookie中缺少secure/HttpOnly属性
<!--编写Filter-->
public class CookieSecureAndHttpOnlyFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 解决检测到会话 cookie 中缺少 Secure/HttpOnly 属性
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
Cookie[] cookies = req.getCookies();
/*if(cookies!=null){
for(Cookie cookie : cookies) {
cookie.setHttpOnly(true);
cookie.setSecure(true);
}*/
if (cookies != null) {
for (Cookie cookie : cookies) {
String value = cookie.getValue();
StringBuilder builder = new StringBuilder();
builder.append("JSESSIONID=" + value + "; ");
builder.append("Secure; ");
builder.append("HttpOnly; ");
resp.setHeader("Set-Cookie", builder.toString());
}
}
filterChain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
<!-- 将Filter载入项目中 -->
<!-- 如果项目中有web.xml,则将Filter设置到WEB-INF下的web.xml设置下 -->
<filter>
<filter-name>CookieSecureAndHttpOnlyFilter</filter-name>
<filter-class>项目自定义的Filter package.CookieSecureAndHttpOnlyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CookieSecureAndHttpOnlyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 如果项目中没有web.xml,则采用java代码配置的方式 -->
在Filter上加入注解@WebFilter
在Application上加入注解@ServletComponentScan
6.敏感目录
<!--一般为第三方服务器工具,例如tomcat的默认文件,识别为敏感路径,容易暴露出服务器的一些信息,导致黑客攻击-->
将对应的敏感路径删除 或 改名即可
建议改名,万一删除目录后导致项目异常,可以再改回来.