API测试(一):PortSwigger靶场笔记
字数 2558 2025-08-19 12:41:30
API测试与漏洞利用:PortSwigger靶场实战指南
1. API基础概念
1.1 什么是API
API(Application Programming Interface)是应用程序对外提供功能的接口。现代Web开发中主要有三种API风格:
-
JSON风格API:
- 使用JSON格式传输数据
- 示例:
POST /api/getUser HTTP/1.1 Host: example.com Content-Type: application/json { "userId": 1 }
-
RESTful风格API:
- 基于HTTP方法定义操作
- 资源导向设计
- 示例:
GET /api/users/1 HTTP/1.1 Host: example.com
-
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时应关注以下方面:
-
数据处理:
- 必需参数和可选参数
- 参数格式和类型
- 边界条件
-
请求类型:
- 支持的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安全评估打下坚实基础。