一,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['last_session_id'],则变量值设置为0,变量值加1;如果有变量$_SESSION['last_session_id'],则变量值加1。然后向用户发送名为dvwaSession,值为$_SESSION['last_session_id']的HTTP cookie。也就是说,名为dvwaSession的cookie的值从1开始每按一次Generate按钮递增1。setcookie()函数的作用是向客户端发送一个 HTTP cookie。
火狐浏览器 :点击“检查-存储-Cookie”
使用BP进行抓包(浏览器关掉从新打开)
点击Generate,BP进行抓包
再次点击
由此推断,Cookie是从1开始每按一次Generate递增1。
二,Medium
源码分析:
<?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);
}
?>
time()函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。
本关代码在用户按下Generate按钮之后,返回等于当前时间戳的dvwaSession值作为cookie
使用时间戳转换工具进行转换
三,Hight
源码分析:
<?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);
}
?>
这关dvwaSession的值也是从1开始递增,并经过md5加密的。
除此之外,从代码中可见,这关setcookie()函数的参数很多,我们来一个一个看一下。
setcookie():
setcookie ( string $name , string $value = "" , int $expires = 0 , string $path = "" , string $domain = "" , bool $secure = false , bool $httponly = false ) : bool
name:
cookie名称。这里是"dvwaSession"。
value:
cookie值,存储于用户电脑。这里是$cookie_value。
expires:
Cookie的过期时间。如果设置成零,或者忽略参数, Cookie 会在会话结束时过期(也就是关掉浏览器时)。这里是time()+3600,表示1小时后过期。
path:
Cookie 有效的服务器路径。 设置成 '/' 时,Cookie 对整个域名 domain 有效。 如果设置成 '/foo/', Cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效(比如 /foo/bar/)。 默认值是设置 Cookie 时的当前目录。这里是"/dvwa/vulnerabilities/weak_id/"。
domain:
Cookie 的有效域名/子域名。 设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')。这里是$_SERVER['HTTP_HOST']。
secure:
设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。这里是false,也就是说可以通过http传递cookie给客户端。
httponly:
设置成 true时,Cookie 仅可通过 HTTP 协议访问,无法通过类似 JavaScript 这样的脚本语言访问。可有效减少 XSS 攻击时的身份窃取行为。这里是false,也就是可以通过脚本语言访问cookie。
四,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);
}
?>
cookie值计算采用的是SHA-1散列函数,并且计算时还通过mt_rand()函数,在基于时间(time()函数)的基础上引入了随机数,因此不具备可预测性。除此之外,setcookie()函数的secure参数和httponly参数在本关都是true,增加了cookie的安全性。
由于设置了secure,因此该cookie仅可通过https传输,因此本关中客户端并没有收到服务器发来的cookie