API初探

news/2025/3/1 4:36:21/文章来源:https://www.cnblogs.com/whitehe/p/18598415

一、API 侦察

要开始 API 测试,您首先需要尽可能多地了解有关 API 的信息,以发现其攻击面。

首先,您应该确定 API 端点。这些是 API 接收有关其服务器上特定资源的请求的位置。例如,请考虑以下请求:GET

GET /api/books HTTP/1.1 Host: example.com 

此请求的 API 端点是 。这会导致与 API 进行交互,以从图书馆中检索书籍列表。例如,另一个 API 端点可能是 ,它将检索神秘书籍列表。/api/books``/api/books/mystery

确定终结点后,需要确定如何与它们进行交互。这使您能够构造有效的 HTTP 请求来测试 API。例如,您应该找到有关以下内容的信息:

  • API 处理的输入数据,包括必填参数和可选参数。
  • API 接受的请求类型,包括支持的 HTTP 方法和媒体格式。
  • 速率限制和身份验证机制。

二、API 文档

通常记录 API,以便开发人员知道如何使用它们并与之集成。

文档可以是人类可读和机器可读的形式。人类可读的文档旨在让开发人员了解如何使用 API。它可能包括详细说明、示例和使用场景。机器可读文档旨在由软件处理,以自动执行 API 集成和验证等任务。它以 JSON 或 XML 等结构化格式编写。

API 文档通常是公开的,特别是当 API 旨在供外部开发人员使用时。如果是这种情况,请始终通过查看文档来开始您的侦察。

1、发现 API 文档

即使 API 文档未公开提供,您仍可以通过浏览使用 API 的应用程序来访问它。

为此,您可以使用 Burp Scanner 对 API 进行爬网。您还可以使用 Burp 的浏览器手动浏览应用程序。查找可能引用 API 文档的终结点,例如:

  • /api
  • /swagger/index.html
  • /openapi.json

如果确定资源的终结点,请确保调查基本路径。例如,如果标识资源终结点,则应调查以下路径:/api/swagger/v1/users/123

  • /api/swagger/v1
  • /api/swagger
  • /api

您还可以使用常用路径列表直接模糊文档。

实验一、API简单理解

访问页面,并通过burp走流量,这样点击的时候,burp也会爬取

登录提供的账号并,手工访问目录/api 进行尝试,弹出下面信息

点击GET,查看信息

点击DELETE,查看信息

点击PATCH,查看信息

返回burp,查看爬取的站点信息

把请求包发送到repeter模块,并把PATCH请求,改成DELETE,并把路径改成/api/user/carlos

到此,实验完成,主要考察API怎么发现,怎么利用,还有HTTP请求的事情

2、使用机器可读的文档

您可以使用一系列自动化工具来分析您找到的任何机器可读的 API 文档。

您可以使用 Burp Scanner 来抓取和审核 OpenAPI 文档,或者 JSON 或 YAML 格式的任何其他文档。您还可以使用 OpenAPI 解析器 BApp 解析 OpenAPI 文档。

您还可以使用专用工具来测试记录的终结点,例如 Postman 或 SoapUI。




三、识别 API 端点

您还可以通过浏览使用 API 的应用程序来收集大量信息。即使您可以访问 API 文档,这通常也是值得的,因为有时文档可能不准确或过时。

您可以使用 Burp Scanner 对应用程序进行爬网,然后使用 Burp 的浏览器手动调查有趣的攻击面。

浏览应用程序时,请在 URL 结构中查找建议 API 端点的模式,例如 .还要注意 JavaScript 文件。这些可以包含对尚未通过 Web 浏览器直接触发的 API 端点的引用。Burp Scanner 在爬网期间会自动提取一些端点,但对于更重量级的提取,请使用 JS Link Finder BApp。您也可以在 Burp 中手动查看 JavaScript 文件。/api/

与 API 端点交互

