• XSS攻击及预防


    跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script(php,js等)代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

    攻击实例

    下面为一个Input标签:

    <input type="text" value="value"></input>

    当用输入值为" onfocus="alert(document.cookie)  时,input标签内容变为 <input type="text" value=""onfocus="alert(document.cookie)"></input>

    当input中的可以执行的js脚本被存储到数据库中。用户再次取出显示时。就会取到用户的cookie。从而得到用户名和密码。

     (1)添加用户

     (2)数据库中存储可执行脚本

     (3)编辑用户(XSS攻击发生)

    攻击危害

      以上获取用户名和密码只是个简单的xss攻击,还有跟多的XSS攻击实例。例如将用户导航到其他网站,后台挂马操作等

    攻击预防

     原理主要采用过滤器对请求中的特殊字符进行编码转化。从而将可以执行的script代码变为不可以执行的script脚本存储到数据库中。

      示例:开发环境采用的SSH框架。所以采用过滤器,注意这里采用装饰者模式对请求request对象进行了包装。

                 注:由于使用了struts2.所以要自定义的装饰者对象继承StrutsRequestWrapper类。但是这样对于上传文件获得不到参数。因为上传文件请求类型为MultiPart

                 所以包装对象为原始的请求HttpServletRequestWrapper

                具体代码:

     1 public class XssFilter implements Filter {
     2     
     3     public void destroy() {
     4         
     5     }
     6     
     7     public void doFilter(ServletRequest servletRequest,  ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     8            XssStrutsRequestWrapper xssRequest = new XssStrutsRequestWrapper((HttpServletRequest) servletRequest);
     9            HttpServletResponse response = (HttpServletResponse)servletResponse;
    10            filterChain.doFilter(xssRequest, response);  
    11     }
    12     
    13     public void init(FilterConfig arg0) throws ServletException {
    14         
    15     }
    16     
    17 }

            

      1 public class XssStrutsRequestWrapper extends HttpServletRequestWrapper{
      2     private HttpServletRequest orgRequest;
      3     
      4     public XssStrutsRequestWrapper(HttpServletRequest request) {
      5         super(request);
      6         this.orgRequest = request;
      7     }
      8     /** 
      9     * 获取最原始的request 
     10     * @return 
     11     */  
     12     public HttpServletRequest getOrgRequest() {  
     13         return orgRequest;  
     14     }  
     15     /** 
     16     * 获取最原始的request的静态方法 
     17     * @return 
     18     */  
     19     public static HttpServletRequest getOrgRequest(HttpServletRequest req) {  
     20         if (req instanceof XssStrutsRequestWrapper) {  
     21             return ((XssStrutsRequestWrapper) req).getOrgRequest();  
     22         }  
     23         return req;  
     24     }  
     25     /** 
     26      * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/> 
     27      * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/> 
     28      * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖 
     29      */  
     30      @Override  
     31      public String getParameter(String name) {  
     32          String value = super.getParameter(xssEncode(name));  
     33          if (value != null) {  
     34              value = xssEncode(value);  
     35          }  
     36          return value;  
     37      }  
     38    
     39      /** 
     40      * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/> 
     41      * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> 
     42      * getHeaderNames 也可能需要覆盖 
     43      */  
     44      @Override  
     45      public String getHeader(String name) {  
     46          String value = super.getHeader(xssEncode(name));  
     47          if (value != null) {  
     48              value = xssEncode(value);  
     49          }  
     50          return value;  
     51      }  
     52     /**
     53      * 覆盖getParamterMap方法,
     54      */
     55     @Override
     56     @SuppressWarnings("unchecked")
     57     public Map<String, String[]> getParameterMap() {
     58         Map<String, String[]> paramMap = super.getParameterMap();
     59             Set<String> keySet = paramMap.keySet();
     60             for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
     61                 String key = (String) iterator.next();
     62                 String[] str = paramMap.get(key);
     63                 for(int i=0; i<str.length; i++) {
     64                    // 对参数值进行编码过滤
     65                    str[i] = xssEncode(str[i]);
     66                 }
     67             }
     68             return paramMap ;
     69      }
     70      public String xssEncode(String source){
     71          if (source == null) {
     72              return "";
     73          }
     74          String html = "";
     75          StringBuffer buffer = new StringBuffer();
     76          for (int i = 0; i < source.length(); i++) {
     77              char c = source.charAt(i);
     78              switch (c) {
     79                  case '<':
     80                      //buffer.append("&lt;");
     81                      buffer.append("<");
     82                      break;
     83                  case '>':
     84                      //buffer.append("&gt;");
     85                      buffer.append(">");
     86                      break;
     87                  case '&':
     88                      //buffer.append("&amp;");
     89                      buffer.append("&");
     90                      break;
     91                  case '"':
     92                      //buffer.append("&quot;");
     93                      buffer.append(""");
     94                      break;
     95                  default:
     96                      buffer.append(c);
     97                  }
     98          }
     99          html = buffer.toString();
    100          return html;
    101      }
    102     
    103 }

    这里编码实现主要是xssEncode(String source)方法。XssStrutsRequestWrapper必须重写getParameterMap()方法。并调用xssEncode(String source)编码。

    结果:

    数据中内容将英文的“变为全角" 。从而将可以执行的js脚本并未不可执行的脚本存储在数据库中。

  • 相关阅读:
    请实现一个js脚本,要求做到将数字转化为千分位表示如:1234567转化为1,234,567
    Linux mlocate安装
    Linux CentOS7网络简单配置
    Linux 常见命令 文件搜索命令
    Linux 常见命令 权限管理命令
    Linux 常见命令 链接命令
    Linux 常见命令 文件处理指令
    List与Set的contains方法效率问题
    集合介绍
    Arrays.asList()
  • 原文地址:https://www.cnblogs.com/mxmbk/p/5082821.html
Copyright © 2020-2023  润新知