目录
一、Session ID
二、源码分析
1、index.php
2、impossible.php
三、Weak Session IDs安全级别对比
四、impossible防范方法分析
1、高随机性会话 ID 生成
2、严格的 Cookie 作用域限制
3、安全的传输与存储控制期
本系列为通过《DVWA靶场通关笔记》的Weak Session IDs关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践。本文为Weak Session IDs impossible关卡的原理分析部分,讲解相对于low、medium和high级别,为何对其进行渗透测试是Impossible的。
一、Session ID
Session ID(会话 ID)是 Web 应用程序中用于标识用户会话的唯一标识符,是用户访问网站时的 “电子身份证”。会话id的核心作用和身份证类似,id用于区分不同的用户,核心作用如下所示。
- 区分用户会话:当用户访问网站时,服务器会为其创建一个会话(Session),并生成唯一的 Session ID,通过 Cookie 存储在用户浏览器或 URL 中。后续请求携带该 ID,服务器即可识别用户身份,保持会话状态(如登录状态、购物车数据等)。
- 跨请求状态保持:由于默认情况下HTTP应用层协议是无状态的,Session ID 让服务器能 “记住” 用户的操作,例如用户登录后,服务器通过 Session ID 关联其权限和数据。
Session ID(会话 ID)通常使用Cookie 存储:默认通过名为PHPSESSID(PHP)等的 Cookie 传输,浏览器自动携带。以DVWA的盲注关卡Impossible级别为例,使用bp抓包,如下报文的sesssion id使用PHPSESSID存储,值为tssqfshe2838kcg5nbkf4464u3,具体如下所示。
二、源码分析
1、index.php
进入DVWA靶场Weak Session IDs源目录,找到index.php源码。
这段
PHP
代码是
Damn Vulnerable Web Application (DVWA)
中
“弱会话
ID
”
演示页面的核心逻辑,通过对比不同安全级别的实现方式,帮助开发者理解弱会话
ID
的风险和安全的会话管理实践。主要功能如下所示。
- 安全级别控制:根据用户 Cookie 中存储的安全级别(低、中、高、安全),动态加载不同的会话 ID 生成算法实现文件,展示不同防护级别的会话管理场景。
- 用户交互界面:
- 提供一个 “Generate” 按钮,每次点击时会触发会话 ID 的生成。
- 页面说明文字提示用户每次点击按钮会设置一个名为 dvwaSession 的新 Cookie。
- 会话 ID 生成演示:根据低、中、高、安全共4个级别演示会话id的生成。
- 辅助功能:
- 提供帮助文档和源代码查看功能。
- 根据不同安全级别显示相应的会话 ID 生成结果
经过注释后的详细代码如下所示。
<?php
// 定义网站根目录路径常量,用于后续文件引用
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
// 引入DVWA页面基础功能库
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 启动页面,验证用户是否已认证并初始化PHPIDS(入侵检测系统)
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 创建新页面实例
$page = dvwaPageNewGrab();
// 设置页面标题,包含名称
$page[ 'title' ] = 'Vulnerability: Weak Session IDs' . $page[ 'title_separator' ].$page[ 'title' ];
// 设置页面ID,用于导航和标识
$page[ 'page_id' ] = 'weak_id';
// 添加帮助按钮和源代码按钮
$page[ 'help_button' ] = 'weak_id';
$page[ 'source_button' ] = 'weak_id';// 连接数据库
dvwaDatabaseConnect();// 设置HTTP请求方法(默认为GET)
$method = 'GET';
// 配置不同级别对应的源文件
$vulnerabilityFile = '';// 根据安全级别Cookie值选择不同的实现文件
switch( $_COOKIE[ 'security' ] ) {case 'low':// 低安全级别:使用易预测的会话ID生成算法$vulnerabilityFile = 'low.php';break;case 'medium':// 中安全级别:部分增强的会话ID生成算法$vulnerabilityFile = 'medium.php';break;case 'high':// 高安全级别:进一步增强的会话ID生成算法$vulnerabilityFile = 'high.php';break;default:// 安全模式:使用安全的会话ID生成算法$vulnerabilityFile = 'impossible.php';$method = 'POST';break;
}// 引入选定的实现文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/weak_id/source/{$vulnerabilityFile}";// 构建页面主体内容,包含说明文字和生成会话ID的按钮
$page[ 'body' ] .= <<<EOF
<div class="body_padded"><h1>Vulnerability: Weak Session IDs</h1><p>This page will set a new cookie called dvwaSession each time the button is clicked.<br /></p><form method="post"><input type="submit" value="Generate" /></form>
$htmlEOF;/*
Maybe display this, don't think it is needed though
if (isset ($cookie_value)) {$page[ 'body' ] .= <<<EOFThe new cookie value is $cookie_value
EOF;
}
*/// 输出最终HTML页面
dvwaHtmlEcho( $page );?>
2、impossible.php
进入DVWA靶场Weak Session IDs的source源码目录,找到impossible.php源码,分析其为何能让这一关卡名为不可能实现Weak Session IDs渗透。
打开源码impossible.php,如下所示。
详细注释后的impossible.php源码如下所示,impossible.php 在接收 POST 请求时,通过 sha1 哈希处理随机数、时间戳与固定字符串的拼接结果生成高随机性会话 ID,设置为 dvwaSession cookie,限定 1 小时有效期、特定路径和域名,且仅 HTTPS 传输并禁止 JS 访问,实现安全会话管理。
<?php
// 初始化HTML输出变量
$html = "";
// 检查请求方法是否为POST
if ($_SERVER['REQUEST_METHOD'] == "POST") {// 生成会话ID:使用sha1哈希函数处理随机数、时间戳和固定字符串$cookie_value = sha1(mt_rand() . time() . "Impossible");// 设置名为dvwaSession的Cookiesetcookie("dvwaSession", // Cookie名称$cookie_value, // Cookie值(即会话ID)time() + 3600, // 过期时间:当前时间+1小时"/vulnerabilities/weak_id/", // 作用路径$_SERVER['HTTP_HOST'], // 作用域名(当前主机)true, // 仅通过HTTPS传输(Secure属性)true // 禁止JavaScript访问(HttpOnly属性));
}
?>
-
会话 ID 生成:
- 当接收到 POST 请求时,生成不可预测的会话 ID(
dvwaSession
) - 生成方式:通过
mt_rand()
(随机数)+time()
(当前时间戳)+ 固定字符串 "Impossible" 拼接后,再经sha1()
哈希处理
- 当接收到 POST 请求时,生成不可预测的会话 ID(
-
安全的 Cookie 设置:
- 限制作用路径:仅在
/vulnerabilities/weak_id/
路径下有效 - 绑定当前域名:防止跨域访问
- 强制 HTTPS 传输(
secure
属性为true
) - 启用 HttpOnly 保护:阻止客户端脚本(如 JavaScript)访问 Cookie,防范 XSS 攻击盗取会话
- 限制作用路径:仅在
-
防护目标:
- 通过高随机性的会话 ID 生成算法,彻底避免会话 ID 被预测或猜测
- 借助 Cookie 的安全属性,增强会话标识的传输和存储安全性,符合 OWASP 会话管理最佳实践
三、Weak Session IDs安全级别对比
impossible级别
相对于Low级别、Medium级别、High级别,四个级别的防范措施对比如下所示。
安全级别 | 会话 ID 生成方式 | Cookie 设置细节 | 安全性分析 |
---|---|---|---|
Low | 基于会话变量last_session_id 自增生成数字(如 1、2、3...) | 仅设置dvwaSession 键值,无有效期、路径、域名限制,无安全属性 | 完全可预测,无任何安全防护,极易被猜测 |
Medium | 使用当前时间戳(time() )作为会话 ID | 仅设置dvwaSession 键值,无有效期、路径、域名限制,无安全属性 | 看似随机,但连续生成时存在时间规律,易被推测 |
High | 将自增会话变量last_session_id_high 经md5 哈希处理生成 | 有效期 1 小时,限制路径/vulnerabilities/weak_id/ 和当前域名,未启用secure 和HttpOnly | 哈希增加复杂度,但源为可预测的递增数值,仍有被破解可能;缺少核心安全属性 |
Impossible | 拼接mt_rand() 随机数、时间戳和固定字符串后经sha1 哈希生成 | 有效期 1 小时,限制路径/vulnerabilities/weak_id/ 和当前域名,启用secure (仅 HTTPS)和HttpOnly (禁止 JS 访问) | 高随机性,结合严格的 Cookie 安全属性,难以被预测或盗取,安全性极高 |
四、impossible防范方法分析
impossible.php 的功能是在接收到 POST 请求时,通过将随机数、当前时间戳和固定字符串 “Impossible” 拼接后经 sha1 哈希处理生成高随机性的会话 ID(dvwaSession),并设置该 Cookie,其有效期为 1 小时,限制作用路径为/vulnerabilities/weak_id/
,绑定当前域名,且仅通过 HTTPS 传输并禁止 JavaScript 访问,以实现难以预测的安全会话管理。
防护机制 | 作用场景 | 核心目标 |
---|---|---|
高随机性会话 ID 生成(mt_rand() 随机数 + 时间戳 + 固定字符串拼接后经sha1 哈希) | 生成会话标识时 | 确保会话 ID 难以被预测或猜测,从源头杜绝通过 ID 推测入侵的可能 |
限制 Cookie 作用路径(/vulnerabilities/weak_id/ ) | Cookie 在服务器与客户端间传输及存储时 | 限定 Cookie 仅在特定路径下生效,减少跨路径访问风险 |
绑定当前域名($_SERVER['HTTP_HOST'] ) | Cookie 作用域控制 | 防止 Cookie 被其他域名访问,增强跨域安全性 |
设置有效期(1 小时,time()+3600 ) | 会话生命周期管理 | 避免会话长期有效导致的潜在风险,自动终止过期会话 |
启用secure 属性(仅通过 HTTPS 传输) | Cookie 传输过程中 | 确保 Cookie 在加密通道中传输,防止传输过程中被窃听 |
启用HttpOnly 属性(禁止 JavaScript 访问) | 客户端脚本环境中 | 防范 XSS 攻击通过脚本盗取 Cookie,保护会话标识安全 |
仅响应 POST 请求生成会话 ID | 处理会话 ID 生成的请求时 | 增加请求来源的验证门槛,减少非预期请求生成会话的风险 |
1、高随机性会话 ID 生成
通过mt_rand()
生成随机数、time()
获取当前时间戳,结合固定字符串 “Impossible” 拼接后,使用sha1()
哈希算法生成会话 ID。随机数确保每次生成的值无规律,时间戳增加实时性差异,哈希处理进一步混淆原始数据,使 ID 难以被预测或逆向破解,从源头杜绝通过猜测会话 ID 进行攻击的可能,大幅提升会话标识的唯一性和不可预测性。
$cookie_value = sha1(mt_rand() . time() . "Impossible");
2、严格的 Cookie 作用域限制
/vulnerabilities/weak_id/
限制 Cookie 仅在该路径下生效,$_SERVER['HTTP_HOST']
绑定当前域名。这种限制确保 Cookie 不会被其他路径或域名的脚本访问,缩小了 Cookie 的作用范围,减少了跨路径、跨域的安全风险,防止恶意网站通过跨域请求获取或操纵会话 Cookie,增强了 Cookie 的访问控制安全性
setcookie(..., "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], ...);
3、安全的传输与存储控制期
time()+3600
设置 Cookie 有效期为 1 小时,避免会话长期有效导致的风险;true
(第一个)启用secure
属性,强制 Cookie 仅通过 HTTPS 加密传输,防止传输过程中被窃听;true
(第二个)启用HttpOnly
属性,禁止 JavaScript 访问 Cookie,有效防范 XSS 攻击通过脚本盗取会话标识,从传输和客户端存储层面双重保护 Cookie 安全。
// weak_id/source/impossible.php 中的代码
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, // secure属性(仅HTTPS传输)true // HttpOnly属性(禁止JavaScript访问)
);