两个都Burp Suite专业人士Burp Suite Enterprise Edition包含打扫扫描仪- 允许用户轻松扫描Web应用程序以了解漏洞。beplay体育能用吗其他博客文章涵盖了Burp Scanner的爬网方式如何遵循网页中的链接,以查找可能暴露安全漏洞的攻击表面。beplay体育能用吗在这篇文章中,我们讨论了如何适应爬行者的工作API端点而不是网页。beplay体育能用吗

我们大多数人经常将Web应用程beplay体育能用吗序用于新闻,娱乐,购物等日常事物。这些网页旨在beplay体育能用吗为普通的最终用户提供。但是,Web还用于提供Abeplay体育能用吗PI(应用程序编程接口),这些API允许不同的应用程序相互交流。许多组织提供了许多API。其中一些是公共API,可作为付费客户提供服务,但API也用于在组织内部提供微服务,使公司内部的不同团队可以将其单独的模块集成在一起。这些API为恶意用户提供了广泛的额外攻击表面,并且通常会被安全团队忽略,因为它们仅由开发人员和其他机器使用(请参阅科里·鲍尔(Corey Ball)的采访有关此的更多信息)。

API的示例


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

OpenAPI标准


通常记录了API,以便用户知道可用的功能以及不同API端点所需的语法(API用户可以访问的接口方法)。相对较新的开发是定义API端点的OpenAPI标准。该标准定义了用于以标准化方式指定端点的YAML或JSON结构,包括托管API的服务器,对于每个端点,所需和可选参数的规范,返回类型等。这些文档旨在由人类和机器可读。它是机器可读的事实,意味着开发人员可以轻松地以其选定的编程语言(例如Java/Python)轻松解析OpenAPI文档,并且可以立即使用接口。

这是端点的OpenAPI规范的示例:

路径:

/用户/{userId}:

得到:

摘要:通过ID返回用户。

参数:

名称:用户ID

在:路径
必需:正确

描述:用户ID

模式:

类型:整数

格式:INT64

最低:1

回答:

“ 200”:

描述:确定

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

获取/用户/1 HTTP/1.1

获取/用户/2 HTTP/1.1

获取/用户/1932899 http/1.1

重写Burp扫描仪与OpenAPI合作


返回Burp Suite和beplay体育能用吗Web应用程序安全,API端点为恶意黑客提供了其他潜在的攻击表面。因此,如果我们找到一个OpenAPI文档,我们可以自动找到暴露的端点,并且爬网可以将这些端点添加到传递给扫描仪的项目列表中。

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

爬虫的简要说明

首先,我将简要介绍一下爬虫如何与普通HTML网页一起使用。beplay体育能用吗在一个简单的层面上,我们将每个页面视为指向其他页面的一组链接。爬虫以广度优先的方式访问了这些链接,并添加每个新页面作为扫描仪可能的攻击表面。在内部,我们通过使用迷宫搜索的人的隐喻来抽象不同类型的链接的细节。我们谈论的是无需考虑页面和链接房间门口。我们可以将一个房间大致对应于一个带有一组门口的网页,即指向其他房间(页面)的链接。beplay体育能用吗

使用这种抽象的一个优点是,我们不会在所有不同可能的HTML元素和技术的细节中陷入困境。例如,代替页面上的链接,我们可能有一个表单(例如登录或注册表格)。这些具有多个输入,在提交到另一页上之前,用户需要填写这些输入。现在,我们可以将形式视为另一种门口。所以我们可能有一个Anchordoorway代表正常链接(锚定为表示HTML中的链接的术语)。那我们可以有一个FormDoorway这代表了另一种可能需要多个用户输入的门口,然后再移到另一个房间。这具有一个优势,然后我们可以重新使用所有现有的算法,以通过房间和门口导航,而无需重写所有内容以使用表格和链接。

然而,形式引起了爬虫的并发症:我们对形式有什么输入?在我们的轨道术语中,我们将表单字段视为钥匙我们需要提供通过门口。我们使用多种不同的策略来构造形式门口的键,这部分取决于用户配置的内容。我们有一个概念猜猜钥匙,它根据表单字段的名称为每个字段提供合理的值。因此,对于电子邮件字段,我们将构建一个伪造的电子邮件地址,并在国家,电话号码等方面构建。另一个键是金丝雀钥匙- 这是我们用于特定目的并存储的随机字符串 - 我们希望查看我们输入的金丝雀键是否出现在其他房间(页面)中。这可能表明可能漏洞,因为它表明用户输入的原始输入反映在其他页面中,使恶意用户可以将恶意代码注入表单中,并在其他地方采取行动,例如在XSS攻击中(请参阅我们的XSS攻击中)XSS攻击的页面有关此的更多信息)。最后我们有凭证键。这些是用户提供的详细信息,允许Crawler进入网站的限制区域,例如登录详细信息。beplay体育能用吗

爬行的OpenAPI文件

当面对抓取OpenAPI文档中指定的端点的问题时,我们的第一种方法是以与HTML形式相似的方式来考虑每个端点。毕竟,每个端点指定所需(和可选)参数的列表,其方式与HTML表单几乎相同。OpenAPI规范允许枚举作为参数(即有限的选项列表),该参数与HTML表单中的下拉菜单或无线电按钮相对应。

尽管我们在此模型上取得了一些最初的进步,但我们很快就遇到了问题。尽管端点的OpenAPI规格与HTML表格之间有相似之处,但在特定细节方面仍然存在重要差异。

例如,HTML表单可以具有检查或未选中的输入复选框。如果用户不打勾复选框,则在提交表单时未在请求中发送该参数。但是,OpenAPI中的布尔字段具有不同的行为。在这种情况下,如果未提供参数,则提供默认值,该值是错误的。这可能导致与API不同的行为。其他数据类型(例如数字字段)也有类似的差异。

因此,我们开始致力于创建独立于HTML形式处理的新的Apidoorway,从而使我们可以遵循OpenAPI规范,而无需尝试适合旧的HTML形式方法。

在这里,我们面临的更大的挑战之一是提交JSON请求主体,这些挑战是某些API端点所要求的。对于爬虫而言,这是全新的功能 - 我们现有的代码具有在html表单的POST请求机构中提交参数(带有类型应用程序/x-www-form-urlenCoded和multipart/form-data),但可以提交的能力JSON请求主体是一项新功能。这是一个强大的新功能,因为它为需要JSON输入的REST API端点打开了许多攻击表面。

确定在爬网中发送哪些参数

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

我们已经决定以下组合:

  • 每一个组合服务器(只要在范围中)和小路方法(获取,发布等)。因此,如果我们有三个服务器和一个带有get和post方法的端点,则将是3 x 2 = 6总端点位置。
  • 如果可选的定义了参数,爬网将至少两个请求发送到该端点:一个仅包含强制性参数的请求和另一个包括所有可选参数的请求。
  • 如果是枚举类型,爬网将为每个参数的允许值发送单独的请求。
  • 如果是数字值我们使用指定的最大值和最小值。
  • 如果例子提供了一组参数,我们使用最终提供的示例。

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

搜寻器要求搜索规格的示例

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

“路径”:
{
“/api”:{
“得到”: {
“摘要”:“此API端点的摘要”,
“请求body”:{
“必需”:是的,
“内容”: {
“应用程序/json”:{
“架构”:{
“类型”:“对象”,
“特性”: {
“ StringField”:{
“类型”:“字符串”
},,

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

}
},,

“ example2”:{

“价值”:

{
“ stringfield”:“ example2”,

“数字”:2.5
}
}

在这种情况下,攻击者将使用最终示例,即“示例2”发送以下请求(省略某些HTTP标头):

获取 /扫描http /1.1
{“ stringfield”:“ example2”,“ numberfield”:2.5}

枚举的另一个例子:

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

“得到”: {

“摘要”:“此API端点的摘要”,

“标签”:[

“扫描”

],,

“参数”: [

{

“名称”:“ StringParameter”,

“在”:“路径”,

“必需”:是的,

“架构”:{

“ type”:“ string”,

“枚举”:[

“ enum1”,

“ enum2”

这是给予的

}

}

这是给予的

}

}

在这种情况下,使用字符串参数的枚举以及数字参数的最小值和最大值,搜寻器将发送以下请求:

get/string参数/enum1 http/1.1
get/string参数/enum2 http/1.1


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

结论

我们引入了API扫描功能,以涵盖这一不断增长的需求领域。我们在管道中有很多新想法 - 您可以在我们的最新消息中看到的第一个想法路线图。您也可以找到一个此处的API扫描功能的摘要