DVWA | Weak Session IDs 弱会话标识符
目录
概念:
产生原因:
危害:
Low
Medium
High
Impossible
更强健的防御改进:
概念:
Weak Session IDs 弱会话标识符是指后端生成的会话ID(如Session ID、令牌)随机性不足或可预测,导致攻击者能够猜测或伪造合法用户的会话,从而绕过身份验证机制。
产生原因:
1、开发者使用了不安全的随机函数(例如php的mt_rand()、Java的Random类):
例如:
$session_id = sha1(mt_rand() . time()); // 结合时间戳和弱随机数
mt_rand()的随机性依赖种子值,若种子可预测(如基于时间),生成的ID易被破解。
2、会话ID生成逻辑简单:
使用可预测的参数如时间戳、自增ID:
$session_id = "SID_" . time() . "_" . $user_id; // 时间戳+用户ID
工具这可通过分析ID格式预测后续会话ID。
3、会话ID长度不足:
断会话ID比如16位一下的可能性空间下,易被暴力破解。
$session_id = substr(md5(time()), 0, 8); // 仅8位哈希值
4、未正确处理会话时期:
会话ID长期有效,或未在用户注销时及时失效
setcookie("session_id", $id, time() + 3600 * 24 * 30); // 有效期30天
危害:
-
会话劫持(Session Hijacking)
- 攻击者获取合法用户的会话 ID 后,可伪装成该用户访问系统,执行任意操作(如转账、修改信息)。
-
账户接管
- 若会话 ID 被泄露或猜测,攻击者可完全控制用户账户,无需密码。
-
横向权限提升
- 攻击者通过弱会话 ID 猜测其他用户的会话,可能获取管理员权限。
-
信息泄露
- 敏感信息(如个人数据、交易记录)可能通过被劫持的会话泄露。
-
CSRF 攻击增强
- 结合弱会话 ID,跨站请求伪造(CSRF)攻击更易成功,因为攻击者无需额外获取 CSRF 令牌。
Low
没有任何输入入口,我们抓包,复制抓到的cookie:
删除浏览器缓存,打开新的标签页,如图:
即可绕过登录页,直接进入靶场入口。
Medium
我们分析下源码:
<?php$html = "";if ($_SERVER['REQUEST_METHOD'] == "POST") {$cookie_value = time(); #把cookie字段的dvwaSession变成了time时间数字setcookie("dvwaSession", $cookie_value);
}
?>
这里是吧time()函数的值给到了dvwaSession
靶场都是php环境,我们用echo time()出当前的时间戳,
同样可以绕过登录页。
High
这里session id是6,我们利用php的echo md5('7')算出id大于6的MD5,小于MD5的话还是会弹出登录。
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);
}
?>
仅作学习。
这里与前面不同的是会话ID$cookie_value()做了复杂化,
$cookie_value = sha1(mt_rand() . time() . "Impossible");
mt_rand():生成一个随机数(使用Mersenne Twister 算法)
time():获取当前时间戳(精确到秒)
Impossible:固定字符,作为盐值增强安全性,可防止利用彩虹表直接破解哈希值。
以上字符串拼接并作sha1()生成40位哈希值作为会话ID。使得会话ID不在是规律化。
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true);
secure=true:确保Cookie仅在HTTPS连接中传输,防止中间人攻击。
httponly=true:防止JavaScript通过document.cookie获取Cookie,降低XSS风险。
更强健的防御改进:
$random_bytes = random_bytes(32); // 生成32字节随机数
$cookie_value = bin2hex($random_bytes); // 转换为16进制字符串
if (!isset($_COOKIE['dvwaSession']) && $_SERVER['REQUEST_METHOD'] == "POST") {// 仅在用户无有效会话时生成新ID$cookie_value = ...;setcookie(...);
}
setcookie("dvwaSession", $cookie_value, ['expires' => time() + 3600,'path' => '/','domain' => $_SERVER['HTTP_HOST'],'secure' => true,'httponly' => true,'samesite' => 'Lax' // 防止CSRF攻击]
);