确定 API 端点后,使用 Burp Repeater 和 Burp Intruder 与它们进行交互。这使您能够观察 API 的行为并发现其他攻击面。例如,您可以研究 API 如何响应更改 HTTP 方法和媒体类型。

与 API 端点交互时,请仔细查看错误消息和其他响应。有时,这些包含可用于构造有效 HTTP 请求的信息。

① HTTP方法与API方法区别

确定支持的 HTTP 方法

HTTP 方法指定要对资源执行的操作。例如:

  • GET- 从资源中检索数据。
  • PATCH- 对资源应用部分更改。
  • OPTIONS- 检索有关可用于资源的请求方法类型的信息。

API 端点可能支持不同的 HTTP 方法。因此,在调查 API 端点时,测试所有潜在方法非常重要。这可能使你能够识别其他终结点功能,从而打开更多的攻击面。

例如,终结点可能支持以下方法:/api/tasks

  • GET /api/tasks- 检索任务列表。
  • POST /api/tasks- 创建新任务。
  • DELETE /api/tasks/1- 删除任务。

您可以使用 Burp Intruder 中内置的 HTTP 谓词列表来自动循环使用一系列方法。

②确定支持的内容类型

API 端点通常需要特定格式的数据。因此,它们的行为可能会有所不同,具体取决于请求中提供的数据的内容类型。通过更改内容类型,您可以:

  • 触发泄露有用信息的错误。
  • 绕过有缺陷的防御。
  • 利用处理逻辑的差异。例如,API 在处理 JSON 数据时可能是安全的,但在处理 XML 时容易受到注入攻击。

若要更改内容类型,请修改标头,然后相应地重新设置请求正文的格式。可以使用内容类型转换器 BApp 在 XML 和 JSON 之间自动转换请求中提交的数据。Content-Type

实验二、查找和利用未使用的 API 端点

打开页面,把链接进行爬虫一下,发现含有api的网站目录,点进去,并用repeter模块

这里先用GET,发现返回{"price":"$0.00","message":"🔥 Don't delay, purchase yours today! 3 people are watching this item! 🔥"}

说明了json格式以及参数

请求体中先用json格式测试,即 {}

返回{"type":"ClientError","code":400,"error":"'price' parameter missing in body"}

意思price参数不在主体中,那么加入即可修改为0

返回支付界面即可付款0

③ 使用入侵者查找隐藏的端点

确定一些初始 API 端点后,您可以使用 Intruder 发现隐藏的端点。例如,假设您已确定以下用于更新用户信息的 API 端点:

PUT /api/user/update

要识别隐藏的端点,您可以使用 Burp Intruder 查找具有相同结构的其他资源。例如,您可以使用其他常用函数(如 和 )的列表将有效负载添加到路径的位置。/update``delete``add

查找隐藏终结点时,请使用基于常见 API 命名约定和行业术语的单词列表。确保根据初始侦察,还包括与应用程序相关的术语。

analysis:

1. 获取api在哪
2. 测试api的每种http请求都是什么效果
3. 根据返回格式再进一步修改content-type进行测试

四、查找隐藏的参数

在执行 API 侦察时,可能会发现 API 支持的未记录参数。您可以尝试使用它们来更改应用程序的行为。

批量分配漏洞

批量分配(也称为自动绑定)可能会无意中创建隐藏参数。当软件框架自动将请求参数绑定到内部对象上的字段时,就会发生这种情况。因此,批量分配可能会导致应用程序支持开发人员从未打算处理的参数。

1. 识别隐藏参数

由于批量分配从对象字段创建参数,因此您通常可以通过手动检查 API 返回的对象来识别这些隐藏参数。

例如,考虑一个 PATCH,它使用户能够更新其用户名和电子邮件,并包含以下 JSON: /api/users/ request

{   "username": "wiener",   "email": "wiener@example.com", 
} 

并发请求返回以下 JSON:GET /api/users/123

{   "id": 123,    "name": "John Doe",    "email": "john@example.com",    "isAdmin": "false" 
} 

