前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >渗透测试XSS漏洞原理与验证(1)——会话管理

渗透测试XSS漏洞原理与验证(1)——会话管理

原创
作者头像
zhouzhou的奇妙编程
发布2024-10-08 09:28:21
1180
发布2024-10-08 09:28:21
举报
文章被收录于专栏:渗透测试专栏

Web会话管理概述

会话管理

在人机交互时,会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程。

会话管理分类 : 桌面会话管理、浏览器会话管理、Web服务器的会话管理。

为什么需要会话管理

HTTP是一种无状态协议,一次请求结束,客户端与服务端的连接就会断开,服务器再次收到请求时,无法识别此次请求是哪个用户发过来的,需要重新建立连接。为了判断发送请求的用户,需要一种记录用户的方式,也就是Web应用会话管理。

常见的Web应用会话管理的方式

  • 基于server端session的管理方式
  • cookie-based的管理方式
  • token-based的管理方式

基于server端session的管理的方式

在早期的Web应用中,通常使用服务端session来管理用户的会话。

服务端session是用户第一次访问应用时,服务器就会创建的对象,代表用户的一次会话过程,可以用来存放数据。服务器为每一个session都分配一个唯一的sessionID以保证每个用户都有一个不同的session对象。

服务器在创建完session后,会把sessionID通过cookie返回给用户所在的浏览器这样当用户第二次及以后向服务器发送请求的时候,就会通过cookie把sessionID传回给服务器,以便服务器能够根据sessionID找到与该用户对应的session对象。

session通常设定有有效时间,比如1个小时。当时间失效后,服务器会销毁之前的session,并创建新的session返回给用户。但是只要用户在失效时间内,有发送新的请求给服务器,通常服务器都会把他对应的session的有效时间根据当前的请求时间再重新刷新。

session在一开始并不具备会话管理的作用。它只有在用户登录认证成功之后,并且往session对象里面放入了用户登录成功的凭证,才能用来管理会话。管理会话的逻辑也很简单,只要拿到用户的session对象,看它里面有没有登录成功的凭证,就能判断这个用户是否已经登录。当用户主动退出的时候,会把它的session对象里的登录凭证清掉。所以在用户登录前或退出后或者session对象失效时,肯定都是拿不到需要的登录凭证的。

session实现会话管理的流程图:

优点:

  • 1、某些地方使用可以简化Web开发:如果在诸多Web页面间传递一个变量,那么用session变量要比通过QueryString传递变量可使问题简化。
  • 2、安全性好:客户端与服务端保持会话状态的媒介始终只是一个sessionID串,只要这个串够随机,攻击者就不能轻易冒充他人的sessionID进行操作:除非通过CSRF或http劫持的方式,才有可能冒充别人进行操作;即使冒充成功,也必须被冒充的用户session里面包含有效的登录凭证才行。

缺点:

  • 1、这种方式将会话信息存储在Web服务器里面,当用户同时在线量比较多时,这些会话信息会占据比较多的内存;
  • 2、当应用采用集群部署的时候,会遇到多台web服务器之间如何做session共享的问题;
  • 3、多个应用要共享session时,还会遇到跨域问题。不同的应用可能部署的主机不一样,需要在各个应用做好cookie跨域的处理。

前端代码

代码语言:html
复制
<html><meta charset="utf-8">
<form action="login.php" method="POST">
username:<br>
<input type="text" name="username"><br>
password:<br>
<input type="text" name="password"><br>
<input type="submit" value="Submit">
</form>
</html>

后端代码

代码语言:html
复制
后端代码(login.php)

<?php
session start();
$usr =$ POST['username'];
$pwd =$ POST['password'];
if($usr==='admin'&&$pwd==='admin'){
    echo'登录成功';
$ SESSION["admin"]=1;
var dump($ SESSION);
}else{
    echo'登录失败'
}?>


后端代码(check.php)
<?php
session start();
var dump($ SESSION);
if($ SESSlON["admin"]==1){
    echo"你好":
}else{
    echo"请重试”;
}?>


后端代码(unset.php)
<?php
session start();
unset($ SESSON['user']);
session destroy();
}?>

cookie-based的管理方式

session的管理方式会增加服务器的负担和架构的复杂性,所以后来就提出把用户的登录凭证直接存到客户端的方案,当用户登录成功之后,把登录凭证写到cookie里面并给cookie设置有效期,后续请求直接验证存有登录凭证的cookie是否存在以及凭证是否有效,即可判断用户的登录状态。

Cookie与Session最大的区别是:Cookie将数据存储在客户端,Session将数据存储在服务端

用户发起登录请求,服务端根据传入的用户密码之类的身份信息,验证用户是否满足登录条件,如果满足,就根据用户信息创建一个登录凭证,这个登录凭证简单来说就是一个对象,最简单的形式可以只包含用户id、凭证创建时间和过期时间三个值。

