伪造servlet容器会话机制
今天以前公司的项目问了一个关于会话的问题,觉得比较有意思,记录一下。
关于servlet的会话机制原理,这里就不嗦了,网络上一大把。主要说明下问的这个问题:
用浏览器访问servlet服务,servlet容器一般会返回一个标示当前会话的cookie,一般servlet容器默认的都是JSESSIONID,这样就会有个问题,每次我用一个浏览器登录后,我使用其他浏览器或者http访问工具如httpclient伪造一个刚浏览器登录的会话的cookie,那是不是就可以访问需要身份认证后的资源?
写个测试页面jsp:
?
<%Cookie [] cookies = request.getCookies();//cookie可能为nullout.append("cookie is null :");out.append(cookies==null ? "true<br>" : "false<br>");if(cookies != null)for(int i=0; i<cookies.length; i++){out.append(cookies[i].getName()+":"+cookies[i].getValue());out.append("<br>");}out.print(request.getSession().getId());%>?使用浏览器访问这个jsp,查看JSESSIONID的cookie信息,然后用httpclient伪造一个cookie进行访问:
?
HttpClient client = new HttpClient();HttpMethod get = new GetMethod("http://localhost:8080/test/test.jsp");Cookie cookie = new Cookie();cookie.setName("JSESSIONID");//设置域名cookie.setDomain("localhost");//设置pathcookie.setPath("/test/");cookie.setValue("0000MDDSdWQ0_C2HDRFpurjIt91");HttpState state = client.getState();state.addCookie(cookie);client.setState(state);client.executeMethod(get);System.out.println(get.getResponseBodyAsString());?测试发现,浏览器访问返回的和httpclient返回的一样,说明cookie机制的会话是可以伪造的。
?
可见,伪造会话是可行的,如果默认使用容器的会话,可能会泄露安全数据,当然这是需要你的网络信息被侦听,获取到了你的会话cookie或者其他安全相关的cookie。使用高安全的https,或者做请求验证,在默认的会话机制上增加相关安全机制都可有安全保障
java程序依赖的lib放在附件了,要测试的话可以下载
1 楼 瓶鱼跃 2012-11-02 楼主的HttpClient HttpMethod 这几个类是从哪个包来的??? 2 楼 goodluck_wgw 2012-11-02 瓶鱼跃 写道楼主的HttpClient HttpMethod 这几个类是从哪个包来的???apache HttpClient 3 楼 bewithme 2012-11-02 你说的不错,的确可以伪造,所以会话周期不能太长,重人的应用应该用SSL进行保护。 4 楼 瓶鱼跃 2012-11-02 我下载了http client的jar包,为什么导入之后还是有很多错误呢?? 5 楼 jayuton 2012-11-02 对于安全要求比较高的页面,都会用令牌进行保护页面资源的 6 楼 finallygo 2012-11-04 瓶鱼跃 写道我下载了http client的jar包,为什么导入之后还是有很多错误呢??
3和4的差别比较大... 7 楼 big_student 2012-11-05 瓶鱼跃 写道我下载了http client的jar包,为什么导入之后还是有很多错误呢??
httpclient依赖了apache的codec和logging2个包,我挂在附件了 版本可能都不是最新的 8 楼 瓶鱼跃 2012-11-05 big_student 写道瓶鱼跃 写道我下载了http client的jar包,为什么导入之后还是有很多错误呢??
httpclient依赖了apache的codec和logging2个包,我挂在附件了 版本可能都不是最新的
确实可以了,多谢楼主