會話劫持防范_第1頁
會話劫持防范_第2頁
會話劫持防范_第3頁
會話劫持防范_第4頁
會話劫持防范_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目錄Session 會話劫持2模擬會話劫持2防范措施3 (1)設(shè)置 httponly (2)session + token驗證 (3) CAS校驗Session 會話劫持會話標識是隨機數(shù)據(jù)的唯一字符串,一般來說由數(shù)字和字符組成,這個字符串由web應(yīng)用生成并通過cookie的方式發(fā)送給用戶。在會話標識被發(fā)送之后,每個用戶發(fā)出的請求都在其它請求中包含了該應(yīng)用發(fā)送給他的會話標識。通過使用會話標識,web應(yīng)用能夠識別不同的用戶,區(qū)分并發(fā)的請求和及時追蹤用戶。會話標識是首要的攻擊目標,因為成功的捕獲并重演會話標識可以為攻擊者提供易受攻擊web應(yīng)用的當即認證。根據(jù)竊取到的ID所屬用戶的訪問權(quán)限,攻擊者可以

2、像普通用戶,甚至是特權(quán)用戶一樣登錄網(wǎng)站,并訪問各種隱私數(shù)據(jù)模擬會話劫持我們正常地登錄一個網(wǎng)站,登錄的用戶名是admin,記錄好登錄后的JSESSIONID我們打開另一個瀏覽器Firefox,我們嘗試訪問一個私密鏈接:http:/localhost/ puzzlemall/private/viewprofile.jsp,這時瀏覽器會提示我們登錄。這說明這個鏈接需要登錄以后才能觀看打開WebScrab并開啟Proxy中的“Intercept requests”功能,并把Firefox的代理設(shè)置成WebScrab的IP和端口(8008),然后再次訪問這個私密鏈接,這時WebScrab會截獲這個請求,

3、然后修改JSESSIONID為上面admin用戶的JSESSIONID這時我們會發(fā)現(xiàn)進入了admin用戶的個人信息(profile)頁面。這說明我們成功地以admin用戶的身份進行了登錄。當然了,這個例子只是一個會話劫持的模擬,在實際的網(wǎng)絡(luò)中,JSESSIONID往往是通過XSS泄露出去的(或者沒有走安全的協(xié)議而被嗅探)防范措施(1)設(shè)置 httponly,可以防止其他人和腳本獲取到session HttpOnly標識是一個可選的、避免利用XSS(Cross-Site Scripting)來獲取session cookie的標識。XSS攻擊最常見一個的目標是通過獲取的session cooki

4、e來劫持受害者的session;使用HttpOnly標識是一種很有用的保護機制??梢匀斯ぴO(shè)置這些參數(shù),如果在Servlet3或者更新的環(huán)境,tomcat7中開發(fā),只需要在web.xml簡單的配置就能實現(xiàn)這種效果: <session-config><cookie-config><http-only>true</http-only></cookie-config></session-config> <!-而且如果使用了secure標識,配置應(yīng)該如下 -><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 類已經(jīng)有了 setHttpOnly 的方法來使用 HttpOnly 的 Cookie 屬性 cookie.setHttpOnly(true);(2)session + token驗證 ,不僅驗證sesion還要驗證自己的token 實現(xiàn)原理:一致性。jsp生成表

6、單時,在表單中插入一個隱藏<input>字段,該字段就是保存在頁面端的token字符串,同時把該字符串存入session中。等到用戶提交表單時,會一并提交該隱藏的token字符串。在服務(wù)器端,查看下是否在session中含有與該token字符串相等的字符串。如果有,那么表明是第一次提交該表單,然后刪除存放于session端的token字符串,再做正常業(yè)務(wù)邏輯流程;如果沒有,那么表示該頁面不正常提交,做非正常流程處理,可以警告提示也可以什么也不做。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()/進行正常業(yè)務(wù)流程else/進行進行異常處理流程(3)CAS校驗 CAS 基礎(chǔ)協(xié)議CAS Client 與受保護的客戶端應(yīng)用部署在一起,以 Filter 方式保護受保護的資源。對于訪問受保護資源的每個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,如果沒有,則說明當前用戶尚未登錄,于是將請求重定向到指定好的 CAS Server 登錄地址,并傳遞 Service (也就是要訪問的目的資源地址),以便登錄成功過后轉(zhuǎn)回該地址。用戶在第 3 步中輸入認證信息,如果登錄成功,CAS Serve

