API 开发中最常见的 6 个安全问题
导语:应用程序编程接口或 API 通过实现流畅的数据交换来连接我们使用的软件和服务。
应用程序编程接口或 API 通过实现流畅的数据交换来连接我们使用的软件和服务。他们经常交换高度敏感的信息:个人数据、用户凭据、财务详细信息等。这就是为什么 API 是黑客攻击的热门目标——根据API 安全状况报告,91% 的公司在 2020 年经历了 API 安全事件 [PDF ]。
在本文中,我们概述了 OWASP API 安全项目中最普遍的 API 漏洞,展示了它们是如何被利用的,并提供了在开发过程中保护您的 API 免受此类安全问题的方法。
最普遍的 API 漏洞是什么?
在处理应用程序安全时,保护 API 是关键任务之一,因为 API 通常是攻击者的网关。Gartner 预测,到 2022 年,API 滥用将成为最常见的黑客攻击媒介,并将导致许多数据泄露。
根据OWASP API 安全项目提供的 API 安全前 10 名(2019 年)列表,通过关注 API 的前 10 大安全风险,优先考虑保护 API 的工作。
OWASP 十大 API 安全风险
了解攻击者如何利用代码中的弱点是在 API 开发过程中防范风险的关键步骤之一。在本文中,我们将向您展示攻击者究竟如何利用列表中的前六个漏洞的示例。我们不会关注最后四个 API 安全挑战,因为它们与安全机制的不当应用有关。
为了向您展示恶意行为者如何利用这些漏洞,我们创建了一个不受保护的 API。我们将展示其代码的哪些部分为黑客打开了大门,并讨论了如何修复它们。让我们从部署不受保护的 API 开始。
创建示例 API
在本文中,我们将为简单的任务管理系统创建一个 API。该系统具有不同访问级别的用户,并允许他们执行简单的任务。此外,该系统允许用户管理活动:自助注册、创建、编辑和删除用户帐户。
API 将具有以下端点:
API 端点的类别
您可以使用任何 Linux 发行版作为此 API 的环境。要部署 API,请执行以下步骤:
1.安装Docker
2.安装Docker Compose
3.在 local.cfg 中配置电子邮件地址(您将需要此地址来发送密码重置电子邮件)
4.转到 API 文件夹并执行 docker-compose up --build 命令
您还可以从我们的GitHub 存储库下载此示例 API 。API 管理员帐户的凭据是:
· 用户名:管理员
· 密码:管理员
要阅读 API 文档,请将 ./swagger/swagger.yaml 文件从 API 上传到Swagger Editor。部署 API 后,我们可以开始利用漏洞并修复它们。
损坏的对象级授权
一些 API 公开对象标识符,这对于访问控制机制至关重要。这些机制验证用户只能访问他们有权访问的资源。为了利用对象级授权被破坏的 API,攻击者在 API 调用中更改请求资源的身份验证数据并获取对受保护数据的访问权限。
在我们的示例 API 中,只有用户自己和管理员可以查看用户的帐户详细信息。此外,我们在 API 开发期间添加了一个安全漏洞,并确保 GET /user 端点包含对象级授权漏洞。为了检测它,我们需要:
· 注册两个用户
· 通过 POST /login 端点以 user1 身份登录系统
· 获取身份验证令牌
我们使用这个请求登录系统:
API 使用以下数据响应我们的请求:
这是我们的身份验证令牌:
如果我们可以获取令牌,我们可以使用它通过 GET /user 端点请求 user2 数据:It was originally published on https://www.apriorit.com/
我们易受攻击的 API 使用 user2 数据进行响应:
如果我们的 API 受到对象级授权攻击的保护,它将使用以下消息响应 GET /user 端点请求:
损坏的用户身份验证
用户身份验证问题可能允许攻击者冒充用户、访问他们的个人数据并滥用访问权限。通常,此类漏洞隐藏在密码重置机制中。让我们看看如何在 API 中利用损坏的用户身份验证。
我们首先执行这个密码重置请求:
请求成功通过后,我们将收到一封电子邮件,其中包含四位数的重置代码至user@mail.com。之后,我们可以提出以下请求来更改密码:
API 不限制尝试输入重置代码的次数,这就是为什么为注册到user@mail.com的用户帐户获取新密码特别容易的原因。要猜测重置代码,我们只需要编写一个脚本,尝试使用从 0000 到 9999 的所有代码:It was originally published on https://www.apriorit.com/
当脚本输入正确的重置代码时,我们将收到包含新密码的响应:
通过利用这个对象级授权漏洞,我们可以获取拥有该邮箱的用户的登录信息,登录到他们的账户,然后更改邮箱。
在我们的示例 API 中,存在一个安全威胁,它允许我们使用相同的重置代码多次重置用户的密码。我们可以使用代码 1111 传递此请求,并随时更改用户密码:
过多的数据暴露
当开发人员为 API 和客户端之间的通信实施通用机制时,可能会出现此 API 安全漏洞。在这种情况下,API 可能会向客户端发送比它需要的更多的数据,客户端必须过滤数据并隐藏用户不相关的信息。攻击者可以嗅探此流量并从中提取敏感信息:身份验证令牌、帐号、电子邮件地址等。
为了在我们的 API 中演示此漏洞,我们将从 GET /task 端点请求任务的 ID 和有关用户的完整信息。这个端点应该只返回任务 ID,但让我们看看会发生什么。
这是我们的要求:
以下是 GET /task 端点的响应方式:
如果攻击者截获此响应,他们将获得 API 拥有的有关用户的所有信息,即使这些信息在 API 的客户端中不可用。
缺乏资源和速率限制
API 可以使用 CPU、RAM 和磁盘资源来处理请求。开发者通常会根据应用程序的业务逻辑来选择分配给 API 的资源。如果攻击者设法绕过业务逻辑限制以造成 API 必须处理的请求超出其设计目标的情况,则应用程序将耗尽资源并开始出现故障或变得不可用。
在我们的 API 中,GET /tasks 包含此漏洞。该端点支持分页——将 RAM 中的数据存储在硬盘上。攻击者可以滥用此功能来重载 API。
假设应用程序在一页上显示 10 个任务。显示任务的请求将如下所示:
攻击者可以使用放大的大小参数发送自己的请求以重载 API:
如果数据库中分配给请求任务的用户的任务过多,API 将过载,导致拒绝服务。
功能级别授权损坏
错误配置的授权机制允许攻击者未经授权访问敏感资源并窃取、编辑或创建新用户帐户。为了检测此漏洞,攻击者发送请求以访问他们不应访问的对象。
我们将 GET /admin/users 端点添加到我们的 API 以演示此漏洞。此端点返回在应用程序中注册的所有用户的数据,而不检查谁请求了数据(用户或管理员)。以下是此类请求的示例:
GET /admin/users 端点使用以下代码进行响应:
批量分配
一些开发人员设计他们的 API 以在将来自应用程序的输入绑定到代码和内部对象时自动分配对象属性。许多框架提供批量分配功能以帮助加快开发速度。
这种方法对开发人员来说很方便,但它也允许用户更改他们不应访问的对象属性。此外,攻击者可以尝试猜测对象属性或根据他们的要求用新的属性替换它们。如果 API 容易受到此类请求的攻击,攻击者可以获取有关敏感对象的信息、阅读文档或修改数据对象。
在我们的 API 中,用户对象存在这个漏洞。它有一个带有两个可能值的 user_type 参数:user和administrator。当人们自己在我们的应用程序中注册时,他们的帐户默认分配用户值。但是,我们的 API 允许用户通过 PUT /user 请求更改此值。通过这种方式,攻击者可以获得管理员权限。
要利用此漏洞,我们必须使用此请求注册用户:
之后,我们将收到包含用户帐户详细信息的响应:It was originally published on https://www.apriorit.com/
然后,我们需要将 user_type 字段更改为 admin:It was originally published on
API 将响应更新的用户数据:
这样,user4 将获得管理员访问权限。It was originally published on https://www.apriorit.com/
结论
缓解 OWASP API 安全项目中的安全问题对于确保应用程序的保护至关重要。为了优先考虑测试程序并节省一些时间,您可以专注于查找和修复我们在本文中讨论的最普遍的漏洞。
发表评论