这两个Burp Suite Professional.Burp Suite Enterprise Edition包含bepaly下载 - 允许用户轻松扫描Web应用程序以获取漏洞。beplay体育能用吗其他博客帖子涵盖Burp Scanner的爬网程序在网页中的链接遵循链接以查找可能暴露安全漏洞的攻击曲面。beplay体育能用吗在这篇文章中,我们讨论了履带的适应如何与之合作API端点而不是网页。beplay体育能用吗

我们大多数人经常使用Web应用beplay体育能用吗程序,以便日常内容,如新闻,娱乐,购物等。这些网页适用beplay体育能用吗于普通的最终用户。然而,Web还用于提供Abeplay体育能用吗PI(应用程序编程接口),允许不同的应用程序彼此交谈。各种组织提供了许多API。其中一些是公共API,其作为支付客户的服务,但API也用于在组织内部内部提供微服务,允许公司内部的不同团队将其单独的模块集成在一起。这些API为恶意用户提供了广泛的额外攻击曲面,并且通常这些攻击曲线被安全团队忽视,因为它们仅供开发人员和其他机器使用(见采访Corey Ball有关此问题的更多信息)。

API的例子


作为一个例子,考虑一个公司,如ZapMap,它正在开发一个允许用户在电动车找到附近的充电点的网站上。beplay体育能用吗该公司希望在地图上显示收费点。为此,他们可以使用映射API(例如Google Maps API)来生成带有标记为上的充电点的地图。在这种情况下,需要一些初始设置步骤,因为它们需要API键来使用该服务。但是,要获取地图数据,他们将简单地以与我们的Web浏览器在请求网页时执行的方式发送Web(HTTP)请求。beplay体育能用吗该请求包含信息,例如需要地图的区域,以及充电站的位置。然后,响应,而不是发送正常的HTML网页(这是我们在浏览器中看到的)地图API服务将返回在ZAPMAPbeplay体育能用吗网页上显示地图所需的数据以及作为标记的位置。

openapi标准


API通常是有文档记录的,这样用户就知道不同API端点需要什么功能和什么语法(API的用户可以访问的接口方法)。一个相对较新的开发是用于定义API端点的OpenAPI标准。该标准定义了一个YAML或JSON结构,用于以标准化的方式指定端点,包括驻留API的服务器,以及每个端点所需和可选参数的规范、返回类型等。这些文档被设计为可被人类和机器阅读。它是机器可读的这一事实意味着开发人员可以很容易地用他们选择的编程语言(例如Java/Python)解析OpenAPI文档,并立即准备好使用接口。

以下是端点的OpenAPI规范的示例:

道路:

/用户/ {userId}:

得到:

摘要:按ID返回用户。

参数:

名称:userid.

在:路径
要求:真正的

description:用户id

架构:

类型:整数

格式:int64

最小值:1

答应:

'200':

描述:好的

端点位于/用户身上,并且具有一个参数userID,它是“整数”类型的路径参数,最小值为“1”。因此,从本说明书中,以下请求对于此端点有效:

获取/用户/ 1 http / 1.1

获取/用户/ 2 http / 1.1

获取/用户/ 1932899 HTTP / 1.1

重写打嗝扫描器以与OpenAPI一起工作


回到Burp套件和beplay体育能用吗Web应用程序安全性,API端点为恶意黑客提供额外的潜在攻击曲面。因此,如果我们发现OpenAPI文档,我们可以自动查找所公开的端点,并且爬网程序可以将这些端点添加到传递给扫描仪的项目列表中。

原则上,这听起来很简单,但在实现过程中提出了许多技术挑战。

履带的简要描述

首先,我将简要介绍爬网程序如何使用普通的HTML网页。beplay体育能用吗在一个简单的级别,我们将每个页面视为与其他页面的一组链接。爬网程序以广度第一的方式访问这些链路中的每一个,将每个新页面添加为扫描仪的可能攻击表面。在内部我们摘要通过使用搜索迷宫的人的隐喻来摘要不同类型的链接的细节。我们谈论的,而不是思考页面和链接房间门口。我们可以将一个房间暗中与网页相对应,其中一组门口即其他房间(页面)。beplay体育能用吗

使用此抽象的一个优点是我们不会在所有不同可能的HTML元素和技术的细节中陷入困境。例如,而不是我们可能具有页面上的链接(例如登录或注册表单)。这些具有多个输入,用户需要在提交到另一个页面之前填充。现在我们可以认为形式是另一种门口。所以我们可能有一个Achordoorway.它表示一个普通的链接(锚是用来在HTML中表示链接的术语)。然后我们有aFormdoorway.它代表了另一种类型的门口,在移动到另一个房间之前需要多个用户输入。这有一个优势,我们可以重新使用所有现有的算法导航通过房间和门口,而不重写一切与表单和链接的工作。

