DVWA-Weak Session IDs (弱会话ID)
Session 是作用是它在web服务器上保持用户的状态信息,当前用户访问时,服务器会给每个用户分配一个唯一的session id,当访问其他程序时可以从用户的session中取出该用户的数据来确认用户身份。
Weak Session IDs(弱会话IDs)是由于服务器在生成session的规则简单,导致session在被劫持后,通过该session的身份可绕过登录直接访问服务器。
--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); } ?>
在low代码中,通过判断last_session_id是否已设置,如果未设置则将last_session_id置为0,如果已有last_session_id则每次累计+1,然后将session设置为cookie值。
第一次点击【Generate】生成的cookie里dvwaSession值如下:
再次点击【Generate】会将该session信息发送服务器,并在服务器端+1,再返回前端。如下:
也就是说下一次访问时将dvwaSession=2;PHPSESSID=9pgg42qeiapkoku6g1pss9fav7; security=low 带入访问http://192.168.52.132/vulnerabilities/weak_id/页面时,可以不用进行登录就能访问该页面信息。
正常情况,在未登录时,直接访问:http://192.168.52.132/vulnerabilities/weak_id/页面,会被重定向到登录页面,但是带上session信息,就可以正常访问weak_id页面。
未登录访问的情况:
用另一个浏览器访问:http://192.168.52.132/vulnerabilities/weak_id/页面,用burp suite 将请求拦截,然后将cookie信息修改dvwaSession=2。
访问成功
--medium级别:
服务器端代码:
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = time(); setcookie("dvwaSession", $cookie_value); } ?>
在medium 代码中dvwaSession的值由时间戳的形式生成。
跟之前操作一样,将请求拦截后,将dvwaSession设置为时间戳格式(在当前时间之后)。
访问成功:
--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); } ?>
在high代码中,将cookie中的session信息通过md5加密后再返回。
当前页面中的session信息如下:
Md5解密内容如下:
解密后发现每次请求也是累计+1,只不过将内容通过md5加密混淆而已。
那也就是说,在访问将dvwaSession中的值累计+1,然后通过md5加密后,在请求就能直接访问weak_id页面
先累计上次返回的session值,然后通过md5加密。
数值通过加密的md5后替换请求头中的dvwaSession的值。
访问成功:
--impossible级别:
服务器端代码:
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = sha1(mt_rand() . time() . "Impossible"); setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true); } ?>
在impossible中通过随机数+时间戳组合内容,然后再通过sha1进行加密,无法猜测session的内容。