用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。
用户拿到session id就会加密后保存到 cookies 上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。
SessionID一旦在生命周期内被窃取,就等同于账户失窃。同时由于SessionID是用户登录之后才持有的认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等等。
Session劫持 就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。
看实例
low
界面很简单,点击按钮,就可以生成session id
只是个简单例子,了解原理。
看一下源码
<?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);
}
?>
如果last_session_id不存在就创建,值为0。
然后值加1,然后保存为cookie,名称dvwaSession。
这个和截取的http信息也是完全一致的。
只是说明session id和cookie是怎么回事情,真实环境不可能有人这么干。
medium
继续看代码
<?php
$html = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
cookie的值变成了时间戳。
界面上运行一下,在开发者工具中获得信息如下
Set-Cookie:"dvwaSession=1552628479"
1552628479是UNIX时间戳,转换一下,其实就是2019-03-15 13:41:19。
稍微有点经验的,一眼就能看出来,没有什么秘密可言。
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);
}
?>
咋一看,和low差不多。只是last_session_id_high用了md5加密。然后cookie设置更加复杂了。
setcookie()函数 http://www.runoob.com/php/func-http-setcookie.html
语法如下
setcookie(name,value,expire,path,domain,secure)
其实也就是多了一个cookie过期时间,1个小时。
运行界面,观察如下:
Set-Cookie:"dvwaSession=c4ca4238a0b923820dcc509a6f75849b; expires=Fri, 15-Mar-2019 07:20:42 GMT; Max-Age=3600; path=/vulnerabilities/weak_id/; domain=172.25.100.100"
找个在线的网站 https://www.cmd5.com/ 还原一下md5加密的c4ca4238a0b923820dcc509a6f75849b
只是包装的好看了一点,其实和low是一样的。
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值= sha1(随机数+时间戳+固定字符串“impossbile”)
sha1函数参见http://www.w3school.com.cn/php/func_string_sha1.asp
知道该怎么做才能减少session id被破解了吧。