然而,表单给爬虫带来了复杂性:我们在表单中输入什么?在我们的爬虫术语中,我们认为表单字段为钥匙我们需要提供通过门口。我们使用许多不同的策略来构造形式门口的键,部分地依赖于用户已配置的内容。我们有概念猜的钥匙,基于表单字段的名称为每个字段提供合理的值。因此,对于电子邮件领域,我们将构建一个假电子邮件地址,同样适用于国家/地区,电话号码等。另一种类型的关键是一个金丝雀钥匙- 这是我们使用和存储特定目的的随机字符串 - 我们希望查看我们输入的金丝雀键是否出现在其他房间(页面)中。这可能表明可能的漏洞,显示由用户输入的原始输入被反映在其他页面中,允许恶意用户将恶意代码注入表单,并在其他地方采取行动,例如在XSS攻击中(见我们的关于XSS攻击的页面有关此问题的更多信息)。最后我们有凭据钥匙。这些是用户提供的详细信息,以允许爬网程序进入网站的受限区域,例如登录详细信息。beplay体育能用吗

爬行OpenAPI文档

当面对爬行openAPI文档中指定的端点的问题时,我们的第一个方法是以类似的方式考虑每个端点到HTML表单。毕竟,每个端点指定所需(和可选)参数的列表,其方式与HTML表单大致相同。OpenAPI规范允许枚举为参数(即选项的有限列表),其对应于以HTML表单中的下拉菜单或单选按钮。

虽然我们通过这种模型进行了一些初步进展,但我们很快就遇到了问题。尽管EndaPI在Endpoints和HTML表单之间的相似性,但在特定细节方面存在重要差异。

例如,HTML表单可以有选中或未选中的输入复选框。如果用户没有勾选复选框,那么当表单提交时,该参数就不会在请求中发送。然而,OpenAPI中的布尔字段有不同的行为。在这种情况下,如果没有提供参数,则会提供一个默认值,即false。这可能会导致与API不同的行为。其他数据类型也有类似的区别,比如数字字段。

因此,我们在创建一个独立于我们的HTML表单处理的新Apidoorway方面工作,允许我们遵循OpenAPI规范,而不尝试适合旧的HTML表单方法。

这里我们面临的一个更大的挑战是提交JSON请求体,这是一些API端点所需要的。这是全新的爬虫——我们的现有代码功能的设施提交参数为HTML表单POST请求的身体(类型应用程序/ x-www-form-urlencoded和多部分/格式),但能够提交一个JSON请求的身体是一个新功能。这是一个强大的新特性,因为它为需要JSON输入的REST API端点打开了许多攻击面。

决定在抓取中发送什么参数

鉴于特定的端点可以具有可以提交的大量可能的参数。例如,没有约束的开放字符串参数可以具有几乎无限的有效输入数。因此,履带将不可能尝试尝试所有参数的组合。但是,与此同时,我们希望通过尝试合理数量的可能的参数组合来揭露可能的攻击表面来实现良好的覆盖范围。

我们已决定以下组合:

  • 每一个的组合服务器(只要它处于范围)和小路方法(GET, POST等)。如果我们有三个服务器和一个具有GET和POST方法的端点,这将是3 x 2 = 6个端点位置。
  • 如果可选的定义参数,爬网程序将向该端点发送至少两个请求:一个请求仅包含强制参数和包含所有可选参数的另一个请求。
  • 在……的情况下枚举类型,爬虫将为每个参数的允许值发送单独的请求。
  • 在……的情况下数字值我们使用指定的最大值和最小值。
  • 如果例子提供了参数集我们使用最终规定的例子。

如果参数未在上面列出的方式之一中定义,我们将恢复为使用猜测和金丝雀键,就像我们为HTML表单一样。

用于OpenAPI规范的履带请求的示例

这段代码显示了GET端点的规范,其中有两组参数示例:

“路径”:
{
“/ api”:{
“得到”:{
"summary": "summary of this API endpoint",
" requestBody ": {
“要求”:没错,
“内容”: {
" application / json ": {
“架构”:{
“类型”:“对象”,
“特性”: {
“stringfield”:{
“类型”:“字符串”
},

       
“numberfield”:{
“类型”:“数量”
}
}
},
“例子”: {
“例子1”:{
“价值”:{
“stringfield”:“example1”,
“Numberfield”:1.5

}
},

“example2”:{

“价值”:

{
“stringfield”:“example2”,

“NumberField”:2.5
}
}

在这种情况下,爬行器将使用最后一个示例,即“example2”,发送以下请求(省略一些HTTP头):

获取/扫描http / 1.1
{“stringField”:“example2”、“numberField”:2.5}

另一个具有枚举的示例:

“路径”:{
“/ stringParameter / {StringParameter}”:{

“得到”:{

"summary": "summary of this API endpoint",

“标签”:[

“扫描”

),

“参数”:(

{

“名称”:“stringParameter”,

“在”:“道路”,

“要求”:没错,

“架构”:{

“类型”:“字符串”,

“枚举”:[

“enum1”,

“enum2”

]

}

}

]

}

}

在这种情况下,爬网程序将使用字符串参数的枚举和数字参数的最小值和最大值来发送以下请求:

get / stringparameter / enum1 http / 1.1
获得/ stringParameter / enum2 HTTP / 1.1这样


然后将这些端点作为目的地发送到扫描仪以扫描。

结论

我们推出了API扫描功能作为基础,以涵盖这种不断增长的需求面积。我们在管道中有很多新想法 - 你最近可以看到的一个新想法路线图。你也可以找到一个这里是API扫描特性的总结