博客

Coders Conquer Security OWASP Top 10 API Series - 破解对象级授权

马蒂亚斯-马杜博士
发表于2020年9月9日

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(OWASP)的顶级API漏洞名单。鉴于API对现代计算基础设施的重要性,这些都是关键问题,你需要不惜一切代价防止你的应用程序和程序出现。

在对被破坏的对象级授权漏洞的检查中,可以发现一个完美的例子,说明为什么使用代码来执行安全是至关重要的。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、改变或提出其他请求来操纵或访问对象,允许他们通过API端点修改和访问对象和数据,就会发生这种情况。一个API端点是一个接触点,通常是一个URL,用于API本身和另一个系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件,但如果它们不是密不透风的,就会有暴露多个端点的风险。

当编码人员忘记或继承父类的属性时,也会发生这种情况,而没有意识到这样做也会遗漏他们代码中的关键验证过程。一般来说,对于使用用户输入的数据源的每个函数,都应该包括对象级的授权检查。

你认为你已经熟悉了这些,并且现在就能找到、修复和消除一个访问控制的错误?参加游戏化的挑战。

你的表现如何?如果你想努力提高你的分数,请继续阅读!

破解对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取他们不应该被允许的行动。这可能是一个应该保留给管理员的行动,如访问或查看敏感数据,或销毁记录。在一个高度安全的环境中,它甚至可能意味着阻止任何人查看记录,除非他们被特别授权这样做。
在定义对象级别的授权时,你应该记住所有可能的行动。例如,在Java Spring API中,一个有潜在问题的端点可能看起来像这样。

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

API端点按ID删除订单,但不验证该订单是否由当前登录的用户做出。这就给攻击者提供了一个机会,可以利用这个漏洞,删除其他用户的订单。

为了正确地实现安全访问限制,代码看起来更像这样。

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

消除破碎的对象级授权漏洞

访问控制代码不需要过于复杂。在我们的Java Spring API环境的例子中,它可以通过严格定义谁可以访问对象来解决。

首先,必须实施一个核查程序,以确定谁在提出请求。

用户user = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

boolean orderExist = getUserOrders().stream()
.anyMatch(order -> (order.getId() == id))。

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



查看资源
查看资源

一般来说,对于每一个使用用户的输入访问数据源的功能,都应该包括对象级别的授权检查,如果不这样做,就会有很大的风险。

想了解更多信息?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

预定一个演示
分享到
作者
马蒂亚斯-马杜博士
发表于2020年9月9日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(OWASP)的顶级API漏洞名单。鉴于API对现代计算基础设施的重要性,这些都是关键问题,你需要不惜一切代价防止你的应用程序和程序出现。

在对被破坏的对象级授权漏洞的检查中,可以发现一个完美的例子,说明为什么使用代码来执行安全是至关重要的。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、改变或提出其他请求来操纵或访问对象,允许他们通过API端点修改和访问对象和数据,就会发生这种情况。一个API端点是一个接触点,通常是一个URL,用于API本身和另一个系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件,但如果它们不是密不透风的,就会有暴露多个端点的风险。

当编码人员忘记或继承父类的属性时,也会发生这种情况,而没有意识到这样做也会遗漏他们代码中的关键验证过程。一般来说,对于使用用户输入的数据源的每个函数,都应该包括对象级的授权检查。

你认为你已经熟悉了这些,并且现在就能找到、修复和消除一个访问控制的错误?参加游戏化的挑战。

你的表现如何?如果你想努力提高你的分数,请继续阅读!

破解对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取他们不应该被允许的行动。这可能是一个应该保留给管理员的行动,如访问或查看敏感数据,或销毁记录。在一个高度安全的环境中,它甚至可能意味着阻止任何人查看记录,除非他们被特别授权这样做。
在定义对象级别的授权时,你应该记住所有可能的行动。例如,在Java Spring API中,一个有潜在问题的端点可能看起来像这样。

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

API端点按ID删除订单,但不验证该订单是否由当前登录的用户做出。这就给攻击者提供了一个机会,可以利用这个漏洞,删除其他用户的订单。

为了正确地实现安全访问限制,代码看起来更像这样。

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

消除破碎的对象级授权漏洞

访问控制代码不需要过于复杂。在我们的Java Spring API环境的例子中,它可以通过严格定义谁可以访问对象来解决。

首先,必须实施一个核查程序,以确定谁在提出请求。

用户user = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

boolean orderExist = getUserOrders().stream()
.anyMatch(order -> (order.getId() == id))。

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



