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

2023-11-05

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 {

    @Override
    protected 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 session
                                originalSessionId = 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);
                }
        }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

会话固定攻击(session fixation attack)及解决办法 的相关文章

  • python中的异常处理方法

    目录 1 什么是异常 3 异常的分类 4 异常的类型 有很多 不一一列举 异常处理实操 基本语法结构 异常处理了解操作 1 什么是异常 代码运行出错之后就是异常 异常会导致程序立刻停止 是我们以后在编程过程中需要极力避免的情况 异常的外号
  • 爬虫之xpath插件下载与使用

    文章目录 1 下载xpath文件 2 打开chrome浏览器 3 点击右上角小圆点 4 更多工具 阔展程序 5 拖拽xpath插件放到阔展程序 6 如果失效 需要将后缀改为zip 7 再次拖拽 8 关闭浏览器重新打开 9 按ctrl shi
  • Pycharm连接Mysql8.0的坑

    Pycharm连接Mysql8 0 1 错误 S1009 The connection property zeroDateTimeBehavior acceptable values are CONVERT TO NULL EXCEPTIO
  • 数据数仓的三种建模方式

    所谓水无定势 兵无常法 不同的行业 有不同行业的特点 因此 从业务角度看 其相应的数据模型是千差万别的 目前业界较为主流的是数据仓库厂商主要是 IBM 和 NCR 这两家公司的除了能够提供较为强大的数据仓库平台之外 也有各自的针对某个行业的
  • 新基建时期助力打造数字化智慧交通体系

    在没多久之前公布的政府工作报告中 明晰了将重点扶持 两新一重 基础建设的战略方针 并且对 两新一重 体系的实际价值给出了 既促消费惠民生又调结构增后劲 的评价 两新一重 体系包含三个基础建设方向 即增强新型基础设施建设 发展新一代的信息网络
  • Struts2 标签详解(学习深入)

    Struts2 标签详解 详细的说明了struts2所有标签 a a标签创建一个HTML超链接 等价于HTML 的
  • 软件测试 - 自动化测试工具 selenium1

    1 什么是自动化测试 2 自动化测试金字塔 2 1 单元测试 2 2 接口测试 2 3 UI 自动化测试 3 为什么要使用 selenium 自动化框架 4 什么样的项目适合自动化测试 5 Selenium IDE 6 Webdriver

