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

程序员征服安全 OWASP 十大 API 系列-失效的对象级授权

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

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

下一系列博客将重点介绍与应用程序编程接口 (API) 有关的一些最严重的安全漏洞。这些都太糟糕了,以至于他们创建了开放 Web 应用程序安全项目 (OWASP) 主要的 API 漏洞列表。鉴于 API 对现代计算基础架构的重要性,您需要不惜一切代价将这些关键问题排除在应用程序和程序之外。

在对损坏的对象级授权漏洞的检查中,可以找到一个很好的例子,说明为什么必须使用代码来加强安全性。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、更改或提出其他操作或访问对象的请求,从而允许他们通过 API 端点修改和访问对象和数据时,就会发生这种情况。API 端点是一个接触点,通常是 URL,用于 API 本身与其他系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件的地位,但如果多个端点不密封,则有暴露多个端点的风险。

当程序员忘记或继承父类的属性时,也可能发生这种情况,却没有意识到这样做还会遗漏代码中的关键验证过程。通常,对于使用用户输入访问数据源的每个函数,都应包括对象级授权检查。

认为你已经熟悉这些漏洞了,现在能找到、修复和消除访问控制错误吗?玩游戏化挑战赛:

你过得怎么样?如果你想努力提高自己的分数,请继续阅读!

损坏的对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取不应允许的操作。这可能是应留给管理员的操作,例如访问或查看敏感数据或销毁记录。在高度安全的环境中,这甚至可能意味着阻止任何人查看记录,除非他们获得特别授权。
定义对象级授权时,应牢记所有可能的操作。例如,在 Java Spring API 中,存在潜在问题的端点可能如下所示:

公共布尔值 deleteOrder(长 ID){
订单订单 = orderRepository.getOne (id);
if(订单 == 空){
log.info(“未找到订单”);
返回 false;
}
用户用户 = order.getUser ();
orderRepository.delete(订购);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;

API 端点按 ID 删除订单,但不验证此订单是否由当前登录的用户下达。这为攻击者提供了利用此漏洞并删除其他用户的订单的机会。

为了正确实施安全访问限制,代码将更像这样:

公共布尔值 deleteOrder(长 ID){
用户用户 = userService.getUserbyContext ();
布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));
if (orderExist) {
orderRepository.deleteById (id);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;
} 其他 {
log.info(“未找到订单”);
返回 false;

消除损坏的对象级授权漏洞

访问控制代码不必过于复杂。就我们的 Java Spring API 环境示例而言,可以通过严格定义谁可以访问对象来修复这个问题。

首先,必须实施验证程序,以确定谁在提出请求:

用户用户 = userService.getUserbyContext ();

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

布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));

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

orderRepository.deleteById (id);

请记住,您需要确保代码中的授权方法与组织的用户政策和数据访问控制保持一致。为了确保您的代码完全安全,您应该进行检查,以验证具有不同权限级别的用户是否有权访问他们执行任务所需的数据,但不能查看或更改任何本应限于他们的内容。这样做可能会发现意外忽视的丢失的对象控制漏洞。

这些示例的主要启示是,首先定义用户可以对对象执行的所有操作,然后直接向代码添加强大的访问控制。最后,永远不要相信继承的父财产可以完成这项工作或在其他地方委托这种权力。取而代之的是,在代码中为需要保护的每种对象类型明确定义用户权限和操作。

来看看 安全代码勇士 博客页面,详细了解此漏洞以及如何保护您的组织和客户免受其他安全漏洞的破坏。你也可以 试试演示 Secure Code Warrior 培训平台可让您的所有网络安全技能不断磨练并保持最新状态。



查看资源
查看资源

通常,对于使用用户输入访问数据源的每个函数,都应包括对象级授权检查,不这样做会带来很大的风险。

对更多感兴趣?

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

了解更多

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

预约演示
分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于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。

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

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

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

下一系列博客将重点介绍与应用程序编程接口 (API) 有关的一些最严重的安全漏洞。这些都太糟糕了,以至于他们创建了开放 Web 应用程序安全项目 (OWASP) 主要的 API 漏洞列表。鉴于 API 对现代计算基础架构的重要性,您需要不惜一切代价将这些关键问题排除在应用程序和程序之外。

在对损坏的对象级授权漏洞的检查中,可以找到一个很好的例子,说明为什么必须使用代码来加强安全性。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、更改或提出其他操作或访问对象的请求,从而允许他们通过 API 端点修改和访问对象和数据时,就会发生这种情况。API 端点是一个接触点,通常是 URL,用于 API 本身与其他系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件的地位,但如果多个端点不密封,则有暴露多个端点的风险。

当程序员忘记或继承父类的属性时,也可能发生这种情况,却没有意识到这样做还会遗漏代码中的关键验证过程。通常,对于使用用户输入访问数据源的每个函数,都应包括对象级授权检查。

认为你已经熟悉这些漏洞了,现在能找到、修复和消除访问控制错误吗?玩游戏化挑战赛:

你过得怎么样?如果你想努力提高自己的分数,请继续阅读!

