[网络安全] DVWA之 Weak Session IDs -弱会话- 攻击姿势及解题详析合集
会话ID及弱会话ID
会话 ID(Session ID)是用于标识用户与服务器之间会话的唯一标识符。它通常在用户身份验证成功后由服务器生成,并通过 Cookie 或其他方式存储在客户端。会话 ID 在整个会话期间用于验证用户身份和维护会话状态。
弱会话 ID(Weak Session ID)指的是具有可预测性、易猜测或容易被攻击者破解的会话 ID。这意味着攻击者可以通过猜测会话 ID 的值或使用可预测的模式,获取合法用户的会话标识并冒充该用户。
以下是弱会话 ID 带来的风险:
-
会话劫持攻击:攻击者通过猜测或推算出会话 ID,获取合法用户的会话标识,并冒充该用户进行恶意操作。攻击者可以访问受限资源、执行未经授权的操作,或者偷取用户的敏感信息。
-
会话固定攻击:攻击者通过伪造会话 ID,欺骗用户访问恶意网站或点击恶意链接,进而获取用户的合法会话标识。一旦攻击者获得有效的会话 ID,就可以绕过身份验证,并以合法用户的身份进行操作。
-
会话劫持漏洞的利用:在存在会话劫持漏洞的应用程序中,攻击者可以使用弱会话 ID 来加速或扩大会话劫持攻击。因为会话 ID 是直接用于会话管理和验证用户身份的关键数据,弱会话 ID 更容易被攻击者滥用。
这些风险可能导致用户隐私泄露、身份冒充、未经授权的访问等安全问题。
Low level
源代码
<?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);
}
?>
逻辑如下:
- 如果当前请求的请求方法为 POST($_SERVER['REQUEST_METHOD'] == "POST"),则执行以下操作:
- 检查是否存在名为 $_SESSION['last_session_id'] 的会话变量。如果不存在,则将其初始化为 0。
- 将 $_SESSION['last_session_id'] 的值加 1。
- 将加 1 后的值赋给变量 $cookie_value。
- 使用 setcookie() 函数设置名为 dvwaSession 的 Cookie,并将其值设置为 $cookie_value。
姿势
思路:在请求头中找到会话ID,进行POST即可实现登录。
如上图,Cookie为:dvwaSession=22; security=low; PHPSESSID=ginokgirpbmi0nb4k1j6dg81fg
接着清除浏览器中该页面缓存,重新打开浏览器使用hackbar进行execute
如下图,输入URL及Cookie:
成功登录:
也可使用Burp抓包获取Cookie:
代码中使用的会话 ID 是通过递增的方式生成的,这种生成方式容易被攻击者猜测或推测出合法的会话标识,从而增加会话劫持攻击的风险。
Medium level
源代码
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
首先,定义了一个空字符串变量 $html
然后,通过检查 $_SERVER['REQUEST_METHOD'] 的值是否为 "POST",判断当前请求的方法是否为 POST 方法。
如果当前请求方法为 POST,将会执行以下操作:
-
通过 time() 函数生成一个时间戳作为 Cookie 的值,并将其赋给变量 $cookie_value。
-
使用名为 "dvwaSession" 的 Cookie 名称,将变量 $cookie_value 的值设置为 Cookie 的值。
姿势
由代码审计可知,该登录模块基于时间戳生成会话
具体姿势如下:
- 抓包得到时间戳
发送至repeater并发包:
得到时间戳:1686834151
- 使用转换工具进行时间戳转换:
潜在风险:
-
会话劫持:如果攻击者能够预测受害者在特定时间点进行点击,攻击者可以在该时间点进行会话劫持攻击。通过在特定时间点之前获取 Cookie 的值,并在该时间点之后使用 Cookie 进行会话劫持,攻击者可以获得未经授权的访问权限。
-
计时攻击:某些应用程序可能会根据 Cookie 中的时间戳执行特定的操作或授予特定的权限。攻击者可以利用时间戳漏洞,通过在特定时间点操纵 Cookie 的值来触发计时攻击。
例如,在某个特定时间点之后,攻击者可能会获得更高级别的权限或执行特定的恶意操作。
High level
源代码
<?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);
}
?>
-
首先,定义了一个空字符串变量
$html
-
然后,通过检查
$_SERVER['REQUEST_METHOD']
的值是否为 "POST",判断当前请求的方法是否为 POST 方法。 -
如果当前请求方法为 POST,将会执行以下操作:
-
首先,通过检查
$_SESSION['last_session_id_high']
是否已设置来判断上一次会话高位 ID 的值。 -
如果
$_SESSION['last_session_id_high']
未设置,则将其赋值为 0。 -
接着,将
$_SESSION['last_session_id_high']
的值递增 1,并将结果赋给$cookie_value
。 -
使用
md5
函数对$cookie_value
进行处理,并将结果赋给$cookie_value
。 -
使用名为 "dvwaSession" 的 Cookie 名称,将
$cookie_value
的值设置为 Cookie 的值。 -
设置 Cookie 的过期时间为当前时间加上 3600 秒(1 小时),路径为 "/vulnerabilities/weak_id/",域名为
$_SERVER['HTTP_HOST']
的值,禁用安全标志和 HTTPOnly 标志。
-
姿势
思路:抓包后将Cookie进行md5解密,再构造Cookie进行md5加密,即可实现会话劫持
- 抓包获取Cookie
发送至Repeater并发包:
- 解密Cookie
- 构造Cookie并进行加密
由于$cookie_value以1为间隔递增,故可获得经md5加密后得到的Cookie
Impossible level
源代码
<?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);
}
?>
采用了 mt_rand() 函数生成随机数,结合当前时间和固定字符串 "Impossible",然后使用 sha1 函数对其进行哈希处理。
通过使用更复杂的生成算法,可以增加攻击者猜测和劫持会话的难度。启用安全标志和 HTTPOnly 标志能够增加 Cookie 的安全性,使其更难以被窃取或篡改。
总结
以上为[网络安全] DVWA之 Weak Session IDs -弱会话- 攻击姿势及解题详析合集,涉及会话session
、PHP代码审计
等相关知识。