Weak Session IDs(弱会话IDS)
靶场搭建推荐蓝易云服务器
Weak Session IDs:密码与证书等认证手段,一般仅仅用于登录(Login)的过程。
当登陆完成后,用户访问网站的页面,不可能每次浏览器请求页面时都再使用密码认证一次。因此,当认证完成后。就需要替换一个对用户透明的凭证。这个凭证就是SessionID。
当用户登陆完成后,在服务器端就会创建一个新的会话(Session),会话中会保存用户的状态和相关信息。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。
为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。SessionID一旦在生命周期内被窃取,就等同于账户失窃。同时由于SessionID是用户登录之后才持有的认证凭证,因此黑客不需要再攻击登陆过程(比如密码)。
Session利用的实质 :由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权
限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。
Session劫持 : 就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用
了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存
在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。
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);
}
?>
我们可以看见,这里session的值首先有一个判断函数!isset(),如果没有这个设置,则设置将第一次的session_id设置为0,而后1,2,3…n的累加。然后将这个值使用setcookie()函数,将这个值发送到浏览器端作为浏览器端的cookie。
这样有规律的session,只要通过推到,就能找出最新的session,然后直接绕过账号密码来进行连接seesion。
我们抓一下数据包
我们再刷新一次
会发现
这个变成了2
每刷一次+1
那么我们可以很简单的猜测出,dvwaSession参数下一个是这次的参数+1。
我们试试用
所以我们使用火狐浏览器的hackbar,构造Payload如下:
Cookie: dvwaSession=10; PHPSESSID=bka9pr82vked08q6cpeaj307l0; security=low
发现火狐浏览器没有登录过DVWA,但通过这个session,我们却绕过了输入账号密码的过程,直接登录进来。
Medium
代码分析
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
从服务器端的代码来看,将SessionID的值改成了当前的时间戳,看起来比low的随机了点,但是经过连续的收集后就很容易发现其中的规律:
时间戳 | 时间戳转换 | Unix timestamp (shijianchuo.net)
这样,我们就可以尝试构造payload
dvwaSession=1661148962; security=medium; PHPSESSID=ec6je5dg4j3ik84l9pk7pk7lk1
在火狐浏览器使用hackbar进行提交尝试。
我们发现,在这个没有进行过账号密码登录认证的浏览器上,使用cookie直接绕过了身份认证过程,进入了后面的界面
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);
}
?>
这里,我们可以看见。首先使用!isset()函数对session变量进行检查,如果没有进行赋值。
则设置为0,然后每一次都递增1。
然后将session变量进行MD5加密后赋值为cookie_value变量。
最终,将 cookie_value这个值发送给浏览器作为cookie。
这里进行哈希加密处理,但初始的值始终是从0开始这种形式作为cookie。在抓包的时候虽然md5加密后的值不容易发现其规律,但若是通过一定的思考,将0,1,2…n进行md5加密后再与cookie碰撞,依旧可以发现其中的规律。猜测出cookie的值,然后重复low级别的步骤,即可成功绕过。这里的操作除了需要将初始值进行md5加密,其他操作与low级别一样。
high级别使用了PHP setcookie()函数,来设置cookie:
setcookie(name,value,expire,path,domain,secure,httponly)
参数 描述
name 必需。规定cookie的名称。
value 必需。规定cookie的值。
expire 可选。规定cookie的有效期。
path 可选。规定cookie的服务器路径。
domain 可选。规定cookie的域名。
secure 可选。规定是否通过安全的HTTPS连接来传输cookie。
httponly 可选。规定是否Cookie仅可通过HTTP协议访问。