启用分析器
前提条件:
-
以下任一类型的 Web API:
- REST API
- SOAP
- GraphQL
- 表单正文、JSON 或 XML
-
提供待测试 API 的以下资产之一:
- OpenAPI v2 或 v3 API 定义
- 待测试 API 请求的 HTTP 存档(HAR)
- Postman Collection v2.0 或 v2.1
切勿 对生产服务器运行模糊测试。它不仅能执行 API 支持的任何功能,还可能触发 API 中的 bug。这包括修改和删除数据等操作。仅对测试服务器运行模糊测试。
要启用 Web API 模糊测试,请使用 Web API 模糊测试配置表单。
- 如需手动配置说明,请根据 API 类型查看相应章节:
- 否则,请参阅 Web API 模糊测试配置表单。
API 模糊测试配置文件必须位于仓库的 .gitlab 目录中。
Web API 模糊测试配置表单
API 模糊测试配置表单可帮助您创建或修改项目的 API 模糊测试配置。该表单允许您为最常见的 API 模糊测试选项选择值,并生成可在 GitLab CI/CD 配置中粘贴的 YAML 片段。
在 UI 中配置 Web API 模糊测试
要生成 API 模糊测试配置片段:
- 在左侧边栏,选择“搜索或前往”并找到您的项目。
- 选择“安全 > 安全配置”。
- 在“API 模糊测试”行,选择“启用 API 模糊测试”。
- 完成字段填写。详情请参见 可用 CI/CD 变量。
- 选择“生成代码片段”。 弹出窗口会显示与表单中所选选项对应的 YAML 片段。
- 执行以下操作之一:
- 要将片段复制到剪贴板,请选择“仅复制代码”。
- 要将片段添加到项目的
.gitlab-ci.yml文件,请选择“复制代码并打开.gitlab-ci.yml文件”。管道编辑器会打开。- 将片段粘贴到
.gitlab-ci.yml文件中。 - 选择“Lint” 标签页以确认已编辑的
.gitlab-ci.yml文件有效。 - 选择“Edit” 标签页,然后选择“提交更改”。
- 将片段粘贴到
当片段被提交到 .gitlab-ci.yml 文件后,管道中将包含一个 API 模糊测试作业。
OpenAPI 规范
OpenAPI 规范(前身为 Swagger 规范)是一种用于 REST API 的描述格式。本节介绍如何使用 OpenAPI 规范来提供有关待测试目标 API 的信息以进行 API 模糊测试配置。OpenAPI 规范以文件系统资源或 URL 形式提供。支持 JSON 和 YAML 格式的 OpenAPI。
API 模糊测试使用 OpenAPI 文档生成请求正文。当需要请求正文时,正文生成限于以下正文类型:
application/x-www-form-urlencodedmultipart/form-dataapplication/jsonapplication/xml
OpenAPI 和媒体类型
媒体类型(以前称为 MIME 类型)是用于标识传输的文件格式和格式内容的标识符。OpenAPI 文档允许你指定某个操作可以接受不同的媒体类型,因此一个请求可以使用不同的文件内容发送数据。例如,更新用户数据的 PUT /user 操作可以接受 XML(媒体类型 application/xml)或 JSON(媒体类型 application/json)格式的数据。
OpenAPI 2.x 允许你全局或按操作指定接受的媒体类型,而 OpenAPI 3.x 允许按操作指定接受的媒体类型。API Fuzzing 会检查列出的媒体类型,并尝试为每个支持的媒体类型生成样本数据。
- 默认行为是从支持的媒体类型中选择一个使用。从列表中选择第一个支持的媒体类型。此行为可配置。
使用不同媒体类型(例如 application/json 和 application/xml)测试同一操作(例如 POST /user)并不总是可取的。例如,如果目标应用程序无论请求内容类型如何都执行相同的代码,完成测试会话的时间会更长,并且可能会报告与请求正文相关的重复漏洞,具体取决于目标应用。
环境变量 FUZZAPI_OPENAPI_ALL_MEDIA_TYPES 允许你指定在为给定操作生成请求时是否使用所有支持的媒体类型而不是一个。当环境变量 FUZZAPI_OPENAPI_ALL_MEDIA_TYPES 设置为任何值时,API Fuzzing 会尝试为给定操作中的所有支持媒体类型生成请求,而不是一个。这会导致测试时间更长,因为对每个提供的媒体类型都会重复测试。
或者,变量 FUZZAPI_OPENAPI_MEDIA_TYPES 用于提供要测试的媒体类型列表。提供多个媒体类型会导致测试时间更长,因为会对每个选定的媒体类型进行测试。当环境变量 FUZZAPI_OPENAPI_MEDIA_TYPES 设置为媒体类型列表时,创建请求时仅包含列出的媒体类型。
FUZZAPI_OPENAPI_MEDIA_TYPES 中的多个媒体类型必须用冒号(:)分隔。例如,要将请求生成限制为 application/x-www-form-urlencoded 和 multipart/form-data 媒体类型,请将环境变量 FUZZAPI_OPENAPI_MEDIA_TYPES 设置为 application/x-www-form-urlencoded:multipart/form-data。创建请求时仅包含此列表中受支持的媒体类型,尽管不受支持的媒体类型始终会被跳过。媒体类型文本可能包含不同的部分。例如,application/vnd.api+json; charset=UTF-8 是由 type "/" [tree "."] subtype ["+" suffix]* [";" parameter] 组成的复合结构。在请求生成时过滤媒体类型不会考虑参数。
环境变量 FUZZAPI_OPENAPI_ALL_MEDIA_TYPES 和 FUZZAPI_OPENAPI_MEDIA_TYPES 允许你决定如何处理媒体类型。这些设置互斥。如果两者都启用,API Fuzzing 会报告错误。
使用OpenAPI规范配置Web API模糊测试
要在GitLab中使用OpenAPI规范配置API模糊测试:
-
在你的
.gitlab-ci.yml文件中添加fuzz阶段。 -
包含
API-Fuzzing.gitlab-ci.yml模板 到你的.gitlab-ci.yml文件中。 -
通过向
.gitlab-ci.yml文件添加FUZZAPI_PROFILECI/CD变量来提供配置文件。该配置文件指定运行多少次测试。用你选择的配置文件替换Quick-10。更多详情,请参阅API模糊测试配置文件。variables: FUZZAPI_PROFILE: Quick-10 -
提供OpenAPI规范的位置。你可以将规范作为文件或URL提供。通过添加
FUZZAPI_OPENAPI变量来指定位置。 -
提供目标API实例的基本URL。使用
FUZZAPI_TARGET_URL变量或environment_url.txt文件。在项目根目录下的
environment_url.txt文件中添加URL非常适合在动态环境中进行测试。若要在GitLab CI/CD管道期间动态创建的应用程序上运行API模糊测试,让应用程序将其URL保存在environment_url.txt文件中。API模糊测试会自动解析该文件以找到扫描目标。你可以在Auto DevOps CI YAML中看到一个示例。
示例.gitlab-ci.yml文件(使用OpenAPI规范):
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/这是API模糊测试的最小配置。从这里你可以:
有关API模糊测试配置选项的详细信息,请参阅可用的CI/CD变量。
HTTP Archive (HAR)
HTTP Archive格式(HAR)是一种用于记录HTTP事务的归档文件格式。当与GitLab API模糊测试工具配合使用时,HAR必须包含调用待测Web API的记录。API模糊测试工具会提取所有请求并使用它们执行测试。
有关更多细节,包括如何创建HAR文件,请参阅HTTP Archive格式。
HAR文件可能包含敏感信息,例如认证令牌、API密钥和会话Cookie。我们建议你在将HAR文件添加到仓库之前先审查其内容。
使用HAR文件配置Web API模糊测试
要配置API模糊测试以使用HAR文件:
-
将
fuzz阶段添加到您的.gitlab-ci.yml文件中。 -
在您的
.gitlab-ci.yml文件中包含API-Fuzzing.gitlab-ci.yml模板(https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)。 -
通过向您的
.gitlab-ci.yml文件添加FUZZAPI_PROFILECI/CD变量来提供配置文件。该配置文件指定运行多少个测试。用您选择的配置文件替换Quick-10。有关更多详细信息,请参阅API模糊测试配置文件。variables: FUZZAPI_PROFILE: Quick-10 -
提供HAR规范的位置。您可以将其作为文件或URL提供。通过添加
FUZZAPI_HAR变量来指定位置。 -
目标API实例的基本URL也是必需的。通过使用
FUZZAPI_TARGET_URL变量或environment_url.txt文件来提供它。在项目根目录下的
environment_url.txt文件中添加URL非常适合在动态环境中进行测试。若要在GitLab CI/CD管道期间动态创建的应用程序上运行API模糊测试,让应用程序将其域名保存在environment_url.txt文件中。API模糊测试会自动解析该文件以查找其扫描目标。您可以在我们的Auto DevOps CI YAML中看到一个示例。
使用HAR文件的示例.gitlab-ci.yml文件:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_HAR: test-api-recording.har
FUZZAPI_TARGET_URL: http://test-deployment/此示例是API模糊测试的最小配置。从这里您可以:
有关API模糊测试配置选项的详细信息,请参阅可用CI/CD变量。
GraphQL Schema
GraphQL是一种用于您的API的查询语言,也是REST API的替代方案。API Fuzzing支持多种方式测试GraphQL端点:
- 使用GraphQL Schema进行测试。在GitLab 15.4中引入。
- 使用GraphQL查询的录制(HAR)进行测试。
- 使用包含GraphQL查询的Postman集合进行测试。
本节介绍如何使用GraphQL Schema进行测试。“API Fuzzing中的GraphQL Schema支持能够从支持内省的端点查询架构。内省默认启用,以允许GraphiQL等工具正常工作。
使用GraphQL端点URL进行API模糊测试扫描
API Fuzzing中的GraphQL支持能够从GraphQL端点查询架构信息。
GraphQL端点必须支持内省查询才能使此方法正常工作。
要配置API模糊测试以使用提供目标API信息的GraphQL端点URL:
-
在您的
.gitlab-ci.yml文件中包含API-Fuzzing.gitlab-ci.yml模板(https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)。 -
通过添加
FUZZAPI_GRAPHQL变量提供GraphQL端点路径,例如/api/graphql。 -
目标API实例的基本URL也是必需的。通过使用
FUZZAPI_TARGET_URL变量或environment_url.txt文件来提供它。在项目根目录下的
environment_url.txt文件中添加URL非常适合在动态环境中进行测试。有关更多信息,请参阅我们文档中的动态环境解决方案部分。
使用GraphQL端点URL的完整配置示例:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
apifuzzer_fuzz:
variables:
FUZZAPI_GRAPHQL: /api/graphql
FUZZAPI_TARGET_URL: http://test-deployment/此示例是API模糊测试的最小配置。从这里您可以:
使用GraphQL模式文件的API模糊测试
API模糊测试可以使用GraphQL模式文件来理解和测试禁用了自省功能的GraphQL端点。若要使用GraphQL模式文件,其必须采用自省JSON格式。可借助在线第三方工具将GraphQL模式转换为自省JSON格式:https://transform.tools/graphql-to-introspection-json。
若要配置API模糊测试以使用提供待测API信息的GraphQL模式文件,需完成以下步骤:
- 在您的
.gitlab-ci.yml文件中包含API-Fuzzing.gitlab-ci.yml模板。 - 提供GraphQL端点的路径(例如
/api/graphql)。可通过添加FUZZAPI_GRAPHQL变量指定该路径。 - 提供GraphQL模式文件的位置。可将位置设为文件路径或URL。可通过添加
FUZZAPI_GRAPHQL_SCHEMA变量指定该位置。 - 目标API实例的基础URL也必不可少。可通过使用
FUZZAPI_TARGET_URL变量或environment_url.txt文件提供此信息。
在项目根目录下的 environment_url.txt 文件中添加URL,非常适合在动态环境中进行测试。有关更多信息,请参阅我们文档中的动态环境解决方案部分。
使用GraphQL模式文件的完整配置示例如下:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
apifuzzer_fuzz:
variables:
FUZZAPI_GRAPHQL: /api/graphql
FUZZAPI_GRAPHQL_SCHEMA: test-api-graphql.schema
FUZZAPI_TARGET_URL: http://test-deployment/使用GraphQL模式文件URL的完整配置示例如下:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
apifuzzer_fuzz:
variables:
FUZZAPI_GRAPHQL: /api/graphql
FUZZAPI_GRAPHQL_SCHEMA: http://file-store/files/test-api-graphql.schema
FUZZAPI_TARGET_URL: http://test-deployment/此示例是API模糊测试的最简配置。从这儿您可以:
Postman集合
Postman API客户端 是开发人员和测试人员用来调用各类API的流行工具。API定义可导出为Postman集合文件以用于API模糊测试。导出时,请确保选择受支持的Postman集合版本:v2.0 或 v2.1。
当与GitLab API模糊测试器配合使用时,Postman集合必须包含带有有效数据的待测Web API的定义。API模糊测试器会提取所有API定义并利用它们执行测试。
Postman集合文件可能包含敏感信息(如认证令牌、API密钥和会话cookie)。我们建议您在将其添加至仓库前,先审查Postman集合文件的内容。
使用 Postman 集合文件配置 Web API 模糊测试
若要配置 API 模糊测试以使用 Postman 集合文件:
-
在你的
.gitlab-ci.yml文件中添加fuzz阶段。 -
在你的
.gitlab-ci.yml文件中 包含API-Fuzzing.gitlab-ci.yml模板。 -
通过向
.gitlab-ci.yml文件添加FUZZAPI_PROFILECI/CD 变量来提供配置文件。该配置文件指定运行的测试数量。将Quick-10替换为你选择的配置文件。更多细节请参见 API 模糊测试配置文件。variables: FUZZAPI_PROFILE: Quick-10 -
提供 Postman 集合规范的位置。你可以将该规范作为文件或 URL 提供。通过添加
FUZZAPI_POSTMAN_COLLECTION变量来指定位置。 -
提供目标 API 实例的基础 URL。使用
FUZZAPI_TARGET_URL变量或environment_url.txt文件。在项目根目录下的
environment_url.txt文件中添加 URL 很适合在动态环境中进行测试。若要在 GitLab CI/CD 流水线期间动态创建的应用上运行 API 模糊测试,让应用将其域名持久化存储在environment_url.txt文件中。API 模糊测试会自动解析该文件以找到其扫描目标。你可以在我们的 Auto DevOps CI YAML 示例 中看到相关示例。
使用 Postman 集合文件的示例 .gitlab-ci.yml 文件:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_POSTMAN_COLLECTION: postman-collection_serviceA.json
FUZZAPI_TARGET_URL: http://test-deployment/这是 API 模糊测试的最小配置。从这里你可以:
有关 API 模糊测试配置选项的详细信息,请参阅 可用 CI/CD 变量。
Postman 变量
Postman客户端中的变量
Postman允许开发者在请求的不同部分定义可用的占位符。这些占位符被称为变量,如使用变量所述。你可以使用变量在请求和脚本中存储和复用值。例如,你可以编辑集合以向文档添加变量:
或者,你也可以在环境中添加变量:
之后,你可以在URL、头部等部分使用这些变量:
Postman已从具有良好用户体验的基本客户端工具发展为一个更复杂的生态系统,支持通过脚本测试API、创建触发二次请求的复杂集合,并在过程中设置变量。并非Postman生态系统的所有功能都受支持。例如,脚本不受支持。Postman支持的主要重点是导入由Postman客户端使用的Postman集合定义及其在工作区、环境和集合本身中定义的相关变量。
Postman允许在不同作用域中创建变量。每个作用域在Postman工具中具有不同的可见性级别。例如,你可以在全局环境作用域中创建一个变量,该变量被每个操作定义和工作区看到。你也可以在一个特定的环境作用域中创建一个变量,该变量仅在选中特定环境时才可见和使用。有些作用域并不总是可用,例如在Postman生态系统中,你可以在Postman客户端中创建请求,这些请求没有本地作用域,但测试脚本有。
Postman中的作用域可能是一个令人望而生畏的话题,并非所有人都熟悉它。我们强烈建议你在继续之前阅读Postman文档中的变量作用域。
如前所述,存在不同的变量作用域,每个作用域都有其用途,可以为你的Postman文档提供更多灵活性。根据Postman文档,有关如何计算变量值有一个重要说明:
如果两个不同作用域中声明了同名变量,则使用范围最窄的变量中存储的值。例如,如果有一个名为username的全局变量和一个名为username的本地变量,则在请求运行时使用本地值。
以下是Postman客户端和API模糊测试支持的变量作用域摘要:
-
全局环境(全局)作用域是一种特殊的预定义环境,在整个工作区中都可用。我们也可以将全局环境作用域称为全局作用域。Postman客户端允许将全局环境导出为JSON文件,该文件可与API模糊测试一起使用。
-
环境作用域是由用户在Postman客户端中创建的一组命名变量。Postman客户端支持单个活动环境以及全局环境。在活动用户创建的环境中定义的变量优先于全局环境中定义的变量。Postman客户端允许将你的环境导出为JSON文件,该文件可与API模糊测试一起使用。
-
集合作用域是在给定集合中声明的一组变量。集合变量可用于它们声明的集合以及嵌套的请求或集合。集合作用域中定义的变量优先于全局环境作用域和环境作用域。Postman客户端可以将一个或多个集合导出为JSON文件,该JSON文件包含选定的集合、请求和集合变量。
-
API模糊测试作用域是API模糊测试新增的作用域,允许用户提供额外的变量或覆盖其他受支持作用域中定义的变量。此作用域不受Postman支持。API模糊测试作用域变量是通过自定义JSON文件格式提供的。
- 覆盖环境或集合中定义的值
- 从脚本定义变量
- 定义来自不受支持的数据作用域的单行数据
-
数据范围 是一组变量,其名称和值来自JSON或CSV文件。像 Newman 或 Postman Collection Runner 这样的Postman集合运行器会根据JSON或CSV文件的条目数量多次执行集合中的请求。这些变量的一个好用法是用Postman中的脚本来编写自动化测试。 API Fuzzing 不 支持从CSV或JSON文件读取数据。
-
本地范围 是在Postman脚本中定义的变量。API Fuzzing 不 支持Postman脚本,因此也不支持脚本中定义的变量。你仍然可以通过在其他受支持的作用域中定义它们,或者使用我们的自定义JSON格式来为脚本定义的变量提供值。
并非所有作用域都受API Fuzzing支持,且脚本中定义的变量不受支持。下表按最广泛到最狭窄的范围排序。
| 作用域 | Postman | API Fuzzing | 注释 |
|---|---|---|---|
| 全局环境 | 是 | 是 | 特殊预定义的环境 |
| 环境 | 是 | 是 | 命名的环境 |
| 集合 | 是 | 是 | 在你的postman集合中定义 |
| API Fuzzing范围 | 否 | 是 | API Fuzzing添加的自定义范围 |
| 数据 | 是 | 否 | CSV或JSON格式的外部文件 |
| 本地 | 是 | 否 | 脚本中定义的变量 |
有关如何在不同的作用域中定义变量和导出变量的更多详细信息,请参阅:
从Postman客户端导出
Postman客户端允许你导出不同的文件格式,例如,你可以导出一个Postman集合或一个Postman环境。 导出的环境可以是全局环境(始终可用),也可以是你之前创建的任何自定义环境。当你导出一个Postman集合时,它可能仅包含对_collection_和_local_范围变量的声明;_environment_范围变量不会被包含在内。
若要获取_environment_范围变量的声明,你必须在当时导出指定的环境。每个导出的文件仅包含来自所选环境的变量。
有关在不同支持范围内导出变量的更多细节,请参阅:
API模糊测试范围,自定义JSON文件格式
我们的自定义JSON文件格式是一个JSON对象,其中每个对象属性代表变量名,属性值代表变量值。该文件可以使用你喜欢的文本编辑器创建,也可以由管道中之前的作业生成。
此示例在API模糊测试范围内定义了两个变量base_url和token:
{
"base_url": "http://127.0.0.1/",
"token": "Token 84816165151"
}在API模糊测试中使用作用域
作用域:global、environment、_collection_和_GitLab API Fuzzing_在GitLab 15.1及更高版本中得到支持。GitLab 15.0及更早版本仅支持_collection_和_GitLab API Fuzzing_作用域。
下表提供了将作用域文件/URL映射到API模糊测试配置变量的快速参考:
| 作用域 | 如何提供 |
|---|---|
| 全局环境 | FUZZAPI_POSTMAN_COLLECTION_VARIABLES |
| 环境 | FUZZAPI_POSTMAN_COLLECTION_VARIABLES |
| 集合 | FUZZAPI_POSTMAN_COLLECTION |
| API模糊测试范围 | FUZZAPI_POSTMAN_COLLECTION_VARIABLES |
| 数据 | 不支持 |
| 本地 | 不支持 |
Postman集合文档会自动包含任何_collection_范围变量。Postman集合通过配置变量FUZZAPI_POSTMAN_COLLECTION提供。该变量可设置为单个导出的Postman集合。
其他作用域的变量通过FUZZAPI_POSTMAN_COLLECTION_VARIABLES配置变量提供。该配置变量在GitLab 15.1及更高版本中支持以逗号(,)分隔的文件列表。GitLab 15.0及更早版本仅支持单个文件。所提供文件的顺序并不重要,因为这些文件提供了所需的作用域信息。
配置变量FUZZAPI_POSTMAN_COLLECTION_VARIABLES可设置为:
未定义的Postman变量
API模糊测试引擎有可能无法找到你的Postman集合文件使用的所有变量引用。一些情况包括:
- 你正在使用_data_或_local_范围变量,而如前所述,这些范围不受API模糊测试支持。因此,假设这些变量的值未通过API模糊测试范围提供,则_data_和_local_范围变量的值将是未定义的。
- 变量名输入错误,且名称与已定义变量不匹配。
- Postman客户端支持新的动态变量,而API模糊测试不支持该变量。
在可能的情况下,API模糊测试遵循与Postman客户端相同的处理未定义变量的行为。变量引用的文本保持不变,不会进行文本替换。对于任何不受支持的动态变量,也会应用相同的行为。
例如,如果Postman集合中的请求定义引用了变量{{full_url}}且该变量未被找到,则会保持不变,值为{{full_url}}。
动态Postman变量
除用户可在不同作用域级别定义的变量外,Postman还提供一组名为动态变量的预定义变量。这些动态变量已预先定义,名称以美元符号($)开头(例如 $guid)。动态变量可像普通变量一样使用,在Postman客户端中,它们会在请求/集合运行期间生成随机值。
API Fuzzing与Postman的关键差异在于:同一动态变量每次被调用时,API Fuzzing会返回相同值;而Postman客户端每次调用同一动态变量都会返回随机值。简言之,API Fuzzing对动态变量使用静态值,Postman则使用随机值。
扫描过程支持以下动态变量:
| 变量 | 值 |
|---|---|
$guid |
611c2e81-2ccb-42d8-9ddc-2d0bfa65c1b4 |
$isoTimestamp |
2020-06-09T21:10:36.177Z |
$randomAbbreviation |
PCI |
$randomAbstractImage |
http://no-a-valid-host/640/480/abstract |
$randomAdjective |
auxiliary |
$randomAlphaNumeric |
a |
$randomAnimalsImage |
http://no-a-valid-host/640/480/animals |
$randomAvatarImage |
https://no-a-valid-host/path/to/some/image.jpg |
$randomBankAccount |
09454073 |
$randomBankAccountBic |
EZIAUGJ1 |
$randomBankAccountIban |
MU20ZPUN3039684000618086155TKZ |
$randomBankAccountName |
Home Loan Account |
$randomBitcoin |
3VB8JGT7Y4Z63U68KGGKDXMLLH5 |
$randomBoolean |
true |
$randomBs |
killer leverage schemas |
$randomBsAdjective |
viral |
$randomBsBuzz |
repurpose |
$randomBsNoun |
markets |
$randomBusinessImage |
http://no-a-valid-host/640/480/business |
$randomCatchPhrase |
Future-proofed heuristic open architecture |
$randomCatchPhraseAdjective |
Business-focused |
$randomCatchPhraseDescriptor |
bandwidth-monitored |
$randomCatchPhraseNoun |
superstructure |
$randomCatsImage |
http://no-a-valid-host/640/480/cats |
$randomCity |
Spinkahaven |
$randomCityImage |
http://no-a-valid-host/640/480/city |
$randomColor |
fuchsia |
$randomCommonFileExt |
wav |
$randomCommonFileName |
well_modulated.mpg4 |
$randomCommonFileType |
audio |
$randomCompanyName |
Grady LLC |
$randomCompanySuffix |
Inc |
$randomCountry |
Kazakhstan |
$randomCountryCode |
MD |
$randomCreditCardMask |
3622 |
$randomCurrencyCode |
ZMK |
$randomCurrencyName |
Pound Sterling |
$randomCurrencySymbol |
£ |
$randomDatabaseCollation |
utf8_general_ci |
$randomDatabaseColumn |
updatedAt |
$randomDatabaseEngine |
Memory |
$randomDatabaseType |
text |
$randomDateFuture |
Tue Mar 17 2020 13:11:50 GMT+0530 (India Standard Time) |
$randomDatePast |
Sat Mar 02 2019 09:09:26 GMT+0530 (India Standard Time) |
$randomDateRecent |
Tue Jul 09 2019 23:12:37 GMT+0530 (India Standard Time) |
$randomDepartment |
Electronics |
$randomDirectoryPath |
/usr/local/bin |
$randomDomainName |
trevor.info |
$randomDomainSuffix |
org |
$randomDomainWord |
jaden |
$randomEmail |
[email protected] |
$randomExampleEmail |
[email protected] |
$randomFashionImage |
http://no-a-valid-host/640/480/fashion |
$randomFileExt |
war |
$randomFileName |
neural_sri_lanka_rupee_gloves.gdoc |
$randomFilePath |
/home/programming_chicken.cpio |
$randomFileType |
application |
$randomFirstName |
Chandler |
$randomFoodImage |
http://no-a-valid-host/640/480/food |
$randomFullName |
Connie Runolfsdottir |
$randomHexColor |
#47594a |
$randomImageDataUri |
data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20baseProfile%3D%22full%22%20width%3D%22undefined%22%20height%3D%22undefined%22%3E%20%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22grey%22%2F%3E%20%20%3Ctext%20x%3D%220%22%20y%3D%2220%22%20font-size%3D%2220%22%20text-anchor%3D%22start%22%20fill%3D%22white%22%3Eundefinedxundefined%3C%2Ftext%3E%20%3C%2Fsvg%3E |
$randomImageUrl |
http://no-a-valid-host/640/480 |
$randomIngverb |
navigating |
$randomInt |
494 |
$randomIP |
241.102.234.100 |
$randomIPV6 |
dbe2:7ae6:119b:c161:1560:6dda:3a9b:90a9 |
$randomJobArea |
Mobility |
$randomJobDescriptor |
Senior |
$randomJobTitle |
International Creative Liaison |
$randomJobType |
Supervisor |
$randomLastName |
Schneider |
$randomLatitude |
55.2099 |
$randomLocale |
ny |
$randomLongitude |
40.6609 |
| $randomLoremLines | Ducimus 在 mollitia 中。\nA itaque 非。\nHarum temporibus 无 voluptas。\nIste 在 sed 与 nesciunt 中 quaerat sed。 |
| $randomLoremParagraph | Ab aliquid odio iste quo voluptas voluptatem dignissimos velit。Recusandae facilis qui commodi ea magnam enim nostrum quia quis。Nihil est suscipit assumenda ut voluptatem sed。Esse ab voluptas odit qui molestiae。Rem est nesciunt est quis ipsam expedita consequuntur。 |
| $randomLoremParagraphs | Voluptatem rem magnam aliquam ab id aut quaerat。Placeat provident possimus voluptatibus dicta velit non aut quasi。Mollitia et aliquam expedita sunt dolores nam consequuntur。Nam dolorum delectus ipsam repudiandae et ipsam ut voluptatum totam。Nobis labore labore recusandae ipsam quo。 |
| $randomLoremSentence | Molestias consequuntur nisi non quod。 |
| $randomLoremSentences | Et sint voluptas similique iure amet perspicatis vero sequi atque。Ut porro sit et hic。Neque aspernatur vitae fugiat ut dolore et veritatis。Ab iusto ex delectus animi。Voluptates nisi iusto。Impedit quod quae voluptate qui。 |
| $randomLoremSlug | eos-aperiam-accusamus, beatae-id-molestiae, qui-est-repellat |
| $randomLoremText | Quisquam asperiores exercitationem ut ipsum。Aut eius nesciunt。Et reiciendis aut alias eaque。Nihil amet laboriosam pariatur eligendi。Sunt ullam ut sint natus ducimus。Voluptas harum aspernatur soluta rem nam。 |
| $randomLoremWord | est |
| $randomLoremWords | vel repellat nobis |
| $randomMACAddress | 33:d4:68:5f:b4:c7 |
| $randomMimeType | audio/vnd.vmx.cvsd |
| $randomMonth | 二月 |
| $randomNamePrefix | Dr. |
| $randomNameSuffix | MD |
| $randomNatureImage | http://no-a-valid-host/640/480/nature |
| $randomNightlifeImage | http://no-a-valid-host/640/480/nightlife |
| $randomNoun | 公交车 |
| $randomPassword | t9iXe7COoDKv8k3 |
| $randomPeopleImage | http://no-a-valid-host/640/480/people |
| $randomPhoneNumber | 700-008-5275 |
| $randomPhoneNumberExt | 27-199-983-3864 |
| $randomPhrase | 你不能在没有导航移动 XML 程序的情况下编程显示器! |
| $randomPrice | 531.55 |
| $randomProduct | 披萨 |
| $randomProductAdjective | 无品牌的 |
| $randomProductMaterial | 钢铁 |
| $randomProductName | 手工混凝土金枪鱼 |
| $randomProtocol | https |
| $randomSemver | 7.0.5 |
| $randomSportsImage | http://no-a-valid-host/640/480/sports |
| $randomStreetAddress | 5742 Harvey 街道 |
| $randomStreetName | Kuhic 岛 |
| $randomTransactionType | 支付 |
| $randomTransportImage | http://no-a-valid-host/640/480/transport |
| $randomUrl | https://no-a-valid-host.net |
| $randomUserAgent | Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9.8; rv:15.6) Gecko/20100101 Firefox/15.6.6 |
| $randomUserName | Jarrell.Gutkowski |
| $randomUUID | 6929bb52-3ab2-448a-9796-d6480ecad36b |
| $randomVerb | 导航 |
| $randomWeekday | 星期四 |
| $randomWord | 提款 |
| $randomWords | 萨摩亚 协同 粘性 复制 杂货店 |
| $timestamp | 1562757107 |
示例:全局作用域
在此示例中,全局作用域从Postman客户端导出,生成 global-scope.json 文件,并通过 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 配置变量提供给API Fuzzing使用。
以下是使用 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 的示例:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: global-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/示例:环境作用域
在此示例中,环境作用域从Postman客户端导出,生成 environment-scope.json 文件,并通过 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 配置变量提供给API Fuzzing使用。
以下是使用 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 的示例:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: environment-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/示例:集合作用域
集合作用域变量包含在导出的Postman集合文件中,并通过 FUZZAPI_POSTMAN_COLLECTION 配置变量提供。
以下是使用 FUZZAPI_POSTMAN_COLLECTION 的示例:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: variable-collection-dictionary.json示例:API Fuzzing作用域
API Fuzzing作用域用于两个主要目的:定义API Fuzzing不支持的数据和本地作用域变量,以及修改其他作用域中已定义变量的值。API Fuzzing作用域通过 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 配置变量提供。
以下是使用 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 的示例:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: api-fuzzing-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/文件 api-fuzzing-scope.json 使用我们的自定义JSON文件格式。该JSON是一个对象,以键值对形式存储属性。键是变量名称,值是变量的值。例如:
{
"base_url": "http://127.0.0.1/",
"token": "Token 84816165151"
}示例:多作用域组合
在此示例中,配置了全局作用域、环境作用域和集合作用域。第一步是导出各种作用域:
- 将全局作用域导出 为
global-scope.json - 将环境作用域导出 为
environment-scope.json - 将包含集合作用域的Postman集合导出为
postman-collection.json
Postman集合通过 FUZZAPI_POSTMAN_COLLECTION 变量提供,而其他作用域则通过 FUZZAPI_POSTMAN_COLLECTION_VARIABLES 提供。API Fuzzing可通过每个文件中提供的数据识别所匹配的作用域类型。
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/示例:更改变量值
在使用导出的作用域时,经常需要更改变量的值以用于API模糊测试。例如,一个集合作用域变量可能包含名为api_version的变量,其值为v2,而您的测试需要值为v1。无需修改导出的集合来更改值,可以使用API模糊测试作用域来更改其值。这是因为API模糊测试作用域优先于所有其他作用域。
集合作用域变量包含在导出的Postman集合文件中,并通过FUZZAPI_POSTMAN_COLLECTION配置变量提供。
API模糊测试作用域通过FUZZAPI_POSTMAN_COLLECTION_VARIABLES配置变量提供,但首先必须创建文件。文件api-fuzzing-scope.json使用我们的自定义JSON文件格式。此JSON是一个对象,其中属性为键值对。键是变量的名称,值是变量的值。例如:
{
"api_version": "v1"
}我们的CI定义:
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: api-fuzzing-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/示例:使用多个作用域更改变量值
在使用导出的作用域时,经常需要更改变量的值以用于API模糊测试。例如,一个环境作用域可能包含名为api_version的变量,其值为v2,而您的测试需要值为v1。无需修改导出的文件来更改值,可以使用API模糊测试作用域。这是因为API模糊测试作用域优先于所有其他作用域。
在此示例中,配置了全局作用域、环境作用域、集合作用域和API模糊测试作用域。第一步是导出并创建各种作用域。
- 导出全局作用域 为
global-scope.json - 导出环境作用域 为
environment-scope.json - 导出包含集合作用域的Postman集合为
postman-collection.json
API模糊测试作用域通过创建文件api-fuzzing-scope.json来使用,采用我们的自定义JSON文件格式。此JSON是一个对象,其中属性为键值对。键是变量的名称,值是变量的值。例如:
{
"api_version": "v1"
}Postman集合通过FUZZAPI_POSTMAN_COLLECTION变量提供,而其他作用域则通过FUZZAPI_POSTMAN_COLLECTION_VARIABLES提供。API模糊测试可以通过每个文件中提供的数据识别提供的文件匹配哪个作用域。
stages:
- fuzz
include:
- template: Security/API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_POSTMAN_COLLECTION: postman-collection.json
FUZZAPI_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json,api-fuzzing-scope.json
FUZZAPI_TARGET_URL: http://test-deployment/运行首次扫描
当正确配置后,CI/CD管道包含一个fuzz阶段和一个apifuzzer_fuzz或apifuzzer_fuzz_dnd作业。仅当提供无效配置时,作业才会失败。在典型操作期间,即使模糊测试中发现故障,作业也会成功执行。
故障会显示在安全流水线标签页上,并带有套件名称。在对仓库默认分支进行测试时,模糊测试故障也会显示在安全和合规性的漏洞报告中。
为防止报告过多故障,API模糊测试扫描仪限制了报告的故障数量。
查看模糊测试故障
API模糊测试分析器生成一份JSON报告,该报告被收集并用于将故障填充到GitLab漏洞屏幕中。模糊测试故障显示为严重性为未知的漏洞。
API模糊测试发现的故障需要手动调查,且不与特定漏洞类型相关联。它们需要调查以确定是否是安全问题,以及是否应修复。有关可进行的配置更改以限制报告的误报数量的信息,请参阅处理误报。
查看API模糊测试漏洞的详细信息
API模糊测试检测到的故障发生在实际运行的Web应用中,需要手动调查以确定是否是漏洞。模糊测试故障被列为未知严重性的漏洞。为了便于调查模糊测试故障,会提供有关发送和接收的HTTP消息的详细信息,以及所做的修改的描述。
按照以下步骤查看模糊测试故障的详细信息:
-
您可以在项目或合并请求中查看故障:
- 在项目中,前往项目的Secure > Vulnerability report页面。此页面仅显示默认分支的所有漏洞。
- 在合并请求中,进入合并请求的Security部分并选择Expand按钮。API模糊测试故障位于标有API Fuzzing detected N potential vulnerabilities的部分中。选择标题以显示故障详情。
-
选择故障的标题以显示故障的详细信息。下表描述了这些详细信息。
字段 描述 Description 故障的描述,包括所做的修改。 Project 发现漏洞的项目命名空间和项目。 Method 用于检测漏洞的HTTP方法。 URL 发现漏洞的URL。 Request 导致故障的HTTP请求。 Unmodified Response 未修改请求的响应。这是典型工作响应的样子。 Actual Response 模糊测试请求收到的响应。 Evidence 我们如何确定发生了故障。 Identifiers 用于发现此故障的模糊测试检查。 Severity 发现结果的严重性始终为Unknown。 Scanner Type 执行测试的扫描器。
安全仪表板
模糊测试故障显示为未知严重性的漏洞。安全仪表板是了解您组、项目和管道中所有安全漏洞概览的好地方。更多信息请参见安全仪表板文档。
与漏洞交互
模糊测试故障显示为未知严重性的漏洞。发现故障后,您可以与之交互。更多关于如何解决漏洞的信息。
处理误报
误报可以通过两种方式处理:
- 关闭产生误报的检查。这会阻止该检查生成任何故障。示例检查包括JSON模糊测试检查和表单主体模糊测试检查。
- 模糊测试检查有多种检测到故障时触发的方法,称为_Asserts_。这些_Asserts_也可以关闭和配置。例如,API模糊测试默认使用HTTP状态码来帮助识别何时存在真实问题。如果在测试期间API返回500错误,则会创建故障。这并不总是理想的,因为某些框架经常返回500错误。
关闭检查
检查会执行特定类型的测试,可为特定配置文件开启或关闭。默认配置文件定义了多个可用的配置文件。配置文件中的配置文件定义列出了扫描期间处于活动状态的检查。若要关闭特定检查,需将其从配置文件的配置文件定义中移除。配置文件在配置文件的 Profiles 部分定义。
示例配置文件定义:
Profiles:
- Name: Quick-10
DefaultProfile: Quick
Routes:
- Route: *Route0
Checks:
- Name: FormBodyFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: JsonFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: XmlFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true若要关闭通用模糊检查(General Fuzzing Check),可移除以下行:
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true结果如下所示:
- Name: Quick-10
DefaultProfile: Quick
Routes:
- Route: *Route0
Checks:
- Name: FormBodyFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: JsonFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: XmlFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true关闭检查的断言
断言用于检测检查生成的测试中的故障。许多检查支持多种断言,例如日志分析、响应分析和状态码。当发现故障时,会提供所使用的断言。若要识别哪些断言默认开启,请参阅配置文件中的检查默认配置,该部分名为 Checks。
此示例展示了表单正文模糊检查(FormBody Fuzzing Check):
Checks:
- Name: FormBodyFuzzingCheck
Configuration:
FuzzingCount: 30
UnicodeFuzzing: true
Assertions:
- Name: LogAnalysisAssertion
- Name: ResponseAnalysisAssertion
- Name: StatusCodeAssertion在此处可以看到三个断言默认开启。常见的误报来源是 StatusCodeAssertion。若要关闭它,请在 Profiles 部分修改其配置。此示例仅保留了其他两个断言(LogAnalysisAssertion、ResponseAnalysisAssertion)。这会阻止 FormBodyFuzzingCheck 使用 StatusCodeAssertion:
Profiles:
- Name: Quick-10
DefaultProfile: Quick
Routes:
- Route: *Route0
Checks:
- Name: FormBodyFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
Assertions:
- Name: LogAnalysisAssertion
- Name: ResponseAnalysisAssertion
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: JsonFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: XmlInjectionCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true