这可能表示隐藏和参数与更新的用户名和电子邮件参数一起绑定到内部用户对象。id``isAdmin

2. 测试批量分配漏洞

若要测试是否可以修改枚举的参数值,请将其添加到请求中:isAdmin``PATCH

{    "username": "wiener",    "email": "wiener@example.com",    "isAdmin": false, 
} 

此外,发送参数值无效的请求:PATCH``isAdmin

{   "username": "wiener",    "email": "wiener@example.com",   "isAdmin": "foo", 
} 

如果应用程序的行为不同,这可能表明无效值会影响查询逻辑,但有效值不会。这可能表示用户可以成功更新参数。

然后,您可以发送参数值设置为 的请求,以尝试利用此漏洞:PATCH``isAdmin``true

{   "username": "wiener",    "email": "wiener@example.com",    "isAdmin": true,
} 

如果请求中的值绑定到用户对象而没有进行充分的验证和清理,则可能会错误地向用户授予管理员权限。要确定是否是这种情况,请浏览应用程序以查看是否可以访问管理功能。

实验室三、利用批量分配漏洞

打开页面,和之前一样,手工和爬虫一起,手工输入/api,发现有返回,并且给出两种方法

大概能看出,post方法有语法命令,get是有响应的命令

这里查看post方法有那些命令

查看ChosenDiscount

查看ChosenProduct

GET方法与POST都是一样的,结合上面,这里说明POST用于修改创造,GET只是查询并返回

把商品添加购物车并在支付时抓包,观察发现,先收到post数据包,再收到get数据包,说明这里可以先修改,再查询

直接抓取第一个数据包并按照上面的格式进行修改,percentage是百分比的意思,discount是折扣的意思

默认的post数据包,chosen_discount是有默认值,所以原始数据包中没有这个参数,这里手工添加。

把三个参数的值都修改进行尝试,percentage这个参数为主进行测试,发送到intruder模块,1到100测试

在0和100有为true,但是0%这就是没有折扣,所以100%折扣看下,发现全免了,

analysis:

1. 发现api
1. 观察http方法所带来的效果
1. 对给出的进行测试,哪怕默认不显示出来的,也要进行一个个测试
1. 学好英语,这个挺重要,对于一些参数,可能直接就知道他的含义了,比如:discount和percentage

五、防止 API 中的漏洞

在设计 API 时,请确保从一开始就考虑安全性。特别是,请确保您:

  • 如果您不希望 API 可公开访问,请保护您的文档。
  • 确保您的文档保持最新状态,以便合法测试人员能够全面了解 API 的攻击 表面。
  • 应用允许的 HTTP 方法的允许列表。
  • 验证每个请求或响应是否应采用内容类型。
  • 使用一般错误消息可避免泄露可能对攻击者有用的信息。
  • 对 API 的所有版本(而不仅仅是当前生产版本)使用保护措施。

为防止大规模分配漏洞,请将可由用户更新的属性列入允许列表,并将用户不应更新的敏感属性列入阻止列表。

六、服务器端参数污染

某些系统包含无法从 Internet 直接访问的内部 API。当网站在服务器端请求中嵌入用户输入到内部 API 而没有进行充分编码时,就会发生服务器端参数污染。这意味着攻击者可能能够操纵或注入参数,从而使他们能够,例如:

  • 覆盖现有参数。
  • 修改应用程序行为。
  • 访问未经授权的数据。

您可以测试任何用户输入是否存在任何类型的参数污染。例如,查询参数、表单字段、标头和 URL 路径参数都可能容易受到攻击。

注意

此漏洞有时称为 HTTP 参数污染。但是,此术语也用于指代 Web 应用程序防火墙 (WAF) 绕过技术。为避免混淆,在本主题中,我们将仅引用服务器端参数污染。

此外,尽管名称相似,但此漏洞类与服务器端几乎没有共同之处 原型污染。

1、测试查询字符串中的服务器端参数污染

