DVWA Weak Session IDs

前言

当用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带session去访问。sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问权限,无需登录直接进入特定用户界面,进而进行其他操作。

用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到session id就会加密后保存到 cookies 上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。

Session利用的实质

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

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

LOW

分析

1
2
3
4
5
6
7
8
9
10
11
<?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判断中,如果last_session_id不存在就设置为0,否则就在上次session ID基础上加1.这样是非常脆弱的设置session方法,很容易被利用。

攻击测试

直接用bp抓包,可以清楚的看到dvwaSesion的cookie,每重放一次,dvwaSesion增加1;

使用hackbar构造payload如下,可以直接劫持登录;

1
dvwaSession=10; security=low; PHPSESSID=51qjt8oa8hiudhaaaobgfseaie

MEDIUM

分析

1
2
3
4
5
6
7
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>

分析:

基于时间戳生成dvwaSesion;

攻击测试

通过Hackbar中,使用hackbar构造payload如下,把dvwaSession的时间戳调整到现在时间,查看当前时间戳的网站https://tool.lu/timestamp/

1
dvwaSession=1605962273; security=medium; PHPSESSID=51qjt8oa8hiudhaaaobgfseaie

HIGH

分析

1
2
3
4
5
6
7
8
9
10
11
<?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);
}
?>

last_session_id_high进行了MD5加密,使用setcookie()函数设置cookie;

1
setcookie(name,value,expire,path,domain,secure,httponly)

参数:

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

攻击方式与LOW级别基本一致;

IMPOSSIBLE

分析

1
2
3
4
5
6
7
<?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的值;

参考

https://zhuanlan.zhihu.com/p/108345433