OWASP WEB会话管理备忘单 阅读笔记

https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Session_ID_Propertiesphp

会话简介

HTTP是一种无状态的协议,每一对请求和响应与其余的web交互是相互独立的,若是要跟踪用户的访问状态,就须要引入会话机制,对用户的访问序列进行管理。前端

会话管理,将认证和访问控制(也叫受权)链接起来,在认证以前可能有未认证的会话,在访问控制以后,要有会话销毁机制。程序员

一旦认证的会话创建,会话ID就至关于最强的认证手段, 等同于用户名和密码。web

泄露、捕获、预测、和暴力破解将致使会话ID被劫持,这样攻击者能够假冒用户操做web。数据库

 

会话ID属性

为了保持用户认证状态和跟踪用户操做状态,web应用程序在提供用户会话ID,在会话建立时候,会话ID被用户和应用程序共享,并在会话存续期间内被每一个HTTP请求发送,会话ID是name=value的名值对。为了实现安全会话ID的目的,会话ID的生成必须知足以下属性。编程

会话ID名称指纹

会话ID名称不能提供极端的描述性,也不能提供非必要的详细信息,关于此ID的目的和含义。浏览器

例如一些开发框架提供的会话ID的名称,暴漏了技术和编程语言,例如PHPSESSID (PHP), JSESSIONID (J2EE), CFID & CFTOKEN (ColdFusion), ASP.NET_SessionId (ASP .NET),缓存

建议修改这些名称为更通用的名称,例如ID安全

会话ID长度

会话ID长度必须足够长,以阻止暴力破解攻击,攻击者可遍历全部会话ID,以验证合法ID的存在性。服务器

建议会话ID长度至少128bit,16字节长度。

会话ID信息熵

会话ID必须不可预测,即足够的随机,防止猜想攻击。攻击者可以经过统计技术,预测和猜想合法会话ID。为实现这个目的,伪随机生成器必须被使用。

会话ID值必须提供64bit以上的信息熵,若是一个好的伪随机生成数被使用, 此值被估计为会话ID长度的一半。

会话ID值

会话ID值必须是无心义的,以防止信息泄露攻击。攻击者能够解码会话ID,提取用户、会话和web应用内部工做的信息。

推荐使用加密hash函数,建立密码式的会话ID,例如sha。

会话管理实现

HTTP协议中有多重实现会话状态维持的机制,cookies,URL重写,GET请求中参数,POST请求中隐含表单域。

cookie最流行。

框架内建的会话管理实现

建议使用业界成熟的框架,J2EE, ASP .NET, PHP,由于它们通过安全软件的测试,和社区的修复,被证实是安全的,

可是框架过去也是存在弱点的,因此建议使用最新的版本,并修复知名的漏洞。

传输层安全

为了防止会话ID交换过程当中,在网络流量中被窃取或者泄露,有必要使用HTTPS进行会话交互,不只仅在认证过程,用户私密信息传递过程。

cookie的secure属性,应该被使用,确保cookie信息经过https链接传递。

加密通讯也能够防止某种形式的会话固定攻击(session fixation),这种攻击在会话传输过程当中,截取并操做会话,将预约的会话ID注入到用户的web浏览器。

如下最佳实践关注保护会话ID,并帮助将https集成到web应用中:

一、web应用不该该支持https和http访问之间的切换,由于此切换会将会话ID暴漏在网络数据中。

二、web应用不该该在相同域名下,支持https和http对不一样资源的访问,由于未加密的通道会泄露会话ID.

3  web应用不该该在相同的域名下,支持公用资源访问和私有资源访问, 建议使用不一样域名访问, 公用资源访问使用一个域名只支持 80端口, 私有资源访问使用另外一个域名只支持443端口。

重要地强调下,https不能防止会话ID预测、暴力破解、客户端篡改和固化。

然而,经过网络流量抓取和泄露会话ID仍然是当前最盛行的攻击手段。

cookies

基于cookie的会话ID交换机制提供了多重安全功能,以cookie属性的形式,能被用于保护会话ID交换过程。

secure属性

secure属性指导浏览器,只在https链接中发送cookie信息。

