用户
搜索
  • TA的每日心情
    慵懒
    5 天前
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    四川高校信息安全在读

    Rank: 7Rank: 7Rank: 7

    9

    主题

    153

    帖子

    567

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2015-11-20

    i春秋签约作者春秋文阁

    枕边月亮 i春秋作家 四川高校信息安全在读 i春秋签约作者 春秋文阁 楼主
    发表于 2018-2-2 14:35:45 65158
    本帖最后由 枕边月亮 于 2018-2-2 14:48 编辑

    由于按照自己的理解来描述,文章可能有些地方描述不够准确,还望指正。

    一、XSSfilter


          一般在JavaWeb中,对于XSS攻击的防范主要是采用XSSfilter来进行过滤。实现过程就是在web.xml加一个filter,实现方式是实现servlet的Filter接口。XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码也就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击
    关键代码如下:


    [Java] 纯文本查看 复制代码
        public static String stripXSSAndSql(String value) {  
            if (value != null) {  
                // NOTE: It's highly recommended to use the ESAPI library and  
                // uncomment the following line to  
                // avoid encoded attacks.  
                // value = ESAPI.encoder().canonicalize(value);  
                // Avoid null characters  
    /**         value = value.replaceAll("", "");***/  
                // Avoid anything between script tags  
                Pattern scriptPattern = Pattern.compile("<[\r\n| | ]*script[\r\n| | ]*>(.*?)</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid anything in a src="http://www.xxx.com/article/java/..." type of e-xpression  
                scriptPattern = Pattern.compile("src[\r\n| | ]*=[\r\n| | ]*[\\\"|\\\'](.*?)[\\\"|\\\']", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Remove any lonesome </script> tag  
                scriptPattern = Pattern.compile("</[\r\n| | ]*script[\r\n| | ]*>", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Remove any lonesome <script ...> tag  
                scriptPattern = Pattern.compile("<[\r\n| | ]*script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid eval(...) expressions  
                scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid e-xpression(...) expressions  
                scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid javascript:... expressions  
                scriptPattern = Pattern.compile("javascript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid vbscript:... expressions  
                scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid onload= expressions  
                scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
            }  
            return value;  
        }  
      
    }  


    实现原理:通过过滤敏感的XSS函数来防止构成XSS攻击代码。
    其他方案:过滤”<” 、”>” 将用户输入放入引号间,基本实现数据与代码隔离。过滤双引号防止用户跨越许可的标记,添加自定义标记。过滤TAB和空格,防止关键字被拆分。过滤script关键字。过滤&#,防止HTML属性绕过检查。、

    二、登陆验证

    [color=rgba(0, 0, 0, 0.7)]前端通过JS函数来进行登陆验证,首先前端对账号和密码进行MD5加密一次,服务器端返回一个随机生成的盐,每次登陆返回的盐值是不相同的,最后是MD5+盐的密码组合再进行一次MD5。在服务器端的数据库中,存储了账号或者密码的MD5值,服务器端通过加盐再进行MD5与前端进行比对,比对成功即为登陆成功。
    如下图:
    时序图:
    QQ图片20180201200157.png
    通俗来讲:
    1、客户端将需要登录的用户账号发给服务器
    2、服务器反馈一个盐值
    3、客户端将用户账号和密码做MD5,然后与盐值再次MD5后发给服务器
    4、服务器根据步骤1中接收到的用户账号查找一个预存的MD5,然后于盐值再次MD5
    5、服务器验证客户端发送的MD5与自己新生成的MD5是否相同

    三、身份加密
    异或加密是一种很简单的加密算法,无论是原理还是操作性上,都不具备任何难度,所以,在做一些简单的加密时,被广为采用。对个人的隐私数据进行XOR加密,需要解密时再次调用该方法即可。(身份证号,手机号等信息)
    [C] 纯文本查看 复制代码
    #include <stdio.h>
    main()
    {
       char a[]="Password";        //要加密的密码
       char b[]="encryption";     //密钥
       int i;
       //加密代码
       for(i=0;a[i];i++)
         a[i]=a[i]^b[i];
       printf("Your Password is encrypted: %s\n",a);
       /*解密代码*/
       for(i=0;a[i];i++)
          a[i]=a[i]^b[i];
       printf("You Password: %s\n",a);
      
    }

    四、CSRF防御


    29381f30e924b899246ac26f6f061d950a7bf617.jpg

    漏洞原理我们不再讲解,主要描述防护原理。
    大家都知道CSRF是因为web浏览器对于cookie和http身份认证等会话信息的处理存在一定缺陷。


    1.我们可以采取验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。


    2.验证Referer请求通常是用于验证CSRF漏洞是否存在的一种方式,但是因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。


    3.最好的办法是采取token验证,这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。


    验证token:
    [Java] 纯文本查看 复制代码
    HttpServletRequest req = (HttpServletRequest)request; 
    HttpSession s = req.getSession(); 
     
    // 从 session 中得到 csrftoken 属性
    String sToken = (String)s.getAttribute(“csrftoken”); 
    if(sToken == null){ 
     
       // 产生新的 token 放入 session 中
       sToken = generateToken(); 
       s.setAttribute(“csrftoken”,sToken); 
       chain.doFilter(request, response); 
    } else{ 
     
       // 从 HTTP 头中取得 csrftoken 
       String xhrToken = req.getHeader(“csrftoken”); 
     
       // 从请求参数中取得 csrftoken 
       String pToken = req.getParameter(“csrftoken”); 
       if(sToken != null && xhrToken != null && sToken.equals(xhrToken)){ 
           chain.doFilter(request, response); 
       }else if(sToken != null && pToken != null && sToken.equals(pToken)){ 
           chain.doFilter(request, response); 
       }else{ 
           request.getRequestDispatcher(“error.jsp”).forward(request,response); 
       } 
    }



    123.png

    评分

    参与人数 1积分 +1 魔法币 +10 收起 理由
    大哥哥团长 + 1 + 10 顺手给你点个赞

    查看全部评分

    信息安全在读大学狗。
    坏蛋 管理员 欢迎大家来春秋群找我玩 秦 楚 燕 魏 齐 赵 春秋文阁
    沙发
    发表于 2018-2-2 15:39:50
    支持阿亮
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋白帽子军团:451217067
    i春秋-韩:556040588
    i春秋CTF交流学习群:234714762
    使用道具 举报 回复
    枕边月亮 i春秋作家 四川高校信息安全在读 i春秋签约作者 春秋文阁
    板凳
    发表于 2018-2-2 17:38:30
    信息安全在读大学狗。
    使用道具 举报 回复
    对于 POST 请求来说,在form表单后加上
    [HTML] 纯文本查看 复制代码
     <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>
    。这样查看源码时候会暴露token的值
    使用道具 举报 回复
    发表于 2018-2-3 13:13:15
    感谢分享!
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    枕边月亮 i春秋作家 四川高校信息安全在读 i春秋签约作者 春秋文阁
    6#
    发表于 2018-2-6 21:23:31
    yez君为妍研 发表于 2018-2-2 22:35
    对于 POST 请求来说,在form表单后加上。这样查看源码时候会暴露to ...

    谢谢指出错误
    信息安全在读大学狗。
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册