1 Cookie 的工作过程

Cookie的传递用到了两个字段: 请求头字段Cookie和响应头字段Set-Cookie

当用户浏览器第一次访问服务器的时候,服务器肯定是不知道他的身份的。所以,就要创建一个独特的身份识别数据,格式是"key=value", 然后放进Set-Cookie字段里。随着响应报文一同发给浏览器。

浏览器收到响应报文,看到里面的Set-Cookie,知道这时服务器给的身份标识,于是就保存起来,下次再请求的时候 就自动把这个值放进Cookie字段里发给服务器。

因为第二次请求里面有了 Cookie 字段,服务器就知道这个用户不是新人,之前来过,就可以拿出 Cookie 里的值,识别出用户的身份,然后提供个性化的服务。

服务器有时会在响应头里添加多个 Set-Cookie,存储多个**“key=value**”。但浏览器这边发送时不需要用多个 Cookie 字段,只要在一行里用“;”隔开就行。

示意图如下:

从上图得知,Cookie是由浏览器负责存储的,而不是操作系统。

2.session 介绍

session 是服务端的一个概念,服务端生成session都会生成一个对应的SessionID,这个SessionId 会通过Cookie传递给前端,前端以后发送请求的时候,都会带上sessionID的参数,服务端看到请求中带了sessionId, 就会根据这个sessionID 取出对应的session信息。

浏览器的关闭不会导致服务器的session失效,服务端session失效只有两种情况:一是session过期,二
是session的invalidate方法,还有就是重启客户端。

为什么我们平时觉得浏览器关闭了,session就失效了吗?这是因为浏览器里面的sessionID丢了,所以当浏览器再次访问服务器端的时候,服务器会重新给浏览器分配一个sessionId ,这个sessionId和 之前的那么session对应不上,所以用户就会感觉session失效。

session的认证的流程如下图:

1.浏览器发送登录请求 /user/login

2.登录成功后,服务端将session存在内存中。

3.然后服务端返回Set-Cookie 携带 sessionId 字段

4.登录后,浏览器每发送都会在请求字段Cookie上自动带上sessionId

5.浏览器拿到sessionID 后,去内存session中回去用户信息,如果匹配不上,说明没有登录。

3.会话固定攻击

会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用黑客预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致黑客设置的sessionId变成了合法桥梁。)

Servlet容器允许URL地址后面增加;JSESSIONID=...的方式携带session信息。

攻击步骤

1.攻击者打开一个登录页面

2.服务端会返回攻击者一个sessionId = 123xyz

3.攻击者发送一个伪装连接并带上sessionId

4.然后正常用户接到后,点击进行登录

5.这时候服务端sessionID=123xyz的session已经存在

6.这时,有了这个sessionID ,攻击者就可以正大光明的访问漏洞系统了。

攻击原理: 登录后的sessionId和登录前的SessionId 没有变化

4. 解决方案

解决办法是在登录的时候,将原来的session作废,生成新的session。这里要注意的是,使用logout不能使session作废,而要用session的stop方法。代码如下:

在 Spring Security中,防御会话固定攻击很简单,只需要下面配置即可:

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().loginPage("/signIn").and().cors().and().sessionManagement().sessionFixation().migrateSession().sessionRegistry(sessionRegistry);}
}

springSecurity 默认已经开启了该配置,主要利用SessionManager这个配置其来完成的。

  • none: 该策略对会话不做任何变动,登录之后会沿用旧的session;

  • newSession: 用户登录后会创建一个新的session;

  • migrateSession: 默认策略,用户登录后创建一个新的session,并将旧session中的数据复制过来;

  • changeSessionId: 表示 session 不变,不会创建新的session,但是会修改 sessionid,内部使用由Servlet容器提供的会话固定保护。

默认的防御策略是 migrateSession ,在用户匿名访问的时候是一个 sessionid,当用户成功登录之后,
又是另外一个 sessionid,这样就可以有效避免会话固定攻击。

Spring Security 之所以可以实现上述防御效果,主要是从以下三个方面来完成:

  1. 利用 StrictHttpFirewall 防火墙,如果发现请求地址中带有 “;”,则该请求会被直接拒绝;这样可以阻止请求URL带上SessionID

  2. 响应的 Set-Cookie 字段中有 HttpOnly 属性,这种方式会避免通过 XSS 攻击来获取 Cookie 中的会话信息,进而达成会话固定攻击。

  3. 登录成功后,改变sessionId 。既然问题是由于 sessionid 不变导致的,那我们就让 sessionid 变一下,利用Spring Security提供的防御会话固定攻击的策略即可实现。

我们看下session策略的源代码。

ChangeSessionIdAuthenticationStrategy中的onAuthentication方法其实是由父类AbstractSessionFixationProtectionStrategy实现的。这个方法就是防止固定会话攻击,会一直不停的修改你的sessionId。

