关于API安全以及开源测试工具

什么是API安全

API(ApplicationProgramming Interface)允许应用程序彼此交互,是现代软件模式的基本组成部分,例如微服务架构。

API安全是保护API免受攻击的过程。由于API很常用且可以访问敏感的软件功能和数据,因此它们正成为攻击者的主要目标。API安全已成为现代web应用安全的关键组成部分。API可能存在诸如身份验证和授权失效、缺乏限速以及代码注入等漏洞,组织必须定期测试API来识别漏洞,并使用安全最佳实践来解决这些漏洞。本文介绍了API安全测试的几种方法和工具,以及一系列可以帮助您保护API安全的最佳实践。

API安全为何重要?

API安全涉及保护通过API传输的数据,特别是在通过公共网络连接的客户端和服务器之间。企业使用API提供服务和传输数据。已经暴露或已被黑客攻击的API将会暴露个人数据、财务信息或其他敏感数据。因此,在设计和开发RESTful和其他API时,安全性是一个关键考虑因素。

API容易受到在后端系统中安全漏洞的影响。如果攻击者破坏了API的提供程序,他们可能会破坏所有API数据和功能。如果API没有正确编写和保护,攻击者也可以通过恶意请求非法使用API。例如,拒绝服务(DoS)攻击可以显著降低线上API的性能。攻击者可以通过抓取数据或超过使用限制来滥用API。更复杂的攻击者可以注入恶意代码来执行未经授权的操作或危害后端。

随着微服务和Serverless架构的普及,几乎每个企业应用程序的基本功能都依赖API,使得API安全成为现代信息安全的核心之一。

API安全与普通应用安全有何区别?

传统Web安全的几个主要特点:
  • 城堡和护城河方法:传统网络存在一条清晰的边界来控制接入点,可以允许或者拒绝访问者的请求,然后假定已经进入的都是良性的。

  • 静态协议为主:传入的请求以静态协议为主,管理员可以通过配置WAF对这些协议加强规范检查。

  • 客户端使用浏览器:WAF可以验证客户端的浏览器环境,如果验证失败,则当做是使用无头浏览器或者模拟器的Bot。

  • 检查请求以检测攻击:传统网络可以通过部署WAF阻断XSS请求尝试。如果发现大量流量来自同一IP,WAF也可以识别出这是一次DDoS攻击尝试。

API安全区别于传统Web安全的几个关键特点:
  • 城堡有很多开口,没有护城河:过去,传统网络环境下主需要保护80(HTTP)和443(HTTPS)常用端口。如今,Web应用有许多使用不同协议的API端点。由于API通常会随着时间的推移扩展,单个API的安全性也变得困难。

  • 传入请求格式变化频繁:在DevOps环境下,API发展迅速,大多数WAF无法弹性适应。API每变化一次,传统安全工具就需要手动调整和重新配置,这一过程费时费力且容易出错。

  • 客户端通常不使用浏览器:大多数服务或者微服务API是由本地/移动应用或者其他服务/软件组件访问。由于不适用浏览器,浏览器验证也不再适用。依靠浏览器验证来检测恶意Bot的方案通常难以从API端点排除自动流量。

  • 检查传入的请求无法保证能够检测攻击:许多API滥用请求看起来是合法的。

OWASP API TOP10 安全威胁

OWASP发布的API安全Top 10,有助于提高对影响组织的最严重API安全问题的认识。TOP10安全威胁是:

2019:API#1:失效的对象级别授权

API 通常公开用于访问资源的对象标识符。当这些端点上没有正确实施访问控制时,就会发生破坏的对象级授权。攻击者通过破坏对象级别授权的API,来获得未经授权的或敏感的数据。

2019:API#2:失效的用户身份验证

开发者对API身份认证机制设计存在缺陷或无保护设计,导致身份认证机制无效,比如弱密码、无锁定机制而被暴露破解、Token未校验或Token泄露导致认证机制失效等。这些问题可能是毁灭性的,因为一个错误就可以让攻击者接管用户的帐户并访问受限制的数据和功能。但是为什么这个问题在 API 实现中特别常见?

