欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Weak Session IDs

程序员文章站 2022-03-11 20:00:46
...

前言

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

 

 

Session ID 是什么?

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

服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使

用哪一个Session,浏览器需要把当前用户持有的Session ID告知服务器。用户拿到session id就会加密后保存到 cookies 上,

之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。

 

 

Session利用的实质 

由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权

限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。

  • Session劫持 :

Session劫持,  是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用

了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存

在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。

下面对弱会话IDs漏洞的四种不同等级进行分析:

 

 

  • 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 ID的做法:   先判断是否存在上一次请求的Session ID值, 如果没有则置为0;  反之将上一次的Session ID值+1,  然后作为此次的Session ID。 

点击一次Generate, 就产生了一个Session回话 (含cookie)。

 

漏洞利用

为了演示利用cookie登录的漏洞,  我们现在google chrome上登录dvwa, 并且可以看到页面的Cookie Session规律。

 Weak Session IDs

利用刚刚找到的Session规律,  将在google Chrome登录的Cookie (dvwaSession的值+1)作为payload:

dvwaSession=5; security=low; PHPSESSID=bnndu29o7au7fr6hfg143eb2vi

 我们打另一个游览器----Firefox Chrome,  登录刚刚的页面:

http://localhost/DVWA/vulnerabilities/weak_id/index.php

点击Execute,  然后抓包, 将cookie修改为刚刚的payload:

Weak Session IDs

Forward之后,  直接到目标界面, 绕过了界面登录:

Weak Session IDs

即在无登录认证的情况下,  攻击者通过恶意构造Cookie值以及Session ID值来登录界面。

 

 

  • Medium

服务端核心代码:

<?php

$html = "";

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

可以看到,  生成的cookie值是当前的时间戳。

 

漏洞利用

和上一题一样,  点击Generate之后可以看到Cookie值为一串数字: 

Weak Session IDs

多点击几次Generate, 发现以秒单位增加,  明显是时间戳:

Weak Session IDsWeak Session IDs

可以通过工具来转换时间戳:

Weak Session IDs

利用刚刚登录生成的Session ID:

Weak Session IDs

构造一下登录的payload: 

dvwaSession=1581229880; security=medium; PHPSESSID=bnndu29o7au7fr6hfg143eb2vi

打开另一个游览器---Firefox Chrome,  抓包,  修改cookie登录:

Weak Session IDs

登录成功:

Weak Session IDs

 

 

  • 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);
}

?>

可以看到,  服务端先查看是否存在上一次的Session ID,  不存在则置为0;  否则+1。

然后再+1后的Session Id值进行 md5 编码:

value 值:last_session_id_high 自增 1,再用 md5 加密
expire 值:当前时间再加一个小时
path 值:/vulnerabilities/weak_id/

 

漏洞利用

High级别不过是md5加密了Session ID值,  那么我们解密就是了。

抓包查看Session ID:

Weak Session IDs

用工具将其解密:

Weak Session IDs

多Generate, 解密几次, 发现服务器是对依次递增的Session ID值进行md5加密。

打开另一个游览器---FIrefox,  将Session ID的值md5加密:

Weak Session IDs

构造payload:

dvwaSession=eccbc87e4b5ce2fe28308fd9f2a7baf3; security=high; PHPSESSID=bnndu29o7au7fr6hfg143eb2vi

Weak Session IDs

forward即可登录成功。

 

 

  • 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_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,完全不能猜测到dvwaSession的值。

Tomcat 的 session id 值生成的策略,是一个随机数+时间+ jvm 的id值(jvm的id值会根据服务器的硬件信息计算得来),如果出现冲突就会再生成一个。

相关标签: DVWA