1.0 在进入话题之前我们先了解下session与cookie的原理

1.1 session介绍

简单介绍:PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。

1.2 几个常用的session配置

php.ini 

session.use_cookies=1  #1代表使用cookie记录客户端的sessionid(php.ini默认就是1) 

session.save_path=”xx” #session文件的保存路径 

session.gc_maxlifetime=1440 #服务器端session的储存的时间,如果超过1440秒没操作,那么Session数据就自动删除。

session.cookie_lifetime=0 #这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废(下面会深入了解)

session.name=PHPSESSID #cookie的名称 利用他来识别session文件(下面会深入了解) 

1.3 深入了解

php代码: 

session_start(); #开启session机构 

1.png

当我们把PHPSESSID 的值改成 freebuf 之后再发送一次请求

1.png

可以看到就生成了一个新的session 

解释:这就是session.cookie_lifetime=0 的作用 通过cookie来识别session文件,那么如果不用cookie来识别seesion文件的话 还有什么办法可以让服务器识别哪个是你的session文件。答:可以通过input的值来识别 或者通过url 等方法。

执行机制流程图:

1.png

2.0 xss利用之session延长生命周期

2.1 利用cookie实现控制对方生命周期

相信读者们都会对xss有多多少少的了解。 

但是不知道有没有老司机们碰到过这种情况:xss上线但因长时间未登录(未操作)而导致失效。 

如下代码:

1.png

解释:当登录之后如果超过10秒钟不操作 那么session就失效。换句话说如果管理员登录后台 触发到了xss 然后又关闭了浏览器(没操作)超过10秒的话 session就会作废。

碰到这种情况我们可以利用客户端来实现session更新。前提是要获取到session的名称。

1.png

phpsession=freebuf; 

1.png

py 死循环代码:

1.png

解释:当获取到cookie之后每隔一秒操作一次

这样就实现了及时在关闭浏览器或者登录了又长时间没操作 的情况下 还可以利用旧cookie来登录。

我们从1.2说过 :session.cookie_lifetime=0 #这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废 但是为什么浏览器关闭了 还可以用旧的cookie来进行登录?我之前利用php5~php7做了一次实验。实验过程中。浏览器关闭了session没删,但是cookie的PHPSESSID的值却发生了改变从而服务器又新生成了一个session,至于旧的session文件什么时候删除 问题是出在:session.gc_maxlifetime=1440 #当用户1440秒内如果没操作的话 那么他就会被删除。

总结:此方法在实战过程中得到较好的辅助。但也不是百分百成功,我目前没有碰到失败案例。我所说的失败案例 如果对方做了令牌(token) 这样服务端就可以识别你是否非法请求并且session 不更新。才导致此方法失败。

*本文原创作者:心东