zoukankan      html  css  js  c++  java
  • Asp.net Session hijacking(会话标识未更新)

    原理复制于:https://www.cnblogs.com/luminji/archive/2012/05/30/2511357.html

    原理:

    原理

    会话劫持是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为sessionid),然后伪造请求,去访问授权用户的数据。

    获取特征值的非常规有段主要有如下几种:

    首先是猜测的方式,如果我们的sessionid的生成是有规律的,那么使用猜测的方式就可以到达非法获取的目的,如图所示:

     

    其次是session fixation攻击。session fixation攻击是指用户通过XSS、网络嗅探、本地木马来得到特征值,这些交互的特征值一般来说放置在浏览器的Cookie中(当然,我们也知道sessionid也可以通过URL来传递,这样的话,获取就简单多了)。然后诱使用户去完成一次登录(诱使的方法可使发邮件,发链接等)。如果服务器没有更新这个SessionID,则攻击者可以凭借此SessionID登录系统,如图所示:

    在特征值被获取到之后,攻击者还可以使用Session保持攻击,这一般是指写一段小代码,定时发送请求,保持Session有效。这样,攻击者,就可以一直利用这个合法用户进行非法活动。

    实际案例

    http://yourdomain.com/default.aspx界面,我们偷到了sessionID,然后就可以模拟这样的请求来完成一次攻击。一次攻击是指,拿上如下的请求,我们可以在任意客户端进行登录。

    User-Agent: Fiddler

    Host: 192.168.40.193

    Cookie: LoginName=luminji; ASP.NET_SessionId=xzyplp45wgl3rf45ssxt5h55;

    同时,在客户端写一段脚本,还可以完成Session保持攻击。经过这样的处理后,非法用户不用登录系统就可以访问任意页面了。

    应对策略

    1:为Cookie设置httpOnly,就可以有效防止Cookie被非法读取,从而防止劫持;

    2:每次登录更换SessionID。

    具体措施

    n  查看sessionid生成策略,确保不可被猜测

    备注,sessionid在asp.net程序中是被自动生成为GUID形式的,所以在Asp.net程序中该项不需要被修改。

    n  查看sessionid保存策略,确保不通过URL进行传递

    n  每次登录更换sessionid

    改进登录模块,每次登录更换sessionid。更换sessionid并不会影响有些站点的类似“一个星期”都不用登录的功能。如果攻击者不是从合法用户的本机获取的sessionid,那么完成此次升级后,session fixation攻击就被阻断了。

    更换SessionID的函数为:(此方法没有成功!

    复制代码
            private void ChangeSessionID()
            {
                SessionIDManager m = new SessionIDManager();
                m.RemoveSessionID(Context);
                HttpApplication ctx = (HttpApplication)Context.ApplicationInstance;
                HttpModuleCollection mods = ctx.Modules;
                SessionStateModule sessionStateModule = (SessionStateModule)mods.Get("Session");
                System.Reflection.MethodInfo CreateSessionId = 
                    sessionStateModule.GetType().GetMethod(
                        "CreateSessionId", 
                        BindingFlags.Instance | BindingFlags.NonPublic);
                System.Reflection.MethodInfo InitStateStoreItem = 
                    sessionStateModule.GetType().GetMethod(
                        "InitStateStoreItem", 
                        BindingFlags.Instance | BindingFlags.NonPublic);
                CreateSessionId.Invoke(sessionStateModule, null);
                SessionStateUtility.RemoveHttpSessionStateFromContext(Context);
                InitStateStoreItem.Invoke(sessionStateModule, new object[] { true });
    
                FieldInfo sessioninfo =
                        this.GetType().BaseType.BaseType.GetField(
                            "_session",
                            BindingFlags.NonPublic | BindingFlags.Instance );
                sessioninfo.SetValue(this, HttpContext.Current.Session);
            }
    复制代码

    n  确保登录逻辑不仅仅依赖sessionid

    如果登录逻辑不仅仅依赖sessionid,攻击者将需要得到全部的特征值(一般情况下,就是说意味着他要得到全部和登录相关的cookie值),这加大了攻击难度。

    n  确保Cookie的httponly

    通过文件查找所有的”cookie”,找出所有设置cookie的地方,为用于认证的cookie设置如下的格式:

    Set-Cookie: cookieName=cookieValue;httponly

    Cookie中的httponly的属性和作用

    1.什么是HttpOnly?

    如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。XSS全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

    2.HttpOnly的设置样例

    response.setHeader("Set-Cookie", "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

     例如:

    //设置cookie

    response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")

    //设置多个cookie

    response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");

    response.addHeader("Set-Cookie", "timeout=30; Path=/test; HttpOnly");

    //设置https的cookie

    response.addHeader("Set-Cookie", "uid=112; Path=/; Secure; HttpOnly");

    具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取。

    Cookie cookies[]=request.getCookies();  

    每次登录修改SessionID

    CustomSessionIDManager.cs 文件

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Web;
    using System.Web.Configuration;
    using System.Web.SessionState;
    
    /// <summary>
    /// CustomSessionIDManager 的摘要说明
    /// </summary>
    public class CustomSessionIDManager : SessionIDManager, ISessionIDManager
    {
        private SessionStateSection pConfig = null;
        string ISessionIDManager.GetSessionID(HttpContext context)
        {
            if (pConfig == null)
            {
                Configuration cfg =
                  WebConfigurationManager.OpenWebConfiguration(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
                pConfig = (SessionStateSection)cfg.GetSection("system.web/sessionState");
            }
    
            string sid = base.GetSessionID(context);//默认从Cookie、UseUri 中获取
    
            if (string.IsNullOrEmpty(sid)
                && !string.IsNullOrEmpty(context.Request.QueryString[pConfig.CookieName]))
            {
                sid = context.Request.QueryString[pConfig.CookieName];//从自定义查询字符中获取,也可以扩展从自定义Header中获取
    
    
                return sid;
            }
            return sid;
        }
    }
    View Code

    登录页事件:

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Context.Session.Abandon();
                CustomSessionIDManager customSessionIDManager = new CustomSessionIDManager();
                Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", customSessionIDManager.CreateSessionID(Context)));
            }
            //其他代码
        }

    这样就实现了每次登录修改一下SessionId

  • 相关阅读:
    本学期课程总结
    “进度条”博客——第十六周
    “进度条”博客——第十五周
    《梦断代码》阅读笔记03
    第二期冲刺站立会议个人博客16(2016/6/09)
    第二期冲刺站立会议个人博客15(2016/6/08)
    第二期冲刺站立会议个人博客14(2016/6/07)
    第二期冲刺站立会议个人博客13(2016/6/06)
    第二期冲刺站立会议个人博客12(2016/6/05)
    “进度条”博客——第十四周
  • 原文地址:https://www.cnblogs.com/xiaoruilin/p/13607955.html
Copyright © 2011-2022 走看看