DVWA Weak Session IDs 弱会话ID通关教程
漏洞简介
Session ID 是服务器识别用户身份的凭证,一般存在 Cookie 里。如果这个 ID 太简单、能猜出来,那攻击者就能冒充别的用户,这就是会话劫持。
这关主要学怎么分析和利用弱会话 ID。
Session 基础知识
先搞清楚几个概念:
| 概念 | 说明 |
|---|---|
| Session | 服务器端存用户会话数据 |
| Session ID | 标识会话的唯一字符串 |
| Cookie | 浏览器存的小数据 |
| Session Cookie | Cookie 里存的 Session ID |
Low 级别
看代码:
1 | $session_id = 1; |
好家伙,Session ID 直接用自增数字,从 1 开始。
攻击方法
打开开发者工具看 Cookie:
1 | dvwaSession=1 |
每次点一下就 +1,这也太好猜了。
攻击者随便枚举就能猜到别人的 Session ID:
1 | curl -H "Cookie: dvwaSession=1" http://localhost:8080/... |
这安全性跟没有一样。
Medium 级别
Medium 用时间戳当 Session ID:
1 | $session_id = time(); |
攻击方法
看 Cookie:
1 | dvwaSession=1711683600 |
看着挺长,其实就是 Unix 时间戳:
1 | import datetime |
知道大概什么时候生成的,就能推算出 Session ID 范围,然后枚举。虽然比自增数字难搞一点,但还是能预测。
High 级别
High 用 mt_rand() 生成随机数:
1 | $session_id = mt_rand( 0, 9999999999 ); |
范围是 0 到 9999999999,看着挺大,但 mt_rand() 是伪随机,知道种子就能推算出序列。
攻击方法
收集一批 Session ID:
1 | dvwaSession=1234567890 |
用统计工具分析规律,或者直接暴力枚举常见值。虽然没那么容易,但理论上还是能搞。
Impossible 级别
Impossible 级别用加密安全的随机数:
1 | $session_id = sha1( uniqid( mt_rand( 0, 9999999999 ), true ) ); |
特点:
uniqid()加随机数生成唯一 IDsha1()哈希增加熵- 设置了
HttpOnly和Secure属性
这才是正确做法。
安全的 Session ID 特征
| 特征 | 说明 |
|---|---|
| 足够长 | 至少 128 位 |
| 随机 | 用加密安全随机数生成器 |
| 不可预测 | 猜不出来下一个 |
| 唯一 | 不同会话不同 ID |
| 有有效期 | 过期就失效 |
Cookie 安全属性
| 属性 | 作用 |
|---|---|
HttpOnly |
JS 读不到,防 XSS 偷 Cookie |
Secure |
只走 HTTPS |
SameSite |
限制跨站带 Cookie |
Path |
限制作用路径 |
Domain |
限制作用域名 |
小结
Session ID 安全要点:
- 用加密安全的随机数生成器,别用自增和时间戳
- ID 要够长,128 位起步
- Cookie 设置 HttpOnly 和 Secure
- 重要操作后重新生成 Session ID
- 设置合理的过期时间