DVWA靶场通关笔记-Weak Session IDs (Impossible级别)

目录

[一、Session ID](#一、Session ID)

二、源码分析

1、index.php

2、impossible.php

[三、Weak Session IDs安全级别对比](#三、Weak Session IDs安全级别对比)

四、impossible防范方法分析

[1、高随机性会话 ID 生成](#1、高随机性会话 ID 生成)

[2、严格的 Cookie 作用域限制](#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用于区分不同的用户,核心作用如下所示。

  1. 区分用户会话:当用户访问网站时,服务器会为其创建一个会话(Session),并生成唯一的 Session ID,通过 Cookie 存储在用户浏览器或 URL 中。后续请求携带该 ID,服务器即可识别用户身份,保持会话状态(如登录状态、购物车数据等)。
  2. 跨请求状态保持:由于默认情况下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>
$html

EOF;

/*
Maybe display this, don't think it is needed though
if (isset ($cookie_value)) {
	$page[ 'body' ] .= <<<EOF
	The 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的Cookie
    setcookie(
        "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()哈希处理
  • 安全的 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");

/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访问)
);
相关推荐
蒲公英eric24 天前
DVWA通关全记录:从漏洞复现到安全防御——总结篇
web安全·ai·dvwa·ai安全
蒲公英eric25 天前
从旧接口泄露到 OAuth 保护:DVWA API 模块完整漏洞分析教程
web安全·ai·ctf·dvwa·ai安全·api模块
蒲公英eric1 个月前
从直接重定向到白名单验证:DVWA 开放重定向模块完整漏洞分析教程
web安全·ai·ctf·dvwa·ai安全·开放重定向模块
蒲公英eric1 个月前
从弱加密到安全实现:DVWA 密码学模块完整漏洞分析教程
安全·web安全·ai·dvwa·ai安全·密码学模块
蒲公英eric1 个月前
从页面检查到功能验证:DVWA 授权绕过模块完整漏洞分析教程
web安全·ai·ctf·dvwa·ai安全·授权绕过模块
蒲公英eric1 个月前
从宽松策略到严格限制:DVWA CSP 绕过模块完整漏洞分析教程
web安全·ai·dvwa·ai安全·csp bypass·csp绕过
蒲公英eric1 个月前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
Sagittarius_A*2 个月前
Stored Cross Site Scripting(XSS)存储型跨站脚本漏洞:恶意数据持久化缺陷与 DVWA 分级绕过实战
前端·网络·web安全·网络安全·xss·dvwa
蒲公英eric2 个月前
从布尔盲注到参数化查询:DVWA SQL 盲注模块完整漏洞分析教程
sql·web安全·ai·dvwa·ai安全·sql 盲注