用戶訪問服務器的時候,一般服務器都會分配一個身份證 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值會根據服務器的硬件信息計算得來),如果出現沖突就會再生成一個。