API测试(一):PortSwigger靶场笔记
字数 2558 2025-08-19 12:41:30

API测试与漏洞利用:PortSwigger靶场实战指南

1. API基础概念

1.1 什么是API

API(Application Programming Interface)是应用程序对外提供功能的接口。现代Web开发中主要有三种API风格:

  1. JSON风格API

    • 使用JSON格式传输数据
    • 示例:
      POST /api/getUser HTTP/1.1
      Host: example.com
      Content-Type: application/json
      
      { "userId": 1 }
      
  2. RESTful风格API

    • 基于HTTP方法定义操作
    • 资源导向设计
    • 示例:
      GET /api/users/1 HTTP/1.1
      Host: example.com
      
  3. GraphQL风格API

    • 灵活的查询语言
    • 客户端定义所需数据
    • 示例:
      POST /graphql HTTP/1.1
      Host: example.com
      Content-Type: application/json
      
      { "query": "{ user(id: 1) { id, name, email } }" }
      

1.2 API测试概述

API测试主要关注:

  • 对开放API期望运行逻辑的破坏
  • 对未开放API的检测和调用

可能导致的风险:

  • 敏感信息泄露
  • 应用行为被改变
  • 未授权访问
  • 权限提升

2. API测试关键点

测试API时应关注以下方面:

  1. 数据处理

    • 必需参数和可选参数
    • 参数格式和类型
    • 边界条件
  2. 请求类型

    • 支持的HTTP方法
    • 接受的媒体格式(Content-Type)
  3. 安全机制

    • 速率限制
    • 认证机制
    • 授权控制
  4. 交互方式

    • 使用不同HTTP方法测试
    • 尝试不同Content-Type

3. HTTP方法详解

3.1 HTTP/1.0方法

  1. GET

    • 请求指定资源的表示形式
    • 只应用于获取数据
  2. HEAD

    • 与GET请求响应相同,但没有响应体
  3. POST

    • 将实体提交到指定资源
    • 通常导致服务器状态变化

3.2 HTTP/1.1新增方法

  1. OPTIONS

    • 描述目标资源的通信选项
  2. PUT

    • 用有效载荷替换目标资源的所有当前表示
  3. DELETE

    • 删除指定资源
  4. TRACE

    • 执行消息环回测试
  5. CONNECT

    • 建立到目标服务器的隧道
  6. PATCH

    • 对资源应用部分修改

4. 常用Content-Type

Content-Type 用途
application/json JSON格式数据传输,RESTful API常用
text/html HTML格式数据传输,Web页面响应
application/x-www-form-urlencoded HTML表单提交编码方式
multipart/form-data 文件上传表单编码方式
text/plain 纯文本数据传输
application/xml XML格式数据传输
application/javascript JavaScript代码传输
application/octet-stream 二进制数据传输,文件下载
image/jpeg JPEG图像传输
image/png PNG图像传输

5. 靶场实战案例

5.1 Lab1: 利用文档中的API端点

目标:删除用户carlos的账户

步骤

  1. 登录网站并尝试所有功能
  2. 观察Burp Suite的HTTP History
  3. 发现PATCH请求端点/api/user/wiener
  4. 修改HTTP方法为DELETE,针对用户carlos发送请求

关键点

  • HTTP方法转换测试
  • 端点路径推断

5.2 Lab2: 查询字符串中的服务器端参数污染

目标:登录administrator账户并删除carlos账户

步骤

  1. 执行所有操作并观察HTTP History
  2. /fogot-password的POST请求发送到Repeater
  3. 使用Intruder模块爆破field参数
  4. 发现GET /static/js/forgotPassword.js文件
  5. 分析JS代码发现reset_token参数
  6. 构造GET请求利用参数污染
  7. 重置密码并删除目标账户

关键点

  • 参数污染漏洞利用
  • 前端JS代码分析
  • 参数值爆破

