美文网首页
2019-07-08

2019-07-08

作者: 留白_bb77 | 来源:发表于2019-07-08 20:57 被阅读0次

    Session Fixation

    例子:假设A有一辆汽车,A把汽车卖给了B,但是A并没有把所有的车钥匙交给B,还自己藏下了一把。这时候如果B没有给车换锁的话,A仍然是可以用藏下的钥匙使用汽车的。

    这个没有换“锁”而导致的安全问题,就是SessionFixation问题。

    在用户登录网站的过程中,如果登录前后用户的SessionID没有发生变化,则会存在Session Fix-ation问题。

    具体攻击的过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID交给用户Y去认证,Y完成认证后,服务器并未更新此SessionID的值,所以X可以直接凭借此SessionID登录进Y的账户。

    X如何才能让Y使用这个SessionID呢?如果SessionID保存在Cookie中,比较难做到这一点。但若是SessionID保存在URL中,则X只需要诱使Y打开这个URL即可。

    解决Session Fixation的正确做法是,在登录完成后,重写SessionID。

    如果使用sid则需要重置sid的值;如果使用Cookie,则需要增加或改变用于认证的Cookie值。值得庆幸的是,在今天使用Cookie才是互联网的主流,sid的方式渐渐被淘汰。

    session保持攻击

    一般的应用都会给session设置一个失效时间,当到达失效时间后,Session将被销毁。但有一些系统,出于用户体验的考虑,只要这个用户还“活着”,就不会让这个用户的Session失效。从而攻击者可以通过不停地发起访问请求,让Session一直“活”下去。攻击者就能通过此有效Session一直使用用户的账户,成为一个永久的“后门”。

    Cookie是可以完全由客户端控制的,通过发送带有自定义Cookie头的HTTP包,也能实现同样的效果。

    在Web开发中,网站访问量如果比较大,维护Session可能会给网站带来巨大的负担。因此,有一种做法,就是服务器端不维护Session,而把Ses-sion放在Cookie中加密保存。当浏览器访问网站时,会自动带上Cookie,服务器端只需要解密Cookie即可得到当前用户的Session了。这样的Session如何使其过期呢?很多应用都是利用Cookie的Expire标签来控制Session的失效时间,这就给了攻击者可乘之机。

    Cookie的Expire时间是完全可以由客户端控制的。篡改这个时间,并使之永久有效,就有可能获得一个永久有效的Session,而服务器端是完全无法察觉的。

    攻击者甚至可以为Session Cookie增加一个Expire时间,使得原本浏览器关闭就会失效的Cookie持久化地保存在本地,变成一个第三方Cookie(third-party cookie)。

    如何对抗这种Session保持攻击呢?

    常见的做法是在一定时间后,强制销毁Session。这个时间可以是从用户登录的时间算起,设定一个阈值,比如3天后就强制Session过期。

    但强制销毁Session可能会影响到一些正常的用户,还可以选择的方法是当用户客户端发生变化时,要求用户重新登录。比如用户的IP、UserA-gent等信息发生了变化,就可以强制销毁当前的Session,并要求用户重新登录。

    单点登录sso

    单点登录的英文全称是Single SignOn,简称SSO。它希望用户只需要登录一次,就可以访问所有的系统。从用户体验的角度看,SSO无疑让用户的使用更加的方便;从安全的角度看,SSO把风险集中在单点上,这样做是有利有弊的。

    SSO的优点在于风险集中化,就只需要保护好这一个点。

    SSO的缺点同样也很明显,因为风险集中了,所以单点一旦被攻破的话,后果会非常严重,影响的范围将涉及所有使用单点登录的系统。降低这种风险的办法是在一些敏感的系统里,再单独实现一些额外的认证机制。

    目前互联网上最为开放和流行的单点登录系统是OpenID。

    流密码是常用的一种加密算法,与分组加密算法不同,流密码的加密是基于异或(XOR)操作进行的,每次都只操作一个字节。但流密码加密算法的性能非常好,因此也是非常受开发者欢迎的一种加密算法。常见的流密码加密算法有RC4、ORYX、SEAL等。

     Reused Key Attack

    在流密码的使用中,最常见的错误便是使用同一个密钥进行多次加/解密。这将使得破解流密码变得非常简单。这种攻击被称为“Reused Key At-tack”,在这种攻击下,攻击者不需要知道密钥,即可还原出明文。

    在密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,被称为Bit-flipping Attack

    解决Bit-flipping攻击的方法是验证密文的完整性,最常见的方法是增加带有KEY的MAC(消息验证码,MessageAuthentication Code),通过MAC验证密文是否被篡改。通过哈希算法来实现的MAC,称为HMAC。HMAC由于其性能较好,而被广泛使用。

    在密码学里有个基本的原则:密码系统的安全性应该依赖于密钥的复杂性,而不应该依赖于算法的保密性。

    在安全领域里,选择一个足够安全的加密算法不是困难的事情,难的是密钥管理。在一些实际的攻击案例中,直接攻击加密算法本身的案例很少,而因为密钥没有妥善管理导致的安全事件却很多。对于攻击者来说,他们不需要正面破解加密算法,如果能够通过一些方法获得密钥,则是件事半功倍的事情。

    密钥管理中最常见的错误,就是将密钥硬编码在代码里。将加密密钥、签名的salt等“key”硬编码在代码中,是非常不好的习惯。

    硬编码的密钥,在以下几种情况下可能被泄露。

    一是代码被广泛传播。这种泄露途径常见于一些开源软件;有的商业软件并不开源,但编译后的二进制文件被用户下载,也可能被逆向工程反编译后,泄露硬编码的密钥。

    二是软件开发团队的成员都能查看代码,从而获知硬编码的密钥。开发团队的成员如果流动性较大,则可能会由此泄露代码。

    对于第一种情况,如果一定要将密钥硬编码在代码中,我们尚可通过Diffie-Hellman交换密钥体系,生成公私钥来完成密钥的分发;而对于第二种情况,则只能通过改善密钥管理来保护密钥。

    对于Web应用来说,常见的做法是将密钥(包括密码)保存在配置文件或者数据库中,在使用时由程序读出密钥并加载进内存。密钥所在的配置文件或数据库需要严格的控制访问权限,同时也要确保运维或DBA中具有访问权限的人越少越好。

    在应用发布到生产环境时,需要重新生成新的密钥或密码,以免与测试环境中使用的密钥相同。

    当黑客已经入侵之后,密钥管理系统也难以保证密钥的安全性。比如攻击者获取了一个web-shell,那么攻击者也就具备了应用程序的一切权限。由于正常的应用程序也需要使用密钥,因此对密钥的控制不可能限制住webshell的“正常”请求。

    密钥管理的主要目的,还是为了防止密钥从非正常的渠道泄露。定期更换密钥也是一种有效的做法。一个比较安全的密钥管理系统,可以将所有的密钥(包括一些敏感配置文件)都集中保存在一个服务器(集群)上,并通过WebService的方式提供获取密钥的API。每个Web应用在需要使用密钥时,通过带认证信息的API请求密钥管理系统,动态获取密钥。Web应用不能把密钥写入本地文件中,只加载到内存,这样动态获取密钥最大程度地保护了密钥的私密性。密钥集中管理,降低了系统对于密钥的耦合性,也有利于定期更换密钥。

    相关文章

      网友评论

          本文标题:2019-07-08

          本文链接:https://www.haomeiwen.com/subject/fmtzhctx.html