一、 Session IDs简介
HTTP协议是无连接的协议,当客户端访问通过HTTP协议访问服务器时,服务器无法确认访问者身份。这会导致一系列的问题,比如无法判断是哪个用户登录或者无法面向用户提供差异化服务,于是session ID上场了,用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。一个Session ID就对应一个客户端,用户拿到session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。但是 session id 过于简单(Weak Session IDs)就会容易被人伪造,根本都不需要知道用户的密码就能登录服务器。
一、 Low
1、客户端代码
<?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);
}
?>
2、漏洞分析
可以看到,Low级别的代码cookie产生策略是:在上一个cookie值的基础上加一。当用户访问服务器的时候,Low级别的代码会先检查服务器是否存在名称为"last_session_id"的session,如果存在,取出其值,自加一后赋值给名称为"dvwaSession"的cookie。
3、漏洞利用
- 使用浏览器A的登录访问dvwa的Weak Session IDs模块,点击generate,使用burpsuite拦截请求,复制url和cookie。
- 打开浏览器B,使用hackbar软件,构造url和cookie,点击execute重放请求,可以看到,浏览器B成功登录dvwa。
三、 Medium
1、客户端代码
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
2、漏洞分析
Medium级别的代码以当前时间作为cookie值。
3、漏洞利用
过程和Low级别漏洞利用相同,不再累述。
四、 High
1、客户端代码
<?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);
}
?>
2、漏洞分析
High级别的代码cookie产生策略和Low级别类似,只不过对值进行了md5加密。
3、漏洞利用
过程和Low级别漏洞利用相同,不再累述。
五、 Impossible
1、客户端代码
<?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);
}
?>
2、漏洞分析
mt_rand():返回一个随机整数
sha1(str):返回字符串str的sha-1散列值
可以看到,impossible代码以"随机值+当前时间+固定字符串"的散列值作为cookie值。
由于不知道产生的随机数是什么,所以不存在漏洞。