随机推荐

  • 手写一个服务器代码将 《vue电商后台管理系统》部署上去 上线、打包

    我将在博文中全程以cnpm作为代码格式 为了好复制 它快啊 你要知道node安装包自带npm npm下载cnpm才可以使用cnpm 今日目标 1 上线vue电商后台管理项目 2 手写搭建服务器并挂载 node 3 打包优化 完成上线 前期回
  • MySQL的数据查询详解

    MySQL查询数据 一 基本查询语句 二 单表查询 三 常用函数查询 四 连接查询 五 子查询 六 合并查询结果 七 为表和字段取别名 八 使用正则表达式查询 一 基本查询语句 数据库管理系统的一个最重要的功能就是数据查询 数据查询不只是简
  • 【AI实战营第二期】第三次作业——基于 RTMDet 的气球检测(包含数据集)

    作业 基于 RTMDet 的气球检测 背景 熟悉目标检测和 MMDetection 常用自定义流程 任务 基于提供的 notebook 将 cat 数据集换成气球数据集 按照视频中 notebook 步骤 可视化数据集和标签 使用MMDet
  • three.js---一个基础的demo

    在学习three js过程中 不难发现 每新开发一个3D场景都会从创建场景 scene 创建物体 创建相机这三个基础的方法开始 从而在其身上衍生出其他的一些API 为了方便日后的开发 特此记录一个简单基础的demo 在之后的开发中可直接使用
  • python测试网络连通性_PYTHON 测试服务器连通性

    coding utf 8 import os import sys import urllib2 import pygame import re import socket import subprocess 输入要测试的site值 pri
  • 基于Jenkins CICD的代码发布与回滚

    案例知识点 1 Jenkins 介绍 Jenkins 原名 Hudson 2011 年改为现在的名字 它是一个开源的实现持续集成的软件工具 官方网站 https jenkins io Jenkins 能实施监控持续集成过程中所存在的问题 提
  • UI自动化测试-第一个测试脚本

    前提 我们在进行UI自动化测试时 一般采用java selenium或者python selenium的方式 由于python比较简单 上手快 因此建议大家采用python selenium的方式来进行UI自动化 1 安装pycharm P
  • 浏览器控制器进行request(ajax)请求

    浏览器控制器进行request ajax 请求 问题 代码 问题 前后分离开发时 经常出现跨域问题 用postman开发的时候不会出现 所以用以下代码在浏览器的控制器里面进行模拟请求 做个记录 代码 var url http XXX XXX
  • Unable to cast object of type ‘System.Byte[]‘ to type ‘System.System.String‘

    环境 C MySQL数据库 asp net core 3 1 问题 调试 确实有问题 异常还原与异常信息一致 初步分析为数据库数据表实体类映射字段没对起来 检查数据库数据表与实体类映射 发现 某字段类型为longblob 映射类型为Stri
  • Qt开发记录18——授权校验

    授权校验 Windows系统 获取cpu序列号 BIOS序列号 网卡mac地址 代码 Linux系统 获取硬盘序列号 网卡MAC地址 代码 生成的授权码 代码 读取授权文件中的授权码 代码 校验 代码 Windows系统 获取cpu序列号
  • Java Stream流操作

    Stream目录 一 概述 二 分类 三 具体用法 1 流的常用创建方法 1 1 使用Collection下的 stream 和 parallelStream 方法 1 2 使用Arrays 中的 stream 方法 将数组转成流 1 3
  • 使用PlayerPrefs的数据存储

    LasText text 上次 长度 PlayerPrefs GetInt lastl 0 上次 分数 PlayerPrefs GetInt lasts 0 如果上次长度没有 则设置上次长度为零 PlayerPrefs SetInt las
  • VLC media player 官方下载

    http www videolan org vlc index zh html
  • HTML5制作个人简历模板

    利用表格标签制作一个个人简历的模板 代码片段如下 table cellspacing 1 width 700px align center caption 个人简历 caption tr height 45 th 姓名 th td td t
  • 弱网测试及工具对比(Fiddler/Charles/NEWT/Clumsy/ATC/WANem/QNET)

    1 什么是弱网测试 弱网测试主要就是对带宽 丢包 延时等进行模拟弱网环境 衡量网络性能好坏的几个指标 带宽 吞吐量 单位时间内传输的数据量 单位通常是 每秒比特数 bps 带宽反映了网络的传输能力 越大越好 丢包 数据丢包个数 发送的数据包
  • MySQL中concat

    MySQL中使用concat拼接字符集 用mysql统计数据总和 需要拼接中文 发现是乱码 一直以为自己写的sql有问题 最后一查原来是因为使用concat函数时 需要转换参数类型 1 乱码sql 直接使用concat拼接中文和统计结果 s
  • 数据结构-多项式的基本操作(链表实现)

    include
  • 虚机Centos忘记密码如何重置 -- 小黑日常超细教学

    有时候虚机太多 会忘记有一些虚机的密码 当启动机器的时候那我们可以尝试重置虚机密码然后登录 日常的小技能记述 目录 一 演示虚机为centos7系列 二 进入开机前的页面 选中第一个 按 e 键 进入编辑模式 三 找到ro crashker
  • ALIGN_SIZE宏解释

    转载 http blog chinaunix net uid 27879959 id 3880459 html 0 tsina 1 63290 397232819ff9a47a7b7e80a40613cfe1
  • 会话固定攻击(session fixation attack)及解决办法

    1 Cookie 的工作过程 Cookie的传递用到了两个字段 请求头字段Cookie和响应头字段Set Cookie 当用户浏览器第一次访问服务器的时候 服务器肯定是不知道他的身份的 所以 就要创建一个独特的身份识别数据 格式是 key