public void onAuthentication(Authentication authentication,HttpServletRequest request, HttpServletResponse response) {boolean hadSessionAlready = request.getSession(false) != null;//1.session不存在直接返回if (!hadSessionAlready && !alwaysCreateSession) {return;}HttpSession session = request.getSession();//2.如果session存在的话则创建一个新的session覆盖老的session,sessionId也会改变if (hadSessionAlready && request.isRequestedSessionIdValid()) {String originalSessionId;String newSessionId;Object mutex = WebUtils.getSessionMutex(session);synchronized (mutex) {// We need to migrate to a new sessionoriginalSessionId = session.getId();session = applySessionFixation(request);newSessionId = session.getId();}if (originalSessionId.equals(newSessionId)) {logger.warn("Your servlet container did not change the session ID when a new session was created. You will"+ " not be adequately protected against session-fixation attacks");}onSessionChange(originalSessionId, session, authentication);}}

会话固定攻击(session fixation attack)及解决办法相关推荐

  1. 漏洞:会话固定攻击(session fixation attack)

    什么是会话固定攻击? 会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会 ...

  2. 网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法

    网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法 唉,本人小白大学生,自己独自一人做了个网上商城项目 昨天刚刚用了半天时间解决支付宝异步回调session丢失问题,今天就继续为沙箱 ...

  3. 【安全牛学习笔记】CSRF跨站请求伪造攻击漏洞的原理及解决办法

    CSRF跨站请求伪造攻击漏洞的原理及解决办法 CSRF,夸张请求伪造漏洞 漏洞的原理及修复方法 1.常见的触发场景 2.漏洞原理:浏览器同源策略 3.DEMO 4.漏洞危害 5.如何避免&修复 ...

  4. session fixation attack修复方法

    Springboot集成Security+redis进行分布式会话,报错: Your servlet container did not change the session ID when a ne ...

  5. ASP.NET 2.0中的Session状态丢失的解决办法

    ASP.NET 2.0引进了不让脚本使用的HttpOnly的cookie,,通过客户端脚本执行的某些操作可能会使session丢失. 解决办法:在global.asax中设置HttpOnly属性为Fa ...

  6. thinkphp5.1 session过期时间失效解决办法

    有时候会感觉session设置的时候不对,明明设置的一天,不刷新,一小时就过期了,这个问题困扰了我好久,我的解决办法如下. 1.type设置成redis 或者memcached,这样过期机制能很好的处 ...

  7. IOS 固定定位失效的分析与解决办法

    1,固定定位失效 首先查看是不是固定定位没有应用上(IOS和Android 都测试一下) 猜想一,父元素使用了 transform 属性 解决方案 // 解决方法: .father{transform ...

  8. VUE input唤起键盘 底部固定的标签被顶上去解决办法

    通过输入框的失去焦点事件和点击事件,当出现键盘时把绝对定位的底部文字隐藏,失去焦点(键盘隐藏的时候)显示底部文字 解决代码 <input type="text" class= ...

  9. tomcat重启后session没有清除的解决办法

    tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomc ...

  10. php session bug,thinkphp2.x中session的BUG及解决办法

    很多人出现一个TP构建的APP,出现SESSION相同导致用户未经授权就登陆了其它项目,N久没有找到原因.今天晚上跟踪了一下代码,找到了问题. 主要原因在于TP在项目实例化的时候没有对SESSION进 ...

最新文章

  1. [分享]组织机构图控件
  2. (AOSP)repo checkout指定版本
  3. android获取未安装APK签名信息及MD5指纹
  4. 关卡设计快速入门_1. 创建新项目
  5. 怎么一键排版_做了这么久的PPT!终于找到可以自动排版的插件了
  6. 智能搜索引擎---命题的确定
  7. php表达式生成工具,thinkPHP5.0数据查询表达式生成技巧
  8. python网络编程实例简析
  9. python中分割字符串两种方法正则分组别名_Python 正则表达式(分组)
  10. PostgreSQL学习总结(3)—— PostgreSQL 数据类型
  11. java比较炫的小程序_有人不建议学Java,有人不建议学Python,该怎么选择
  12. java常用的date类
  13. 小米手机隐私相册在哪?将你的照片锁进“保险柜”
  14. Word文字怎么添加下划线
  15. 正睿集训模拟赛 Day1
  16. python绘制qq图_Python中作QQ图(quantilequantile Plot)
  17. ubuntu下exiftool安装
  18. 【input 身份证号】星号 代替,input 切割成 多个 小格格(类似)
  19. 使用数据库进行用户身份认证
  20. 【NOIP2018】摆渡车

热门文章

  1. ft232h引脚_K9K8G08U0B-PIB0--斗门--镁光MICRON内存收购
  2. 常威来了(变量和常量)简单易懂
  3. 豆瓣电影喜剧榜数据爬取
  4. 【论文笔记】Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
  5. 文本域(可输入多行文本)
  6. 麦客CEO李卉:实践证明肯钻营的“小而美”亦动人|企服三会系列报道
  7. 【sv】getenv 【import “DPI-C“】
  8. 面经:两年半经验,面10个公司,经28轮面试,拿9个offer,涨麻了!
  9. 奇迹暖暖安卓鸿蒙互通吗,奇迹暖暖安卓和ios互通吗 奇迹暖暖苹果和安卓能一起玩吗...
  10. 从入门到放弃,50G编程视频免费送!