API 很难进行身份验证。通常,在 API 调用期间提示输入用户凭据或使用多因素身份验证是不可行的。因此,API 系统中的身份验证通常使用访问令牌来实现:令牌嵌入到各个 API 调用中以对用户进行身份验证。访问令牌可能会出错:令牌可能无法正确生成或失效,或者令牌可能通过另一个漏洞泄漏。如果发生这些问题,攻击者可以利用这些错误配置伪装成其他人。

2019:API#3:过度的数据暴露

当应用程序通过 API 响应向用户透露超出必要的信息时,就会发生过多的数据暴露。一些应用程序开发人员认为,如果他们不在网页上显示敏感信息,用户就看不到它。因此,他们将 API 响应中的敏感信息发送到用户的浏览器,而没有先过滤掉敏感信息,而是依靠客户端代码来过滤掉隐私信息。在这种情况下,任何人都可以拦截此 API 响应并提取敏感数据。

2019:API#4:缺乏资源和费率限制

API 不限制来自特定 API 客户端的请求数量或频率。所以一个 API 客户端每秒可以进行数千甚至更多的 API 调用,或者一次请求成百上千条数据记录,服务器仍然会尝试满足这些请求。

缺乏速率限制会影响 API 服务器的性能,并允许攻击者发起 DoS 攻击。当单个客户端或多个客户端同时发出过多请求时,来自这些客户端的请求可能会压倒服务器处理请求的能力,进而导致其他用户无法使用该服务或服务变慢。另一个问题是,缺乏速率限制会导致对身份验证端点的暴力攻击。例如,如果用户可以提交登录请求的次数没有限制,恶意攻击者就可以通过尝试使用不同的密码登录来暴力破解用户的密码,直到成功为止。

2019:API#5:失效的功能级别授权

应用程序未能将敏感功能限制给授权用户。与失效的对象级别授权不同,此缺陷特指未经授权的用户可以访问他们不应访问的敏感或受限功能。授权缺陷通常是由于过于复杂的访问控制策略,或者如果常规功能和管理功能之间没有明确的区分。攻击者可以利用这些漏洞访问用户的资源或执行管理功能。

2019:API#6:批量分配

“批量赋值”是指同时为多个变量或对象属性赋值的做法。但此功能有时允许攻击者随意覆盖、修改或创建新的程序变量或对象属性。利用此漏洞,攻击者可能能够覆盖他们不应访问的数据,或以其他方式影响应用程序逻辑。

批量分配通常是基于允许列表将客户端提供的数据(即JSON)绑定到数据模型,而不正确过滤属性。攻击者可以通过多种方式修改对象属性,他们可以探索API端点、阅读文档、猜测对象属性或通过请求有效负载提供其他属性。

2019:API#7:安全性配置错误

安全配置错误通常是由于默认配置不全面、临时或不完整的配置、错误配置的HTTP头或不必要的HTTP方法、限制性不足的跨源资源共享(CORS)、开放云存储或包含敏感信息的错误消息造成的。它们是针对 API 和非 API 应用程序的持续安全威胁。

2019:API#8:注入

注入破坏了(包括SQL注入、NoSQL注入和命令注入)不可信源通过命令或查询发送到解释器的数据。攻击者可以发送恶意数据,诱骗解释器执行危险的命令,或者允许攻击者在没有必要授权的情况下访问数据。

当应用程序无法正确区分不受信任的用户数据和代码时,就会发生此漏洞。如果应用程序在将不受信任的用户数据插入命令或查询之前没有正确处理它,程序的解释器会将用户输入混淆为命令或查询的一部分。在这种情况下,攻击者可以通过改变其命令含义的方式向应用程序发送数据。

例如,在SQL 注入攻击中,攻击者注入数据来操纵 SQL 命令。在命令注入攻击中,攻击者注入数据来操纵托管服务器上的 OS 系统命令的逻辑。您可以通过实施输入验证、参数化和转义来防止注入问题。

2019:API#9:资产管理不当

