API安全学习笔记
字数 1961 2025-08-24 16:48:07
API安全学习笔记
1. API技术概述
1.1 GraphQL
- 用于API的查询语言
- 特征:
- 数据包发送至
/graphql接口 - 包含大量换行符
\n
- 数据包发送至
1.2 SOAP-WSDL
- WSDL(Web服务描述语言)是一种XML应用
- 使用SOAP协议
- 数据格式为XML
- 常见
.asmx文件包含WSDL格式 - 测试工具:soapui
1.3 WADL
- 文件中有明显WADL标志
- 测试工具:soapui的REST功能
1.4 REST
- 架构规范而非协议或标准
- 资源状态表述传输格式:
- JSON(最常用)
- HTML
- XLT
- Python
- PHP
- 纯文本
- 重要元素:
- 请求头和响应头
- HTTP方法中的参数
- 状态码
2. 获取API端点的方法
2.1 Swagger API-docs泄露
- Swagger是RESTful Web服务的框架
- 常见路径:
- Swagger 2:
/swagger-ui.html/api-docs/v2/api-docs
- Swagger 3:
/swagger-ui/index.html/api-docs/v2/api-docs/v3/api-docs
- Swagger 2:
测试工具:
- swagger-editor
- 导入或远程加载URL
- 支持JSON和YAML格式
- APIKit(Burp插件)
2.2 GraphQL内省查询
- 获取所有端点信息
- 生成接口文档工具:
npm install -g @2fd/graphdoc graphdoc -s ./test.json -o ./doc/schema
2.3 其他方法
- Web静态资源(JS/HTML)中查找
- 工具:Burp插件JS LinkFinder
- App和其他客户端应用
- GitHub搜索
- 根据规律fuzz
3. API鉴权方式
3.1 Basic Auth
- 每次请求提供username和password
- HTTP头格式:
Authorization: Basic base64(username:password) - 安全性较低,现已较少使用
3.2 JWT(JSON Web Token)
-
基于Token的认证授权机制
-
三部分结构:
- Header:描述JWT元数据
- Payload:存放实际传递数据
- Signature:服务器生成的签名
-
签名计算方式:
加密算法(base64(header).base64(payload), secret) -
在线测试工具:https://jwt.io/
3.3 其他方式
- 自定义头
- Cookie
- API Key
- 随机生成的Token
4. API网关安全
4.1 Apache APISIX
-
云原生API网关
-
漏洞:CVE-2022-24112(命令执行)
- 影响版本:
- APISIX 1.3 ~ 2.12.1(不含2.12.1)
- APISIX 2.10.0 ~ 2.10.4 LTS(不含2.10.4)
利用条件:
- batch-requests插件默认开启
- 使用默认Admin Key且未分配管理端口
利用步骤:
- 绕过请求头检测
- 伪造请求头注册路由
- 通过filter_func传递Lua代码执行
- 影响版本:
4.2 Spring Cloud Gateway
-
高性能API网关组件
-
漏洞:代码注入(CVE-2022-22947)
- 影响版本:
- < 3.1.1
- < 3.0.7
攻击方法:
- 添加路由(包含SpEL表达式)
- 刷新配置
- 获取命令执行结果
- 清除痕迹
- 影响版本:
4.3 Traefik
- 常见问题:Dashboard未授权访问
- 可获取信息:
- 路由转发规则
- 内网IP等
5. Actuator未授权访问
5.1 配置问题
- 默认只开放health端点
- 危险配置:
或management.endpoints.web.exposure.include=*management: endpoints: web: exposure: include: "*"
5.2 利用方法
- heapdump获取shiro key
- 下载heapdump:
/actuator/heapdump - 使用jvisualvm.exe或JDumpSpider分析
- 搜索
org.apache.shiro.web.mgt.CookieRememberMeManager - 提取并转换key
- 下载heapdump:
6. 后端代码安全问题
6.1 越权漏洞
-
参数污染
- 为单个参数提供多个值
GET /api/user?id={userid1}&id={userid2} -
附加特殊字符
GET /api/user/1%20 -
添加查询参数
GET /api/user?id=1 -
修改动作
PUT /api/user 改为 DELETE /api/user/1
6.2 XXE漏洞
- 当API支持多种数据格式时可能存在问题
- 测试方法:
- 将JSON格式改为XML格式
- 尝试XML外部实体注入
7. 鉴权绕过思路
7.1 JWT Token伪造
- 修改签名算法为none
- 爆破签名密钥
- 伪造密钥
- 工具:jwt_tool
7.2 Spring-security认证绕过
- CVE-2022-22978
- 影响版本:
- 5.5.x < 5.5.7
- 5.6.x < 5.6.4
- 利用方法:使用换行符(
%0d%0a)
- 影响版本:
7.3 Shiro权限绕过
-
CVE-2020-1957
- 影响版本:< 1.5.2
- 利用URI中
;处理差异
/;/admin -
CVE-2020-13933
- 影响版本:< 1.6.0
- 利用URL编码
/admin/%3bindex
8. 其他经验
- GitHub、JS和App中可能包含测试token
- 测试站点凭据可能在正式站点有效
- toC端凭据可能用于toB端接口认证