损坏的对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取不应允许的操作。这可能是应留给管理员的操作,例如访问或查看敏感数据或销毁记录。在高度安全的环境中,这甚至可能意味着阻止任何人查看记录,除非他们获得特别授权。
定义对象级授权时,应牢记所有可能的操作。例如,在 Java Spring API 中,存在潜在问题的端点可能如下所示:

公共布尔值 deleteOrder(长 ID){
订单订单 = orderRepository.getOne (id);
if(订单 == 空){
log.info(“未找到订单”);
返回 false;
}
用户用户 = order.getUser ();
orderRepository.delete(订购);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;

API 端点按 ID 删除订单,但不验证此订单是否由当前登录的用户下达。这为攻击者提供了利用此漏洞并删除其他用户的订单的机会。

为了正确实施安全访问限制,代码将更像这样:

公共布尔值 deleteOrder(长 ID){
用户用户 = userService.getUserbyContext ();
布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));
if (orderExist) {
orderRepository.deleteById (id);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;
} 其他 {
log.info(“未找到订单”);
返回 false;

消除损坏的对象级授权漏洞

访问控制代码不必过于复杂。就我们的 Java Spring API 环境示例而言,可以通过严格定义谁可以访问对象来修复这个问题。

首先,必须实施验证程序,以确定谁在提出请求:

用户用户 = userService.getUserbyContext ();

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

布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));

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

orderRepository.deleteById (id);

请记住,您需要确保代码中的授权方法与组织的用户政策和数据访问控制保持一致。为了确保您的代码完全安全,您应该进行检查,以验证具有不同权限级别的用户是否有权访问他们执行任务所需的数据,但不能查看或更改任何本应限于他们的内容。这样做可能会发现意外忽视的丢失的对象控制漏洞。

这些示例的主要启示是,首先定义用户可以对对象执行的所有操作,然后直接向代码添加强大的访问控制。最后,永远不要相信继承的父财产可以完成这项工作或在其他地方委托这种权力。取而代之的是,在代码中为需要保护的每种对象类型明确定义用户权限和操作。

来看看 安全代码勇士 博客页面,详细了解此漏洞以及如何保护您的组织和客户免受其他安全漏洞的破坏。你也可以 试试演示 Secure Code Warrior 培训平台可让您的所有网络安全技能不断磨练并保持最新状态。



查看资源
查看资源

填写下面的表格下载报告

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

提交
scw 成功图标
SCW 错误图标
要提交表单,请启用“分析”Cookie。完成后,可以随意再次禁用它们。

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

下一系列博客将重点介绍与应用程序编程接口 (API) 有关的一些最严重的安全漏洞。这些都太糟糕了,以至于他们创建了开放 Web 应用程序安全项目 (OWASP) 主要的 API 漏洞列表。鉴于 API 对现代计算基础架构的重要性,您需要不惜一切代价将这些关键问题排除在应用程序和程序之外。

在对损坏的对象级授权漏洞的检查中,可以找到一个很好的例子,说明为什么必须使用代码来加强安全性。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、更改或提出其他操作或访问对象的请求,从而允许他们通过 API 端点修改和访问对象和数据时,就会发生这种情况。API 端点是一个接触点,通常是 URL,用于 API 本身与其他系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件的地位,但如果多个端点不密封,则有暴露多个端点的风险。

当程序员忘记或继承父类的属性时,也可能发生这种情况,却没有意识到这样做还会遗漏代码中的关键验证过程。通常,对于使用用户输入访问数据源的每个函数,都应包括对象级授权检查。

认为你已经熟悉这些漏洞了,现在能找到、修复和消除访问控制错误吗?玩游戏化挑战赛:

你过得怎么样?如果你想努力提高自己的分数,请继续阅读!

损坏的对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取不应允许的操作。这可能是应留给管理员的操作,例如访问或查看敏感数据或销毁记录。在高度安全的环境中,这甚至可能意味着阻止任何人查看记录,除非他们获得特别授权。
定义对象级授权时,应牢记所有可能的操作。例如,在 Java Spring API 中,存在潜在问题的端点可能如下所示:

公共布尔值 deleteOrder(长 ID){
订单订单 = orderRepository.getOne (id);
if(订单 == 空){
log.info(“未找到订单”);
返回 false;
}
用户用户 = order.getUser ();
orderRepository.delete(订购);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;

API 端点按 ID 删除订单,但不验证此订单是否由当前登录的用户下达。这为攻击者提供了利用此漏洞并删除其他用户的订单的机会。

为了正确实施安全访问限制,代码将更像这样:

公共布尔值 deleteOrder(长 ID){
用户用户 = userService.getUserbyContext ();
布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));
if (orderExist) {
orderRepository.deleteById (id);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;
} 其他 {
log.info(“未找到订单”);
返回 false;

消除损坏的对象级授权漏洞

访问控制代码不必过于复杂。就我们的 Java Spring API 环境示例而言,可以通过严格定义谁可以访问对象来修复这个问题。

首先,必须实施验证程序,以确定谁在提出请求:

用户用户 = userService.getUserbyContext ();

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

布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));

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

orderRepository.deleteById (id);

