`

一种真正意义上的Session劫持

 
阅读更多

[ 目录 ]

0×00 应用程序认证设计背景
0×01 常规攻击思路及缺陷
0×02 利用应用程序设计缺陷进行Session劫持的攻击原理
0×03 Session劫持的大致思路及意义
0×04 如何防御这种攻击

0×00 应用程序认证设计背景

一个应用程序在设计的过程中,为了实现对资源和请求进行管理,用户信息认证是非常重要的一环。由于HTTP请求的无连接性,一般的应用程序都是通过Cookie或者Session来完成认证工作,通过将加密的用户认证信息存储到Cookie中,或者通过赋予客户端的一个Token,通常也就是所说的SessionId来在服务器端直接完成认证和取得用户的身份信息,不管哪一种方式,实际上在HTTP协议里都是通过Cookie来实现的,不同的是Cookie可能可以比较长期地存储在客户端上,而Session往往在会话结束之后服务器监视会话不处于活动状态而予以销毁。

0×01 常规攻击思路及缺陷

我们研究的web安全,往往很多时候其实就是在攻击认证,包括非常流行的客户端攻击XSS,传统的方法是我们可以截取Cookie来伪造成别人的身份来获得认证。各种应用程序为了实现自己独特的功能应用,在认证机制设计的时候并不一致,譬如有的完全将认证信息(用户密码信息)加密存储到客户端里,只要用户密码信息不修改,就可以一直利用这个认证信息来登录应用程序。也有的是将认证通过后应用程序赋予客户端一个Token,这个Token存储在Cookie里,这样当客户端登录的时候就可以通过这个Token获得对应的身份,这样只要这个Cookie不被删除,就可以永远的处于登录状态。而另外的一些应用程序将Token放置到Session里,当客户端退出应用程序之后或者客户端在一段时间无响应之后,服务器就销毁这个Session,而且因为是Session里,所以客户端浏览器关闭之后,这个Session也从浏览器内存里销毁了。

我们常用的跨站脚本攻击非常常用的一个攻击手法就是去攻击应用程序的认证,而由于服务器实现认证的时候存在的一些漏洞和机制的一些区别,攻击成果也往往显得不同。对于应用程序来讲,为了保证绝对的安全,服务器应该将Cookie和客户端绑定,譬如将客户端的加密IP也存储到Cookie里,如果发现Ip发生变化就可以认为是Cookie发生了泄漏,应该取消这个Cookie,但是这样一来,用户体验就非常不好,所以一般的应用程序都没有对Cookie做太多的策略,这就为我们的客户端身份窃取提供了可乘之机。所以问题就集中到认证机制的处理上,对于第一种情况,大多数的中小型应用程序的前台都是使用的这种认证方式,只要获得了Cookie就可以永久获得别人的身份。而第二种情况也比较常见,譬如Google就是使用的这种机制,只要窃取了Cookie,别人只关闭应用程序也不退出应用程序的时候就可以获得别人的身份(之前别人退出都可以获得别人的身份,后来他们做了改进)。剩下比较麻烦的就是第三种情况最令人头疼,因为是Session认证,所以别人退出或者关闭浏览器而与服务器的沟通结束之后,Session在一定时间内也被销毁。但是我们发现一些程序在设计的时候存在问题,可能导致我们利用Session的机制在服务器上永久的产生一个后门(在某些设计不严的程序里,可能修改密码也不能消除掉这种后门),我这里把它称为一种真正意义上的Session劫持。

0×02 利用应用程序设计缺陷进行Session劫持的攻击原理

一般的Session劫持都是获得身份之后期望对方不要点击退出,而且如果在这段时间里没有及时利用Session,Session也会因为自己的机制而进行自我销毁,这样获取到的Session就失去了效果,这里比较典型的应用有很多,譬如163邮箱,譬如baidu的认证机制。我们可以经常遇到这样的情况,我在一个浏览器里开了webmail然后新打开一个浏览器开了webmail,然后我第一个浏览器退出了并不影响第二个的账户,两者互不影响,其实是因为他们获取到了两个SessionId,这在应用程序里可能是作为用户体验考虑的,但是正是这种机制存在巨大的安全漏洞。
Session信息是以一个SessionId或者表现为临时Cookie的Token的形式发送的,而我们在实现了XSS的时候其实是可以操作Cookie的了,可以想象,如果我们赋给浏览器一个和Session Cookie名字相同而值不同的Cookie会怎么样?通过我们的测试发现,实际上两个Cookie都是被发送出去的,在HTTP头里表现为出现两个一样的COOKIE,那么服务器会选择哪个Cookie作为实际取得的COOKIE变量呢?我们测试的时候发现实际上是以第一个出现的COOKIE为准的,而不管发送过来的是Session Cookie还是Store Cookie,所以我们就可以利用Javascript改变客户端的Session Token了。

0×03 Session劫持的大致思路及意义

这样我们的思路就很清晰,我们要实现的是Session劫持,而不是传统的Session窃取,我们通过覆盖这个Session Token为一个无效值,服务器会认为用户身份为未登录,然后会要求用户再次登陆,在这个时候我们可以窃取到有效的Session Token值。用户再次登陆之后,他获得新的Session Token,而由于应用程序的机制,之前的Session Token并没有失效,这样服务器上就存在两个有效的Session Token了。我们通过研究应用程序的Session超时机制和心跳包机制,就可以长久地使这个Session有效。而接下来假设用户很注意安全,他有退出应用程序的使用习惯,他销毁了他的Session Token,但是仍然有一个Session Token被我们掌握。这种方法的狠毒在于,即使用户意识到Session Token被窃取,如果某些应用程序的设计有问题,即使用户修改密码,他也不能控制服务器注销掉被我们掌握的会话,他的Session永远被我们掌握了,他也永远不知道这个Session Token是多少。

0×04 如何防御这种攻击

我们可以看到,这种攻击是由于应用程序在设计的时候考虑不周造成的,我们可以在设计认证的时候就强行要求客户端必须唯一,并且认证信息在多少天之后就过期的机制,但是很明显这样会和将COOKIE和ip绑定一样,可能带来不好的用户体验,如何在设计的时候意识到这个问题并且权衡应用和安全的平衡点才是web应用程序设计者要考虑的难题。

分享到:
评论

相关推荐

    PHP漏洞全解(七)-Session劫持整理.pdf

    这演示了Session劫持攻击的一种实现方式,也间接提醒开发者在开发应用时,要重视安全检查,如输入验证、输出编码等,防止此类攻击。 综上所述,本文通过实例与解释相结合的方式,揭示了Session劫持的攻击手法和防御...

    session实验

    Session是服务器端用来跟踪用户状态的一种机制。在HTTP协议无状态的特性下,Session扮演了关键角色,它允许服务器保存和识别不同请求之间的用户信息。 Session的工作原理是:当用户访问网站并登录后,服务器会为该...

    处理session跨域几种方案

    Session是Web应用程序用来存储用户特定数据的一种机制,通常存储在服务器端,而Session ID通过Cookie在客户端与服务器之间传递。当用户在不同域之间跳转时,如果不进行特殊处理,Session信息将无法跨域共享。 以下...

    sessionsession

    Session在计算机领域,特别是在Web开发中,是一种用于存储用户状态信息的关键机制。它是服务器端存储用户信息的方式,与Cookie不同,Cookie是在客户端存储数据。Session的使用通常涉及用户登录、购物车、个性化设置...

    session简介.doc

    使用session可能会遇到的问题包括内存管理(过多session可能导致服务器内存耗尽)、安全性(session劫持和篡改)、会话过期以及跨域共享等问题。开发者需要合理设置session的生命周期,使用安全的session ID生成策略...

    java中使用session模拟用户登陆

    8. **安全注意事项**:尽管Session提供了用户状态跟踪的便利,但也存在安全风险,如Session劫持、Session固定攻击等。应尽量避免在URL中传递Session ID,定期更新Session ID,以及启用HTTPS等安全措施。 总结,Java...

    php session操作类

    Session是服务器端的一种存储方式,它允许开发者在用户浏览器关闭前跨页面地跟踪用户状态。当用户访问网站时,服务器会为该用户生成一个唯一的Session ID,并通过cookie存储在客户端。之后,每次请求时,客户端都会...

    一个简单的Go session 实现

    Session是在服务器端存储用户会话数据的一种方式,通常用于存储用户的登录状态、购物车信息等。当用户在浏览器中访问网站并登录后,服务器会给该用户分配一个唯一的session ID,并将其通过cookie返回给客户端。...

    Session

    在Web开发中,Session是服务器端用来跟踪用户状态的一种方法。当用户访问网站并进行登录等操作时,服务器创建一个Session对象,并将用户的登录信息、偏好设置等关键数据存储在这个对象中。每个Session对象都有一个...

    老外session实例购物车

    - 虽然Session相对安全,但还需注意防止Session劫持和固定Session ID攻击。应定期更新Session ID,并使用HTTPS确保数据传输安全。 通过这个实例,开发者不仅可以学习如何在PHP中使用Session来实现购物车功能,还...

    PHP的session基础

    在Web开发中,PHP的Session机制是一种非常重要的用户状态管理工具,它允许...在实际项目中,还需考虑Session的存储方式(默认为文件系统,也可以配置为数据库)、Session超时设置以及防止Session劫持的安全措施。

    Session用法

    2. **安全性**:确保Session ID的安全性,防止Session劫持。 3. **兼容性**:考虑到不同的浏览器对Cookie的支持情况,需要做好相应的兼容性处理。 总之,Session作为一种重要的Web开发技术,在实现用户状态跟踪方面...

    flask-session-cookie-manager-master.zip

    而session则是一种在服务器端存储用户状态的方法,相比cookie更安全,因为它不包含敏感信息,只存储一个session ID,实际数据存储在服务器上。 在Flask中,默认的session机制是基于cookies的,这意味着session ID被...

    理解HTTP session原理及应用

    值得注意的是,session管理需要谨慎处理,避免session过期导致用户意外退出,以及session hijacking(会话劫持)等安全问题。为此,通常会设置合理的session过期时间,并采取加密session ID等措施增强安全性。 总之...

    跨域共享session (实现http跳转https 共享session)

    1. **防止Session Hijacking**:使用HttpOnly Cookie可以防止JavaScript脚本访问session ID,降低session劫持的风险。 2. **防止Session Fixation**:在用户成功登录后,重新生成session ID,避免攻击者利用预先...

    session.rar

    Session是指在用户与服务器交互过程中,用于保持状态的一种技术。它允许服务器跟踪用户的活动,存储用户特定的信息,即使用户在不同页面之间跳转也能保持数据的一致性。 在Web应用程序中,HTTP协议是无状态的,这...

    session存用户名密码实现用户登录和退出

    在Web开发中,Session是一种非常重要的技术,用于跟踪用户的会话状态。特别是在用户登录和退出的过程中,Session扮演了关键角色。本篇文章将详细介绍如何利用Session存储用户名和密码,以实现用户登录和退出功能。 ...

    Session登录在线人

    在IT行业中,Session是一种在服务器端存储用户状态的机制,特别是在Web开发中广泛使用。它允许服务器跟踪每个用户的特定信息,比如登录状态,以便在用户的不同请求之间保持上下文。当我们谈论"Session登录在线人"时...

    PHP Session的配置与应用

    PHP Session是它提供的一种机制,用于跟踪用户在网站上的状态,实现会话管理。本文将深入探讨PHP Session的配置与应用,以及如何在实践中运用它们。 一、PHP Session的基本原理 PHP Session的工作原理基于客户端和...

    java后台请求http并保持Session

    在Java编程中,后台请求HTTP并保持Session是一个常见的任务,特别是在需要访问受保护的Web资源时,例如登录后的网页数据。下面将详细讲解这个过程,...同时,注意保持良好的安全性,避免Session劫持或Session固定攻击。

Global site tag (gtag.js) - Google Analytics