[红日安全]Web安全Day12 - 会话安全实战攻防
字数 2000 2025-08-18 11:39:22

Web安全实战:会话安全攻防详解

1. 会话安全概述

1.1 会话机制原理

Session会话机制是一种服务器端机制,使用类似哈希表的结构保存信息。工作流程如下:

  1. 服务器检查客户端请求是否包含会话ID
  2. 如果包含,则检索已有会话(无法检索则创建新会话)
  3. 如果不包含,则为客户端创建新会话并生成会话ID
  4. 会话ID应是不重复且难以复制的字符串
  5. 会话ID返回给客户端保存

1.2 常见会话安全问题

1.2.1 会话预测

  • 通过分析会话ID生成过程预测有效会话ID值
  • 利用预测的会话ID获取应用访问权限

1.2.2 会话劫持

  • 获取用户Session ID后使用该ID登录网站
  • 获取目标用户的操作权限

1.2.3 会话重用

  • 用户退出系统后服务器端Session未失效
  • 攻击者可利用此Session继续发送请求
  • 测试方法:登录后注销会话,重放登录数据包仍可登录

1.2.4 会话失效时间过长

  • 会话失效时间设置过长
  • 导致服务器性能受损且可被多次利用
  • 测试方法:系统登录后长时间不失效仍可正常使用

1.2.5 会话固定

  • 用户进入登录页面但未登录时已产生session
  • 登录后session ID不变,不建立新session也不销毁原session
  • 攻击者可诱使受害者使用特定session登录
  • 测试方法:系统登录前后用户的session保持不变

2. 会话安全漏洞的危害

攻击者可利用这些漏洞绕过身份验证,实现权限提升。

3. 测试方法与靶场实践

3.1 测试靶场介绍

3.1.1 DVWA靶场

  • 简介:PHP+MySQL编写的漏洞检测和教学程序
  • 安装步骤
    1. 下载地址:http://www.dvwa.co.uk/
    2. 解压到WWW目录,配置本地域名
    3. 修改config.inc.php.dist中的数据库密码,去掉.dist后缀
    4. 访问配置的本地域名,点击"Create Database"
    5. 使用默认管理员账户登录:admin/password

3.1.2 WebGoat靶场

  • 简介:OWASP研制的Java web漏洞实验程序
  • Docker安装
    apt install apt-get install docker.io  # 安装Docker
    docker --version  # 查看版本
    docker pull webgoat/webgoat-7.1  # 下载容器
    docker run -p 8080:8080 -t webgoat/webgoat-7.1  # 运行
    
  • 访问地址:http://127.0.0.1:8080/WebGoat/login

3.2 DVWA靶场手工测试

3.2.1 Low级别测试

  • 测试过程

    1. 使用Firefox登录admin/password
    2. 设置安全等级为Low
    3. 在Weak Session IDs页面多次点击generate
    4. 观察dvwasessionid每次+1
    5. 构造Cookie:dvwaSession=1; PHPSESSID=...; security=low
  • 源码分析

    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    $_SESSION['last_session_id']++;
    $cookie_value = $_SESSION['last_session_id'];
    setcookie("dvwaSession", $cookie_value);
    

3.2.2 Medium级别测试

  • 测试过程

    1. 设置安全等级为Medium
    2. 生成的dvwasessionid为当前时间戳
    3. 构造时间戳范围内的Cookie
  • 源码分析

    $cookie_value = time();
    setcookie("dvwaSession", $cookie_value);
    

3.2.3 High级别测试

  • 测试过程

    1. 设置安全等级为High
    2. 生成的dvwasessionid为Low级别的MD5加密值
    3. 构造MD5加密后的Cookie
  • 源码分析

    $_SESSION['last_session_id_high']++;
    $cookie_value = md5($_SESSION['last_session_id_high']);
    setcookie("dvwaSession", $cookie_value, time()+3600, ...);
    

3.2.4 Impossible级别测试

  • 测试过程

    1. 生成的dvwasessionid为随机数+时间戳的sha1加密值
    2. 难以预测和破解
  • 源码分析

    $cookie_value = sha1(mt_rand() . time() . "Impossible");
    setcookie("dvwaSession", $cookie_value, time()+3600, ...);
    

4. CMS实战演练

4.1 XiaoCMS会话固定漏洞

4.1.1 CMS介绍

PHP+Mysql架构的轻量级CMS,适合企业站和博客。

4.1.2 安装步骤

  1. 下载地址:http://www.a5xiazai.com/php/108347.html
  2. 放入www目录
  3. 填写数据库信息完成安装

4.1.3 漏洞分析

  • 漏洞文件core/library/session.class.php
  • 漏洞代码
    if(isset($session_id)){
        session_id($session_id);
    }
    
  • 漏洞成因:直接使用传入的session_id而不重新生成

4.1.4 漏洞利用

  1. 注册普通管理员账号quan
  2. 获取quan的session_id
  3. 构造POST请求:
    POST /admin/?xiaocms
    session_id=57049dc90ccd7226302dc8efbb8f2ce0
    
  4. 或构造HTML表单:
    <form action="http://quan.xiaocms.net/admin/" method="post">
      <input type="hidden" name="session_id" value="57049dc90ccd7226302dc8efbb8f2ce0">
      <input type="submit">
    </form>
    

