会话固定攻击(session fixation attack)及解决办法
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 之所以可以实现上述防御效果,主要是从以下三个方面来完成:
利用 StrictHttpFirewall 防火墙,如果发现请求地址中带有 “;”,则该请求会被直接拒绝;这样可以阻止请求URL带上SessionID
响应的 Set-Cookie 字段中有 HttpOnly 属性,这种方式会避免通过 XSS 攻击来获取 Cookie 中的会话信息,进而达成会话固定攻击。
登录成功后,改变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)及解决办法相关推荐
- 漏洞:会话固定攻击(session fixation attack)
什么是会话固定攻击? 会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会 ...
- 网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法
网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法 唉,本人小白大学生,自己独自一人做了个网上商城项目 昨天刚刚用了半天时间解决支付宝异步回调session丢失问题,今天就继续为沙箱 ...
- 【安全牛学习笔记】CSRF跨站请求伪造攻击漏洞的原理及解决办法
CSRF跨站请求伪造攻击漏洞的原理及解决办法 CSRF,夸张请求伪造漏洞 漏洞的原理及修复方法 1.常见的触发场景 2.漏洞原理:浏览器同源策略 3.DEMO 4.漏洞危害 5.如何避免&修复 ...
- session fixation attack修复方法
Springboot集成Security+redis进行分布式会话,报错: Your servlet container did not change the session ID when a ne ...
- ASP.NET 2.0中的Session状态丢失的解决办法
ASP.NET 2.0引进了不让脚本使用的HttpOnly的cookie,,通过客户端脚本执行的某些操作可能会使session丢失. 解决办法:在global.asax中设置HttpOnly属性为Fa ...
- thinkphp5.1 session过期时间失效解决办法
有时候会感觉session设置的时候不对,明明设置的一天,不刷新,一小时就过期了,这个问题困扰了我好久,我的解决办法如下. 1.type设置成redis 或者memcached,这样过期机制能很好的处 ...
- IOS 固定定位失效的分析与解决办法
1,固定定位失效 首先查看是不是固定定位没有应用上(IOS和Android 都测试一下) 猜想一,父元素使用了 transform 属性 解决方案 // 解决方法: .father{transform ...
- VUE input唤起键盘 底部固定的标签被顶上去解决办法
通过输入框的失去焦点事件和点击事件,当出现键盘时把绝对定位的底部文字隐藏,失去焦点(键盘隐藏的时候)显示底部文字 解决代码 <input type="text" class= ...
- tomcat重启后session没有清除的解决办法
tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomc ...
- php session bug,thinkphp2.x中session的BUG及解决办法
很多人出现一个TP构建的APP,出现SESSION相同导致用户未经授权就登陆了其它项目,N久没有找到原因.今天晚上跟踪了一下代码,找到了问题. 主要原因在于TP在项目实例化的时候没有对SESSION进 ...
最新文章
- [分享]组织机构图控件
- (AOSP)repo checkout指定版本
- android获取未安装APK签名信息及MD5指纹
- 关卡设计快速入门_1. 创建新项目
- 怎么一键排版_做了这么久的PPT!终于找到可以自动排版的插件了
- 智能搜索引擎---命题的确定
- php表达式生成工具,thinkPHP5.0数据查询表达式生成技巧
- python网络编程实例简析
- python中分割字符串两种方法正则分组别名_Python 正则表达式(分组)
- PostgreSQL学习总结(3)—— PostgreSQL 数据类型
- java比较炫的小程序_有人不建议学Java,有人不建议学Python,该怎么选择
- java常用的date类
- 小米手机隐私相册在哪?将你的照片锁进“保险柜”
- Word文字怎么添加下划线
- 正睿集训模拟赛 Day1
- python绘制qq图_Python中作QQ图(quantilequantile Plot)
- ubuntu下exiftool安装
- 【input 身份证号】星号 代替,input 切割成 多个 小格格(类似)
- 使用数据库进行用户身份认证
- 【NOIP2018】摆渡车
热门文章
- ft232h引脚_K9K8G08U0B-PIB0--斗门--镁光MICRON内存收购
- 常威来了(变量和常量)简单易懂
- 豆瓣电影喜剧榜数据爬取
- 【论文笔记】Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
- 文本域(可输入多行文本)
- 麦客CEO李卉:实践证明肯钻营的“小而美”亦动人|企服三会系列报道
- 【sv】getenv 【import “DPI-C“】
- 面经:两年半经验,面10个公司,经28轮面试,拿9个offer,涨麻了!
- 奇迹暖暖安卓鸿蒙互通吗,奇迹暖暖安卓和ios互通吗 奇迹暖暖苹果和安卓能一起玩吗...
- 从入门到放弃,50G编程视频免费送!