DVWA靶场——Weak Session IDs(弱会话)
2026/7/25 19:48:19 网站建设 项目流程

Weak Session IDs(弱会话),用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。用户拿到 session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。

但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了。

在开始攻击之前,需要了解以下概念:

1.Cookie 存储在浏览器中的键值对数据,每次请求会自动携带

2.PHPSESSID PHP默认的会话ID名称,由服务器自动生成

3.dvwaSession 本模块自定义的Cookie名称,用于演示弱会话ID的生成

4.Cookie劫持 攻击者获取他人的Cookie后,使用该Cookie冒充他人身份

low

我们首先进入Weak Session IDs模块

点击Generate按钮,打开开发者工具,观察到生成的Session ID值是1,连续点击Session ID增加1——1234...

由此我们推断ID生成是有规律的

源码分析

<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { if (!isset ($_SESSION['last_session_id'])) { $_SESSION['last_session_id'] = 0; } //服务器每次生成的session_id加1给客户端 $_SESSION['last_session_id']++; $cookie_value = $_SESSION['last_session_id']; setcookie("dvwaSession", $cookie_value); } ?>

Session ID的生成逻辑是从0开始每次加1——这是一个完全可预测的序列。攻击者只需要知道当前用户的Session ID,就能轻松推算出下一个或前一个用户的ID

接下来我们尝试利用这个漏洞,实现具体的攻击

我们首先通过某种方式(如XSS、网络嗅探)获取了某个用户的dvwaSession值,然后使用该值冒充该用户。

这里我们需要用到火狐浏览器的hackbar插件。打开火狐浏览器,找到右上角的扩展管理

搜索下载hackbar并启用

然后我们来到DVWA靶场的登录界面,可以看到我是没有登陆过的。F12打开开发者工具,进入hackbar,输入我们需要访问的网页,手动设置Cookie dvwaSession=4,外加已登录用户的PHPSESSID(PHPSESSID 是登录门票,攻击全程必须携带当前浏览器的原值,不能替换、不能删除;dvwaSession 是漏洞靶标,只修改这一段数字实现登录绕过),然后访问DVWA的任意页面。由于服务器只检查dvwaSession的值来识别用户,攻击者无需密码即可直接登录目标用户的账户

可以看到登陆成功了

Medium

点击Generate按钮,这看起来session是一串随机的10位数字

再多点击几次呢,发现,好像都是后面三位数在改变

似乎没有思路了,我们先看看源代码

源码分析

<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = time(); //返回当前时间的 Unix 时间戳,并格式化为日期: time() 函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数 setcookie("dvwaSession", $cookie_value); } ?>

这个级别使用当前时间戳作为Session ID。虽然时间戳看起来是一个随机的数字,但它的生成逻辑是完全确定的——攻击者只需要知道Session ID生成的大致时间范围,就可以精确推算出该ID的值。

这里解释一个概念

时间戳(Timestamp),在计算机和DVWA这个靶场里,特指Unix 时间戳(Unix Timestamp)

用最通俗的话说:时间戳就是“从 1970年1月1日 0点0分0秒(格林威治时间)开始,到现在这一刻,总共走过的秒数

两个特点

  • 它是全球唯一的参考点:全世界所有的电脑,只要时间校准准确,在同一个时刻调用time(),得到的数字是完全一样的。
  • 它是“秒级”递增的:虽然它不是每次都 +1(因为你不一定每秒都点击),但它严格遵循时间线性增长。这一秒是 A,下一秒绝对是 A+1。

因此,我们只要知道其他用户大概在什么时间生成了Session ID,就可以推算出该用户的Session ID

时间戳转换工具(如https://tool.lu/timestamp/

例如,如果攻击者知道管理员在2026-08-08 12:00:00登录了系统,那么管理员的Session ID大约为1786161600(对应的时间戳)。

我们使用推算出的时间戳作为Cookie值,即可冒充管理员

没毛,成功登录进来了

High

Session ID显示为一个字符串,我们还是多点击几次generate看看是否有规律

这样似乎看不出任何规律,不妨先看看源代码

源码分析

<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { if (!isset ($_SESSION['last_session_id_high'])) { $_SESSION['last_session_id_high'] = 0; } $_SESSION['last_session_id_high']++; $cookie_value = md5($_SESSION['last_session_id_high']); //setcookie(name,value,expire,path,domain,secure,httponly) 参数 描述 name 必需。规定cookie的名称。 value 必需。规定cookie的值。 expire 可选。规定cookie的有效期。 path 可选。规定cookie的服务器路径。 domain 可选。规定cookie的域名。 secure 可选。规定是否通过安全的HTTPS连接来传输cookie。 httponly 可选。规定是否Cookie仅可通过HTTP协议访问。 setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false); } ?>

好了,一目了然,使用了MD5哈希算法。

这是一个自增数字:每次 POST 请求都 +1

我们把刚刚拿到的加密后的session拿去解密看看(MD5破解网站https://www.cmd5.com/

请求次数

Session ID

MD5 值

第1次

1

c4ca4238a0b923820dcc509a6f75849b

第2次

2

c81e728d9d4c2f636f067f89cc14862c

第3次

3

eccbc87e4b5ce2fe28308fd9f2a7baf3

我逐渐开始理解一切,虽然session变成了我们不认识的样子

但我们针对这个漏洞的流程大体不变

  1. 获取当前 Cookie 值
  2. 知道他的加密方式,用 MD5 字典/彩虹表反查(或直接枚举 1-1000)
  3. 得到当前数字后,+1预测下一个 Cookie
  4. 伪造下一个用户的会话

只要cookie可以被我们预测,实施攻击就很简单,这也是这关叫做"Weak Session ID"(弱会话ID)的原因

Impossible

<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { //随机数+时间戳+固定字符串"Impossible",再进行sha1运算 $cookie_value = sha1(mt_rand() . time() . "Impossible"); setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true); } ?>

$cookie_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,完全不能猜测到dvwaSession的值。

Session ID 必须满足:

  1. 不可预测→ 使用random_bytes()/dev/urandom
  2. 足够长→ ≥ 128 位(32字节十六进制 = 256位)
  3. 仅通过 Cookie 传输→ 禁止 URL 传递
  4. 加密传输→ Secure 标志 + HTTPS
  5. 防窃取→ HttpOnly 标志
  6. 防 CSRF→ SameSite 标志
  7. 服务端强校验→ 绑定用户、IP(可选)、过期时间
  8. 定期更换→ 登录、权限变更时重新生成

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询