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

  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/xiaoruilin/p/13607955.html
Copyright © 2011-2022 走看看