JavaWeb项目安全问题及其解决方案

1.弱口令漏洞

解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密,或者多种加密方式叠加组合。

2.未使用用户名及密码登录后台可直接输入后台URL登录系统。

解决方案:通过配置filter来过滤掉无效用户的连接请求。

3JSP页面抛出的异常可能暴露程序信息。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。

解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。

4.合法用户注销后,在未关闭浏览器的情况下,点击浏览器后退按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。

解决方案:配置filter对存放敏感信息的页面限制页面缓存。如:

httpResponse.setHeader(“Cache-Control”,“no-cache”); 

httpResponse.setHeader(“Cache-Control”,“no-store”);

httpResponse.setDateHeader(“Expires”0);

httpResponse.setHeader(“Pragma”,“no-cache”);

5.SQL注入漏洞。

解决方案:在数据库访问层中不要使用“+”来拼接SQL语句!如:

String sql= “SELECT * FROM USERS WHERE 1=1;if(null != user.getUserName() && !””.equals(user.getUserName())){

        sql += “ and UNAME = ‘”+user.getUserName()+”’”;}

而应使用PreparedStatement。如:

PreparedStatement pstmt = con.prepareStatement(“SELECT * FROM USERS WHERE UNAME=?”);

pstmt.setString(1, “Neeke”);

如果项目中使用了Hibernate框架,则推荐使用named parameter。如:

String queryString = “from Users where uname like :name”;

冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到name参数上:

List result = session.createQuery(queryString)

                  .setString(“name”, user.getUserName())

                  .list();

6.文件上传漏洞。前台仅使用JS对文件后缀做了过滤,这只能针对普通的用户,而恶意攻击者完全可以修改表单去掉JS校验。

解决方案:前台JS过滤加服务器端程序过滤。具体过滤掉哪些文件类型视具体情况而定。

7.可执行脚本漏洞。对用户提交的数据未转义,一些用户提交的含有JavaScript脚本的信息被直接输出到页面中从而被浏览器执行。

解决方案:使用org.apache.commons.lang.StringEscapeUtils对用户提交的数据进行转义。如:

@RequestMapping(params=“method=addTopic”,method=RequestMethod.POST)public ModelAndView addTopic(HttpServletRequest request, HttpServletResponse response, BbsTopic topic){

BaseAdmin user = (BaseAdmin) request.getSession().getAttribute(Constant.SESSION_USER);

topic.setBaseAdmin(user);

topic.setTopicDate(new Timestamp(System.currentTimeMillis()));

topic.setTopicContent(StringEscapeUtils.escapeHtml(topic.getTopicContent()));

topic.setTopicTitle(StringEscapeUtils.escapeHtml(topic.getTopicTitle()));this.bbsTopicService.save(topic);return new ModelAndView(new RedirectView(“bbs.do?method=topicList&bfid=”+ topic.getBfid()));}

8.Java WEB容器默认配置漏洞。如TOMCAT后台管理漏洞,默认用户名及密码登录后可直接上传war文件获取webshell

解决方案:最好删除,如需要使用它来管理维护,可更改其默认路径,口令及密码。

9、 日志,建议增加服务的访问日志,记录来访者的 IP ,传递参数,对后台操作用户建立日志,记录其操作内容。完善的日志记录可以帮助你发现潜在的危险,找到已经发生的问题。

——————————————————————————————————————————-

参数过滤

