Session对于Web应用无疑是最重要的,也是最复杂的。对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而保存到数据层。然而,为了维持来自同一个用户的不同请求之间的状态, 客户端必须要给服务器端发送一个唯一的身份标识符(Session ID)。很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择。可以看出,web应用程序中最脆弱的环节就是session,因为服务器端是通过来自客户端的一个身份标识来认证用户的, 所以session是web应用程序中最需要加强安全性的环节。
由于PHP内置的Session管理机制并没有提供安全处理,所以,开发人员需要建立相应的安全机制来防范会话攻击。
针对Session的攻击手段主要有两种:
会话劫持(Session hijacking)
会话固定(Session fixation)
攻击者至少可以通过以下三种方式来获取一个有效的session标识符:
预测
捕获(劫持)
固定
会话劫持
会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏。
攻击步骤
用户登录网站成功之后获得一个session id
攻击者通过某种手段去窃取用户的session id
攻击者通过获得的session id去访问站点即可得到目标合法会话
获取cookie
了解cookie接口:找到Session ID位置进行破解
暴力破解:尝试各种Session ID,直到破解为止
预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来
窃取:XSS攻击、使用网络嗅探(中间人攻击)等方法获得
XSS攻击劫持cookie
中间人攻击劫持cookie
危害
冒充其他人做事情:被冒充的人的权限越大,可以做的事情越多,比如:更改用户信息、进行转账、购买物品
对网站的影响:因为投诉等原因,会出现信誉下降、客户认为网站本身不可信
cookie机制
在动态网页语言中,某个用户(浏览器)访问(登陆)后,可以一直记录状态。这种状态浏览器使用Cookie来保存。
服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间
session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能
就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户
端的请求里是否已包含了一个session标识 -称为session id,如果已包含一个
session id则说明以前已经为此客户端创建过session,服务器就按照sessionid
把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求
不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联
的session id,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造
的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为:
http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
cookie属性
(1)HTTP-Only
服务端发送cookie的时候,可以设置HTTP-Only
Set-Cookie: SESSIONID=abc123; expires=Wednesday, 17-Nov-99 23:12:40 GMT; HttpOnly
这个参数的优点是不会被js获取
尝试打开有HTTP-Only cookie设置的网站查看cookie,
一般,session-id是用这个来判断,即使有xss漏洞,也获取不了session-id相关的cookie值
(2)secure
设置cookie的某个值secure为True时:
此cookie只有在HTTPS协议中才会进行传输,HTTP协议传输时,是不传输此协议的。
防御方法
XSS漏洞引起的会话劫持:可以使用http-only来防止js获取cookie中的sessionid信息
会话劫持引起的会话劫持:可以使用HTTP-SSL(https)+secure来保证sessionid不被获取
会话固定
会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击。
会话固定也是会话劫持的一种类型。会话劫持是攻击者偷走受害者与服务器建立链接的会话,而会话固定是攻击者事先建立一个会话,然后诱使受害者使用此会话进行登录。
由于HTTP的无状态性,导致Web应用程序必须使用会话机制来识别用户。会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击。
但是这个漏洞在实际应用过程中比较鸡肋,需要配合XSS攻击等方式。
访问网站(未登录):获取cookie信息,获取sessionid
登录网站:查看cookie信息,获取sessionid
查看登录前,登录后sessionid是否相同
攻击者Attacker能正常访问该应用网站;
应用网站服务器返回一个会话ID给他;
攻击者Attacker用该会话ID构造一个该网站链接发给受害者Victim;
受害者Victim点击该链接,携带攻击者的会话ID和自己的用户名密码正常登录了该网站,会话成功建立;
攻击者Attacker用该会话ID成功冒充并劫持了受害者Victim的会话
防御方法
每当用户登陆的时候就进行重置sessionID
sessionID闲置过久时,进行重置sessionID
大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明化Session ID,User-Agent验证,Token校验等。