5.3 Lab3: 发现和利用未使用的API端点

目标:购买一件商品(绕过支付)

步骤

  1. 尝试所有功能发现无法充值
  2. 观察HTTP History发现GET /api/products/1/price
  3. 发送OPTIONS请求发现允许GET和PATCH
  4. 构造PATCH请求修改价格
  5. 实现零元购

关键点

  • 未文档化端点发现
  • HTTP方法测试
  • 参数格式猜测

5.4 Lab4: 利用批量赋值漏洞

目标:购买一件商品(绕过支付)

步骤

  1. 尝试所有功能并观察HTTP History
  2. 发现POST /api/checkoutGET /api/checkout
  3. 分析交易信息结构
  4. 修改折扣相关字段
  5. 成功绕过支付

关键点

  • 批量赋值漏洞
  • 数据结构分析
  • 敏感字段识别

5.5 Lab5: REST URL中的服务器端参数污染

目标:登录administrator账户并删除carlos账户

步骤

  1. 使用Lab2技巧测试
  2. 推测服务端URL路径结构
  3. 构造特殊username参数administrator/field/x%23
  4. 分析forgotPassword.js文件
  5. 构造GET请求利用路径遍历
  6. 重置密码并删除目标账户

关键点

  • 路径遍历技巧
  • URL编码利用
  • 防御绕过

6. API安全防御措施

  1. 设计阶段考虑安全

    • 从系统设计初期纳入安全考量
    • 遵循最小权限原则
  2. 文档管理

    • 保护API文档不被公开访问
    • 确保文档全面性,便于合法测试
  3. 输入验证

    • 限制接受的HTTP方法
    • 验证请求/响应格式
    • 使用通用错误信息
  4. 版本管理

    • 对所有API版本实施安全措施
    • 不只是保护当前主要版本
  5. 属性控制

    • 用户可修改属性列入白名单
    • 敏感属性列入黑名单
  6. 持续监控

    • 记录和监控API访问
    • 及时检测异常行为

7. 总结

API测试是Web安全测试的重要组成部分,通过本指南中的方法和技巧,可以有效地发现和利用API中的安全漏洞。关键点包括:

  1. 全面理解API的工作原理和设计风格
  2. 系统性地测试各种HTTP方法和参数
  3. 善于分析前端代码和文档
  4. 掌握参数污染、批量赋值等常见漏洞利用技术
  5. 实施多层防御措施保护API安全

通过PortSwigger靶场的实战练习,可以逐步掌握API测试的核心技能,为实际工作中的API安全评估打下坚实基础。