若要测试查询字符串中的服务器端参数污染,请在输入中放置查询语法字符(如 、 和),并观察应用程序的响应方式。#``&``=

考虑一个易受攻击的应用程序,它使您能够根据用户名搜索其他用户。当您搜索用户时,您的浏览器会发出以下请求:

GET /userSearch?name=peter&back=/home

为了检索用户信息,服务器使用以下请求查询内部 API:

GET /users/search?name=peter&publicProfile=true

① 截断查询字符串

您可以使用 URL 编码的字符来尝试截断服务器端请求。为了帮助您解释响应,您还可以在字符后添加一个字符串。#``#

例如,可以将查询字符串修改为以下内容:

GET /userSearch?name=peter%23foo&back=/home

前端将尝试访问以下 URL:

GET /users/search?name=peter#foo&publicProfile=true

注意

必须对字符进行 URL 编码。否则,前端应用程序会将其解释为片段标识符,并且不会将其传递给内部 API。#

查看响应,以获取有关查询是否已被截断的线索。例如,如果响应返回 user ,则服务器端查询可能已被截断。如果返回错误消息,则应用程序可能已被视为用户名的一部分。这表明服务器端请求可能尚未被截断。peter``Invalid name``foo

如果能够截断服务器端请求,则无需将字段设置为 true。您可以利用此漏洞返回非公共用户配置文件。publicProfile

② 注入无效参数

您可以使用 URL 编码的字符尝试向服务器端请求添加第二个参数。&

例如,可以将查询字符串修改为以下内容:

GET /userSearch?name=peter%26foo=xyz&back=/home

这会导致对内部 API 发出以下服务器端请求:

GET /users/search?name=peter&foo=xyz&publicProfile=true

查看响应以获取有关如何分析其他参数的线索。例如,如果响应未更改,这可能表示参数已成功注入,但被应用程序忽略。

为了建立一个更完整的图片,你需要进一步测试。

③ 注入有效参数

如果能够修改查询字符串,则可以尝试向服务器端请求添加第二个有效参数。

例如,如果已标识参数,则可以将其添加到查询字符串中,如下所示:email

GET /userSearch?name=peter%26email=foo&back=/home

这会导致对内部 API 发出以下服务器端请求:

GET /users/search?name=peter&email=foo&publicProfile=true

查看响应以获取有关如何分析其他参数的线索。

④ 覆盖现有参数

若要确认应用程序是否容易受到服务器端参数污染的影响,可以尝试覆盖原始参数。为此,请注入具有相同名称的第二个参数。

例如,可以将查询字符串修改为以下内容:

GET /userSearch?name=peter%26name=carlos&back=/home

这会导致对内部 API 发出以下服务器端请求:

GET /users/search?name=peter&name=carlos&publicProfile=true

内部 API 解释两个参数。其影响取决于应用程序如何处理第二个参数。这因不同的 Web 技术而异。例如:name

  • PHP 只解析最后一个参数。这将导致用户搜索 .carlos
  • ASP.NET 结合了这两个参数。这将导致用户搜索 ,这可能会导致出现错误消息。peter,carlos``Invalid username
  • Node.js / express 仅解析第一个参数。这将导致用户搜索 ,给出不变的结果。peter

如果能够覆盖原始参数,则可能能够进行攻击。例如,您可以添加到请求中。这允许您以管理员用户身份登录。name=administrator

实验室四、利用查询字符串中的服务器端参数污染

这里强烈建议科学后打开实验室

根据上面的学习,可以知道服务器参数的污染可以输入有效/无效参数,覆盖/注释参数,主要用到的就是#&,不过这里建议都进行URL编码后使用。因为有的参数用户并看不到,但是可能是有默认值之类的,使用了&代表有多个参数,如果没有输入这个参数,可能会报错,那么注释这个参数的话,后台代码检测时,发现原本的默认值都没有了,也可能会报出错误,根据报出的错误就可以进行猜测,比如报出了另一个参数的话,就可以对这个参数进行爆破,猜测服务器端可能会用到的名称,比如email等,然后就可以进行覆盖。

