SCW图标
英雄背景无分隔线
博客

コーダーズ・コンカー・セキュリティ OWASP トップ 10 API シリーズ-ブロークン・オブジェクト・レベル・オーソライゼーション

马蒂亚斯·马杜博士
出版日期: 2020 年 9 月 09 日
最后更新于 2026年3月10日

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个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 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



显示资源
显示资源

一般に、ユーザーからの入力を使用してデータソースにアクセスするすべての関数にオブジェクトレベルの認証チェックを含める必要があります。そうしないと、大きなリスクが伴います。

您还有兴趣吗?

马蒂亚斯·马杜博士是安全专家、研究员、首席技术官,以及安全代码战士的联合创始人。马蒂亚斯在根特大学以静态分析解决方案为核心,获得了应用安全领域的博士学位。此后他加入美国Fortify公司,并意识到仅检测代码问题而未协助开发者编写安全代码是远远不够的。这一认知促使他致力于开发能帮助开发者减轻安全负担、超越客户期望的产品。作为Team Awesome成员,当他不在办公桌前时,最享受在RSA大会、BlackHat、DefCon等技术会议上登台演讲的时刻。

了解更多

Secure Code Warrior致力于在整个软件开发生命周期中保护代码,并协助构建将网络安全置于首位的文化。无论您是应用程序安全经理、开发人员、首席信息安全官还是安全相关人员,我们都能帮助您降低与不安全代码相关的风险。

预约演示
分享:
领英品牌社交x 标志
著者
马蒂亚斯·马杜博士
发表于2020年9月9日

马蒂亚斯·马杜博士是安全专家、研究员、首席技术官,以及安全代码战士的联合创始人。马蒂亚斯在根特大学以静态分析解决方案为核心,获得了应用安全领域的博士学位。此后他加入美国Fortify公司,并意识到仅检测代码问题而未协助开发者编写安全代码是远远不够的。这一认知促使他致力于开发能帮助开发者减轻安全负担、超越客户期望的产品。作为Team Awesome成员,当他不在办公桌前时,最享受在RSA大会、BlackHat、DefCon等技术会议上登台演讲的时刻。

马蒂亚斯是一位拥有15年以上软件安全实践经验的研究员兼开发者。他曾为Fortify Software、其创立的Sensei Security等企业开发解决方案。在职业生涯中,马蒂亚斯主导了多个应用安全研究项目,这些项目最终转化为商用产品,并获得了10余项专利。在离开办公桌时,马蒂亚斯担任高级应用安全培训课程讲师,并定期在RSA大会、黑帽大会、DefCon、BSIMM、OWASP应用安全大会、BruCon等全球性会议上发表演讲。

马蒂亚斯在根特大学获得计算机工程博士学位,期间学习了通过程序混淆技术隐藏应用程序内部运作机制的应用程序安全技术。

分享:
领英品牌社交x 标志

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个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 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



显示资源
显示资源

要下载报告,请填写以下表格。

恳请允许我们向您发送有关本公司产品及/或相关安全编码主题的信息。我们始终以高度谨慎的态度处理您的个人信息,绝不会出于营销目的将其出售给其他公司。

送信
scw 成功图标
SCW 错误图标
要提交表单,请启用“Analytics”Cookie。设置完成后,您可以再次将其禁用。

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个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致力于在整个软件开发生命周期中保护代码,并协助构建将网络安全置于首位的文化。无论您是应用程序安全经理、开发人员、首席信息安全官还是安全相关人员,我们都能帮助您降低与不安全代码相关的风险。

显示报告预约演示
下载PDF文件
显示资源
分享:
领英品牌社交x 标志
您还有兴趣吗?

分享:
领英品牌社交x 标志
著者
马蒂亚斯·马杜博士
发表于2020年9月9日

马蒂亚斯·马杜博士是安全专家、研究员、首席技术官,以及安全代码战士的联合创始人。马蒂亚斯在根特大学以静态分析解决方案为核心,获得了应用安全领域的博士学位。此后他加入美国Fortify公司,并意识到仅检测代码问题而未协助开发者编写安全代码是远远不够的。这一认知促使他致力于开发能帮助开发者减轻安全负担、超越客户期望的产品。作为Team Awesome成员,当他不在办公桌前时,最享受在RSA大会、BlackHat、DefCon等技术会议上登台演讲的时刻。

马蒂亚斯是一位拥有15年以上软件安全实践经验的研究员兼开发者。他曾为Fortify Software、其创立的Sensei Security等企业开发解决方案。在职业生涯中,马蒂亚斯主导了多个应用安全研究项目,这些项目最终转化为商用产品,并获得了10余项专利。在离开办公桌时,马蒂亚斯担任高级应用安全培训课程讲师,并定期在RSA大会、黑帽大会、DefCon、BSIMM、OWASP应用安全大会、BruCon等全球性会议上发表演讲。

马蒂亚斯在根特大学获得计算机工程博士学位,期间学习了通过程序混淆技术隐藏应用程序内部运作机制的应用程序安全技术。

分享:
领英品牌社交x 标志

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个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文件
显示资源
您还有兴趣吗?

马蒂亚斯·马杜博士是安全专家、研究员、首席技术官,以及安全代码战士的联合创始人。马蒂亚斯在根特大学以静态分析解决方案为核心,获得了应用安全领域的博士学位。此后他加入美国Fortify公司,并意识到仅检测代码问题而未协助开发者编写安全代码是远远不够的。这一认知促使他致力于开发能帮助开发者减轻安全负担、超越客户期望的产品。作为Team Awesome成员,当他不在办公桌前时,最享受在RSA大会、BlackHat、DefCon等技术会议上登台演讲的时刻。

了解更多

Secure Code Warrior致力于在整个软件开发生命周期中保护代码,并协助构建将网络安全置于首位的文化。无论您是应用程序安全经理、开发人员、首席信息安全官还是安全相关人员,我们都能帮助您降低与不安全代码相关的风险。

预约演示[下载]
分享:
领英品牌社交x 标志
资源中心

开始所需的资源

其他投稿
资源中心

开始所需的资源

其他投稿