APP下载

防堵漏洞 保护Web会话安全

2020-06-20河南郭建伟

网络安全和信息化 2020年6期
关键词:令牌会话合法

■ 河南 郭建伟

和会话相关的安全隐患

可以说,会话ID的作用极为关键,正因为该会话ID的重要性,因此也成了黑客“关注”的目标。

如果某合法用户的会话ID被黑客获取,黑客就会伪装成该用户来非法访问Web应用,这种攻击手段被称为会话劫持。

因此,对于会话ID进行保护就显得极为重要。黑客获取会话ID的方法包括预测会话ID、窃取会话ID和挟持会话ID等。

对于第一种攻击方式来说,黑客可以采取猜测的方法来获知会话ID。

对于第二种攻击方式来说,黑客可以嗅探HTTP明文信息来获取会话ID。

当然,黑客还可能会利用XSS跨站脚本,以及HTTP消息头注入,或者将会话ID嵌入到URL等手段,来窃取会话ID。

对于第三种攻击方式来说,黑客可以先获取一个属于自己的会话ID,之后便强制其他用户使用该ID来连接Web应用。即黑客通过各种欺骗手段,将指定的会话ID强制设置到用户的浏览器之中,然后就可以轻松掌控用户的会话ID,以造成会话劫持,这也被称为固定会话攻击。

防范预测会话ID攻击

对于预测会话ID来说,其实是一个Web设计上的缺陷。如果生成会话ID的方法不完善,用户的会话ID就很可能被黑客成功预测,黑客进而就可以劫持会话。

例如,基于连续的数值、固定的日期时间,以及用户名称等方式来产生会话ID的话,就会造成安全隐患。此外,使用一些开源软件来生成会话ID的话,因为对用的程序逻辑实际上处于开放状态,因此黑客根据公开的代码也完全可以推测出会话ID。

因此,必须使用绝对的随机数来生成会话ID,为了避免可预测的会话ID,应该避免自行开发相关的会话管理机制。最稳妥的办法是使用成型的框架(例如,PHP、Java/J2EE、ASP.NET等编程语言或者中间件)提供的会话管理机制,来创建完全随机的会话ID。对于预测会话ID漏洞而言,其影响的范围包括使用会话的所有页面,尤其对于显示隐私信息或者执行关键处理(例如,购物、发帖、更改密码等)的页面来说,其危害尤为明显。

注意,该攻击方式是无需用户参与的。具体的应对方法也很简单,即不要自行设计会话管理机制,必须使用功能强大的Web应用开发工具内置的会话管理机制。对于此类机制来说,会将用户的ID、IP地址、日期和时间以及随机数等内容组合起来使用,执行加密或者散列函数处理,来得到会话ID,其安全性较高,往往是难以预测的。

保护会话ID,防止非法窃取

黑客可以使用各种方法来窃取会话ID,例如,对于会话ID嵌入URL来说,会话ID并不保存在Cookie中,而是保存在URL中。PHP、Jave以及ASP.NET等工具都支持该功能。此外,在手机中也可能采用该方法来访问Web应用。

但是,该方式存在很大的安全隐患,可能造成会话ID经由Referer消息头泄露。例如,黑客可先在侵入某个合法的网站,之后在其中添加恶意链接指向非法网站。

而当合法的用户点击该恶意链接时,用户当前的URL中的会话ID就会被发送给该非法网站。这样,黑客就可以很轻松地读取该非法网站收集的会话ID信息。

当然,由Referer造成的会话ID泄露可能是偶发事件而触发,也可能是黑客有意为之。为了防止由此引发的伪装攻击,需要在Web程序中禁止将会话ID嵌入到URL中。

注意,该攻击方式需要用户参与。例如,对于PHP来说,执行“vim php.ini”命令,在编辑界面中将其中的“session.use_cookies=” “session.use_only_cookies=”行的值均设置为“On”,表示仅仅将会话ID保存到Cookie中。

如果将前者设置为“On”,将后者设置为“Off”,那么表示在可以使用Cookie时,将会话ID保存到Cookie中,否则将会话ID嵌入到URL中。为了安全起见,最好使用前者的组合方式。

之后执行“service httprestart”命令,重启Apache服务让上述修改生效。

该方法是全局性质的针对整个网站发挥作用,如果仅仅希望在网站的某个目录下实现上述功能,可以在该目录下创建名为“.htaccess”的文件,并在其中输入“php_flag session.use_cookies On” “php_flag.session.use_only_cookies On”行即可。

挟持会话ID攻击的危害

挟持会话ID攻击的特点是从外部劫持会话ID,黑客会先取得会话ID,该会话ID是合法的。之后将该会话ID强制提交给给受害用户,再让受害用户登录黑客需要攻击的Web应用,最后黑客使用该会话ID顺利进入目标应用。

例如,PHP网站如果存在会话ID嵌入URL漏洞,黑客可以在提交URL时,随意指定一个会话ID来进行攻击。

因为PHP存在会话采纳机制,能够接受来源不明的会话ID。而对于ASP.NET来说,也存在会话采纳机制。对于不存在会话采纳机制的中间件上运行的Web程序程序,当黑客对其进行攻击时,会先浏览目标Web应用,来取得有效的会话ID,之后利用该会话ID来布设恶意链接来欺骗用户。

因此,不管开发工具中是否存在会话采纳机制,都不能完全避免固定会话攻击。

防御会话ID攻击

根据其攻击步骤来看,最好的防御方法是在用户登录时更换其会话ID,这样黑客即使按照上述步骤行动,也无法得到用户登录后的真实会话ID。

例如,对于PHP来说,就可以使用“session_regenerate_id”函数,来执行更改会话ID操作,比如在认证后的网页代码中添加“session_regenerate_id(true)”行,来生成全新的会话ID,删除老的会话ID,其中的“true”蚕食用来指定是否将变更前的会话ID对应的会话信息删除。

之后再将用户提交的信息,例如用户名、密码和邮箱等信息写入到对应的会话变量中。因为老的会话ID已经消失,所以黑客发起的固定会话ID攻击就失败了。

对于有些Web应用来说,因为其使用的开发工具的原因,无法在程序中显式的更改会话ID,所以可以使用令牌来防范固定会话攻击。

其实现方法是在登录时生成一个随机数字字符串(即令牌),将其保存到Cookie和会话变量中,之后在各页面进行认证时比较上述令牌值,如果相符就视为已认证状态,否则视为认证错误。

因为只有在登录时,令牌才可以被传到外界,黑客无法得知该令牌,所以使用令牌可以有效防御固定会话攻击。例如,在网页代码中添加如下命令,设置产生随机数的函数:

之后,添加“$token=getToken()”行,来产生随机数(即令牌)。添加“setcookie('token',$token,0,'/');” “$_SESSION ['token']=$token;”行,将令牌保存到Cookie和会话变量中。

这样,合法用户可以利用Cookie来获取该令牌。之后可以利用该令牌进行身份验证。

例如在对应的页面中添加:

就可以执行令牌比对操作,即从用户提交的Cookie中取得令牌,和会话变量中读取的令牌进行比对,如果一致则说明用户合法。黑客虽然可以利用固定会话进行攻击,但是无法得到该令牌,所以无法进行有效的身份验证操作。

而对于有些Web网站(尤其是购物网站)可能在登录前就使用了会话变量,在这种情况下,要想完全防御固定会话攻击是比较困难的。比较稳妥的对策是,在登录前不要使用会话管理机制,而使用Hidden参数来传递值。

当然,为了更好地提高安全性,可以采取各种方式来加以防范,例如,不要在登录前的会话变量中保存敏感信息,不使用嵌入会话ID的URL,不要使用地域型域名等。

猜你喜欢

令牌会话合法
称金块
QQ和微信会话话轮及话轮转换特点浅析
基于路由和QoS令牌桶的集中式限速网关
一种高精度均匀取样算法及其网络应用
合法外衣下的多重阻挠
西班牙推动废除合法卖淫
基于集群节点间即时拷贝的会话同步技术研究①
报告
平行进口汽车将有“合法身份”?
年龄大小的种种说法