burp打开后,打开实验室页面,把能点的都先点击了,然后在burp上查看历史记录,注意这里两个点中都含有忘记密码的,其中有个js文件,这里忘记标注了,就在下面中,这个js文件可能含有一些重置密码的函数,需要注意

抓取忘记密码时需要提交用户的数据包,并通过#&进行参数污染

在使用&时,后面随便输入,查看返回

Parameter is not supported. 不支持参数。

这里说明另一个参数不正确,那么使用#注释参数试试

Field not specified 未指定field

这里把另一个参数返回出来了,制造payload

csrf=tsHfCW9y1ycCDosquetbqpnkXCIhikCl&username=administrator%26field=id

这里把id作为服务器可能设置的变量进行猜测,发送intruder模块进行爆破,不过这里爆破后并没有发现什么,可能是字典原因,接下来查看之前的js文件,看里面是否含有一些信息。

发现关键函数

forgotPwdReady(() => {const queryString = window.location.search;const urlParams = new URLSearchParams(queryString);const resetToken = urlParams.get('reset-token');if (resetToken){window.location.href = `/forgot-password?reset_token=${resetToken}`;//如果resettoken不为空,则跳转到这个界面,这里参数是reset_token}else{const forgotPasswordBtn = document.getElementById("forgot-password-btn");forgotPasswordBtn.addEventListener("click", displayMsg);}
});

那么就想办法搞到reset_token,之前爆破时发现的field=Email时的返回界面,查看一下

这里可以看到,参数等于email时,返回的是结果和参数本身,那么reset_token是否一样呢,进行测试

csrf=tsHfCW9y1ycCDosquetbqpnkXCIhikCl&username=administrator%26field=reset_token

返回下面的值

那么知道了reset_token的值,那么js代码中的路径进行测试

window.location.href = /forgot-password?reset_token=${resetToken};

直接访问url连接,在重置密码的界面后面加上reset_token以及它的值

url/forgot-password?reset_token=mp.......pf

即可直接进入到重置密码的界面,只需输入新密码即可修改administrator的密码,然后以这个密码登录删除carlos即可

analysis:

1. 灵活使用`&`和`#`来猜测参数或注释参数
1. 确定参数后,利用服务器常用的一些变量进行爆破,要有好的字典
1. 要注意js文件,可能就有敏感信息泄露,且要能读懂js代码

2、 测试 REST 路径中的服务器端参数污染

RESTful API 可以将参数名称和值放在 URL 路径中,而不是查询字符串中。例如,请考虑以下路径:

/api/users/123

URL 路径可能按如下方式细分:

  • /api是根 API 端点。
  • /users表示资源,在本例中为 。users
  • /123表示一个参数,此处是特定用户的标识符。

考虑一个应用程序,该应用程序使您能够根据用户名编辑用户配置文件。请求将发送到以下终结点:

GET /edit_profile.php?name=peter

这会导致以下服务器端请求:

GET /api/private/users/peter

攻击者可能会操纵服务器端 URL 路径参数来利用 API。若要测试此漏洞,请添加路径遍历序列以修改参数并观察应用程序的响应方式。

您可以提交 URL 编码作为参数的值:peter/../admin``name

GET /edit_profile.php?name=peter%2f..%2fadmin

这可能会导致以下服务器端请求:

GET /api/private/users/peter/../admin

如果服务器端客户端或后端 API 规范化此路径,则可能会将其解析为 ./api/private/users/admin

实验室5 :利用 REST URL 中的服务器端参数污染

若要解决实验室问题,请以administrator 权限登录和 删除 carlos.

所需知识

若要解决此实验,需要了解:

  • 如何识别用户输入是否包含在服务器端 URL 路径或查询字符串中。
  • 如何使用路径遍历序列尝试更改服务器端请求。
  • 如何发现 API 文档。

首先抓取数据包,把能点的功能都点一遍,然后分析数据包,并且也可以对网址进行扫描等操作。也可以手工输入路径/api测试有无明显的,发现没有

在数据包中发现,当点击忘记密码的时候,会请求页面,但是后面会再请求一个JS文件,并且在扫描的地方也发现含有这个JS文件。

可以查看其中的JS代码,并且对修改密码的POST请求数据包进行分析

首先尝试截断查询字符串试试,首先看看正常的数据包,然后进行测试

使用#注释,尝试截断,观察响应,发现#有无编码,返回一样,但是说明服务器应该处理了,并且对于编码也进行了解码

api-21

尝试使用路径./进行测试,看请求的username是否为路径,发现可以访问成功,说明是路径构造的,并且服务器处理这种路径标识的。那么就可以从../../../这种下手。

那么这里可以访问到administrator的话,如果路径可行,使用../访问上级目录,一般应该不会再有的,除非管理员真的很闲

尝试路径搭配截断测试 ..%23 %23#的URL编码,发现不行

尝试添加更多路径的方式呢,看怎么响应,发现响应的是从API服务器上,是NOT FOUND,那说明这种方式可行

既然这里不知道api路径的名称,使用常见的一些路径进行测试,看响应,发现从api服务器中返回500代码,是服务器的问题,但是里面的内容值得关注,返回了一些信息,还有一个路径,以及路径下的参数。/api/internal/v1/users/{username}/field/{field}

那么知道的当前路径username下还有一个路径,filed,并且它下面还有一个传参,构造这个传参的值

尝试注入无效的参数测试,发现报错,并且提示因为安全原因,这个版本的API仅支持email,那么修改为email试试

发现正常显示了,说明这里的参数服务器读取了,并且验证无误

到这里,想想之前的JS文件,进行代码审计,看能否配合当前进行下一步,截取关键代码

let forgotPwdReady = (callback) => {if (document.readyState !== "loading") callback();else document.addEventListener("DOMContentLoaded", callback);
}function urlencodeFormData(fd){let s = '';function encode(s){ return encodeURIComponent(s).replace(/%20/g,'+'); }for(let pair of fd.entries()){if(typeof pair[1]=='string'){s += (s?'&':'') + encode(pair[0])+'='+encode(pair[1]);}}return s;
}const validateInputsAndCreateMsg = () => {try {const forgotPasswordError = document.getElementById("forgot-password-error");forgotPasswordError.textContent = "";const forgotPasswordForm = document.getElementById("forgot-password-form");const usernameInput = document.getElementsByName("username").item(0);if (usernameInput && !usernameInput.checkValidity()) {usernameInput.reportValidity();return;}const formData = new FormData(forgotPasswordForm);const config = {method: "POST",headers: {"Content-Type": "x-www-form-urlencoded",},body: urlencodeFormData(formData)};fetch(window.location.pathname, config).then(response => response.json()).then(jsonResponse => {if (!jsonResponse.hasOwnProperty("result")){forgotPasswordError.textContent = "Invalid username";}else{forgotPasswordError.textContent = `Please check your email: "${jsonResponse.result}"`;forgotPasswordForm.className = "";forgotPasswordForm.style.display = "none";}}).catch(err => {forgotPasswordError.textContent = "Invalid username";});} catch (error) {console.error("Unexpected Error:", error);}
}const displayMsg = (e) => {e.preventDefault();validateInputsAndCreateMsg(e);
};forgotPwdReady(() => {const queryString = window.location.search;const urlParams = new URLSearchParams(queryString);const resetToken = urlParams.get('reset-token');	//密码重置令牌if (resetToken){window.location.href = `/forgot-password?passwordResetToken=${resetToken}`;	//路径和参数出来了}else{const forgotPasswordBtn = document.getElementById("forgot-password-btn");forgotPasswordBtn.addEventListener("click", displayMsg);}
});

上面代码的关键点来了,密码重置令牌,并且这里还给出了参数passwordResetToken,根据上面的可控参数{field},尝试在这里测试,发现提示安全原因,版本不支持。

之前获取到的路径/api/internal/v1/users/{username}/field/{field}这里路径是固定,也就是调用哪个是固定的,若是有多个,是否能修改路径导致成功呢,这里修改路径为../../v1/users/administrator/field/passwordResetToken%23测试,可以看到返回了重置令牌,那么就可以进行修改密码的操作了

在GET请求忘记密码的时候,把令牌加上,即可绕过后面的输入用户名和发送到邮箱链接的操作,因为我们的令牌就是在输入用户名后获取的

然后以administrator登录即可

至此成功

analysis:

1. 抓取数据包或者使用工具扫描,看能否获取到一些信息,测试的时候,把能点的都点了,可能有的隐藏,可以借助工具 
2. 对于这种调用API的,在有接收参数的地方,测试前面的操作,如:截断、注入有/无效字符串等
3. 经过测试后,发现服务器可能处理的话,说明可能有希望有可利用的
4. 如果../路径可以的话,尽量可以使用多个序列,如../../../../   进行测试
5. 暴露出的代码,要学会分析,并且要与找到的测试点进行联合使用,因为可能单个测试或者代码审计,可能发现不了

3、 测试结构化数据格式中的服务器端参数污染

攻击者可能能够操纵参数,利用服务器处理其他结构化数据格式(如 JSON 或 XML)时的漏洞。要对此进行测试,请将意外的结构化数据注入到用户输入中,并查看服务器的响应方式。

考虑一个应用程序,它使用户能够编辑他们的配置文件,然后通过请求将他们的更改应用于服务器端 API。当您编辑您的姓名时,您的浏览器会发出以下请求:

POST /myaccount 
name=peter 

这会导致以下服务器端请求:

PATCH /users/7312/update 
{"name":"peter"} 

您可以尝试将参数添加到请求中,如下所示:access_level

POST /myaccount 
name=peter","access_level":"administrator

如果在未进行充分验证或审查的情况下将用户输入添加到服务器端 JSON 数据中,则会导致以下服务器端请求:

PATCH /users/7312/update 
{name="peter","access_level":"administrator"} 

这可能会导致用户被授予管理员访问权限。peter

考虑一个类似的示例,但客户端用户输入位于 JSON 数据中。当您编辑您的姓名时,您的浏览器会发出以下请求:

POST /myaccount 
{"name": "peter"} 

这会导致以下服务器端请求:

PATCH /users/7312/update 
{"name":"peter"} 

您可以尝试将参数添加到请求中,如下所示:access_level

POST /myaccount 
{"name": "peter\",\"access_level\":\"administrator"}

如果对用户输入进行解码,然后在没有充分编码的情况下将其添加到服务器端 JSON 数据中,则会导致以下服务器端请求:

PATCH /users/7312/update 
{"name":"peter","access_level":"administrator"}

同样,这可能会导致用户被授予管理员访问权限。peter

结构化格式注入也可能发生在响应中。例如,如果用户输入安全地存储在数据库中,然后嵌入到来自后端 API 的 JSON 响应中,而没有进行足够的编码,则可能会发生这种情况。您通常可以像在请求中一样检测和利用响应中的结构化格式注入。

4、 使用自动化工具进行测试

Burp 包含可帮助您检测服务器端参数污染漏洞的自动化工具。

Burp Scanner 在执行审计时会自动检测可疑的输入转换。当应用程序接收用户输入,以某种方式转换它,然后对结果执行进一步处理时,就会发生这种情况。此行为不一定构成漏洞,因此需要使用上述手动技术进行进一步测试。有关详细信息,请参阅可疑 输入转换问题定义。

您还可以使用反斜杠支持的扫描程序 BApp 来识别服务器端注入漏洞。扫描程序将输入分类为无聊、有趣或易受攻击。您需要使用上述手动技术调查有趣的输入。有关详细信息,请参阅反斜杠 Powered Scanning: Hunting Unknown Vulnerability Classes 白皮书。

5、 防止服务器端参数污染

若要防止服务器端参数污染,请使用允许列表来定义不需要编码的字符,并确保在将所有其他用户输入包含在服务器端请求中之前对其进行编码。您还应该确保所有输入都符合预期的格式和结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/850650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone越狱版和免越狱版iMessages群发,苹果手机iMessages短信,iMessages推信群发实现原理

Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用。完美替代运营商的短信与电话。并且FaceTime与iMessage的帐号不仅仅与Apple ID 绑定,同时也与使用这Apple ID的手机号码绑定,这样的漏洞自然给无孔不入的群发垃圾信息商们提供了后门。这样iPhone的…

KMP-字符串

虽然我们可以根据板子题:兔子和兔子同样实现线性字符串匹配的速度。 但是也有更好的算法KMP,其更高效快捷。 先看看什么是KMP算法? 例如 S = ababccabab 与T = abacabab我们来看next数组 ,依次S[i]与T[i]进行比较,若S[i]!= T[i] 我们只需要读取next[i]数组下的内容;例如…

vxe-table 树表格拖拽排序,支持拖拽到空节点,直接拖拽成子级

vxe-table 树表格拖拽排序,支持拖拽到空节点,直接拖拽成子级;通过 row-drag-config.isToChildDrag 启用便捷拖拽成子节点,拖拽的同时按住 Ctrl 键可以自动拖放到该节点的子级 官网:https://vxetable.cn/通过 row-drag-config.isToChildDrag 启用便捷拖拽成子节点,拖拽的同…

敏捷开发:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍

ScrumBoard(Scrum板)介绍 ScrumBoard(Scrum板)是敏捷项目管理中使用的可视化工具,用于跟踪和监控冲刺阶段的任务进度。 主要通过可视化的看板来管理工作,它可视化了敏捷开发中的工作流程、任务状态、团队角色。 Scrum 团队在各种 Scrum 会议(Sprint计划会,每日站会,Spri…

autofac aop扩展 通过接口

class Program { static void Main(string[] args) { //创建一个容器 ContainerBuilder builder = new ContainerBuilder();//注册UserService builder.RegisterType<UserService>().As<IUserService>() .Enable…

autofac aop扩展

class Program { static void Main(string[] args) { //创建一个容器 ContainerBuilder builder = new ContainerBuilder();//注册UserService builder.RegisterType<UserService>().As<IUserService>() .Enable…

英语期末视听说大二

语雀链接:https://www.yuque.com/g/wushi-ls7km/mlng6f/hr8zqdt6rygushag/collaborator/join?token=fK0acakbepENTOZJ&source=doc_collaborator# 《英语期末视听说大二》

935. 骑士拨号器

象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个 L 的形状)。象棋骑士可能的移动方式如下图所示:我们有一个象棋骑士和一个电话垫,如下所示,骑士只能站在一个数字单元格上(即蓝色单元格)。…

ThreeJs-06详解灯光与阴影

一.gsap动画库 1.1 基本使用和原理 首先直接npm安装然后导入 比如让一个物体,x轴时间为5s旋转同理动画的速度曲线,可以在官网的文档找到1.2 控制动画属性与方法 当然这里面也有一些方法,动画完成,动画开始等一些属性也可实现停止动画随时,给到一个变量双击暂停以及恢复二.…

在Windows下为CodeBlocks20.3安装、配置wxWidget3.2.6

0.前言 CodeBlocks是使用C++编写程序的一个很好的开发环境,最大的好处是它是开源的、免费的,而不仅仅是因为它具有跨平台的能力。还有一个很重要的原因是在CodeBlocks中可以使用wxWidget,wxWidget也是开源的、免费的。 尽管Qt和MFC也很优秀,Qt Creator和Visual Studio都是很…