会话劫持防范_第1页
会话劫持防范_第2页
会话劫持防范_第3页
会话劫持防范_第4页
会话劫持防范_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录Session 会话劫持2模拟会话劫持2防范措施3 (1)设置 httponly (2)session + token验证 (3) CAS校验Session 会话劫持会话标识是随机数据的唯一字符串,一般来说由数字和字符组成,这个字符串由web应用生成并通过cookie的方式发送给用户。在会话标识被发送之后,每个用户发出的请求都在其它请求中包含了该应用发送给他的会话标识。通过使用会话标识,web应用能够识别不同的用户,区分并发的请求和及时追踪用户。会话标识是首要的攻击目标,因为成功的捕获并重演会话标识可以为攻击者提供易受攻击web应用的当即认证。根据窃取到的ID所属用户的访问权限,攻击者可以

2、像普通用户,甚至是特权用户一样登录网站,并访问各种隐私数据模拟会话劫持我们正常地登录一个网站,登录的用户名是admin,记录好登录后的JSESSIONID我们打开另一个浏览器Firefox,我们尝试访问一个私密链接:http:/localhost/ puzzlemall/private/viewprofile.jsp,这时浏览器会提示我们登录。这说明这个链接需要登录以后才能观看打开WebScrab并开启Proxy中的“Intercept requests”功能,并把Firefox的代理设置成WebScrab的IP和端口(8008),然后再次访问这个私密链接,这时WebScrab会截获这个请求,

3、然后修改JSESSIONID为上面admin用户的JSESSIONID这时我们会发现进入了admin用户的个人信息(profile)页面。这说明我们成功地以admin用户的身份进行了登录。当然了,这个例子只是一个会话劫持的模拟,在实际的网络中,JSESSIONID往往是通过XSS泄露出去的(或者没有走安全的协议而被嗅探)防范措施(1)设置 httponly,可以防止其他人和脚本获取到session HttpOnly标识是一个可选的、避免利用XSS(Cross-Site Scripting)来获取session cookie的标识。XSS攻击最常见一个的目标是通过获取的session cooki

4、e来劫持受害者的session;使用HttpOnly标识是一种很有用的保护机制。可以人工设置这些参数,如果在Servlet3或者更新的环境,tomcat7中开发,只需要在web.xml简单的配置就能实现这种效果: <session-config><cookie-config><http-only>true</http-only></cookie-config></session-config> <!-而且如果使用了secure标识,配置应该如下 -><session-config><cooki

5、e-config><http-only>true</http-only><secure>true</secure></cookie-config></session-config>兼容 Java EE 6.0 的容器,如 Tomcat 7,那么 Cookie 类已经有了 setHttpOnly 的方法来使用 HttpOnly 的 Cookie 属性 cookie.setHttpOnly(true);(2)session + token验证 ,不仅验证sesion还要验证自己的token 实现原理:一致性。jsp生成表

6、单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该页面不正常提交,做非正常流程处理,可以警告提示也可以什么也不做。Token主类文件: jsp页面端<% page import="Token" %>表单包含隐藏的toke

7、n字符串:<form><input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>"></form>在Server端action中进行检验if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME),&#

8、160;request.getSession()/进行正常业务流程else/进行进行异常处理流程(3)CAS校验 CAS 基础协议CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Serve

9、r 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行

10、Ticket 验证的过程对于用户是透明的。(详解)添加cas-client的jar包下载cas-client,地址:/downloads/cas-clients/,当前最新版本是cas-client-3.2.1-release.zip。然后解压cas-client-3.2.1-release.zip,在modules拷贝cas-client-core-3.2.1.jar到应用的WEB-INF/lib目录中。撰写支持CAS集成的客户化包除了在web.xml添加CAS内置的filter外(具体看配置web.xml),我们需要撰写自己支持CAS集成的客户化包。

11、大致思路如下:Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException HttpServletRequest request = (HttpServletRequest)servletRequest;HttpServletResponse response = (HttpServletResponse)servletResponse;HttpSe

12、ssion session = request.getSession();/在session中自定义一个参数,以它来校验是否完成过自动登陆Object user_login = session.getAttribute(AURORA_USER_LOGIN);if (user_login != null)/登陆过,就继续执行其他filterfilterChain.doFilter(request, response);return;/通过CAS的API获得登陆账号String loginName = AssertionHolder.getAssertion().getPrincipal().ge

13、tName();try /执行本系统的登陆。跟平常同时校验用户名和密码不同,这里只有用户名。executeLoginProc(request,response,loginName); catch (Exception e) logger.log(Level.SEVERE, "executeLoginProc error:", e);return;/登陆成功session.setAttribute(AURORA_USER_LOGIN, Boolean.TRUE);/跳转到登陆成功后的页面response.sendRedirect(roleSelectPageUrl);把这个c