请记住,您需要确保代码中的授权方法与组织的用户政策和数据访问控制保持一致。为了确保您的代码完全安全,您应该进行检查,以验证具有不同权限级别的用户是否有权访问他们执行任务所需的数据,但不能查看或更改任何本应限于他们的内容。这样做可能会发现意外忽视的丢失的对象控制漏洞。

这些示例的主要启示是,首先定义用户可以对对象执行的所有操作,然后直接向代码添加强大的访问控制。最后,永远不要相信继承的父财产可以完成这项工作或在其他地方委托这种权力。取而代之的是,在代码中为需要保护的每种对象类型明确定义用户权限和操作。

来看看 安全代码勇士 博客页面,详细了解此漏洞以及如何保护您的组织和客户免受其他安全漏洞的破坏。你也可以 试试演示 Secure Code Warrior 培训平台可让您的所有网络安全技能不断磨练并保持最新状态。



观看网络研讨会
开始吧
了解更多

点击下面的链接并下载此资源的PDF。

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

查看报告预约演示
查看资源
分享到:
领英品牌社交x 标志
对更多感兴趣?

分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于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。

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

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

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

下一系列博客将重点介绍与应用程序编程接口 (API) 有关的一些最严重的安全漏洞。这些都太糟糕了,以至于他们创建了开放 Web 应用程序安全项目 (OWASP) 主要的 API 漏洞列表。鉴于 API 对现代计算基础架构的重要性,您需要不惜一切代价将这些关键问题排除在应用程序和程序之外。

在对损坏的对象级授权漏洞的检查中,可以找到一个很好的例子,说明为什么必须使用代码来加强安全性。当程序员未能明确定义哪些用户能够查看对象和数据,或提供任何形式的验证来查看、更改或提出其他操作或访问对象的请求,从而允许他们通过 API 端点修改和访问对象和数据时,就会发生这种情况。API 端点是一个接触点,通常是 URL,用于 API 本身与其他系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件的地位,但如果多个端点不密封,则有暴露多个端点的风险。

当程序员忘记或继承父类的属性时,也可能发生这种情况,却没有意识到这样做还会遗漏代码中的关键验证过程。通常,对于使用用户输入访问数据源的每个函数,都应包括对象级授权检查。

认为你已经熟悉这些漏洞了,现在能找到、修复和消除访问控制错误吗?玩游戏化挑战赛:

你过得怎么样?如果你想努力提高自己的分数,请继续阅读!

损坏的对象级授权漏洞的例子有哪些?

对象级访问控制漏洞允许攻击者采取不应允许的操作。这可能是应留给管理员的操作,例如访问或查看敏感数据或销毁记录。在高度安全的环境中,这甚至可能意味着阻止任何人查看记录,除非他们获得特别授权。
定义对象级授权时,应牢记所有可能的操作。例如,在 Java Spring API 中,存在潜在问题的端点可能如下所示:

公共布尔值 deleteOrder(长 ID){
订单订单 = orderRepository.getOne (id);
if(订单 == 空){
log.info(“未找到订单”);
返回 false;
}
用户用户 = order.getUser ();
orderRepository.delete(订购);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;

API 端点按 ID 删除订单,但不验证此订单是否由当前登录的用户下达。这为攻击者提供了利用此漏洞并删除其他用户的订单的机会。

为了正确实施安全访问限制,代码将更像这样:

公共布尔值 deleteOrder(长 ID){
用户用户 = userService.getUserbyContext ();
布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));
if (orderExist) {
orderRepository.deleteById (id);
log.info(“删除用户 {} 的订单”,user.getId ());
返回真值;
} 其他 {
log.info(“未找到订单”);
返回 false;

消除损坏的对象级授权漏洞

访问控制代码不必过于复杂。就我们的 Java Spring API 环境示例而言,可以通过严格定义谁可以访问对象来修复这个问题。

首先,必须实施验证程序,以确定谁在提出请求:

用户用户 = userService.getUserbyContext ();

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

布尔值 orderExist = getUserOrders () .stream ()
.anyMatch(订单->(order.getId () == id));

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

orderRepository.deleteById (id);

请记住,您需要确保代码中的授权方法与组织的用户政策和数据访问控制保持一致。为了确保您的代码完全安全,您应该进行检查,以验证具有不同权限级别的用户是否有权访问他们执行任务所需的数据,但不能查看或更改任何本应限于他们的内容。这样做可能会发现意外忽视的丢失的对象控制漏洞。

这些示例的主要启示是,首先定义用户可以对对象执行的所有操作,然后直接向代码添加强大的访问控制。最后,永远不要相信继承的父财产可以完成这项工作或在其他地方委托这种权力。取而代之的是,在代码中为需要保护的每种对象类型明确定义用户权限和操作。

来看看 安全代码勇士 博客页面,详细了解此漏洞以及如何保护您的组织和客户免受其他安全漏洞的破坏。你也可以 试试演示 Secure Code Warrior 培训平台可让您的所有网络安全技能不断磨练并保持最新状态。



目录

下载PDF
查看资源
对更多感兴趣?

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

了解更多

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

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

帮助您入门的资源

更多帖子
资源中心

帮助您入门的资源

更多帖子