会话保护机制是必须的对于防止中间人攻击,须要确保攻击者不能简单从浏览器的网络抓获会话ID.

单纯强制规定web应用只能使用https链接,不能根本上保护会话ID不泄露,浏览器可能被欺骗使用为加密的链接发送请求,从而以明文方式发送会话ID.

httponly属性

httponly属性规定此cookie不能被脚本访问,例如document.cookie. 此种保护是必须的,对于防止会话ID被XSS攻击手段窃取。

domain和path属性

domain属性规定浏览器只能发送cookie到本domain和全部子domain的主机上,若是此属性未被设置,将默认为原始服务器。

path属性规定浏览器只能发送cookie到本路径和全部子路径上,若是此属性未被设置,将默认为请求资源并设置cookie的路径。

建议设置这两个属性为窄的和严格约束的范围,这种方法,domain属性不该该设置(保证cookie属于原始服务器),path属性应该尽可能严格设置为使用它的web应用的路径。

expire和max-age属性

会话管理机制,利用cookie实现,分为两种,一种为持久的,另一种为非持久型的,

若是设置了expire或者max-age属性,则cookie在浏览器端被存储到磁盘上,直到超期。

典型,对于认证以后的会话ID,通常为非持久的,这样有个好处,若是浏览器实例关闭,则会话ID丢失,会话就至关于失效了,这样可尽可能减小黑客获取会话ID的时间窗口。

会话ID生命周期

会话ID生成和验证: 允许性和严格会话管理

有两种类型的会话管理机制,一种允许性 一种严格性

允许性会话,能够接受客户端指定的内容做为会话ID,严格性只接受web应用本身生成的会话ID

尽管现代都采用严格型管理,可是程序员须要保证在特性状况下,程序中没有允许性状况出现,

web应用不该该接受一个它没有产生过的会话ID,当收到这样一个会话ID后,它须要提供一个新的本身产生的会话ID,遇到这种状况,应用应该检测为 可疑活动,一个告警应该产生。

管理会话ID像任意其余的用户输入

会话ID跟其余用户输入同样,须要通过后台的校验和验证,因为会话的管理机制,会话ID从客户端的请求中获取,get post url参数或者cookie,因此客户端的发送须要通过校验。

若是服务器端不校验会话ID,就处理相应请求,攻击者就会利用web弱点,例如若是会话ID存储在数据库中,他尝试SQL注入。

更新会话ID在权限级别修改后

会话ID应该被更新或者产生,在用户会话级别改变。

最多见的状况是, 当用户从未认证的状态切换到认证状态,会话ID必须改变,在认证过程。

其余常见场景,包括 密码改变, 权限改变, 用户级别改变(从普通用户切换为管理员),

对于web应用的关键资源,当请求到达后,须要将以前的会话ID失效,并产生一个新的会话ID给客户端,此为关键资源的受权管理机制。

当使用多cookie时候的考虑

若是web应用使用cookie做为会话ID交换机制, 而且多个cookie被设置到给定的会话中,则web应用必须验证全部的cookie,而后容许访问用户会话。

很是常见现象是, 用户未登陆时候,会话非配一个会话ID给用户, 当用户登录后, 分配一个新的用户ID给用户, 这两个cookie之间的关系就被肯定, 若是不校验两个cookie,则攻击者颇有可能使用 未登陆的cookie访问已经登录受权的资源。

 

会话超期

为了减小攻击者攻击时间,攻击者发送攻击或者劫持会话, 必须设置会话超时时间,对于每个会话。

不足够的会话超时,增长其余基于会话攻击的暴漏程度, 攻击者能够攻击或者劫持还生效的会话ID.

越是少的会话时间段,越是少的时间,让攻击者攻击。可是对于用户体验,也须要考虑均衡,不能为了安全,让用户常常遇到超时现象,不停登录。

对于高风险值的会话,通常设置超时时间为 二到五分钟, 低风险值会话设置为 十五到半小时。

当会话超期,应用须要主动销毁客户端和服务器段的会话ID,后台的销毁动做更加关键。

 

自动会话超期

idle timeout

无请求超时时间,为自从上一次页面访问以后, 到这个超时时候, 须要销毁全部超期的会话。