14、lass打包成一个jar拷贝到应用的WEB-INF/lib目录中。如果有兴趣,还可以简单了解下org.jasig.cas.client.authentication.AuthenticationFilter这个CAS内置filter的功能public final void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException     HttpServl

15、etRequest request = (HttpServletRequest)servletRequest;    HttpServletResponse response = (HttpServletResponse)servletResponse;    HttpSession session = request.getSession(false); /检查自定义属性"_const_cas_assertion_"    Assertion assertion = ses

16、sion != null ? (Assertion)session.getAttribute("_const_cas_assertion_") : null;    if (assertion != null)    /已经成功登陆过CAS      filterChain.doFilter(request, response);      return;      /拿到url,并检查

17、url参数中的ticket是否有效    String serviceUrl = constructServiceUrl(request, response);    String ticket = CommonUtils.safeGetParameter(request, getArtifactParameterName();    boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);&#

18、160;   if (CommonUtils.isNotBlank(ticket) | (wasGatewayed)    /ticket有效      filterChain.doFilter(request, response);      return;        this.log.debug("no ticket and no assertion found");&

19、#160;   String modifiedServiceUrl;    String modifiedServiceUrl;    if (this.gateway)       this.log.debug("setting gateway attribute in session");      modifiedServiceUrl = this.gatewayStorage.storeG

20、atewayInformation(request, serviceUrl);    else       modifiedServiceUrl = serviceUrl;        if (this.log.isDebugEnabled()       this.log.debug("Constructed service url: " + modifiedServiceUrl);

21、        String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);    if (this.log.isDebugEnabled()       this.log.debug("redire

22、cting to "" + urlToRedirectTo + """);      /重定向到cas的登陆页面    response.sendRedirect(urlToRedirectTo);   修改web.xml在应用WEB-INF/web.xml添加filter的内容,效果如下所示<!- = 单点登录开始 = -><!- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-><listener><li

23、stener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!- 该过滤器用于实现单点登出功能,可选配置。 -><filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter<

24、;/filter-class></filter><filter-mapping><filter-name>CAS Single Sign Out Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- 该过滤器负责用户的认证工作,必须启用它 -><filter><filter-name>CASFilter</filter-name><filter-class>or

25、g.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>:8080/cas/login</param-value><!-这里的server是服务端的IP-></init-param><init-param><

26、param-name>serverName</param-name><param-value>:8080</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- 该过滤器负责对

27、Ticket的校验工作,必须启用它 -><filter><filter-name>CAS Validation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value&

28、gt;:8080/cas</param-value></init-param><init-param><param-name>serverName</param-name><param-value>:8080</param-value></init-param></filter><filter-mapping><filter-name>CAS

29、 Validation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。-><filter><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>&

30、lt;filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-该过滤器使得开发者可以通过org.jas

31、ig.cas.client.util.AssertionHolder来获取用户的登录名。比如AssertionHolder.getAssertion().getPrincipal().getName()。-><filter><filter-name>CAS Assertion Thread Local Filter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter>

32、;<filter-mapping><filter-name>CAS Assertion Thread Local Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- 自动根据单点登录的结果设置本系统的用户信息-><filter><display-name>AutoSetUserAdapterFilter</display-name><filter-name>AutoSetUse

33、rAdapterFilter</filter-name><filter-class>aurora.plugin.sso.cas.AutoSetUserFilter</filter-class><init-param><param-name>roleSelectPageUrl</param-name><param-value>:8080/yourapp/role_select.screen</param-value></init-pa

34、ram></filter><filter-mapping><filter-name>AutoSetUserAdapterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- = 单点登录结束 = -> 前面几个都是CAS的标准配置,最后一个AutoSetUserAdapterFilter(自定义,可以取其他任意名字)才是我们支持cas的客户化程序。其中roleSelectPageUrl是指用户完成单

35、点登录后跳转的页面。本文档撰写时java web项目和CAS用同一个tomcat,所以都用的https。否则只需要配置CAS的链接为HTTPS,本项目连接用HTTP。 修改CAS的认证逻辑CAS默认的逻辑是用户名和密码一致就可以登陆,现在需要把原web系统的用户名和密码校验挪到CAS中。这里假设原先web系统中有一张sys_user表存储了用户名和MD5散列后的密码。 打开cas/WEB-INF/deployerConfigContext.xml注释掉SimpleTestUsernamePasswordAuthenticationHandler这个Handler,

36、并添加 <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><property ref="dataSource" name="dataSource"></property><property name="sql" value="select t.encrypted_user_password from sys_user t where t.user_name=?"></property> <property ref="MD5PasswordEncode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论