探索ASP.NET Forms验证的相关安全性问题
创始人
2024-06-07 20:00:44
0

ASP.NET Forms验证主要是为了防止Forms被破解危害网站的安全,今天我们将从简单的Forms开始讲述,最后讲解危机将带来什么后果。

ASP.NET提供了内置的登录验证,最为常用的就是Forms验证。讲解如何配置的文章非常多,这里就不再讲如何配置使用这个验证的方式了。下面讲讲其在安全性上存在的一些被忽视的问题。其实它本身没有问题,而使用的方式上会附带出来一些问题。

本文将分三部分讲实际应用中将会遇到的安全性问题,并且加以研究,并尝试提出解决方案。

一、简单的Forms被破解危机

二、垂直划分站点的Forms被破解危机

三、危机将带来什么后果

一、简单的Forms被破解危机

最简单的一个ASP.NET Forms验证,在web.config下配置节点:

  1.  mode="Forms"> 
  2.      name=".MyCookies"> 
  3.  

编写一个帮助类:

  1. CookieHelper类  
  2.     public static class CookieHelper {  
  3.         public static string Encrypt(string name, string value) {  
  4.             FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddDays(1), true, value, "/");  
  5.             string authTicket = FormsAuthentication.Encrypt(ticket);  
  6.             return authTicket;  
  7.         }  
  8.  
  9.         public static void Set(string name, string value) {  
  10.             HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, Encrypt(name, value));  
  11.             cookie.Expires = DateTime.Now.AddDays(1);  
  12.             if (HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName] == null)  
  13.                 HttpContext.Current.Response.Cookies.Add(cookie);  
  14.             else 
  15.                 HttpContext.Current.Response.Cookies.Set(cookie);  
  16.         }  
  17.  
  18.         public static string Get() {  
  19.             if (HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName] == null)  
  20.                 return null;  
  21.             else {  
  22.                 return HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value;  
  23.             }  
  24.         }  
  25.  
  26.         public static FormsAuthenticationTicket Decrypt(string value) {  
  27.             return FormsAuthentication.Decrypt(value);  
  28.         }  
  29.     } 

建立站点SiteA

建立站点SiteB

在SiteA的页面设置Cookie:

CookieHelper.Set("yurow", "123123");

OK!这样,就在SiteA建立了一份Cookie,这个本身并没有任何问题。但是我们往往忽视了一些问题,大家看到,我在CookieHelper类里提供了Decrypt方法,这个方法可以解密Cookie。问题就在于这里!怎么?不知道?那就让贫道来跟施主解释。在这样的网站下,我进行以下的操作步骤:

1、我注册一个帐号;

2、我用这个帐号登录(方便起见,我使用Firefox);

3、打开Firebug,并且启用该网站的网络监视;

4、刷新登录后的页面;

5、在该页面被监视的HTTP头中可以看到一段Cookie密文。例如:

.MyCookie=32DDE0B4E858248037E4D082EF7E9C9BC607B7AA878F8DD
7DE7C13630A5A38FD9A9DA89B709E79F97D05DEEFC9D55A45D29051D
66955439055D01476E8659E34ABDB42FA0018020194F26618FE74E11B
 这样的字符串。

OK,在该网站的操作到此为止。现在在SiteB中建立一个页面,中间加上一个输入框,一个按钮,并且编写以下事件:

解密代码

  1. protected void Button1_Click(object sender, EventArgs e) {  
  2.     string text = TextBox1.Text;  
  3.     if (!string.IsNullOrEmpty(text)) {  
  4.         FormsAuthenticationTicket ticket = CookieHelper.Decrypt(text);  
  5.         Type type = ticket.GetType();  
  6.         PropertyInfo[] properties = type.GetProperties();  
  7.         StringBuilder sb = new StringBuilder();  
  8.         foreach (PropertyInfo propertie in properties) {  
  9.             string name = propertie.Name;  
  10.             string val = propertie.GetValue(ticket, null).ToString();  
  11.             sb.Append(name);  
  12.             sb.Append(":");  
  13.             sb.Append(val);  
  14.             sb.Append("\r\n");  
  15.         }  
  16.         //textBox2.Text = sb.ToString();  
  17.         Response.Write(sb.ToString());  
  18.     }  

把上面的Cookie密文,等于后面的部分复制到SiteB页面中,点解密按钮,看到了什么?

Version:1 Name:yurow Expiration:2009-9-23 19:12:44 IssueDate:2009-9-22 19:12:44 IsPersistent:True Expired:False UserData:123123 CookiePath:/

怎么样?所有的信息都被解密了!不过好像高兴地太早了,解密了自己的数据有啥用啊,又拿不到别人的Cookie密文。暂且打住,接下来先讲垂直划分站点安全隐患。

二、垂直划分站点的Forms被破解危机

垂直划分站点其外在表现一般是多域名的N多站点。比如博客园的space.cnblogs.com,news.cnblogs.com等等。而上面第一部分的描述中,贫道似乎漏掉了关于设置machineKey的问题,那是因为要留到这里来讲,要是上面都说了,现在讲啥?

是的,我们是可以在web.config中设置

这样的节点。如果在A站点设置了这个,除非B站点也设置相同KEY的节点,否则SiteB将无法正确解密SiteA产生的Cookie密文。似乎一般的网站都设置了这个,好像我们不需要为此而担心了嘛!

是的,一般情况是这样的。但是,很多公司的人员流动性是较大的,而且垂直分割的站点中,可以接触到web.config的人我相信是非常多的。这就能让某些人,(当然,不包括贫道,嘿嘿)就可以比较容易地拿到这个关键的数据。这个数据能干啥?那还用说啊?我在SiteB我自己建立的站点的Web.config也配置上这个节点,那就可以轻易解开目标网站的Cookie密文。为了保证这方面的安全性不得不把Cookie加密解密部分做成服务,不但容易更新,而且让尽可能少的人接触,防止安全性上的问题被放大。要不然,有个人离职啊,或者电脑中毒啊,最好还是要改动改动machineKey,否则呢?否则就有可能出问题。出什么问题呢?这就是下面要讲的。

三、危机将带来什么后果

加密的Key泄露,会带来什么后果?后果很严重。从上面的例子可以看到这个站点Cookie密文包含的关键信息。而是要CookieHelper类,根据这些关键信息,我们就可以轻易地制造出一个Cookies密文。而拿这个Cookies密文写入目标网站的Coookies中,那么就会认为你已经登录。并且这个(这里我们用的验证可能是Cookie保持的用户名或者ID一类的东西。)用户名可以随意伪造,也就是可以用不存在的用户进行发帖!如果你每次在发帖等操作进行验证无疑是增加了服务器的负担,而最好的办法当然是不外泄加密KEY了。这种方式不当可以伪造用户(几个月前我专门试过一些站点是可以的,而伪造用户发帖会造成该论坛的某个版面甚至首页无法访问),而且可以伪造成管理员的帐号。不难想象,如果用其它用户的帐号或者管理员的帐号进行随意发帖,会造成怎么样的恶劣影响了吧?

OK,意识到问题了吧?

本文来自Birdshover博客园文章《ASP.NET Forms验证的安全性问题研究——为什么加密代码需要配置为服务

【编辑推荐】

  1. ASP.NET MVC单元测试:HttpContext类的Path属性解惑
  2. 自定义的ControllerFactory:接口实现,支持Area
  3. ASP.NET Routing之“解析URL”功能详解
  4. 为ASP.NET MVC应用添加自定义路由
  5. 学习ASP.NET MVC路由的使用方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...