我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
一、session身份验证绕过漏洞与测试
1、session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 注意:session是存在于服务器里,而cookie是存在客户端。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个)(其实就是在检索一个session文件,里面存储在内容)(这个session文件的命名格式为sess_sessionid号),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。
session一般用于登录验证。session的机制,是会在浏览器生成一个cookie session_id,也会在服务器里生产一个session id对应的session文件。比如,在做身份证认证的时候就会在这个服务器里的session id对应的文件写入要验证的内容。
在php里 session的存放位置是 在php.ini里设置的,也可以通过函数设置在其他位置
2、session的生命周期
默认关闭浏览器,session就会消失,当然了也可以在程序中设置session的过期时间
3、出现漏洞的情景
如果服务器的session-id对应的文件存在网站的其他目录(比如/var/www/html/tmp目录下)(有时会存储在网站根目录下的某目录下),通过扫描目录即可获取 session 文件所在目录,我们即可获取到seesion_id,即可绕过身份验证。 如果存放在数据库,可以通注入漏洞获取seesion信息,获取到session_id 就可以修改cookie 进行提交,验证就可以通过。
4、session身份验证绕过示例:
(1)源码:session.php
【默认帐号和密码:qwsn/123456】
<?php
$path_parts = pathinfo(__FILE__);
$save_seesion=$path_parts['dirname'].'\tmp';
session_save_path($save_seesion);
session_start();
//当用户访问当前的页面的时候就会在tmp目录下生成session_id文件
登录后的用户session_id文件内就会存储用户名。
$username='qwsn';
$password='123456';
if($_GET['c']=='login'){
if($_SESSION['username']==$username){
//检索所有当前的session_id文件内容进行验证,如果文件内存在用户即可登录!!!
echo "欢迎回来!{ $_SESSION['username']}";
}else{
if($_POST['username']==$username && $_POST['password']==$password){
$_SESSION['username']=$username;
isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id();
//session_id() 可以用来获取/设置 当前会话 ID
setcookie('PHPSESSID', $PHPSESSID, time()+24 * 3600);
//设置当前的SESSION的过期时间为24h
echo "登录成功 { $_SESSION['username']}";
}else{
echo "帐号或者密码出错<a href='session.php'>返回</a>";
}
}
}else{
echo '<meta charset="UTF-8">';
echo"<form method='post' action='?c=login'>";
echo"<label>帐号:</label><input type='text' name='username'><br>";
echo"<label>密码:</label><input type='password' name='password'><br>";
echo"<input type='submit' value='登录' name='submit'>";
echo "</form>";
}
?>
(2)绕过:抓包改包
第一步: 使用qwsn/123456登录后,服务器的/var/www/html/tmp下会存储session id对于的session_id文件,该文件存储着用户名!!!
如下图所示,http://www.webtester.com/session.php是用户登录页面: 如下图所示,我们使用qwsn/123456用户登录成功:
如下图所示,我们登录成功后,可以通过开发者工具的网络模块发现cookie值:PHPSESSID=ij11lj0rsir754g01l7um1nuk3
如下图所示,我们在靶机上也发现生成了session_id对应的sess_sessionid文件:sess_ij11lj0rsir754g01l7um1nuk3,其内容是保存的用户名qwsn,只要我们在使用其他用户登录的时候,使用了该sess_sessionid文件的话,那么就可以绕过验证直接登录。这里我们可以使用cookie传值的时候传该文件对应的sessionid即可调用该文件!!!
第二步: 换一个浏览器,然后随便使用不存在的一个用户名和密码,点击登录,抓包,修改包中的cookie数组变量的PHPSESSID的键值为qwsn登录的时候的phpsessid即可绕过登录!!!
如下图所示,我们使用账户qwsn2/asdfghjkl登录,抓包修改cookie的phpsessid键值为qwsn的sessionid【ij11lj0rsir754g01l7um1nuk3】即可绕过登录验证:
(3)总结:
抓包,修改cookie的phpsessid的值为登录成功的用户的sessionid,这个sessionid我们可以通过目录扫描或者SQL注入得到,因为sesion文件一般是以sess_sessionid号的形式命名的!!!