package com.founder.web.util.filter;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class XssFilter implements Filter {  

  

 private String[] characterParams = null;

 private boolean OK=true;

  

    /* (non-Javadoc) 

     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 

     */  

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException {  

          HttpServletRequest servletrequest = (HttpServletRequest) request;

         

        HttpServletResponse servletresponse = (HttpServletResponse) response; 

        servletrequest.setCharacterEncoding(“utf-8”);

        boolean status = false;  

        Enumeration  params = servletrequest.getParameterNames();

         String param=””;

         String paramValue = “”;

         servletresponse.setContentType(“text/html”);

         servletresponse.setCharacterEncoding(“utf-8”);

         String str=””; 

         while (params.hasMoreElements()) {

          param = (String) params.nextElement();

          String[] values = request.getParameterValues(param);

          paramValue = “”;

          if(OK){//过滤字符串为0个时 不对字符过滤

          for (int i = 0; i < values.length; i++){

          paramValue=paramValue+values[i];//比这样写好   paramValue = values[i];

          }

          //去除特殊字符

          //  paramValue=trimIllegalCharacter(paramValue);

          //转换成小写

          paramValue=paramValue.toLowerCase();

          //characterParams=new String[]{“expression”,”script”,”mouseover”,”mouseon”,”mouseout”,”click”,”dblclick”,”blur”,”focus”,”change”,”eval”};

          System.out.print(“paramValue=”+paramValue);

          characterParams=new String[]{“mouseo”,”click”,”blur”,”focus”,”change”,”eval”,”expression”,”alert(“};

          for(int i=0;i<characterParams.length;i++){

           if (paramValue.indexOf(characterParams[i]) >= 0) {

           str=characterParams[i];

            status = true;

            break; 

           }

          if(status)break;

          }

          String badStr =””;

          if(param.equals(“newstype”)){

       badStr= “‘|and|exec|<|>|&|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|” 

+”char|declare|sitename|net user|xp_cmdshell|like’|and|exec|execute|insert|create|drop|” +

“table|from|grant|use|group_concat|column_name|” +                            “information_schema.columns|table_schema|union|where|select|delete|update|count|*|” 

      

“chr|mid|master|truncate|char|declare|–|like|%|+|#”;

          }else{

       badStr= “‘|and|exec|<|>|&|execute|insert|select|delete|update|drop|*|%|chr|mid|master|truncate|” +          

“char|declare|sitename|net user|xp_cmdshell|like’|and|exec|execute|insert|create|drop|” +      

“table|from|grant|use|group_concat|column_name|” +

“information_schema.columns|table_schema|union|where|select|delete|update|count|*|” +              

                      “chr|mid|master|truncate|char|declare|–|like|%|#”;       

          }

             String[] badStrs = badStr.split(“\\|”);

                  for (int i = 0; i < badStrs.length; i++) {

                      if (paramValue.indexOf(badStrs[i]) >= 0) {

                        status = true;

                        str=badStrs[i];

            break; 

                      }

                      if(status)break;

                  }

          }

         }

         //包含这三个的额页面不过滤 登录相关

         boolean status_url = true;   

         StringBuffer url=  servletrequest.getRequestURL();

         String file[] = url.toString().split(“/”);    if(file[file.length-1].contains(“login”)||file[file.length-1].contains(“setcookie”)||file[file.length-1].contains(“redirect”)||file[file.length-1].contains(“client”)){

        status_url=false;

        }

         //购买流程相关不过滤

         if(file[file.length-1].contains(“templateFlow”) ||

      file[file.length-1].contains(“return.jsp”) ||

      file[file.length-1].contains(“cashiergw”) ||

      file[file.length-1].contains(“cashierReturnMiddlePage”) ){

         status_url=false;

         }

         if (status&&status_url){

         System.out.println(“请求路径==”+ servletrequest.getRequestURL());

         PrintWriter out = servletresponse.getWriter();

         

         String outstr=”<script language=’javascript’>alert(‘对不起!您输入内容含有非法字符:\\”+str+”‘);window.history.go(-1);</script>”;

         out.print(outstr);

        }else{

       filterChain.doFilter(request, response);      

         }  

    }

@Override

public void destroy() {

@Override

public void init(FilterConfig arg0) throws ServletException {

}    

2cookies 安全设置

HttpOnly 主要是为了限制web页面程序的浏览器端script程序读取cookie

在web.xml 中配置

<session-config>

<cookie-config>

  <http-only>true</http-only>

</cookie-config>

    <session-timeout>1200</session-timeout>

  </session-config>

 

在tomcat 中的server.xml 中配置

<Context path=”” docBase=””  useHttpOnly=”true” />

 

3、http方法  访问方式设置

 WebDAV (Web-based Distributed Authoring and Versioning)是基于 HTTP 1.1 的一个通信协议。它为 HTTP 1.1 添加了一些扩展(就是在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法)

,使得应用程序可以直接将文件写到 Web Server 上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还可以支持对文件所做的版本控制。这个协议的出现极大地增加了 Web 作为一种创作媒体对于我们的价值。基于 WebDAV 可以实现一个功能强大的内容管理系统或者配置管理系统。 

    现在主流的WEB服务器一般都支持WebDAV,使用WebDAV的方便性,呵呵,就不用多说了吧,用过VS.NET开发ASP.NET应用的朋友就应该 知道,新建/修改WEB项目,其实就是通过WebDAV+FrontPage扩展做到的,下面我就较详细的介绍一下,WebDAV在tomcat中的配 置。   

如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等协议访问应用程序应用程序呢? 解决方法 

第一步:修改应用程序的web.xml文件的协议

 <?xml version=”1.0″ encoding=”UTF-8″?>  

    <web-app xmlns=”http://java.sun.com/xml/ns/j2ee”   

    xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”   

    xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”       

    version=”2.4″>   

第二步:在应用程序的web.xml中添加如下的代码即可  

 <security-constraint>      

<web-resource-collection>    

     <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>MOVE</http-method>

<http-method>COPY</http-method> 

<http-method>PROPFIND</http-method> 

<http-method>SEARCH</http-method> 

<http-method>MKCOL</http-method>    

<http-method>LOCK</http-method> 

<http-method>UNLOCK</http-method> 

<http-method>PROPPATCH</http-method>  

 </web-resource-collection>  

  <auth-constraint>   </auth-constraint> 

   </security-constraint>  

  <login-config>   

   <auth-method>BASIC</auth-method> 

  </login-config>

 

 

1.弱口令漏洞

解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密,或者多种加密方式叠加组合。

2.未使用用户名及密码登录后台可直接输入后台URL登录系统。

解决方案:通过配置filter来过滤掉无效用户的连接请求。

3JSP页面抛出的异常可能暴露程序信息。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。

解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。

4.合法用户注销后,在未关闭浏览器的情况下,点击浏览器后退按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。

解决方案:配置filter对存放敏感信息的页面限制页面缓存。如:

httpResponse.setHeader(“Cache-Control”,“no-cache”); 

httpResponse.setHeader(“Cache-Control”,“no-store”);

httpResponse.setDateHeader(“Expires”0);

httpResponse.setHeader(“Pragma”,“no-cache”);

5.SQL注入漏洞。

解决方案:在数据库访问层中不要使用“+”来拼接SQL语句!如:

String sql= “SELECT * FROM USERS WHERE 1=1;if(null != user.getUserName() && !””.equals(user.getUserName())){

        sql += “ and UNAME = ‘”+user.getUserName()+”’”;}

而应使用PreparedStatement。如:

PreparedStatement pstmt = con.prepareStatement(“SELECT * FROM USERS WHERE UNAME=?”);

pstmt.setString(1, “Neeke”);

如果项目中使用了Hibernate框架,则推荐使用named parameter。如:

String queryString = “from Users where uname like :name”;

冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到name参数上:

List result = session.createQuery(queryString)

                  .setString(“name”, user.getUserName())

                  .list();

6.文件上传漏洞。前台仅使用JS对文件后缀做了过滤,这只能针对普通的用户,而恶意攻击者完全可以修改表单去掉JS校验。

解决方案:前台JS过滤加服务器端程序过滤。具体过滤掉哪些文件类型视具体情况而定。

7.可执行脚本漏洞。对用户提交的数据未转义,一些用户提交的含有JavaScript脚本的信息被直接输出到页面中从而被浏览器执行。

解决方案:使用org.apache.commons.lang.StringEscapeUtils对用户提交的数据进行转义。如:

@RequestMapping(params=“method=addTopic”,method=RequestMethod.POST)public ModelAndView addTopic(HttpServletRequest request, HttpServletResponse response, BbsTopic topic){

BaseAdmin user = (BaseAdmin) request.getSession().getAttribute(Constant.SESSION_USER);

topic.setBaseAdmin(user);

topic.setTopicDate(new Timestamp(System.currentTimeMillis()));

topic.setTopicContent(StringEscapeUtils.escapeHtml(topic.getTopicContent()));

topic.setTopicTitle(StringEscapeUtils.escapeHtml(topic.getTopicTitle()));this.bbsTopicService.save(topic);return new ModelAndView(new RedirectView(“bbs.do?method=topicList&bfid=”+ topic.getBfid()));}

8.Java WEB容器默认配置漏洞。如TOMCAT后台管理漏洞,默认用户名及密码登录后可直接上传war文件获取webshell

解决方案:最好删除,如需要使用它来管理维护,可更改其默认路径,口令及密码。

9、 日志,建议增加服务的访问日志,记录来访者的 IP ,传递参数,对后台操作用户建立日志,记录其操作内容。完善的日志记录可以帮助你发现潜在的危险,找到已经发生的问题。

 

原文链接:https://www.cnblogs.com/lhhitnote/p/5531567.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17763

(0)
上一篇 2022年11月21日
下一篇 2022年11月22日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml