DVWA靶场实战(九)——Weak Session IDS

时间:2023-01-23 07:10:13

九、Weak Session IDS:

1.漏洞原理:

  Weak Session IDS也叫做弱会话,当用户登录后,在服务器就会创造一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问。

  SessionID作为特定用户访问站站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易的获取访问控制权,无需登录直接进入特定用户界面,进而进行其他操作。

  用户访问服务器的时候,在服务器端会创造一个新的会话(session),会话中会保存用户的状态和相关信息,用于标识用户。

  服务器端维护所有在线用户的session,此时认证,只需要知道哪个是用户在浏览器当前的页面即可。为了告诉服务器应该用一个session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到SessionID就会加密保存到cookie上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就相当于用户失窃。

2.Session:

Session利用的实质:由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登录过程(比如密码),就可以轻易获取访问权限,无需登录密码就可以直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等。

Session劫持:就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户有效的Session。如果SessionID是保在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。

3.攻击步骤:

(1)目标用户需要先登录站点;

(2)登录成功后,该用户会得到站点提供的一个会话标识SessionID;

(3)攻击者通过某种攻击手段捕获SessionID;

(4)攻击者通过捕获到的SessionID访问站点即可获得目标用户合法会话。

4.获取Session的几种方法:

(1)暴力破解:尝试各种SessionID,直到破解为止;

(2)预测:如果SessionID使用非随机的方式产生,那么就有可能计算出来。

(3)窃取:使用网络嗅探,XSS攻击等方式获取。

5.防御方式:

(1)更改Session名称:PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。

(2)关闭透明化SessionID:透明化SessionID指当浏览器中的HTTP请求没有使用Cookie来存放SessionID时,SessionID则使用URL来传递。

(3)设置HttpOnly通过设置Cookie的HttpOnly为true,可以防止客户端访问这个Cookie,从而有效的防止XSS攻击。

(4)关闭所有的phpinfo类dump request信息的页面。

(5)使用User-Agent检测请求的一致性:但有专家警告不要依赖于检查User-Agent的一致性。这里是因为服务器群集中的HTTP的代理服务器会对User-Agent进行编辑,而本群集中的多个代理服务器在编辑该值时可能会不一致。

(6)加入Token校验:同样是用于检测请求的一致性,给攻击者制造一些麻烦,使攻击者即使获取了SessionID,也无法进行破坏,减少对系统造成的损失。但Token需要存放在客户端,如果攻击者有办法获取到SessionID,那么也同样可以获取到Token。

6.实战:

(1)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级别还是没有什么防护。

  开始进行攻击,我们打开BurpSuite,我们开始发包然后进行尝试。

DVWA靶场实战(九)——Weak Session IDS                

  我们这里可以看见Cookie这一栏,“Cookie: PHPSESSID=1fa3jls5mq9ok54q3l4j44u0q1; security=low”,重新打开一个没有Cookie的账户,复制进去就可以登入。

(2)Medium:

  代码分析:

<?php

$html = "";

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

  我们看这个级别的代码,可以知道这里是通过时间戳来生成session的,所以我们这里利用时间戳转换器来转换就可以了。

  我们开始攻击,这里提供一个时间戳转换器的网址:https://tool.lu/timestamp/

  与Low等级相同,我们找到Cookie,然后截包将时间戳,修改为现在就可以攻击成功了。 DVWA靶场实战(九)——Weak Session IDS

(3)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);
}

?> 

  这里我们可以看见使用了md5进行了加密。

  所以我们这里开始攻击,使用md5解密,发现从零开始的整数进行加密,设置拆解后构造的SessionID,可以直接免密登录。

(4)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);
}
?> 

  我们这里查看代码SessionID作为起始值。