赞
踩
在Web应用里,会话管理的安全性始终是最重要的安全问题,对用户的影响极大。
从会话管理凭证来说,Session会话管理的会话凭证仅仅是一个session ID,所以只要这个session ID足够随机,那么攻击者就不会轻易地冒充别人的session ID进行操作;Cookie会话管理的凭证(ticket)以及Token会话管理凭证(token)都是一个在服务端做了数字签名和加密处理的串,所以只要密钥不泄露,攻击者也无法轻易拿到这个串中有效信息并对它进行篡改。总之,这三种会话管理方式的凭证本身是比较安全的。从客户端和服务端的HTTP过程来说,当攻击者截获到客户端请求中的会话凭证, 就能拿这个凭证冒充原用户,做一些非法操作,而服务器也认不出来。这种安全问题, 可以简单采用HTTPS来解决,虽然可能还有HTTP劫持这种更高程度的威胁存在,但是从代码能做的防范,确实也就是这个层次了。
Session对于Web应用是最重要的,也是最复杂的。对于Web应用程序来说,加强安全性的首要原则就是:不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,再保存到数据层。 然而,为了维持来自同一个用户的不同请求之间的状态,客户端必须要给服务器端发送一个唯一的身份标识符(Session ID)。 很显然, 这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择。 由此可以看出,Web应用程序中最脆弱的环节就是session,因为服务器端是通过来自客户端的一个身份标识来认证用户的, 所以session是Web应用程序中最需要加强安全性的环节。
基于session的攻击有很多种方式。大部分的手段都是首先通过捕获或者固定合法用户的session, 然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的session标识符,用于接下来的身份验证。
攻击者至少可以通过以下三种方式来获取一个有效的session标识符
➢ 预测
➢ 捕获(劫持)
➢ 固定
会话预测这种方式需要攻击者猜测出系统中使用的有效的session标识符(PHP中格式为PHPSESSID=1234),类似暴力破解。目前会话预测这种攻击方式基本上不太可能成功。原因如下:
➢ PHP生成随机的session id往往是极其复杂的并且难于被预测出来
➢ PHP生成session字符串无任何规律和顺序
会话劫持通过窃取合法用户Session ID后,使用该Session ID登录目标账号的攻击方法。会话劫持最重要的部分是取得一个合法的会话标识来伪装成合法用户。
攻击步骤
1、目标用户需要先登录站点
2、登录成功后,该用户会得到站点提供的一个会话标识SessionID
3、攻击者通过某种攻击手段捕获Session ID
4、攻击者通过捕获到的Session ID访问站点即可获得目标用户合法会话
会话劫持攻击示意图:
获取Session ID的方式
攻击者获取Session ID的方式有很多种:
➢ 暴力破解:尝试各种Session ID,直到破解为止
➢ 预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来
➢ 窃取:使用网络嗅探、XSS攻击等方法获得
对于php来说,其内部Session的实现机制虽然不是很安全,但是关于生成Session ID的环节还是比较安全的,这个随机的Session ID往往是极其复杂的并且难于被预测出来,所以,暴力破解Session ID和预测Session ID的攻击方式基本上是不太可能成功的。对于窃取Session ID的方式大多使用网络数据通讯层进行攻击获取,可以使用SSL进行防御。
会话劫持防御方法
1、更改Session名称:PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,可以阻挡部分攻击。
2、关闭透明化Session ID:透明化Session ID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。
3、设置HttpOnly:通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这 个Cookie,从而有效的防止XSS攻击。
4、关闭所有phpinfo类dump request信息的页面:phpinfo页面会dump出请求信息,其中就包括Cookie信息。5、验证HTTP头部信息
中间人攻击
中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种通过窃取或篡改通信物理、逻辑链路间接完成攻击行为的网络攻击方法。攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,实际上整个会话都被攻击者完全控制。这个被攻击者控制的通信节点就是所谓的“中间人”。
中间人攻击有两种常见形式:
➢ 基于监听的信息窃取
➢ 基于监听的身份冒认
中间人攻击示意图:
中间人攻击难以防御的原因:
1、攻击者在窃听时,一般网络连接仍能正常运行,不会断线,因此很少有人会主动发现
2、受害者电脑上不会被安装木马或恶意软件,难以被杀毒软件发现
3、攻击者在欺骗网络协议时,虽然会留下一些蛛丝马迹,但由于网络设备不会保留太多记录,事后难以追踪
4、绝大多数的网络协议,仍然基于“对方的数据是安全可靠”的假设来运作的,这导致攻击者有太多漏洞可以利用进行欺骗网络设备、伪装成中间人
会话固定(Session fixation),诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用攻击者预先设置的Session ID进行登录,从而使Web不再进行生产新的Session ID,导致攻击者预先设置的Session ID变成了合法桥梁)会话固定也可以看成是会话劫持的一种类型,因为会话固定攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。
攻击步骤
1、攻击者通过某种手段重置目标用户的Session ID,然后监听用户会话状态;
2、目标用户携带攻击者设定的Session ID登录站点;
3、攻击者通过Session ID获得合法会话;
会话固定攻击示意图:
Web接收Session ID机制
早期浏览器存储的session ID容易暴露。
使用URL来传送session ID首先检查携带cookie是否含有sessionID;若没有则再检查get、post数据中是否 含有,若有则使用此数据;没有才会使系统生成一个session ID发给客户端。
重置Session ID的方式—客户端脚本
使用客户端脚本来设置Cookie到浏览器
<script type='text/javascript'> document.cookie="PHPSESSID=99999";</script>
这种方式可以使用XSS来达到目的。
防御方案:
开启Httponly阻止攻击者读取Cookie。
但有少数低版本浏览器存在漏洞,即使设置了HttpOnly,也可以重写Cookie。所以还需要添加其他方式校验,如User-Agent验证,Token校验。
使用HTML的标签加Set-Cookie属性。
服务器可以在返回的HTML文档中增加标签来设置Cookie:
<meta http-equiv='Set-Cookie' content='PHPSESSID=23333'>
与客户端脚本相比,对标签的处理目前还不能被浏览器禁止。
重置Session ID的方式—HTTP响应劫持修改
使用Set-Cookie的HTTP响应头部设置Cookie
攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部。
会话固定防御方法
1、每当用户登陆的时候就进行重置Session ID
2、Session ID闲置过久时,进行重置Session ID
3、大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明 化Session ID,User-Agent验证,Token校验等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。