DVWA 黑客攻防演练(七)Weak Session IDs

用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。用户拿到 session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。
但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了。
下面就去看看一些不太合理的 sessionId 创建方式(这部分有点傻,正常人都不会这样设计

页面也比较简单的,点击 generate 就会生成一个 session Id。

初级

生成的策略是很简单的。

就在 cookies 上 dvwaSessionId 上 +1s,这种是肯定不行的。太容易被人伪造

再看看代码

<?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,这样 dvwaSession 的冲突也太多了吧,都已经不是唯一了。

中级

第二种明显就是时间戳了。

依然是比较容易猜出来了
代码如下

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

高级

看起来很高级,应该是 md5 处理了一下。

于是我在 https://www.cmd5.com/ 这个网站,md5 解密了一下。

。。。

再发一次请求。。。

也就是说跟初级是一样的策略,只是换汤不换药,
后台代码是这样的

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

不可能

不可能级别使用随机数+时间戳+固定字符串(”Impossible”)进行 sha1 运算,作为 session Id,完全就不能猜测到。

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

也行吧,可以作为其中一种生成 session Id 的策略。

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