查看资源
查看资源

请填写下表下载报告

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

提交
要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(OWASP)的顶级API漏洞名单。鉴于API对现代计算基础设施的重要性,这些都是关键问题,你需要不惜一切代价防止你的应用程序和程序出现。

在对被破坏的对象级授权漏洞的检查中,可以发现一个完美的例子,说明为什么使用代码来执行安全是至关重要的。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、改变或提出其他请求来操纵或访问对象,允许他们通过API端点修改和访问对象和数据,就会发生这种情况。一个API端点是一个接触点,通常是一个URL,用于API本身和另一个系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件,但如果它们不是密不透风的,就会有暴露多个端点的风险。

当编码人员忘记或继承父类的属性时,也会发生这种情况,而没有意识到这样做也会遗漏他们代码中的关键验证过程。一般来说,对于使用用户输入的数据源的每个函数,都应该包括对象级的授权检查。

你认为你已经熟悉了这些,并且现在就能找到、修复和消除一个访问控制的错误?参加游戏化的挑战。

你的表现如何?如果你想努力提高你的分数,请继续阅读!

破解对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取他们不应该被允许的行动。这可能是一个应该保留给管理员的行动,如访问或查看敏感数据,或销毁记录。在一个高度安全的环境中,它甚至可能意味着阻止任何人查看记录,除非他们被特别授权这样做。
在定义对象级别的授权时,你应该记住所有可能的行动。例如,在Java Spring API中,一个有潜在问题的端点可能看起来像这样。

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

API端点按ID删除订单,但不验证该订单是否由当前登录的用户做出。这就给攻击者提供了一个机会,可以利用这个漏洞,删除其他用户的订单。

为了正确地实现安全访问限制,代码看起来更像这样。

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

消除破碎的对象级授权漏洞

访问控制代码不需要过于复杂。在我们的Java Spring API环境的例子中,它可以通过严格定义谁可以访问对象来解决。

首先,必须实施一个核查程序,以确定谁在提出请求。

用户user = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

boolean orderExist = getUserOrders().stream()
.anyMatch(order -> (order.getId() == id))。

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



访问资源

点击下面的链接,下载本资料的 PDF 文件。

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

查看报告预定一个演示
下载PDF
查看资源
分享到
想了解更多信息?

分享到
作者
马蒂亚斯-马杜博士
发表于2020年9月9日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(OWASP)的顶级API漏洞名单。鉴于API对现代计算基础设施的重要性,这些都是关键问题,你需要不惜一切代价防止你的应用程序和程序出现。

在对被破坏的对象级授权漏洞的检查中,可以发现一个完美的例子,说明为什么使用代码来执行安全是至关重要的。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、改变或提出其他请求来操纵或访问对象,允许他们通过API端点修改和访问对象和数据,就会发生这种情况。一个API端点是一个接触点,通常是一个URL,用于API本身和另一个系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件,但如果它们不是密不透风的,就会有暴露多个端点的风险。

当编码人员忘记或继承父类的属性时,也会发生这种情况,而没有意识到这样做也会遗漏他们代码中的关键验证过程。一般来说,对于使用用户输入的数据源的每个函数,都应该包括对象级的授权检查。

你认为你已经熟悉了这些,并且现在就能找到、修复和消除一个访问控制的错误?参加游戏化的挑战。

你的表现如何?如果你想努力提高你的分数,请继续阅读!

破解对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取他们不应该被允许的行动。这可能是一个应该保留给管理员的行动,如访问或查看敏感数据,或销毁记录。在一个高度安全的环境中,它甚至可能意味着阻止任何人查看记录,除非他们被特别授权这样做。
在定义对象级别的授权时,你应该记住所有可能的行动。例如,在Java Spring API中,一个有潜在问题的端点可能看起来像这样。

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

API端点按ID删除订单,但不验证该订单是否由当前登录的用户做出。这就给攻击者提供了一个机会,可以利用这个漏洞,删除其他用户的订单。

为了正确地实现安全访问限制,代码看起来更像这样。

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

消除破碎的对象级授权漏洞

访问控制代码不需要过于复杂。在我们的Java Spring API环境的例子中,它可以通过严格定义谁可以访问对象来解决。

首先,必须实施一个核查程序,以确定谁在提出请求。

用户user = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

boolean orderExist = getUserOrders().stream()
.anyMatch(order -> (order.getId() == id))。

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



目录

下载PDF
查看资源
想了解更多信息?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

预定一个演示下载
分享到
资源中心
资源中心