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——1→2→3→4...
由此我们推断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 |
|
第2次 | 2 |
|
第3次 | 3 |
|
我逐渐开始理解一切,虽然session变成了我们不认识的样子
但我们针对这个漏洞的流程大体不变
- 获取当前 Cookie 值
- 知道他的加密方式,用 MD5 字典/彩虹表反查(或直接枚举 1-1000)
- 得到当前数字后,+1预测下一个 Cookie
- 伪造下一个用户的会话
只要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 必须满足:
- 不可预测→ 使用
random_bytes()或/dev/urandom - 足够长→ ≥ 128 位(32字节十六进制 = 256位)
- 仅通过 Cookie 传输→ 禁止 URL 传递
- 加密传输→ Secure 标志 + HTTPS
- 防窃取→ HttpOnly 标志
- 防 CSRF→ SameSite 标志
- 服务端强校验→ 绑定用户、IP(可选)、过期时间
- 定期更换→ 登录、权限变更时重新生成