一、什么是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接口的安全性,监控异常活动,快速响应潜在攻击
- 为防止服务器端参数污染,确保所有用户输入在包含在服务器端请求之前都经过编码。您还应确保所有输入都符合预期的格式和结构。