4.2 YxCMS会话固定漏洞

4.2.1 CMS介绍

PHP+mysql的企业建站系统。

4.2.2 安装步骤

放入www目录,按向导完成安装。

4.2.3 漏洞分析

  • 漏洞文件yxcms/protected/include/lib/common.function.php
  • 漏洞代码
    if(isset($sessionid)){
        session_id($sessionid);
    }
    
  • request函数支持多种参数传输方式(GET/POST等)

4.2.4 漏洞利用

  1. 注册普通会员quan
  2. 获取quan的PHPSESSID
  3. 访问URL:
    http://quan.yxcms146.net/index.php?r=admin/index/index&sessionid=5fcb75b7b1cda3d797b1cf7ac1cc0be1
    

5. 防御方法

  1. 防篡改验证:在Cookie值后添加防篡改验证串
  2. 及时清空会话:用户退出后服务器端应清空Session
  3. 设置合理有效期:强制设置Session存活时间,超时销毁
  4. 重新生成SessionID:认证信息或权限变更时重新生成SessionID并失效旧会话
Web安全实战:会话安全攻防详解 1. 会话安全概述 1.1 会话机制原理 Session会话机制是一种服务器端机制,使用类似哈希表的结构保存信息。工作流程如下: 服务器检查客户端请求是否包含会话ID 如果包含,则检索已有会话(无法检索则创建新会话) 如果不包含,则为客户端创建新会话并生成会话ID 会话ID应是不重复且难以复制的字符串 会话ID返回给客户端保存 1.2 常见会话安全问题 1.2.1 会话预测 通过分析会话ID生成过程预测有效会话ID值 利用预测的会话ID获取应用访问权限 1.2.2 会话劫持 获取用户Session ID后使用该ID登录网站 获取目标用户的操作权限 1.2.3 会话重用 用户退出系统后服务器端Session未失效 攻击者可利用此Session继续发送请求 测试方法 :登录后注销会话,重放登录数据包仍可登录 1.2.4 会话失效时间过长 会话失效时间设置过长 导致服务器性能受损且可被多次利用 测试方法 :系统登录后长时间不失效仍可正常使用 1.2.5 会话固定 用户进入登录页面但未登录时已产生session 登录后session ID不变,不建立新session也不销毁原session 攻击者可诱使受害者使用特定session登录 测试方法 :系统登录前后用户的session保持不变 2. 会话安全漏洞的危害 攻击者可利用这些漏洞绕过身份验证,实现权限提升。 3. 测试方法与靶场实践 3.1 测试靶场介绍 3.1.1 DVWA靶场 简介 :PHP+MySQL编写的漏洞检测和教学程序 安装步骤 : 下载地址:http://www.dvwa.co.uk/ 解压到WWW目录,配置本地域名 修改config.inc.php.dist中的数据库密码,去掉.dist后缀 访问配置的本地域名,点击"Create Database" 使用默认管理员账户登录:admin/password 3.1.2 WebGoat靶场 简介 :OWASP研制的Java web漏洞实验程序 Docker安装 : 访问地址:http://127.0.0.1:8080/WebGoat/login 3.2 DVWA靶场手工测试 3.2.1 Low级别测试 测试过程 : 使用Firefox登录admin/password 设置安全等级为Low 在Weak Session IDs页面多次点击generate 观察dvwasessionid每次+1 构造Cookie: dvwaSession=1; PHPSESSID=...; security=low 源码分析 : 3.2.2 Medium级别测试 测试过程 : 设置安全等级为Medium 生成的dvwasessionid为当前时间戳 构造时间戳范围内的Cookie 源码分析 : 3.2.3 High级别测试 测试过程 : 设置安全等级为High 生成的dvwasessionid为Low级别的MD5加密值 构造MD5加密后的Cookie 源码分析 : 3.2.4 Impossible级别测试 测试过程 : 生成的dvwasessionid为随机数+时间戳的sha1加密值 难以预测和破解 源码分析 : 4. CMS实战演练 4.1 XiaoCMS会话固定漏洞 4.1.1 CMS介绍 PHP+Mysql架构的轻量级CMS,适合企业站和博客。 4.1.2 安装步骤 下载地址:http://www.a5xiazai.com/php/108347.html 放入www目录 填写数据库信息完成安装 4.1.3 漏洞分析 漏洞文件 : core/library/session.class.php 漏洞代码 : 漏洞成因 :直接使用传入的session_ id而不重新生成 4.1.4 漏洞利用 注册普通管理员账号quan 获取quan的session_ id 构造POST请求: 或构造HTML表单: 4.2 YxCMS会话固定漏洞 4.2.1 CMS介绍 PHP+mysql的企业建站系统。 4.2.2 安装步骤 放入www目录,按向导完成安装。 4.2.3 漏洞分析 漏洞文件 : yxcms/protected/include/lib/common.function.php 漏洞代码 : request函数 支持多种参数传输方式(GET/POST等) 4.2.4 漏洞利用 注册普通会员quan 获取quan的PHPSESSID 访问URL: 5. 防御方法 防篡改验证 :在Cookie值后添加防篡改验证串 及时清空会话 :用户退出后服务器端应清空Session 设置合理有效期 :强制设置Session存活时间,超时销毁 重新生成SessionID :认证信息或权限变更时重新生成SessionID并失效旧会话