9、r 隨機產(chǎn)生一個相當長度、唯一、不可偽造的 Service Ticket,并緩存以待將來驗證,之后系統(tǒng)自動重定向到 Service 所在地址,并為客戶端瀏覽器設(shè)置一個 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產(chǎn)生的 Ticket 過后,在第 5,6 步中與 CAS Server 進行身份合適,以確保 Service Ticket 的合法性。在該協(xié)議中,所有與 CAS 的交互均采用 SSL 協(xié)議,確保,ST 和 TGC 的安全性。協(xié)議工作過程中會有 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到應(yīng)用的WEB-INF/lib目錄中。撰寫支持CAS集成的客戶化包除了在web.xml添加CAS內(nèi)置的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中自定義一個參數(shù),以它來校驗是否完成過自動登陸Object user_login = session.getAttribute(AURORA_USER_LOGIN);if (user_login != null)/登陸過,就繼續(xù)執(zhí)行其他filterfilterChain.doFilter(request, response);return;/通過CAS的API獲得登陸賬號String loginName = AssertionHolder.getAssertion().getPrincipal().ge

13、tName();try /執(zhí)行本系統(tǒng)的登陸。跟平常同時校驗用戶名和密碼不同,這里只有用戶名。executeLoginProc(request,response,loginName); catch (Exception e) logger.log(Level.SEVERE, "executeLoginProc error:", e);return;/登陸成功session.setAttribute(AURORA_USER_LOGIN, Boolean.TRUE);/跳轉(zhuǎn)到登陸成功后的頁面response.sendRedirect(roleSelectPageUrl);把這個c

14、lass打包成一個jar拷貝到應(yīng)用的WEB-INF/lib目錄中。如果有興趣,還可以簡單了解下org.jasig.cas.client.authentication.AuthenticationFilter這個CAS內(nèi)置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)    /已經(jīng)成功登陸過CAS      filterChain.doFilter(request, response);      return;      /拿到url,并檢查

17、url參數(shù)中的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在應(yīng)用WEB-INF/web.xml添加filter的內(nèi)容,效果如下所示<!- = 單點登錄開始 = -><!- 用于單點退出,該過濾器用于實現(xiàn)單點登出功能,可選配置-><listener><li

23、stener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!- 該過濾器用于實現(xiàn)單點登出功能,可選配置。 -><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是服務(wù)端的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><!-該過濾器負責實現(xiàn)HttpServletRequest請求的包裹,比如允許開發(fā)者通過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><!-該過濾器使得開發(fā)者可以通過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><!- 自動根據(jù)單點登錄的結(jié)果設(shè)置本系統(tǒng)的用戶信息-><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><!- = 單點登錄結(jié)束 = -> 前面幾個都是CAS的標準配置,最后一個AutoSetUserAdapterFilter(自定義,可以取其他任意名字)才是我們支持cas的客戶化程序。其中roleSelectPageUrl是指用戶完成單

35、點登錄后跳轉(zhuǎn)的頁面。本文檔撰寫時java web項目和CAS用同一個tomcat,所以都用的https。否則只需要配置CAS的鏈接為HTTPS,本項目連接用HTTP。 修改CAS的認證邏輯CAS默認的邏輯是用戶名和密碼一致就可以登陸,現(xiàn)在需要把原web系統(tǒng)的用戶名和密碼校驗挪到CAS中。這里假設(shè)原先web系統(tǒng)中有一張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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論