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_highmd5哈希处理生成 有效期 1 小时,限制路径/vulnerabilities/weak_id/和当前域名,未启用secureHttpOnly 哈希增加复杂度,但源为可预测的递增数值,仍有被破解可能;缺少核心安全属性
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访问)
);
相关推荐
mooyuan天天2 个月前
DVWA靶场通关笔记-存储型XSS(Stored Medium级别)
xss·xss漏洞·存储型xss·dvwa靶场
mooyuan天天2 个月前
DVWA靶场通关笔记-XSS DOM(Medium级别)
xss·dom型xss·xss漏洞·dvwa靶场
mooyuan天天2 个月前
DVWA靶场通关笔记-弱会话IDs(Weak Session IDs High级别)
web安全·dvwa靶场·弱会话id
mooyuan天天2 个月前
DVWA靶场通关笔记-XSS DOM(High级别)
xss·dom型xss·xss漏洞·dvwa靶场
mooyuan天天2 个月前
DVWA靶场通关笔记-反射型XSS(Reflected Low级别)
xss·反射型xss·xss漏洞·dvwa靶场
mooyuan天天2 个月前
DVWA靶场通关笔记-SQL盲注(SQL Injection Blind Medium级别)
sql注入·sql盲注·sql注入漏洞·布尔盲注·dvwa靶场
mooyuan天天2 个月前
DVWA靶场通关笔记-文件上传(Medium级别)
web安全·文件上传·文件上传漏洞·dvwa靶场·文件上传mime
Le_ee3 个月前
dvwa7——SQL Injection
数据库·sql·网络安全·靶场·token·dvwa
Le_ee3 个月前
dvwa5——File Upload
网络安全·靶场·php·靶机·dvwa