接口安全:威胁分类、常见漏洞与安全测试实战
接口安全:威胁分类、常见漏洞与安全测试实战
接口(API)是前后端、服务与服务之间交互的核心通道,也是系统对外暴露攻击面最大的一环。OWASP 反复强调:API 是最容易被攻击者利用的入口之一——一次未鉴权的越权调用、一段明文传输的用户信息、一个缺少限流的查询接口,都可能演变为严重的安全事故。
本文面向测试工程师与研发同学,从威胁全景、传输安全、常见漏洞攻击手法、安全测试实战到防护最佳实践,系统梳理接口安全知识体系。
一、接口安全概述
1.1 什么是接口安全
接口安全指围绕 API 的调用过程,保障其机密性(Confidentiality)、完整性(Integrity)、可用性(Availability) 不被破坏的一系列技术与措施,涉及认证、授权、传输加密、输入校验、限流防刷、审计日志等多个维度。
1.2 安全目标:CIA 三元组
| 目标 | 含义 | 接口层面的体现 |
|---|---|---|
| 机密性 | 数据不被未授权者获取 | HTTPS 加密传输、响应字段脱敏、权限隔离 |
| 完整性 | 数据在传输/存储中不被篡改 | 签名(JWT 签名、参数签名)、校验和 |
| 可用性 | 系统在受攻击时仍可正常服务 | 限流、熔断、防 DDoS、防刷 |
1.3 为什么接口更容易成为攻击目标
- 直接暴露业务逻辑:接口参数可被任意构造,攻击者通过修改参数即可探测系统边界;
- 绕过前端限制:所有前端校验(如输入框长度限制、按钮禁用)都可通过直接调用接口绕过;
- 攻击成本低:自动化工具(Burp Suite、Postman、sqlmap)可对接口批量扫描;
- 机器可读:接口返回结构化数据(JSON/XML),攻击者极易解析与利用;
- 无状态化带来的鉴权难题:微服务/前后端分离架构下,会话管理更复杂,越权、Token 泄露风险上升。
测试视角:一切安全测试都要落到接口层。前端做了再多限制,只要接口层校验缺失,漏洞就真实存在。
二、接口安全威胁全景(OWASP API Top 10)
OWASP 发布了专门针对 API 的 Top 10 列表,是接口安全测试的权威参考。2023 版摘要如下:
| 排名 | 风险 | 简要说明 | 对应章节 |
|---|---|---|---|
| 1 | 失效的对象级授权(BOLA/IDOR) | 只校验登录、不校验对象归属,可越权访问他人数据 | 5.1 |
| 2 | 失效的认证 | 认证机制可被绕过:弱口令、Token 泄露、会话固定 | 认证授权文档 |
| 3 | 失效的对象属性级授权 | 可通过修改字段值越权(如 role: admin) | 5.1 |
| 4 | 资源消耗不受限 | 无限流、无分页上限,可被批量刷接口造成 DoS | 5.4 |
| 5 | 失效的功能级授权 | 普通用户可调用管理员功能(垂直越权) | 5.1 |
| 6 | 服务端请求伪造(SSRF) | 接口可访问内网地址,被用作跳板 | 5.5 |
| 7 | 安全配置错误 | 错误信息泄露、CORS 配置不当、默认口令 | 5.6 |
| 8 | 注入(SQL/XSS/命令等) | 输入未校验直接拼接执行 | 注入攻击文档 |
| 9 | 资产管理不当 | 遗留/废弃/影子 API 未下线 | 6.2 |
| 10 | 日志与监控不足 | 攻击行为无法被发现与追溯 | 七 |
2023 版把「对象级授权」列为 No.1,可见越权是接口安全的最大顽疾,安全测试必须重点覆盖。
三、传输层安全:HTTPS 与 TLS
3.1 明文 HTTP 的风险
HTTP 明文传输时,数据包可被中间人设备完整读取与篡改:
客户端 ——HTTP 明文——> 路由器/代理(可窃听) ——> 服务端
用户密码、Token、业务数据一览无余- 窃听:账号密码、Token、身份证号等敏感信息被截获;
- 篡改:请求/响应内容被修改(如植入恶意链接、篡改金额);
- 劫持:被重定向到钓鱼站点。
3.2 HTTPS 与 TLS 握手
HTTPS = HTTP + TLS。TLS 握手核心步骤:
1. ClientHello:客户端发送支持的加密套件列表
2. ServerHello:服务端选定套件并下发证书(含公钥)
3. 证书校验:客户端验证证书是否由受信 CA 签发、域名是否匹配、是否过期
4. 密钥协商:客户端用公钥加密预主密钥(或 ECDHE 密钥交换),双方生成会话密钥
5. 加密通信:后续数据使用会话密钥对称加密3.3 证书与中间人攻击(MITM)
攻击者若能在客户端与服务端之间插入自己,并让客户端"信任"伪造证书,即可解密全部流量。常见手法:
- 伪造/自签名证书(客户端未做证书校验时成功);
- 劫持 DNS/ARP,把流量引向攻击机;
- 内网抓包工具(Fiddler、Charles)本质就是 MITM——只是它是"受信任的"中间人。
应用加固:Android 设置 networkSecurityConfig 禁止明文流量;iOS ATS 强制 HTTPS;服务端开启 HSTS,强制浏览器只走 HTTPS。
3.4 接口 HTTPS 测试要点
| 测试项 | 检查点 | 期望结果 |
|---|---|---|
| 全链路加密 | 抓包检查是否存在 HTTP 明文接口 | 所有接口均走 HTTPS |
| 证书有效性 | 浏览器/客户端检查证书 | 合法 CA 签发、未过期、域名匹配 |
| 证书校验 | 抓包工具代换证书后是否仍能通信 | 客户端拒绝不可信证书 |
| TLS 版本 | 检测是否支持 TLS 1.0/1.1 等弱版本 | 仅启用 TLS 1.2+ |
| HSTS | 响应头是否携带 Strict-Transport-Security | 生产环境应开启 |
四、接口身份认证与授权基础
接口安全的两大基石:
- 认证(Authentication):确认"你是谁"。常见方案:Session/Cookie、Token、JWT、OAuth2、OIDC;
- 授权(Authorization):确认"你能干什么"。常见模型:RBAC(基于角色)、ABAC(基于属性)、ACL(访问控制列表)。
认证 ≠ 授权。"登录成功"不等于"可以访问所有数据"。OWASP 接口漏洞 No.1 正是"只做了认证、没做对象级授权"。
完整方案(JWT 攻击、OAuth2 流程、越权测试方法)见《认证授权》文档,本节不再展开。
五、常见接口漏洞与攻击手法
5.1 越权访问(BOLA / IDOR / 水平与垂直越权)
原理:接口只校验"是否登录",未校验"对象是否属于当前用户",攻击者通过遍历/猜测 ID 访问他人资源。
# 正常请求:查询自己的订单
GET /api/order/10001 Authorization: Bearer <用户A的Token>
# 越权请求:把 ID 改为 10002,访问用户B的订单
GET /api/order/10002 Authorization: Bearer <用户A的Token>- 水平越权:同级别用户之间越权(A 访问 B 的数据);
- 垂直越权:低权限用户调用高权限功能(普通用户访问
/api/admin/users)。
检测思路:登录两个不同账号,互换资源 ID/角色,观察服务端是否校验归属。
5.2 参数篡改
原理:接口信任客户端提交的业务参数,攻击者修改价格、数量、状态、角色等字段。
# 篡改前
POST /api/cart/checkout {"goodsId": 1001, "price": 199, "quantity": 1}
# 篡改后
POST /api/cart/checkout {"goodsId": 1001, "price": 0.01, "quantity": 999}检测思路:对关键业务参数(金额、数量、优惠、用户 ID、角色)做篡改测试,服务端应以服务端数据为准(如价格以数据库/库存为准),而非信任前端传入值。
5.3 重放攻击(Replay Attack)
原理:攻击者截获合法请求后,在不修改内容的情况下重复发送。典型场景:重复下单、重复支付、重复领券。
# 用 curl 反复提交同一个抓包得到的请求
curl -X POST https://api.example.com/pay \
-H "Authorization: Bearer <截获的Token>" \
-d '{"orderId": "20260824001"}'检测思路:同一请求重复提交是否产生多笔订单/多次扣款;服务端是否做幂等校验(唯一请求号、时间戳窗口、随机数 nonce)。
5.4 资源消耗不受限与数据爬取
原理:接口无认证、无频控、分页无上限,可被脚本批量调用,造成数据泄露或拒绝服务。
# 遍历分页拉取全量数据
for i in $(seq 1 10000); do
curl "https://api.example.com/users?page=$i&size=1000"
done检测思路:
- 未登录状态下接口是否可访问、可批量拉数据;
- 是否有限流(IP/用户维度 QPS 限制、验证码);
- 分页是否有上限、查询参数是否可注入排序/过滤条件。
5.5 服务端请求伪造(SSRF)
原理:接口接收 URL 参数并让服务端去请求该地址,攻击者借此访问内网服务(如 http://169.254.169.254/ 云元数据、内网 Redis)。
POST /api/import {"url": "http://169.254.169.254/latest/meta-data/"}检测思路:找所有带 URL/跳转功能的接口(图片代理、网页快照、文件导入),替换为内网地址、云元数据地址,观察响应是否返回内网数据。
5.6 敏感信息泄露与安全配置错误
- 错误信息泄露堆栈/数据库结构(5xx 返回完整堆栈);
- 响应返回多余字段(如用户接口返回密码哈希、Token);
- CORS 配置为
Access-Control-Allow-Origin: *且无认证; - 调试接口、文档接口(swagger)未下线;
- 响应头缺少安全头(
X-Content-Type-Options、X-Frame-Options等)。
六、接口安全测试实战
6.1 接口安全测试流程
1. 资产梳理:收集所有接口(含测试/废弃/内部接口),整理接口清单
2. 接口分析:确认认证方式、参数含义、权限设计、返回数据结构
3. 威胁建模:按 OWASP API Top 10 逐项评估风险
4. 用例设计:为每个高风险点设计安全测试用例(越权/注入/篡改/重放…)
5. 手工测试:用 Burp Suite / Charles 抓包改包验证
6. 自动化扫描:结合扫描器批量发现漏洞
7. 回归验证:修复后复测,确保漏洞闭环6.2 手工测试工具
Burp Suite(接口安全测试首选):
Proxy 抓包/改包(Repeater 重放、Intruder 爆破/遍历)
Scanner 自动扫描 SQL 注入、XSS 等常见漏洞
Decoder 编解码(URL/Base64/Hex)
Comparer 请求响应对比Charles / Fiddler:抓包、断点修改请求、模拟弱网/断网场景。
curl:命令行快速验证接口安全属性。
# 检查响应头安全配置
curl -sI https://api.example.com/user/info
# 未带 Token 访问受保护接口,验证是否放行
curl -s https://api.example.com/user/info
# 期望返回 401/403
# 修改对象 ID 验证越权(IDOR)
curl -s https://api.example.com/user/10002 \
-H "Authorization: Bearer <自己的Token>"6.3 自动化安全扫描
- OWASP ZAP:开源免费,支持主动/被动扫描,适合 CI 集成;
- Burp Scanner:商业工具,扫描结果准确率高;
- sqlmap:SQL 注入自动化检测与利用;
- Nuclei:基于模板的快速漏洞扫描,可自定义接口安全模板。
6.4 接口安全测试用例清单(可直接复用)
| 编号 | 测试点 | 操作 | 期望 |
|---|---|---|---|
| AUTH-01 | 未认证访问 | 不携带 Token 访问受保护接口 | 401/403 |
| AUTH-02 | Token 篡改 | 修改/伪造 Token 访问 | 拒绝 |
| AUTH-03 | Token 过期 | 使用过期 Token 访问 | 拒绝并提示重新登录 |
| AUTH-04 | 水平越权 | 用户 A 访问用户 B 的资源 ID | 403 或返回 A 自己的数据 |
| AUTH-05 | 垂直越权 | 普通用户调用管理员接口 | 403 |
| AUTH-06 | 对象属性越权 | 修改请求体中的 role/userId/status 字段 | 服务端忽略或拒绝 |
| TRANS-01 | 明文传输 | 抓包检查敏感接口是否 HTTP | 全部 HTTPS |
| TRANS-02 | 弱 TLS 版本 | 使用 TLS 1.0 客户端握手 | 握手失败 |
| INJ-01 | SQL 注入 | 参数加 '、' or 1=1 -- | 不返回异常数据 |
| INJ-02 | XSS | 参数提交 <script>alert(1)</script> | 被转义/过滤 |
| RATE-01 | 限流 | 高频调用接口 | 触发限流/验证码 |
| RATE-02 | 分页上限 | 设置超大 size 参数 | 服务端限制返回条数 |
| REPL-01 | 重放 | 重复提交同一支付/下单请求 | 幂等处理,不重复扣款 |
| PARA-01 | 参数篡改 | 修改价格/数量/优惠字段 | 以服务端数据为准 |
| SSRF-01 | 服务端请求伪造 | URL 参数替换为内网地址 | 拒绝或隔离 |
| INFO-01 | 敏感信息泄露 | 检查响应体/错误信息 | 无堆栈、无多余字段 |
| HEAD-01 | 安全响应头 | 检查 CORS/Security Headers | 按规范配置 |
七、接口安全防护最佳实践
- 全链路 HTTPS:禁用明文 HTTP,开启 HSTS,TLS 1.2+;
- 认证授权双层校验:认证(你是谁)+ 授权(能否访问该对象),服务端对每个资源做归属校验;
- 输入校验不信任前端:所有参数在服务端做类型、长度、范围、格式校验,关键业务数据以服务端为准;
- 参数化查询与输出编码:从源头阻断 SQL 注入与 XSS;
- 限流防刷:按 IP/用户/设备维度做 QPS 限制,敏感接口加验证码/行为校验;
- 幂等设计:支付、下单等关键接口支持幂等(唯一请求号);
- 最小化数据暴露:响应只返回必要字段,错误信息不泄露内部细节;
- 安全响应头:
X-Frame-Options、X-Content-Type-Options、Content-Security-Policy、Referrer-Policy; - 接口资产管理:废弃接口及时下线,影子 API 定期排查;
- 审计与监控:记录关键操作日志(谁、何时、做了什么),异常行为可追溯、可告警。
八、总结
接口安全是安全测试的第一战场。记住几个关键结论:
- 接口是攻击面最大、最易被自动化的入口,所有前端校验都可被绕过,安全测试必须下沉到接口层;
- OWASP API Top 10 中,对象级授权(越权)位列第一,是测试投入的重点;
- HTTPS 只能防窃听防篡改,不能替代认证与授权,两者缺一不可;
- 一份可复用的安全测试用例清单(如 6.4)加上 Burp Suite 等工具,即可系统化覆盖常见接口漏洞;
- 安全是设计出来的:默认拒绝、最小权限、不信任客户端输入,比事后修补成本低得多。
延伸阅读:《认证授权》详解 Session/JWT/OAuth2 与越权;《注入攻击》详解 SQL 注入/XSS/越权;《数据泄露》详解敏感数据保护与合规。