`
csd_ali
  • 浏览: 136087 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

固定SessionID漏洞

阅读更多

 

by BoBo

 

一个简单的登录控制

下面是一个最常用最简单的登录控制流程,通过表单提交用户名密码,servlet判断用户名密码,正确则写一个session,然后跳转到登录后的能够看到的页面
登录页面JSP

/*省略头部信息*/
<body>
<form action="SessionTestServlet" method="post">
	用户名:<input name="username" type="text" value=""/>
	密码:<input name="password" type="password" value=""/>
	<input name="submit" type="submit" value="Submit"/>
</form>
</body>

SessionTestServlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    HttpSession session = request.getSession();
	    String username=request.getParameter("username");
	    String password=request.getParameter("password");
	    if("admin".equals(username) && "pass".equals(password)){
	        session.setAttribute("login", true);
	        response.sendRedirect("hello.jsp");
	    }else{
	        response.sendRedirect("login.jsp");
	    }
	}

登录后的页面hello.jsp

<body>
<%
	boolean isLogin = (Boolean)request.getSession().getAttribute("login");
	if(isLogin!=null){
	    out.print("Welcome");
	}else{
	    out.print("Sorry!");
	}
%>
</body>

匿名SessionID

运行着个简单的demo后,打开login.jsp,使用firebug或chrome会发现,即使没有登录,我们也会有一个JSESSIONID,这是由服务器端在会话开始是通过set-cookie来设置的匿名SessionId

输入用户名密码后,在查看JSESSIONID

可以发现,登录前和登录后的JSESSIONID并没有改变,那么这就是一个固定SessionID的漏洞(详见《黑客攻防技术宝典-web实战》第七章)

简单的漏洞攻击

第一步,需要获取被攻击用户的JSESSIONID,可以通过给被攻击用户一个伪造的JSESSIONID,使其用该JESSIONID登录,获取用户登录后的JESSIONID。(这里作为示范,直接从浏览器中获取)
第二步,等被攻击用户登录,是JESSIONID成为已登录状态。
第三步,伪造请求,访问登录后的资源。
在用户登录使该JSESSIONID称为已登录的ID后,攻击者就可以利用这个ID伪造请求访问登录后的资源。下面是一个简单的python脚本

#!/bin/python
import urllib, urllib2

request = urllib2.Request('http://localhost:9090/sec/hello.jsp')
opener = urllib2.build_opener()
//设置窃取的JSESSIONID
request.add_header('Cookie','JSESSIONID=CF2D43B2C433F1A9FD78CE9D01E2E52D')
hellodata=opener.open(request).read()
print hellodata

执行该脚本,结果如下:

能够看到需要登录的页面

漏洞分析处理

出现该问题的主要原因是登录控制使用的固定的SessionID,登录前与登录后的SessionID是一样的。这样就使得攻击者可以简单的伪造一个SessionID诱使用户使用该SessionID登录,即可获取登录权限。如果配合XSS漏洞,则更加可以轻易获取登录权限。避免这一漏洞的方法主要有两种:
1.在登录后重置sessionID
在登录验证成功后,通过重置session,是之前的匿名sessionId失效,这样可以避免使用伪造的sessionId进行攻击。代码如下

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    String username=request.getParameter("username");
	    String password=request.getParameter("password");
	    if("admin".equals(username) && "pass".equals(password)){
                //是之前的匿名session失效
	        request.getSession().invalidate();
	        request.getSession().setAttribute("login", true);
	        response.sendRedirect("hello.jsp");
	    }else{
	        response.sendRedirect("login.jsp");
	    }
	}

这样登录前与登录后的sessionID就不会相同

2.设置httpOnly属性
httponly是微软对cookie做的扩展,该值指定 Cookie 是否可通过客户端脚本访问, 解决用户的cookie可能被盗用的问题,减少跨站脚本攻击
主流的大多数浏览器已经支持此属性。httpOnly是cookie的扩展属性,并不包含在servlet2.x的规范里,因此一些javaee应用服务器并不支持httpOnly,针对tomcat,>6.0.19或者>5.5.28的版本才支持httpOnly属性,具体方法是在conf/context.xml添加httpOnly属性设置

<Context useHttpOnly="true">
...
</Context>

另一种设置httpOnly的方式是使用Tomcat的servlet扩展直接写header

response.setHeader( "Set-Cookie", "name=value; HttpOnly");
  • 大小: 36.1 KB
  • 大小: 28.9 KB
  • 大小: 30.4 KB
  • 大小: 37.5 KB
分享到:
评论
21 楼 JE帐号 2010-12-15  
chris_zley 写道
JE帐号 写道
chris_zley 写道
其实这个漏洞很简单,但整个攻击过程最难点在于如何获取用户的jsessionid


这个方案不是为了解决哪些能获取用户jsessionid的情况. 而是为了解决去诱导用户使用一个与jsessionid绑定的url(sessionid的url改写),并诱使用户在此基础上进行登录操作的情况.
这和获取去获取用户jsessionid还是有本质区别的,因为这种引诱的情况,实际上是不需要攻击用户的终端和网络的.

另外,对于有人说的tomcat7每次连接都会修改jsessionid的情况,有人知道更详细的细节么? 我很疑惑的是,如果每次都修改,岂不是意味着一些并发连接可能失效了?
比如,我先是一个xhr异步请求,服务端刚生成一个新jsessionid,但是还没有返回客户端时,我又是一个xhr请求过去.此时我带的是旧的jsessionid,岂不是就会出问题?




。。。你想说什么,能把话理顺了吗


汗, .
"整个攻击过程最难点在于如何获取用户的jsessionid" 意味着攻击的前提是你有办法可以监听对方的浏览器或者网络.很显然,这时候你面对的敌人不只是对方,还有对方的系统安全防护或者网络安全防护.成本会大很多.

但是另外一个方案是,你发给对方一个url(注意,这个url是经过你精心构造的,你将一个由你访问网站产生的jsessionid以 url重写的方式附加到你发给对方的url上.比如:www.x.com/login;jsessionid=xxxxxxxxxx?x=money).再找一些理由让对方在你给的url里进行登录.这样,对方访问过去的时候就已经附带上jsessionid了,此时如果服务端在login成功后,不去重新生成jsessionid,那么原先的那个jsessionid就会被认证.此时,你以及对方就都可以使用同一个jsessionid做登录后的操作了.
很显然,这种攻击方式,你除了需要找个有诱惑的理由去引诱对方去使用你给的url登录,其他的完全没有什么技术含量,而且对方的所有系统安全手段也完全无效. 攻击成本会低很多.这也是所谓的"社会工程学攻击"的一种.

总结一下,实施这中攻击的条件:
1.匿名访问服务器时,服务器也会分配jsessionid.
2.服务器端支持识别jsessionid的url重写.
3.服务器端在认证后没有重新生成jsessionid.
20 楼 nehu 2010-12-15  
java里面还算有解决方案,.net就悲剧了,目前还没发现好办法 (除了绑定IP)
19 楼 cr0w 2010-12-15  
https也不是绝对安全的
18 楼 xgj1988 2010-12-15  
javaeyebird 写道
服务器可以不接受url里的sessionid 只接收cookie里的sessionid
当然攻击者可以伪造 javascript:...之类的url来设置cookie 不过这样很容易被识别出来 不是一个常规的url

  我也觉得是这样。。
17 楼 archerfrank 2010-12-15  
chunquedong 写道
在session中保存客户端ip地址,每次都检查一下ip地址是否对应,要是不太合适就删除session。我想应该会安全点。

如果在局域网里,大家都用一个代理出去,一样有问题。
16 楼 javaeyebird 2010-12-15  
服务器可以不接受url里的sessionid 只接收cookie里的sessionid
当然攻击者可以伪造 javascript:...之类的url来设置cookie 不过这样很容易被识别出来 不是一个常规的url
15 楼 chris_zley 2010-12-15  
JE帐号 写道
chris_zley 写道
其实这个漏洞很简单,但整个攻击过程最难点在于如何获取用户的jsessionid


这个方案不是为了解决哪些能获取用户jsessionid的情况. 而是为了解决去诱导用户使用一个与jsessionid绑定的url(sessionid的url改写),并诱使用户在此基础上进行登录操作的情况.
这和获取去获取用户jsessionid还是有本质区别的,因为这种引诱的情况,实际上是不需要攻击用户的终端和网络的.

另外,对于有人说的tomcat7每次连接都会修改jsessionid的情况,有人知道更详细的细节么? 我很疑惑的是,如果每次都修改,岂不是意味着一些并发连接可能失效了?
比如,我先是一个xhr异步请求,服务端刚生成一个新jsessionid,但是还没有返回客户端时,我又是一个xhr请求过去.此时我带的是旧的jsessionid,岂不是就会出问题?




。。。你想说什么,能把话理顺了吗
14 楼 chunquedong 2010-12-15  
在session中保存客户端ip地址,每次都检查一下ip地址是否对应,要是不太合适就删除session。我想应该会安全点。
13 楼 JE帐号 2010-12-15  
chris_zley 写道
其实这个漏洞很简单,但整个攻击过程最难点在于如何获取用户的jsessionid


这个方案不是为了解决哪些能获取用户jsessionid的情况. 而是为了解决去诱导用户使用一个与jsessionid绑定的url(sessionid的url改写),并诱使用户在此基础上进行登录操作的情况.
这和获取去获取用户jsessionid还是有本质区别的,因为这种引诱的情况,实际上是不需要攻击用户的终端和网络的.

另外,对于有人说的tomcat7每次连接都会修改jsessionid的情况,有人知道更详细的细节么? 我很疑惑的是,如果每次都修改,岂不是意味着一些并发连接可能失效了?
比如,我先是一个xhr异步请求,服务端刚生成一个新jsessionid,但是还没有返回客户端时,我又是一个xhr请求过去.此时我带的是旧的jsessionid,岂不是就会出问题?
12 楼 chris_zley 2010-12-15  
其实这个漏洞很简单,但整个攻击过程最难点在于如何获取用户的jsessionid
11 楼 褚晓娜(0511) 2010-12-15  
感觉不错,虽然不是最终中的解决办法,但是还是比较安全一点的,
10 楼 tianice 2010-12-14  
官方早就有补丁了,tomcat7解决了这个问题
9 楼 JE帐号 2010-12-14  
无论如何,这样处理一下,确实会安全一些.
比如,我给一个人发过去一个url,然后使用url上带上sessionid这种情况,这个时候,那个人在这个url的地址上进行登录,如果sessionid是固定的,那么我就可以使用这个共享这个sessionid的.
在这种模式下,我完全没有尝试去对那个人的系统有任何的监听,hack行为,却能达到很好的效果.

8 楼 linkobe 2010-12-14  
所以现在大部分好的网站都有在客户端对用户密码进行加密,或者走https协议,这个问题很老了,不走https,是没有绝对的安全的,用sniffer,任何明文都可以轻易获取,管你什么session不session,除非将session跟ip加密绑定
7 楼 kkqqcom 2010-12-14  
archerfrank 写道
既然之前的sessionid会被盗,那么如果用户在登录以后sessionid再被盗了呢。



能拿到别人的sessionid,如果不是在局域网的话,差不多能拿到用户名密码了。
6 楼 michael.softtech 2010-12-14  
tomcat7已经自动处理了这种情况,可以设置为每次请求更新sessionId
5 楼 archerfrank 2010-12-14  
既然之前的sessionid会被盗,那么如果用户在登录以后sessionid再被盗了呢。
4 楼 bill2004158 2010-12-14  
不就是Session fixation嘛?
3 楼 icanfly 2010-12-14  
老生常谈的问题。
2 楼 lxtx517 2010-12-14  
这个session跟数据库的sql语言预处理,感觉有相似

相关推荐

    学习笔记

    3. **固定SessionID漏洞** 在Web开发中,SessionID用于跟踪用户状态。固定SessionID可能引发安全问题,如会话劫持。开发者应当确保每次会话开始时生成新的SessionID,并妥善管理其生命周期,以防止恶意攻击。 4. *...

    PHP Session_Regenerate_ID函数双释放内存破坏漏洞

    在PHP中,`session_regenerate_id()`函数是用于生成一个新的会话ID并替换当前的会话ID,以增加安全性,防止会话固定攻击。然而,在某些特定版本的PHP中,这个函数存在一个严重的问题——双释放内存破坏漏洞。 该...

    JavaWeb程序代码安全漏洞处理!

    5. 不安全的身份验证与会话管理:应使用安全的会话管理机制,例如定期刷新Session ID,避免固定Session ID,同时在敏感操作前进行重新验证身份。 6. 敏感信息泄露:确保敏感数据如密码、API密钥等加密存储,并限制...

    基于MD5和Session的PHP安全防范.pdf

    其研究重点是在对SessionID值的防泄漏上,显然各种Session设置会起到较好的防范效果。本文在PHP中利用MD5()函数对Session值以及SessionID值进行Hash处理,确切地说,是在SessionID值的储存机制上添加了MD5算法,作了...

    PHP漏洞全解

    **定义**:攻击者通过固定Session ID,等待受害者登录后冒充其身份。 **示例**:攻击者可能预先知道一个Session ID,并诱导受害者登录,之后使用这个ID访问账户。 **防御措施**: - 在用户登录成功后立即重新创建...

    PHP开发漏洞环境(SQL注入+文件上传+文件下载+XSS+万能密码+session/cookie的学习等等)

    6. session/cookie管理:不安全的session和cookie管理可能导致会话劫持、会话固定等安全问题。正确设置cookie属性(如HttpOnly和Secure),使用HTTPS协议,定期刷新session ID,以及限制会话时间,都是保护用户会话...

    Session Fixation Test:安全会话固定测试-开源

    会话固定攻击是一种网络安全性问题,攻击者通过在用户登录前预先设定一个已知的会话ID(Session ID),然后在用户登录后继续使用这个固定的会话ID,从而能够控制或劫持用户的会话。这种攻击方式可能导致敏感信息泄露...

    php漏洞全解1

    7. **Session固定攻击(Session Fixation)**:攻击者引导用户使用已知的Session ID登录,然后利用这个ID进行攻击。防御措施包括在用户登录后生成新的Session ID,避免在URL中传递Session ID。 8. **HTTP响应拆分攻击...

    011-Web安全基础7 - 会话管理漏洞.pptx

    会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。会话劫持的第一步是取得一个合法的会话标识来伪装成...

    PHP程序常见漏洞防范

    不要在URL中明文传输SESSION ID,定期清理过期的SESSION,以防止SESSION固定或劫持攻击。同时,使用session_start()前进行会话初始化设置,如设置session.use_trans_sid为false以阻止跨站会话固定。 6. **数据类型*...

    PHP安全漏洞

    8. **Session固定攻击**:攻击者迫使用户使用特定的session ID,以便在后续交互中继续冒充用户。确保session ID的随机性和唯一性,避免在URL中传递session ID。 9. **HTTP响应拆分攻击**:通过在响应头中注入换行符...

    PHP高级应用程序漏洞审核技术 PDF版.rar

    书中探讨了如何使用session_start()启动会话,设置安全的会话ID,以及如何避免会话固定攻击。同时,提到了使用HTTPOnly Cookie和Secure Flag来增强会话cookie的安全性。 4. SQL注入防护:SQL注入是一种常见的Web...

    高级php应用程序漏洞审核技术教程pdf版

    使用session_start()开始会话,定期更新session_id,避免固定会话ID,以减少会话劫持风险。 3. **权限控制**:限制文件系统访问权限,避免以root或管理员权限运行PHP,确保目录和文件权限设置合理,防止恶意代码执行...

    PHP漏洞全解(详细介绍)

    与会话劫持不同,Session固定攻击中攻击者会先设置一个固定的session ID,并诱导受害者使用该ID登录,之后攻击者便可使用相同的session ID访问受害者的会话。防御策略是让服务器生成并分配session ID,并在用户登录...

    161250128_唐诗林1

    同时,还应定期更新Session ID,以防止Session固定攻击,即攻击者在获取到一次Session ID后,长期有效利用。 总的来说,为了增强系统的安全性,开发者需要考虑多方面的防护措施,包括但不限于密码加密、设置...

    phpweb成品网站跳过官方用户身份验证方法

    4. **利用漏洞**:如果存在安全漏洞,例如session固定攻击或者SQL注入,可以利用这些漏洞直接获取或构造有效的session ID。但请注意,这种方法仅适用于测试环境,不应在生产环境中实践,以免对系统造成破坏。 5. **...

    PHP漏洞全解1

    Session会话劫持(Session Hijacking)和Session固定攻击(Session Fixation)涉及攻击者获取或操纵用户的会话ID。要防止这类攻击,应该使用HTTPS进行敏感通信,定期更新会话ID,以及在用户登录后立即生成新的会话ID...

    JSF Multiple Session都一個典型解決

    【JSF Multiple Session一个典型解决方案】 JavaServer Faces (JSF) 是Java平台上的一个用于构建Web应用程序的MVC(Model-View-Controller)框架。在处理用户会话时,JSF可能会遇到多重会话的问题,这可能导致数据...

Global site tag (gtag.js) - Google Analytics