与传统的web应用相比,API通常公开更多的端点,因此需要结构化的最新文档。暴露的调试端点和弃用的API版本等问题可能会增加攻击面。通过创建已部署的API版本和正确配置的主机的清单,可以减轻这种情况。

一个 API 通常有许多不同的版本、功能、端点和许多影响该端点行为的参数。如果您不跟踪所有这些功能,您就不会意识到隐藏在未知端点中的安全漏洞。你无法确保你不知道的东西。

除了不完整或缺失的文档,不准确的文档也是一个安全问题。即使您有详细说明 API 端点的文档,它是否会告诉您每个端点的作用?是否存在文档中未记录的端点行为,例如接受备用 HTTP 方法?是否有任何未记录的参数会影响端点的功能?不准确的文档可能会让您认为端点是安全的,但实际上它的行为并不像您认为的那样。

2019:API#10:日志记录和监控不足

对API缺失有效的监控和日志审计手段,导致被黑客攻击时缺少告警、提醒,未能及时阻断。攻击者可以利用日志记录和监控不足,以及事件响应集成无效或缺乏,长期驻足于系统中,加深控制、提取或销毁更多数据。持续攻击通常需要200多天才能检测到,而漏洞通常由外部方发现,强调有效的API监控至关重要。

RESTful API安全与SOAP API安全

现代API主要有两种架构形式:

  • SOAP:一种高度结构化的消息协议,支持多种低级协议

  • REST:一种更简单的API方法,使用HTTP/S作为传输协议,通常使用JSON格式进行数据传输

两种类型都支持HTTP请求与响应,以及SSL。

SOAP API安全
  • SOAP为解决安全问题的协议提供了扩展

  • SOAP基于W3C和OASIS规范,包括SAML令牌、XML加密和XML签名

  • SOAP支持Web服务(WS)规范,允许使用安全扩展,比如WS-security,它为Web服务提供企业级安全

  • SOAP支持了内置错误处理组件WS-ReliableMessaging

RESTful API安全
  • REST API没有任何内置的安全功能,安全性取决于API本身的设计

  • 数据传输、部署和与客户端的交互必须内置安全

  • REST API没有内置错误处理功能,当发生错误时需要重新发送数据

  • 常见的架构选择是在API网关后面部署REST API。客户端连接到网关,网关充当代理,而不是直接连接到REST API,由API网关解决许多安全问题

总之,SOAP API在设计上更安全,但REST API可以变得安全,取决于它们的实现和所选的架构。

GraphQL Security

GraphQL是一种查询语言,用来描述客户端如何通过API请求信息。开发人员可以使用GraphQL语法请求特定数据,并从单个源或多个源接收数据。一旦客户端为请求定义了所需的数据结构,服务器就会使用该结构返回数据。

由于客户端可以构造高度复杂的查询,因此服务器必须准备好正确地处理请求。服务器应该能够处理恶意客户端的滥用查询,也要能够处理合法客户端的大型查询。如果服务器不能正确处理这些场景,客户端可能会使服务器停机。

下面是一些可以帮助您减轻GraphQL安全风险的策略:

  • 超时:超时可以帮助您抵挡大量查询。这是最简单的策略,服务器只需要知道每个查询允许的最长时间,不需要了解查询的任何细节。

  • 最大查询深度:可以防止客户端滥用查询深度。最大查询深度通过对查询文档的抽象语法树(AST)的分析来决定什么是可接受的。然后GraphQL服务器可以使用此深度信息接受或拒绝请求。

  • 查询复杂度:查询深度并不总是足以理解GraphQL查询的范围。当某些模式字段的计算比其他模式字段更复杂时,通常会发生这种情况。查询复杂度可以帮助您定义这些字段的复杂度级别,并限制复杂度超过阈值的查询。

  • 节流:上述选项可以阻止大型查询,但无法阻止发出许多中型查询的客户端。对于GraphQL,如果查询太耗费资源,那么即使是很少的几个查询也可能很难处理。您可以定义服务器完成每种类型的查询所需的时间,并使用此估计来限制查询。