API测试与漏洞利用:PortSwigger靶场实战指南 1. API基础概念 1.1 什么是API API(Application Programming Interface)是应用程序对外提供功能的接口。现代Web开发中主要有三种API风格: JSON风格API : 使用JSON格式传输数据 示例: RESTful风格API : 基于HTTP方法定义操作 资源导向设计 示例: GraphQL风格API : 灵活的查询语言 客户端定义所需数据 示例: 1.2 API测试概述 API测试主要关注: 对开放API期望运行逻辑的破坏 对未开放API的检测和调用 可能导致的风险: 敏感信息泄露 应用行为被改变 未授权访问 权限提升 2. API测试关键点 测试API时应关注以下方面: 数据处理 : 必需参数和可选参数 参数格式和类型 边界条件 请求类型 : 支持的HTTP方法 接受的媒体格式(Content-Type) 安全机制 : 速率限制 认证机制 授权控制 交互方式 : 使用不同HTTP方法测试 尝试不同Content-Type 3. HTTP方法详解 3.1 HTTP/1.0方法 GET : 请求指定资源的表示形式 只应用于获取数据 HEAD : 与GET请求响应相同,但没有响应体 POST : 将实体提交到指定资源 通常导致服务器状态变化 3.2 HTTP/1.1新增方法 OPTIONS : 描述目标资源的通信选项 PUT : 用有效载荷替换目标资源的所有当前表示 DELETE : 删除指定资源 TRACE : 执行消息环回测试 CONNECT : 建立到目标服务器的隧道 PATCH : 对资源应用部分修改 4. 常用Content-Type | Content-Type | 用途 | |--------------|------| | application/json | JSON格式数据传输,RESTful API常用 | | text/html | HTML格式数据传输,Web页面响应 | | application/x-www-form-urlencoded | HTML表单提交编码方式 | | multipart/form-data | 文件上传表单编码方式 | | text/plain | 纯文本数据传输 | | application/xml | XML格式数据传输 | | application/javascript | JavaScript代码传输 | | application/octet-stream | 二进制数据传输,文件下载 | | image/jpeg | JPEG图像传输 | | image/png | PNG图像传输 | 5. 靶场实战案例 5.1 Lab1: 利用文档中的API端点 目标 :删除用户carlos的账户 步骤 : 登录网站并尝试所有功能 观察Burp Suite的HTTP History 发现PATCH请求端点 /api/user/wiener 修改HTTP方法为DELETE,针对用户carlos发送请求 关键点 : HTTP方法转换测试 端点路径推断 5.2 Lab2: 查询字符串中的服务器端参数污染 目标 :登录administrator账户并删除carlos账户 步骤 : 执行所有操作并观察HTTP History 将 /fogot-password 的POST请求发送到Repeater 使用Intruder模块爆破field参数 发现GET /static/js/forgotPassword.js 文件 分析JS代码发现 reset_token 参数 构造GET请求利用参数污染 重置密码并删除目标账户 关键点 : 参数污染漏洞利用 前端JS代码分析 参数值爆破 5.3 Lab3: 发现和利用未使用的API端点 目标 :购买一件商品(绕过支付) 步骤 : 尝试所有功能发现无法充值 观察HTTP History发现 GET /api/products/1/price 发送OPTIONS请求发现允许GET和PATCH 构造PATCH请求修改价格 实现零元购 关键点 : 未文档化端点发现 HTTP方法测试 参数格式猜测 5.4 Lab4: 利用批量赋值漏洞 目标 :购买一件商品(绕过支付) 步骤 : 尝试所有功能并观察HTTP History 发现 POST /api/checkout 和 GET /api/checkout 分析交易信息结构 修改折扣相关字段 成功绕过支付 关键点 : 批量赋值漏洞 数据结构分析 敏感字段识别 5.5 Lab5: REST URL中的服务器端参数污染 目标 :登录administrator账户并删除carlos账户 步骤 : 使用Lab2技巧测试 推测服务端URL路径结构 构造特殊username参数 administrator/field/x%23 分析 forgotPassword.js 文件 构造GET请求利用路径遍历 重置密码并删除目标账户 关键点 : 路径遍历技巧 URL编码利用 防御绕过 6. API安全防御措施 设计阶段考虑安全 : 从系统设计初期纳入安全考量 遵循最小权限原则 文档管理 : 保护API文档不被公开访问 确保文档全面性,便于合法测试 输入验证 : 限制接受的HTTP方法 验证请求/响应格式 使用通用错误信息 版本管理 : 对所有API版本实施安全措施 不只是保护当前主要版本 属性控制 : 用户可修改属性列入白名单 敏感属性列入黑名单 持续监控 : 记录和监控API访问 及时检测异常行为 7. 总结 API测试是Web安全测试的重要组成部分,通过本指南中的方法和技巧,可以有效地发现和利用API中的安全漏洞。关键点包括: 全面理解API的工作原理和设计风格 系统性地测试各种HTTP方法和参数 善于分析前端代码和文档 掌握参数污染、批量赋值等常见漏洞利用技术 实施多层防御措施保护API安全 通过PortSwigger靶场的实战练习,可以逐步掌握API测试的核心技能,为实际工作中的API安全评估打下坚实基础。