服务端把上一步创建好的登录凭证,先对它做数字签名,然后再用对称加密算法做加密处理,将签名、加密后的字串,写入cookie。cookie的名字必须固定(如ticket),因为后面再获取的时候,还得根据这个名字来获取cookie值。这一步添加数字签名的目的是防止登录凭证里的信息被篡改,因为一旦信息被篡改,那么下一步做名验证的时候肯定会失败。做加密的目的,是防止cookie被别人截取的时候,无法轻易读到其中的用户信息。

用户登录后发起后续请求,服务端根据上一步存登录凭证的cookie名字,获取到相关的cookie值。然后先做解密处理,再做数字签名的认证,如果这两步都失败,说明这个登录凭证非法;如果这两步成功,接着就可以拿到原始存入的登录凭证了。然后用这个凭证的过期时间和当前时间做对比,判断凭证是否过期,如果过期,就需要用户再重新登录;如果未过期,则允许请求继续。

cookie实现会话管理的流程:

优点:

  • 1、实现了服务端的无状态化(最大的优点),服务端只需要负责创建和验证登录cookie即可,无需保持用户的状态信息。
  • 2、cookie可以跨越同域名下的的多个网页,但不能跨越多个域名使用。
  • 3、可以设置有效期限,控制cookie的生命周期,使之不会永远有效(攻击者可能拿到的是过期的cookie)。

缺点:

  • 1、cookie有大小限制,存储不了太多数据
  • 2、每次传送cookie,增加了请求的数量,对访问性能也有影响
  • 3、同样存在跨域问题(不同域名无法互相读取cookie)

token-based的管理方式

Session和Cookie两种会话管理方式由于都要用到Cookie,不适合用在nativeapp里面,因为native app不是浏览器,,不好管理Cookie,因此都不适合做纯API服务的登录认证。要实现API服务的登录认证,就需要用到token-based的会话管理方式。

token-based的管理方式从流程上和实现上跟cookie-based的管理方式没有太多区别,只不过cookie-based的管理方式中写到cookie里面的ticket在这种方式下称为token,这个token在返回给客户端之后,后续请求都必须通过ur参数或者是httpheader的形式,主动带上token,这样服务端接收到请求之后就能直接从http header或者url里面取到token进行验证。

token实现会话管理的方式:

优点:

  • 1、支持跨域访问:Cookie是不支持跨域访问的,Token支持
  • 2、无状态:Token无状态,Session有状态(有状态和无状态最大的区别就是服务端会不会保存客户端的信息)
  • 3、支持移动设备:Token更适用于移动应用,Cookie不支持手机端访问

缺点:

  • 1、占带宽:正常情况下Token要比sessionID更大,需要消耗更多的流量,挤占更多带宽
  • 2、无法在服务端注销,很难解决劫持问题

安全问题

在Web应用里,会话管理的安全性始终是最重要的安全问题,对用户的影响极大。

从会话管理凭证来说,Session会话管理的会话凭证仅仅是一个sessionID,所以只要这个session ID足够随机,那么攻击者就不会轻易地冒充别人的sessionID进行操作;Cookie会话管理的凭证(ticket)以及Token会话管理凭证(token)都是一个在服务端做了数字签名和加密处理的串,所以只要密钥不泄露,攻击者也无法轻易拿到这个串中有效信息并对它进行篡改。总之,这三种会话管理方式的凭证本身是比较安全的。

从客户端和服务端的HTTP过程来说,当攻击者截获到客户端请求中的会话凭证就能拿这个凭证冒充原用户,做一些非法操作,而服务器也认不出来。这种安全问题可以简单采用HTTPS来解决,虽然可能还有HTTP劫持这种更高程度的威胁存在,但是从代码能做的防范,确实也就是这个层次了。


本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

我正在参与2024腾讯21天技术创作挑战赛|年中回顾特别季,年中技术沉淀,拯救你的flag,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Web会话管理概述
    • 会话管理
      • 为什么需要会话管理
        • 常见的Web应用会话管理的方式
        • 基于server端session的管理的方式
          • 前端代码
            • 后端代码
            • cookie-based的管理方式
            • token-based的管理方式
            • 安全问题
            相关产品与服务
            渗透测试服务
            腾讯云渗透测试服务(Penetration Test Service, PTS),为客户提供针对于 Web 应用、移动 APP、微信小程序的黑盒安全测试内容;可以覆盖安全漏洞全生命周期,包括漏洞的发现、利用、修复以及修复后的验证。使用腾讯云渗透测试服务,可以随时将安全测试这一动作加入到您的产品研发、应用上线、安全自检等计划中来。不仅快速且便捷,而且稳定可靠,易于管理,有效的提升应用的安全能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档