锁定老帖子 主题:固定SessionID漏洞
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-13
最后修改:2010-12-13
by BoBo
一个简单的登录控制下面是一个最常用最简单的登录控制流程,通过表单提交用户名密码,servlet判断用户名密码,正确则写一个session,然后跳转到登录后的能够看到的页面 /*省略头部信息*/ <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,使其用该JESSIONID登录,获取用户登录后的JESSIONID。(这里作为示范,直接从浏览器中获取) #!/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漏洞,则更加可以轻易获取登录权限。避免这一漏洞的方法主要有两种: 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就不会相同 <Context useHttpOnly="true">
...
</Context>
另一种设置httpOnly的方式是使用Tomcat的servlet扩展直接写header response.setHeader( "Set-Cookie", "name=value; HttpOnly"); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-13
确实是这样。。。
还有登录要输入验证码的,在通过登录后,保存在session中的验证码也有重置 |
|
返回顶楼 | |
发表时间:2010-12-14
这个session跟数据库的sql语言预处理,感觉有相似
|
|
返回顶楼 | |
发表时间:2010-12-14
老生常谈的问题。
|
|
返回顶楼 | |
发表时间:2010-12-14
不就是Session fixation嘛?
|
|
返回顶楼 | |
发表时间:2010-12-14
既然之前的sessionid会被盗,那么如果用户在登录以后sessionid再被盗了呢。
|
|
返回顶楼 | |
发表时间:2010-12-14
tomcat7已经自动处理了这种情况,可以设置为每次请求更新sessionId
|
|
返回顶楼 | |
发表时间:2010-12-14
archerfrank 写道 既然之前的sessionid会被盗,那么如果用户在登录以后sessionid再被盗了呢。
能拿到别人的sessionid,如果不是在局域网的话,差不多能拿到用户名密码了。 |
|
返回顶楼 | |
发表时间:2010-12-14
所以现在大部分好的网站都有在客户端对用户密码进行加密,或者走https协议,这个问题很老了,不走https,是没有绝对的安全的,用sniffer,任何明文都可以轻易获取,管你什么session不session,除非将session跟ip加密绑定
|
|
返回顶楼 | |
发表时间:2010-12-14
无论如何,这样处理一下,确实会安全一些.
比如,我给一个人发过去一个url,然后使用url上带上sessionid这种情况,这个时候,那个人在这个url的地址上进行登录,如果sessionid是固定的,那么我就可以使用这个共享这个sessionid的. 在这种模式下,我完全没有尝试去对那个人的系统有任何的监听,hack行为,却能达到很好的效果. |
|
返回顶楼 | |