0x01 简介
当用户登录后,在服务器就会创建一个会话(session),叫做会话控制。接下来用户访问页面的时候就不用重新登录,只需要携带session去访问,服务器就知道用户身份了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。
0x02 Weak Session IDs-Low
F12发现浏览器dvwaSession的值,每次刷新都会+1,这就好搞了呀。
cookie
构造下攻击语句
weak_id/?PHPSESSID=rnopubb64ho3jvq2epe48gf352&dvwaSession=6&security=low
成功免密码登录看下源代码
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset ($_SESSION['last_session_id'])) {
$_SESSION['last_session_id'] = 0;
}
$_SESSION['last_session_id']++;
$cookie_value = $_SESSION['last_session_id'];
setcookie("dvwaSession", $cookie_value);
}
?>
0x03 Weak Session IDs-Medium
image.png
看起来应该是时间戳,转换看看
时间戳转换
证实是时间戳,那么伪造一个特定的时间戳,然后按特定的时间去访问即可。
看下源代码:
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
0x04 Weak Session IDs-High
image.png
发现high等级仍然是时间戳,看下源代码先,琢磨下。
<?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("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}
?>
原来是我的浏览器问题,不管怎么情况cookies,都加载不了high级别的cookie。这里只能从源代码分析了,是从0开始使用MD5加密,只要找到了规律,仍然是可以伪造的。
0x05 防范
- cookieonly 只允许cookie设置sessionid的值,不允许通过url重置
- sessionid定期销毁
- 增加token验证