此机制,能够限制攻击者猜想到正确会话ID的可能性。

可是若是用户劫持此会话, idle timeout则不生效, 会话能够被攻击者一直更新, 致使此会话一直生效。

absolute timeout

绝对超时时间,定义了会话的最大可活动时间段, 时间一到,无论用户时候活动, 都须要将当前会话销毁,要求用户从新提供认证信息。

此机制,可以限制攻击者攻击和劫持会话的时间, 冒充用户的时间。

renewal timeout

更新超时时间, 是在此超时时间后, 会话ID将自动更新, 在用户会话过程当中,与会话活动和超时无关。

新的会话ID产生后, 老的会话ID非马上失效, 等待新的ID第一次被请求后, 则新ID生效,老的ID失效。

这种场景,减小一个给定会话ID的生存时间,同时不影响用户的会话的生存周期,

减小攻击者劫持会话的时间。

手动会话超期机制

web应用应该提供机制, 对于安全敏感的用户, 则能够主动操做退出会话。

退出按钮

web应用应该提供可见的易于访问的退出按钮, 在任何资源页面上, 让用户可随时退出。

 

Web内容缓存

会话超期后, 客户端可能仍是存在服务器发送回来的资源, 须要保证这些资源的的缓存类型为 不缓存

同时若是根据缓存策略, 有些内容须要缓存,可是请保证会话ID必定不能缓存。

推荐:

Cache-Control: no-cache="Set-Cookie, Set-Cookie2

 

额外的客户端保护对会话管理机制

客户端的保护机制,能够加强安全性, 虽然前端的保护,通常为js校验和验证, 极为有限, 对于有经验的攻击者能够绕过,可是对于入侵者, 能够增长其难度。

initial login timeout

对于登录页面, 也须要设置超时时间, 若是超时时间达到, 则须要将登录页面刷新, 从新获取新的会话ID

这样能够减小会话攻击, 若是前面一个攻击者,使用错误用户名和密码登录失败, 记住了会话ID,而后一个合法用户过来登录,其登录使用的仍是同一个会话ID, 这样非法用户就会使用相同的会话ID,仿冒合法用户执页面操做。

 

强迫会话登出,当浏览器窗口关闭

使用js能够检测到浏览器窗口的关闭事件, 当事件发生, 能够模仿用户退出动做,主动销毁当前会话,

让后台会话状态能够跟前台一同销毁。

 

关闭浏览器跨tab会话

用户在一个tab中登录, 若是用户想在另一个新开的tab访问, 则使用js使得访问为未登录状态。

这种方法,对cookie不适用, 由于cookie对不一样tab是公用的。

 

自动客户端退出

使用js代码在全部页面实现, 一旦会话超期, 自动跳转到登录页面, 这样后台会话跟着前台一并消失。

好处是, 用户能够认识到,前台超时意味着后台也超期, 是一体的,安全得很。

同时, 能够避免用户填写大量表单, 而后点提交后, 数据丢失的用户不易用问题。

 

会话攻击检测

会话ID猜想和暴力破解检测

攻击者为了猜想和暴力破解会话ID,其必然会经过同一个IP,将发动屡次请求,使用不一样的会话ID尝试。

若是发现同一个IP上会话尝试太多, 则将此IP攻击者告警 或者 锁定。

检测会话ID异常

当合法会话发生操做的时候, 经过web程序内部逻辑检测异常, 有助于防范攻击,存在的cookie被删除,或者修改

会话ID在另一个用户上重用, 例如使用user-agent来辅助检测。

记录会话生存周期

会话的建立、销毁, 以及执行重要的动做, 以及会话ID更新。

并发会话登录

并发登录是设计的策略, 若是不支持,须要采起有效的动做,当新的会话校验后, 或者隐式销毁掉前一个会话,或者询问用户是否要销毁。

若是支持, 建议提供用户随时均可以使用的, 多用户并发访问的校验、检测和告警功能。

支持用户手动远程结束会话, 跟踪帐户活动历史,记录多个客户端的 IP USER-AGENT 时间、耗时

 

会话管理WAF

当web应用的代码不能修改, 则引入web application firewall

相关文章
相关标签/搜索