API安全测试的方法

可以使用下面几个工具人工测试您的API的安全隐患:

参数篡改测试

在大多数情况下,通过API请求发送的参数很容易被篡改。例如,通过操纵参数,攻击者可以更改购买金额并免费接收产品,或者诱骗API提供未经用户帐户授权的敏感数据。

参数篡改通常使用隐藏的表单字段。您可以使用浏览器元素检查器测试隐藏字段的存在。如果发现隐藏字段,请尝试使用不同的值,并查看API的反应。

命令注入测试

要测试您的API是否容易受到命令注入攻击,请尝试在API输入中注入操作系统命令。请使用适用于运行API服务器的操作系统的命令。建议使用无害的、可以在服务器上观察的操作系统命令,例如重启命令。

例如,如果您的API通过URL显示内容,则可以在URL末尾附加一个操作系统命令,以查看该命令是否在服务器上执行:

https://vulnerablesite.com/view?name=userfile.txt;restart
API输入模糊测试

模糊意味着向API提供随机数据,直到发现功能或安全问题。您应该查找API返回了错误、输入处理错误或崩溃的迹象。

例如,如果您的API接受数字输入,您可以尝试非常大的数字、负数或零。如果它接受字符串,您可以尝试随机SQL查询、系统命令或任意非文本字符。

未处理的HTTP方法测试

使用API进行通信的Web应用程序可以使用各种HTTP方法。这些HTTP方法可以用于存储、删除或检索数据。如果服务器不支持某种HTTP方法,请求者通常会收到错误。然而,情况并非总是如此。如果服务器端不支持某种HTTP方法,则会产生安全漏洞。

通过向需要身份验证的API端点发出HEAD请求,很容易测试服务器端是否支持该HTTP方法。尝试所有常见的HTTP方法POST、GET、PUT、PATCH、DELETE等。

开源API测试工具

Postman

Postman是一款API开发平台,主要特性包括:

  • 自动化人工API测试

  • 将测试集成到CI/CD流程中

  • 模拟API端点和响应的预期行为

  • 检查API性能和响应时间

  • 通过内置版本控制实现开发人员之间的协作

Swagger

Swagger是一个开源工具包,可以帮助您创建RESTful API。它支持两种API开发风格:

  1. 自顶向下的API设计:允许您在Swagger中构建API,然后根据规范生成代码

  1. 自底向上的API设计,Swagger采用现有代码并生成有关API操作、参数和输出的文档

JMeter

JMeter是一个负载测试工具,也可以用于安全测试。主要功能包括:

  • 输入CSV文件并将其用于负载测试:使用不同的值执行测试,以模拟风险场景和网络攻击。

  • 使用Jenkins将API测试嵌入到构建过程中

  • 高级性能测试,能够回放测试结果

SOAPUI

SoapUI是一种流行的API功能测试工具。其主要特点包括:

  • 一个大型功能测试元素库,可自动化API测试

  • 完全可定制,提供源代码,可以构建自己的功能

  • 轻松拖放界面,创建测试

  • 允许将现有的负载测试或安全扫描重用,进行功能测试

  • 在pro软件包中,可以执行数据驱动测试,通过电子表格或数据库模拟用户如何使用API

Karate

Karate DSL是一种使用行为驱动开发(BDD)方法的JavaAPI测试工具。其主要特点包括:

  • 使用现成的步骤定义为API编写BDD

  • 生成标准Java报告

  • 不需要Java知识来编写基于Java的API的测试

  • 支持多线程执行

  • 支持分段和生产之间的切换配置

Fiddler

Fiddler是一个监视和回放HTTP请求的工具,具有针对.NET、Java、Ruby和其他流行框架的API测试扩展。其主要特点包括:

  • 调试来自任何类型客户端的请求,包括Windows、MacOS、Linux和移动设备

  • 测试客户端-服务器通信中的cookie、缓存和header

  • 为分组和组织API请求提供方便的UI

  • 创建无代码更改的模拟请求和响应

引用参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值