DVWA靶场通关笔记-弱会话IDs(Weak Session IDs Low级别)

目录

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

二、代码审计(Low级别)

1、配置security为Low级别

2、源码分析

(1)index.php

(2)low.php

(3)渗透思路

三、渗透实战

1、点击生成会话ID

2、burpsuite抓包分析

[3、预测后续会话 ID](#3、预测后续会话 ID)


DVWA(Damn Vulnerable Web Application)中的 弱会话Weak Session IDs关卡是用于练习和演示 弱会话ID的不同场景,不同安全等级存在不同的脆弱点和绕过方法,本小节对低等级别的关卡进行渗透实战。

一、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)、JSESSIONID(Java)等的 Cookie 传输,浏览器自动携带。以DVWA的盲注关卡Impossible级别为例,使用bp抓包,如下报文的sesssion id使用PHPSESSID存储,值为tssqfshe2838kcg5nbkf4464u3,具体如下所示。

二、代码审计(Low级别)

1、配置security为Low级别

进入到脆弱的id关卡,完整URL地址具体如下所示。

复制代码
http://192.168.59.1/dvwa/vulnerabilities/weak_id/

2、源码分析

(1)index.php

进入DVWA靶场源目录,找到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)low.php

进入DVWA靶场源目录,找到low.php源码。

打开源码low.php,分析可知这段代码实现了一个简单的会话 ID 生成机制功能,如下所示。

代码的功能如下所示。

  • 通过会话变量last_session_id维护一个自增计数器。
  • 每次 POST 请求时,计数器加 1 并将新值作为会话 ID。
  • 将会话 ID 存储在名为dvwaSession的 Cookie 中。
  • 未设置 Cookie 的安全属性(如 Secure、HttpOnly)和有效期。

详细注释后的代码如下所示。

复制代码
<?php
// 初始化HTML输出变量
$html = "";

// 检查是否为POST请求(用户点击生成按钮时触发)
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    // 如果会话中不存在上一次的会话ID记录,则初始化为0
    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    
    // 自增会话计数器,生成新的会话ID
    $_SESSION['last_session_id']++;
    
    // 将计数器值作为会话ID存储到Cookie中
    $cookie_value = $_SESSION['last_session_id'];
    
    // 设置名为dvwaSession的Cookie,默认有效期为浏览器关闭
    // 未设置安全属性(如Secure、HttpOnly)
    setcookie("dvwaSession", $cookie_value);
}
?>

(3)渗透思路

安全机制分析

核心问题 :具有弱会话 ID(Predictable Session ID)攻击可能性。

  • 会话 ID 可预测 :使用简单的自增计数器生成会话 ID,攻击者可轻易预测后续会话 ID。
  • 缺乏随机性 :未引入随机因素(如时间戳、随机数),完全确定性生成。
  • 安全属性缺失
    • 未设置Secure属性,Cookie 可通过 HTTP 明文传输。
    • 未设置HttpOnly属性,Cookie 可被 JavaScript 读取(易受 XSS 攻击)。
    • 未设置有效期,默认为会话 Cookie(浏览器关闭失效)。

影响 :攻击者可通过枚举会话 ID 值,伪造合法用户会话,获取未授权访问权限。

三、渗透实战

1、点击生成会话ID

bp开启拦截功能,进入靶场的脆弱的session id关卡,点击生成会话id三次,如下所示。

2、burpsuite抓包分析

第1个报文的session id为dvwaSession=1,如下图所示。

第2个报文的session id为dvwaSession=2,为第1个报文的dvwaSession加1,如下图所示。

第3个报文的session id为dvwaSession=3,为第2个报文的dvwaSession加1,如下图所示。

第4个报文的session id为dvwaSession=4,为第3个报文的dvwaSession加1,如下图所示。

3、预测后续会话 ID

根据第2步bp抓包我们得知dvwaSession这个cookie中的变量是DVWA靶场在弱会话id关卡场景中用来演示的Session ID,每次点击generate后值会刷新增加1,这与源码分析一致(如果没有session,就将其初始化设置为0,随后每点击一次生成就加1),如下所示。

复制代码
    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    
    // 自增会话计数器,生成新的会话ID
    $_SESSION['last_session_id']++;
    
    // 将计数器值作为会话ID存储到Cookie中
    $cookie_value = $_SESSION['last_session_id'];

由于会话 ID 是简单自增的,攻击者可预测下一个会话 ID 为 5、6、7、8、...。在已知用户会话 ID 范围后,攻击者可通过修改自己的 Cookie 值为有效会话 ID。例如,假设用户当前会话 ID 为 1000,攻击者将自己的 Cookie 设置为dvwaSession=1000,若系统未验证会话 ID 的合法性,攻击者即可冒充该用户。