Asp.net安全架构之2:Session hijacking(会话劫持)

简介: 原理 会话劫持是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为sessionid),然后伪造请求,去访问授权用户的数据。 获取特征值的非常规有段主要有如下几种: 首先是猜测的方式,如果我们的sessionid的生成是有规律的,那么使用猜测的方式就可以到达非法获取的目的,如图所示:   其次是session fixation攻击。

原理

会话劫持是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为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

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
86 0
|
存储 开发框架 NoSQL
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
284 0
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
|
开发框架 前端开发 安全
ASP.NET Core Startup类Config gure()方法|ASP.NET Core 中间件详细说明
目录 Startup 类 Configure() 方法 中间件 使用中间件 Configure 方法 的参数 IApplicationBuilder Extension Methods(拓展方法)--微软提供的中间件
146 0
ASP.NET Core Startup类Config gure()方法|ASP.NET Core 中间件详细说明
|
存储 开发框架 NoSQL
ASP.NET Core+Quartz.Net实现web定时任务
此处我们的项目使用稍复杂的Quartz.net实现web定时任务。
ASP.NET Core+Quartz.Net实现web定时任务
|
开发框架 .NET 应用服务中间件
ASP.NET Core : 一. 概述
ASP.NET Core : 一. 概述
147 0
ASP.NET Core : 一. 概述
|
开发框架 前端开发 .NET
ASP.NET MVC (五、HttpClient接口解析)(6)
ASP.NET MVC (五、HttpClient接口解析)(6)
197 0