JAVA年度安全 第一周 防御Session Fixation
http://www.jtmelton.com/2012/01/02/year-of-security-for-java-week-1-session-fixation-prevention这是神马东西,我为啥要关心?
Session Fixation,常用的定义:session劫持的一个变种。最常见的基本流程是:
1、攻击者从应用中获取一个可用的session id
2、攻击者易做图受骗者使用这个session id
3、攻击者通过受骗者正在使用的session id获取受骗者账户的访问权限。
第2步诱使受骗者使用这个session id才是攻击的精髓。常见的做法仅仅是给受骗者发送一个带有某个网站session id的url链接。 www.zzzyk.com
很明显,一个用户能够控制其他用户的账户是一个严重的问题,那么。。。
我应该做什么?
幸运的是解决这个问题通常很简单。简单的建议:
当用户成功登陆后,废弃用户的session(译者注:网站在用户登陆后,废弃用户登录前使用的session)
解决Session Fixation的常见流程如下:
1、用户输入正确的凭证
2、系统成功认证用户信息
3、当前session中的所有需要被保留的信息都存放到一个临时位置
4、废弃当前session(HttpSession.invalidate())
5、创建新的session(new session ID)
6、将临时位置中的信息放入新session中
7、用户使用新的session id成功登陆访问页面
在ESAPI工程中有一段有用的代码来展示如何改变session标示。
http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java(参考changeSessionIdentifier方法)
还可以采用其他的方法来提供更多的保障来避免这种情况。下面列出我的一些想法:
1、检查用户是否试图使用一个废弃的session id登陆(需要维护一个LRU cache来保存废弃的session id列表)
2、检查用户是否试图使用一个已经在其他ip上使用过的session id(需要使用map来维护这些数据)
3、如果发现一些明显的恶意行为,考虑使用类似AppSensor(作者的广告)的工具来保护你的应用,并且能够让你知道这些攻击。
正如你所知,session fixation是一个严重问题,但是有很简单的解决方案。如果可能的话,你最好的措施是引入一些“企业级”框架中(例如ESAPI)的合适解决方案,这样就能够在你的所有应用中通用这个方案。
参考
———–
https://www.owasp.org/index.php/Session_fixation
http://www.acros.si/易做图s/session_fixation.pdf
http://cwe.mitre.org/data/definitions/384.html
http://projects.webappsec.org/w/page/13246960/Session%20Fixation
作者liu251
补充:综合编程 , 安全编程 ,