DVWA Weak Session IDs 弱会话ID通关教程

漏洞简介

Session ID 是服务器识别用户身份的凭证,一般存在 Cookie 里。如果这个 ID 太简单、能猜出来,那攻击者就能冒充别的用户,这就是会话劫持。

这关主要学怎么分析和利用弱会话 ID。

Session 基础知识

先搞清楚几个概念:

概念 说明
Session 服务器端存用户会话数据
Session ID 标识会话的唯一字符串
Cookie 浏览器存的小数据
Session Cookie Cookie 里存的 Session ID

Low 级别

看代码:

1
2
$session_id = 1;
setcookie( 'dvwaSession', $session_id );

好家伙,Session ID 直接用自增数字,从 1 开始。

攻击方法

打开开发者工具看 Cookie:

1
2
3
dvwaSession=1
dvwaSession=2
dvwaSession=3

每次点一下就 +1,这也太好猜了。

攻击者随便枚举就能猜到别人的 Session ID:

1
curl -H "Cookie: dvwaSession=1" http://localhost:8080/...

这安全性跟没有一样。

Medium 级别

Medium 用时间戳当 Session ID:

1
2
$session_id = time();
setcookie( 'dvwaSession', $session_id );

攻击方法

看 Cookie:

1
2
dvwaSession=1711683600
dvwaSession=1711683605

看着挺长,其实就是 Unix 时间戳:

1
2
3
4
import datetime
timestamp = 1711683600
print(datetime.datetime.fromtimestamp(timestamp))
# 2024-03-29 10:00:00

知道大概什么时候生成的,就能推算出 Session ID 范围,然后枚举。虽然比自增数字难搞一点,但还是能预测。

High 级别

High 用 mt_rand() 生成随机数:

1
2
$session_id = mt_rand( 0, 9999999999 );
setcookie( 'dvwaSession', $session_id );

范围是 0 到 9999999999,看着挺大,但 mt_rand() 是伪随机,知道种子就能推算出序列。

攻击方法

收集一批 Session ID:

1
2
3
dvwaSession=1234567890
dvwaSession=9876543210
dvwaSession=5555555555

用统计工具分析规律,或者直接暴力枚举常见值。虽然没那么容易,但理论上还是能搞。

Impossible 级别

Impossible 级别用加密安全的随机数:

1
2
$session_id = sha1( uniqid( mt_rand( 0, 9999999999 ), true ) );
setcookie( 'dvwaSession', $session_id, time() + 3600, '/', '', true, true );

特点:

  1. uniqid() 加随机数生成唯一 ID
  2. sha1() 哈希增加熵
  3. 设置了 HttpOnlySecure 属性

这才是正确做法。

安全的 Session ID 特征

特征 说明
足够长 至少 128 位
随机 用加密安全随机数生成器
不可预测 猜不出来下一个
唯一 不同会话不同 ID
有有效期 过期就失效
属性 作用
HttpOnly JS 读不到,防 XSS 偷 Cookie
Secure 只走 HTTPS
SameSite 限制跨站带 Cookie
Path 限制作用路径
Domain 限制作用域名

小结

Session ID 安全要点:

  1. 用加密安全的随机数生成器,别用自增和时间戳
  2. ID 要够长,128 位起步
  3. Cookie 设置 HttpOnly 和 Secure
  4. 重要操作后重新生成 Session ID
  5. 设置合理的过期时间