当前位置: 首页 > news >正文

固定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");

相关文章:

  • Python 学习入门(20)—— 循环
  • 网络安全[脚本小子] -- SSI注入
  • wdcp虚拟主机管理系统注入漏洞
  • python发送GET或POST请求以便干一些趣事
  • SSH安全技巧
  • JSP过滤器防止Xss漏洞
  • XSS漏洞解决方案之一:过滤器
  • 五个你必须知道的javascript和web debug技术
  • 12 款最好的 Bootstrap 设计工具
  • 设置Jetty服务器的cookie为secure和httponly
  • XSS与HTTP-only Cookie 脚本获取JSESSIONID的方法
  • DNS 安全信息 (微软)
  • DNS安全 -月宫吴刚
  • ldap 身份验证的通用步骤
  • Openssl多个安全补丁简易分析危害及修复方案
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java编程基础24——递归练习
  • js对象的深浅拷贝
  • React+TypeScript入门
  • Tornado学习笔记(1)
  • vue:响应原理
  • Vue2.x学习三:事件处理生命周期钩子
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于游标的分页接口实现
  • 我看到的前端
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 最近的计划
  • Mac 上flink的安装与启动
  • #define
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (2015)JS ES6 必知的十个 特性
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (三) diretfbrc详解
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .md即markdown文件的基本常用编写语法
  • .NET Framework .NET Core与 .NET 的区别
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET正则基础之——正则委托
  • @Autowired多个相同类型bean装配问题
  • @ConditionalOnProperty注解使用说明
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [CISCN2019 华东南赛区]Web11
  • [delphi]保证程序只运行一个实例
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [HDOJ4911]Inversion
  • [KMP求最小循环节][HDU1358][Period]