PortSwigger API接口漏洞

一、什么是API接口

         API(Application Programming Interface,应用程序编程接口)是不同软件组件之间进行交互的接口,允许不同的系统、程序、应用之间进行通信。API接口通常定义了访问某个系统或服务的标准化方式,包括如何请求数据、如何获取数据,以及返回的数据格式。

二、API接口的组成

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

接口(Endpoint):

        URL路径,指明API资源的位置,例如:https://api.example.com/users

请求方法(HTTP Methods):

        GET:从服务器获取数据
        POST:向服务器
        PUT:更新服务器上的现有数据
        DELETE:删除服务器上的数据
        PATCH:对资源进行部分修改。与 PUT 类似,但 PATCH 只更改部分数据而不是替换整个资源

请求头(Headers):

        包含请求的附加信息,例如认证信息、数据格式、XML等)等。

请求体(Body):

        当请求方法是POST或PUT时,数据通常通过请求体传递。请求体中包含了需要发送到服务器的数据。

 响应体(Response):

        API的返回信息,通常包含一个状态码(如200表示成功,404表示未找到等)以及响应体(格式的数据)。

  状态码(Status Codes):
          200 OK:请求成功
          201 Created:资源创建成功
          400 Bad Request:请求错误
          404 Not Found:请求的资源不存在
          500 Internal Server Error:服务器发生错误

三、使用文档开发 API 端点

1、通过Burp 查找有关API接口请求

2、浏览器直接访问API接口,发现API接口

3、观察接口文档删除用户

四、 查找和利用未使用的 API 接口

1、通过测试在商品页面调取了商品价格和消息的API接口,如下:

2、尝试其他method方法处理数据,如通过PATCH:对资源进行部分修改。

3、根据报错修改请求方法,最终将商品改为0刀

4、加入购物车直接购买即可

五、 批量分配漏洞

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

1、在购物车页面,会通过POST API接口进行提交订单,金额不够返回报错页面。

2、进入购物车页面每次会调用GET API接口查询购物车商品信息,其中包含了折扣信息(percentage)

3、尝试直接访问API接口,查看接口信息 xxx/api

4、在进行提交订单的时候传入 隐藏的参数percentage(折扣),自己给自己打100折,成功购买

六、服务器端参数污染

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

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

七、 利用查询字符串中的服务器端参数污染

1、尝试通过忘记密码找回administrator的密码

2、尝试截断后面的参数,根据报错得知field为指定

3、将field设置为ra,来覆盖后面变量,根据报错得知我们传入的变量无效

4、使用burp 内置参数(Server-side variable names)进行暴力破解,发现传入 email 和 username时存在返回值,如下:

5、通过网站js文件得知,重置密码的时候会有一个reset_token 参数被传入,可以猜测到内部可能会存在reset_token变量

6、通过url参数控制,使服务器请求API时获取reset_token 变量,最终获取到了administrator重置密码的token

7、通过js提供的重置密码路径登录administrator重置密码,删除carlos用户

八、测试 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。

添加路径遍历序列以修改参数并观察应用程序的响应方式。例如:

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

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

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

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

例如:当您编辑姓名时,您的浏览器会发出以下请求:

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

这将产生以下服务器端请求:

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

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

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

如果用户输入被解码,然后添加到服务器端 JSON 数据中,而没有进行适当的编码,这将导致以下服务器端请求: 

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

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

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

十、如何防止 API 中的漏洞

  • 身份验证与授权:确保API接口严格执行身份验证和授权,使用强认证机制(如OAuth、JWT等),并且进行权限管理。
  • 输入验证与输出编码:对所有用户输入进行严格的验证与过滤,避免SQL注入、XSS等攻击。对所有输出进行适当的编码,防止脚本注入。
  • 加密通信:使用HTTPS确保数据在传输过程中加密,避免数据泄露。
  • 错误处理:避免将敏感信息暴露在错误响应中。确保错误消息对外部用户是模糊的,并且仅提供必要的错误信息。
  • API限流:实施请求频率限制和IP限制,防止滥用、暴力破解等攻击。
  • 使用API网关:通过API网关进行流量监控、身份验证、速率限制等安全措施。
  • 审计与监控:定期审计API接口的安全性,监控异常活动,快速响应潜在攻击
  • 为防止服务器端参数污染,确保所有用户输入在包含在服务器端请求之前都经过编码。您还应确保所有输入都符合预期的格式和结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值