[Web]Session定置攻击的过程和预防
08/30/2013
问题
确保用户的session标识符不会由第三方提供,例如挟持了用户的session的攻击者
方案
只要用户的授权范围改变,如成功登陆后,就通过session_regenerate_id()来重新生成session标识符
<?php session_regenerate_id(); $_SESSION [ 'logged_in' ] = true;
?> |
如上图,用户本次登陆时传递给服务器的cookies中的session id是 4tj1583c1nplkkf80oa2ikqf22。当验证成功后,利用session_regenerate_id()函数重新分配一个 session id 9kehkhf5m900tqefbee97ho5n4,存在cookies中传递给客户端。
在默认情况下,PHP可以接受来自cookies或URL中的session标识符。而攻击者可能会欺骗受害人点击一个包含session标识符并指向到你的应用的链接:
<a href="http://example.org/login.php?PHPSESSID=1234">点击</a> |
点击了该链接的用户,其session标识符会被重置为1234。因此,攻击者在知道了这个用户的session标识符后,就可以通过使用相通的session标识符来尝试劫持用户的会话。
例子
- 首先,攻击者在这种情况下也是一个合法用户,登录到服务器
- 服务器向攻击者发送一个发送一个Session ID 1234
- 攻击者向用户发送超链接http://online.worldbank.dom/login.jsp?sessionid=1234,并企图诱惑他去点击
- 服务器收到login.jsp?sessionid=1234的请求,因为web服务器已经创建了基于Session ID 1234的会话,所以不会重新创建Session ID
- 用户提供了他的账号密码,服务器授予他访问他的银行帐户的权限
- 因为知道Session ID,攻击者同样可以通过account.jsp?sessionid=1234访问并操作用户信息
攻击过程
一般来说,会话固定攻击是一个三个步骤,如下图所示
- 会话建立:首先,攻击者在目标服务器上设置一个所谓的Session陷阱,获得Session ID,或者选择一个通常任意Session ID用于攻击。在某些情况下,建立了陷阱会话需要维护(存活),通过重复发送请求引用来避免空闲会话超时。
- 会话定置:接下来,攻击者需要介绍他的SessionID给用户的浏览器,从而恢复他的会话。
- 进入会话:最后,攻击者必须等待,直到用户登录到目标服务器使用前面固定Session ID,然后进入用户的会话。
通过确保只要改变用户的授权范围就重新生成session标识符,可以有效地消除session定置攻击。如图一所示,PHP会自动更新存储的session数据并传送新的session标识符。——这算是比较简单有效的防止攻击的方法了
相关推荐
4. **定制session ID**:如果需要自定义session ID的生成策略,可以通过实现RedisSessionRepository.SessionIdGenerator接口来完成。 5. **设置session超时时间**:可以在配置中设置session的过期时间,Spring ...
5. **定制Session行为**: 可以通过实现`SessionRepository`接口来自定义Session的行为,或者通过监听器(`ApplicationListener<SessionDestroyedEvent>`)来监听Session销毁事件。 **实战示例** 在使用Redis作为...
完成Session的定制后,接下来需要设置自动登录到你创建的"Simple" Session。这需要编辑`/etc/lightdm/lightdm.conf`文件,将`user-session`字段设置为你的自定义Session名,例如: ```ini [SeatDefaults] greeter-...
如果需要自定义Session的行为,可以通过实现`HttpSessionStrategy`接口来自定义Session ID的处理策略,或者创建`SessionRepositoryFilter`的子类进行更深入的定制。 5. **测试与验证**: 创建一个简单的...
无论是全局范围内的统一配置,还是针对特定Web应用的定制化设置,亦或是根据用户的交互行为动态调整,都能轻松实现。正确地管理和设置Session的有效时长对于提高Web应用的安全性和用户体验至关重要。
如果需要进一步定制 session,例如设置过期时间、自定义 key 前缀等,可以通过创建一个配置类并重写 `HttpSessionConfig` 来实现: ```java @Configuration public class HttpSessionConfig extends ...
【Spring-Session 实现Session共享】 在现代分布式系统中,由于多服务器、微服务架构的广泛应用,Session共享成为一个重要的需求。...在实际开发中,可以根据具体需求进行定制,以满足各种复杂的SSO场景。
在实际操作中,开发者可能需要查看和理解这些工具的配置文件和源代码,以更好地定制和优化session共享解决方案。 总的来说,"nginx+spring-session+redis 实现session共享"是分布式系统中常见的解决方案,它结合了...
Redis作为一款高性能的键值数据库,常被用于缓存、消息队列等多种场景。在Web应用中,Session同步是解决分布式环境下用户会话一致性的重要手段...开发者可以根据项目需求,参考该项目的源代码,进行相应的定制和优化。
- 如果需要共享拦截器逻辑,可以考虑使用Spring的`@Component`和`@Order`注解,结合`@EnableWebMvc`和`WebMvcConfigurerAdapter`来实现组件化和定制化的拦截器管理。 7. **总结** SpringMVC的Session拦截器是提高...
在本案例中,`tomcat-cluster-redis-session-manager`这个jar包提供了一个定制的session管理器,它实现了Tomcat的`Manager`接口,将session数据透明地存储到Redis中。 **配置Tomcat** 要使用这个jar包,首先需要将...
《Express-Session源码解析与应用深度探讨》 在Node.js的世界里,Express框架以其轻量级、灵活性和强大的功能而备受...理解其内部工作原理有助于我们在实际项目中更好地运用和定制,提升Web应用的用户体验和安全性。
1. **Session管理器**:这是一个定制化的session管理器,它拦截Tomcat内部的session操作,如创建、读取、更新和删除session,然后将这些操作转发到Redis中进行处理。 2. **Redis客户端库**:这个库负责与Redis...
描述中提到的“修改了tomcat-redis-session-manager源码进行的编译生成的jar包”,意味着这个jar包不是官方发布的原版,而是经过开发者对源代码进行了一些定制化的修改后重新编译得到的。这样的修改可能包括修复已知...
总结起来,自定义 Session 存储路径和使用 `session_set_save_handler()` 函数能够帮助开发者更加灵活地管理 Session 数据,同时也能根据具体的应用场景进行更高级的定制化设置。通过对 php.ini 文件中相关配置项的...
标题与描述中的关键词“session和cookie区别”指向了两种在Web开发中常用的状态管理技术,它们各自具有独特的特性和用途。下面将详细阐述这两种技术的关键知识点: ### session和cookie的区别 **1. 定义与存储位置...
**Memcached-Session-Manager...通过灵活配置,可以根据系统的规模、性能需求以及容错要求来定制适合的Session管理策略。通过下载的jar包和配置文件,开发者可以快速集成并测试这些配置,确保在实际部署中能顺利运行。
通过编写一个自定义的处理器类并使用`session_set_save_handler()`函数,我们可以确保Session数据的安全性和可靠性,同时还能根据项目需求进行定制化扩展。在处理大型网站或分布式系统时,这样的解决方案显得尤为...
在现代Web应用开发中,会话管理是至关重要的部分,特别...Spring Session提供了丰富的API和配置选项,可以根据具体需求进行定制。通过不断学习和实践,你可以更好地利用这个强大的工具来提升你的Web应用的质量和性能。
SecureCRT提供多平台支持,拥有丰富的定制选项,而XShell则以直观的界面和易于使用的功能著称,支持会话管理和自动填充。根据个人喜好和具体需求,用户可以选择最适合自己的工具。 **总结** `SessionConverter`作为...