@blueking/bkui-knowledge 0.0.1-beta.1 → 0.0.1-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -58
- package/bin/bkui-knowledge.js +147 -82
- package/knowledge/manifest.json +38 -1
- package/knowledge/skills/.template/README.md +1 -1
- package/knowledge/skills/bk-security-redlines/SKILL.md +47 -0
- package/knowledge/skills/bk-security-redlines/references/auth-check.md +73 -0
- package/knowledge/skills/bk-security-redlines/references/data-encryption.md +78 -0
- package/knowledge/skills/bk-security-redlines/references/input-validation.md +96 -0
- package/knowledge/skills/bk-skill-creator/SKILL.md +37 -0
- package/knowledge/skills/bk-skill-creator/references/common-mistakes.md +43 -0
- package/knowledge/skills/bk-skill-creator/references/quick-start.md +42 -0
- package/knowledge/skills/bk-skill-creator/references/skill-checklist.md +93 -0
- package/knowledge/skills/bk-skill-creator/references/structure-guide.md +88 -0
- package/knowledge/skills/bk-skill-creator/references/writing-tips.md +153 -0
- package/knowledge/skills/bkui-quick-start/SKILL.md +52 -0
- package/knowledge/skills/bkui-quick-start/references/components-list.md +17 -0
- package/knowledge/skills/bkui-quick-start/references/skills-index.md +26 -0
- package/knowledge/skills/external/vue-skills/LICENSE +21 -0
- package/knowledge/skills/external/vue-skills/README.md +69 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/SKILL.md +42 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/codeactions-save-performance.md +79 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/data-attributes-config.md +74 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/deep-watch-numeric.md +102 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/define-model-update-event.md +79 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/duplicate-plugin-detection.md +102 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/fallthrough-attributes.md +63 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/hmr-vue-ssr.md +124 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/module-resolution-bundler.md +81 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/pinia-store-mocking.md +159 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/script-setup-jsdoc.md +85 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/strict-css-modules.md +68 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/unplugin-auto-import-conflicts.md +97 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/volar-3-breaking-changes.md +66 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-directive-comments.md +73 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-router-typed-params.md +81 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-tsc-strict-templates.md +69 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/with-defaults-union-types.md +102 -0
- package/knowledge/skills/web-security-guide/SKILL.md +48 -0
- package/knowledge/skills/web-security-guide/references/access-control.md +123 -0
- package/knowledge/skills/web-security-guide/references/auth-session.md +99 -0
- package/knowledge/skills/web-security-guide/references/csrf.md +59 -0
- package/knowledge/skills/web-security-guide/references/data-exposure.md +108 -0
- package/knowledge/skills/web-security-guide/references/deserialization.md +59 -0
- package/knowledge/skills/web-security-guide/references/injection.md +357 -0
- package/knowledge/skills/web-security-guide/references/logging-monitoring.md +47 -0
- package/knowledge/skills/web-security-guide/references/security-config.md +73 -0
- package/knowledge/skills/web-security-guide/references/ssrf.md +55 -0
- package/knowledge/skills/web-security-guide/references/xss.md +134 -0
- package/package.json +3 -3
- package/server/mcp-core.js +48 -33
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# 访问控制缺失
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 访问控制缺失(Broken Access Control)是指应用未对用户访问的功能或资源进行严格的 身份认证与权限校验,导致攻击者可以越权访问、操作他人数据或调用敏感功能。
|
|
6
|
+
|
|
7
|
+
- 常见问题:
|
|
8
|
+
- 鉴权仅在前端或网关,后端未做校验。
|
|
9
|
+
- ID 可控(IDOR,Insecure Direct Object Reference)。
|
|
10
|
+
- 垂直越权(普通用户可调用管理员接口)。
|
|
11
|
+
- 鉴权逻辑存在绕过漏洞(路径编码、大小写、截断)。
|
|
12
|
+
|
|
13
|
+
## 2. 漏洞影响
|
|
14
|
+
|
|
15
|
+
- 水平越权:攻击者可读取/修改其他用户的数据(如查看他人订单、转账记录)。
|
|
16
|
+
- 垂直越权:普通用户可调用管理员功能(如创建用户、删除数据)。
|
|
17
|
+
- 内部绕过:通过内网直连后端,绕过网关鉴权。
|
|
18
|
+
- 逻辑绕过:利用路径大小写、编码差异,绕过黑名单/路径匹配规则。
|
|
19
|
+
|
|
20
|
+
## 3. 典型业务场景
|
|
21
|
+
|
|
22
|
+
### 3.1 功能隐藏在前端 UI,但后端未鉴权
|
|
23
|
+
|
|
24
|
+
- 前端页面隐藏"导出数据"按钮,但后端接口 /admin/export 无鉴权。
|
|
25
|
+
- 攻击者直接访问接口即可导出敏感数据。
|
|
26
|
+
|
|
27
|
+
### 3.2 API 可越权访问其他用户数据(IDOR)
|
|
28
|
+
|
|
29
|
+
- URL 参数可控:/api/user/profile?id=1002。
|
|
30
|
+
- 用户 A 修改参数即可获取用户 B 的信息。
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
GET /api/user/profile?id=1001 # 合法
|
|
34
|
+
GET /api/user/profile?id=1002 # 越权读取
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 3.3 水平越权:用户可修改 URL 参数访问他人资源
|
|
38
|
+
|
|
39
|
+
- 类似 IDOR,但更广:订单、合同、文件下载接口。
|
|
40
|
+
- 攻击者通过修改 URL order_id=xxx,获取他人订单详情。
|
|
41
|
+
|
|
42
|
+
### 3.4 垂直越权:普通用户调用管理员接口
|
|
43
|
+
|
|
44
|
+
- 普通用户调用 /admin/deleteUser。
|
|
45
|
+
- 若仅靠前端按钮控制权限,后端无校验,则直接越权成功。
|
|
46
|
+
|
|
47
|
+
### 3.5 鉴权逻辑仅在网关,后端未鉴权
|
|
48
|
+
|
|
49
|
+
- API Gateway / Nginx 配置了鉴权规则,但后端服务自身无鉴权。
|
|
50
|
+
- 攻击者通过 SSRF / 内网跳板 直连后端,绕过网关调用接口。
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
# 外网访问被网关阻挡
|
|
54
|
+
GET https://api.example.com/admin/deleteUser?id=123 -> 403 Forbidden
|
|
55
|
+
|
|
56
|
+
# 内网直连绕过网关
|
|
57
|
+
GET http://10.0.0.5:8080/admin/deleteUser?id=123 -> 200 OK
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3.6 鉴权逻辑被编码/截断/大小写绕过
|
|
61
|
+
|
|
62
|
+
- 仅拦截 /admin/,但攻击者用 /admin%2F、/Admin、/admin;.jsp 绕过。
|
|
63
|
+
|
|
64
|
+
```java
|
|
65
|
+
// Bad:基于 startsWith() 的字符串判断
|
|
66
|
+
if (uri.startsWith("/admin")) {
|
|
67
|
+
checkAdmin();
|
|
68
|
+
}
|
|
69
|
+
// 绕过:双编码
|
|
70
|
+
GET /admin%2fdeleteUser?id=1 -> 绕过鉴权
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 4. 漏洞修复方案
|
|
74
|
+
|
|
75
|
+
### 4.1 【必须】所有权限校验在后端完成
|
|
76
|
+
|
|
77
|
+
- 不依赖前端按钮或网关规则,后端每个接口都必须有鉴权逻辑。
|
|
78
|
+
|
|
79
|
+
### 4.2 【必须】资源级/行级权限控制(user_id/tenant_id)
|
|
80
|
+
|
|
81
|
+
- 在数据查询层面增加 user_id/tenant_id 条件,保证只能访问自己的数据。
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
# Bad Code: 根据传入 ID 查询
|
|
85
|
+
User findUser(Long id);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
# Good Code: 限制为当前登录用户
|
|
90
|
+
User findUserByIdAndTenant(Long id, Long tenantId);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 4.3 【必须】敏感接口必须加角色/权限控制注解
|
|
94
|
+
|
|
95
|
+
- Spring Security: @PreAuthorize("hasRole('ADMIN')")
|
|
96
|
+
- Django: @permission_required("app.delete_user")
|
|
97
|
+
|
|
98
|
+
### 4.4 【建议】使用统一的 RBAC/ABAC 框架
|
|
99
|
+
|
|
100
|
+
- 统一鉴权框架,避免业务线各自实现,减少漏鉴权。
|
|
101
|
+
|
|
102
|
+
### 4.5 【必须】后端服务自身必须做鉴权,不能仅依赖网关
|
|
103
|
+
|
|
104
|
+
- 网关鉴权是 第一道防线,后端鉴权是 最后一道防线。
|
|
105
|
+
|
|
106
|
+
### 4.6 【建议】服务间调用采用 mTLS / JWT / API Key
|
|
107
|
+
|
|
108
|
+
- 即使是内网调用,也要有身份凭证,避免伪造请求。
|
|
109
|
+
|
|
110
|
+
### 4.7 【必须】统一路径规范化再鉴权
|
|
111
|
+
|
|
112
|
+
- URL 统一大小写、解码、normalize 后再匹配。
|
|
113
|
+
|
|
114
|
+
```java
|
|
115
|
+
// Good Code: Spring Security 推荐方式
|
|
116
|
+
http.authorizeHttpRequests()
|
|
117
|
+
.requestMatchers("/admin/**").hasRole("ADMIN")
|
|
118
|
+
.anyRequest().authenticated();
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 4.8 【建议】敏感操作二次确认
|
|
122
|
+
|
|
123
|
+
- 如转账、删号、权限变更,需要二次验证码/密码确认。
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# 认证和会话管理不当
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 认证和会话管理不当指应用程序在登录验证、身份令牌(如JWT、SessionID)、Cookie配置等关键身份凭据的生成、传输、验证过程中存在设计或实现缺陷,导致攻击者可以冒充合法用户或维持非法会话。
|
|
6
|
+
|
|
7
|
+
## 2. 漏洞影响
|
|
8
|
+
|
|
9
|
+
- 账户暴力破解:登录接口无限制尝试密码
|
|
10
|
+
- Token猜解/重放:弱Token或无过期机制导致账号被劫持
|
|
11
|
+
- 会话劫持:Cookie 被JS或中间人窃取
|
|
12
|
+
- 权限穿越:身份伪造后访问其他用户数据或管理接口
|
|
13
|
+
- 长时间控制:Token 永不过期、用户退出无效化
|
|
14
|
+
|
|
15
|
+
## 3. 典型业务场景
|
|
16
|
+
|
|
17
|
+
### 3.1 登录未限速或缺验证码(暴力破解)
|
|
18
|
+
|
|
19
|
+
- 漏洞示例代码如下:
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# Flask 示例:无限尝试登录
|
|
23
|
+
@app.route('/login', methods=['POST'])
|
|
24
|
+
def login():
|
|
25
|
+
username = request.form['user']
|
|
26
|
+
password = request.form['pass']
|
|
27
|
+
if check_user(username, password):
|
|
28
|
+
return 'login ok'
|
|
29
|
+
else:
|
|
30
|
+
return 'fail'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 3.2 Token 可预测或未过期(重放攻击)
|
|
34
|
+
|
|
35
|
+
- 漏洞示例代码如下:
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
# 使用时间戳或用户名作为token
|
|
39
|
+
token = hashlib.md5(username.encode() + str(time.time()).encode()).hexdigest()
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3.3 Cookie 未设置 HttpOnly / Secure / SameSite(被盗用)
|
|
43
|
+
|
|
44
|
+
- 漏洞示例代码如下:
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
# Flask 设置 cookie 时未加 HttpOnly / Secure
|
|
48
|
+
resp.set_cookie('session_id', session_id)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- 修复建议:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
resp.set_cookie('session_id', session_id,
|
|
55
|
+
httponly=True, # 防止JS读取
|
|
56
|
+
secure=True, # 仅HTTPS传输
|
|
57
|
+
samesite='Strict') # 防止跨站携带
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3.4 JWT 签名绕过或私钥泄露
|
|
61
|
+
|
|
62
|
+
- 使用不安全的算法,如 alg: none
|
|
63
|
+
- JWT 密钥泄露、使用弱秘钥(如 test、123456)
|
|
64
|
+
|
|
65
|
+
### 3.5 用户登出无效,旧会话仍可用
|
|
66
|
+
|
|
67
|
+
- JWT/Session未绑定设备信息,登出后未销毁旧 token,攻击者可长期使用
|
|
68
|
+
|
|
69
|
+
## 4. 漏洞修复方案
|
|
70
|
+
|
|
71
|
+
### 4.1 【必须】使用强随机 Token + 签名验证机制
|
|
72
|
+
|
|
73
|
+
- 使用 secrets、uuid4、os.urandom 生成随机Token
|
|
74
|
+
- JWT等结构化Token需添加签名 + 加密 + 时效控制
|
|
75
|
+
- 明确算法算法配置(HS256、RS256),禁用"none"
|
|
76
|
+
|
|
77
|
+
### 4.2 【必须】Token 设置过期时间并支持吊销
|
|
78
|
+
|
|
79
|
+
- Access Token 推荐有效期 ≤ 15分钟
|
|
80
|
+
- Refresh Token 设置较长时间,并限制单设备有效
|
|
81
|
+
- 可在 Redis 维护 blacklist、revoked 状态表
|
|
82
|
+
|
|
83
|
+
### 4.3 【必须】配置 Cookie 安全属性
|
|
84
|
+
|
|
85
|
+
- 开启HttpOnly:禁止 JS 读取 cookie
|
|
86
|
+
- Secure:仅在 HTTPS 下传输
|
|
87
|
+
- SameSite=Strict 阻止第三方携带 Cookie 发起请求
|
|
88
|
+
|
|
89
|
+
### 4.4 【必须】登录限速 + 验证码策略
|
|
90
|
+
|
|
91
|
+
- IP维度/账号维度做登录次数限制
|
|
92
|
+
- 多次失败需冷却或触发验证码
|
|
93
|
+
- 应记录登录日志并告警异常登录行为
|
|
94
|
+
|
|
95
|
+
### 4.5 【建议】用户绑定多端设备与会话管理
|
|
96
|
+
|
|
97
|
+
- 多终端登录记录中应显示设备、IP、登录时间
|
|
98
|
+
- 后台可选择"踢出其他设备"、"只允许单端登录"
|
|
99
|
+
- 所有 token 使用者身份变化时强制刷新
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 跨站请求伪造(CSRF)
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 跨站请求伪造(Cross-Site Request Forgery, CSRF),是指攻击者诱导已登录的用户,在不知情的情况下向受信任站点发起恶意请求,从而执行敏感操作。
|
|
6
|
+
- 本质:应用只依赖 Cookie/Session 等隐式凭证鉴权,而未绑定用户意图(缺乏额外验证),导致用户在第三方页面访问时也能"自动带上凭证"。
|
|
7
|
+
|
|
8
|
+
## 2. 漏洞影响
|
|
9
|
+
|
|
10
|
+
- 用户账户被盗用:攻击者可伪造请求修改用户信息、邮箱、密码。
|
|
11
|
+
- 金融类业务损失:伪造转账、支付、购买请求。
|
|
12
|
+
- 权限维持与系统破坏:攻击者可在后台添加管理员、开启恶意配置。
|
|
13
|
+
- 长期隐患:攻击可通过钓鱼站点、广告投放、论坛嵌入图片等途径批量触发。
|
|
14
|
+
|
|
15
|
+
## 3. 典型业务场景
|
|
16
|
+
|
|
17
|
+
### 3.1 用户已登录,访问恶意站点触发转账/改密
|
|
18
|
+
|
|
19
|
+
- 攻击者在钓鱼网站放置隐藏表单或图片:
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<img src="https://bank.com/transfer?to=attacker&amount=1000">
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- 如果银行网站仅依赖 Cookie 鉴权,用户已登录时就会直接完成转账。
|
|
26
|
+
|
|
27
|
+
### 3.2 使用 GET 请求执行敏感操作
|
|
28
|
+
|
|
29
|
+
- 系统用 GET 请求处理改密:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
https://example.com/resetpwd?new=123456
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- 攻击者只需诱导点击链接即可完成修改。
|
|
36
|
+
|
|
37
|
+
### 3.3 未校验 Origin/Referer
|
|
38
|
+
|
|
39
|
+
- 后端只依赖 Cookie 验证,未检查请求来源,导致任意第三方页面可发起敏感请求。
|
|
40
|
+
|
|
41
|
+
## 4. 漏洞修复方案
|
|
42
|
+
|
|
43
|
+
### 4.1 【必须】启用 CSRF Token / 双提交 Cookie
|
|
44
|
+
|
|
45
|
+
- 后端生成随机 Token,绑定到用户会话,在表单或请求头中附带,后端验证一致性。
|
|
46
|
+
- 双提交 Cookie 模式:前端 JS 写入 Cookie 和请求参数,后端校验两者一致。
|
|
47
|
+
|
|
48
|
+
### 4.2 【必须】敏感操作使用 POST/PUT/DELETE
|
|
49
|
+
|
|
50
|
+
- 禁止使用 GET 请求执行转账、改密、删除等操作。
|
|
51
|
+
|
|
52
|
+
### 4.3 【必须】校验 Origin/Referer 请求头
|
|
53
|
+
|
|
54
|
+
- 服务端必须验证请求来源域名与白名单匹配。
|
|
55
|
+
- 对跨域请求强制使用 CORS 配置。
|
|
56
|
+
|
|
57
|
+
### 4.4 【建议】关键操作需二次确认(验证码/密码输入)
|
|
58
|
+
|
|
59
|
+
- 转账、改密等高风险操作要求再次输入验证码或密码,增加攻击难度。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# 敏感数据泄漏
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 敏感数据泄漏(Sensitive Data Exposure) 是指应用在传输、存储或处理过程中未正确保护敏感信息,导致攻击者能够直接获取或间接推测出这些数据。
|
|
6
|
+
- 常见敏感信息包括:
|
|
7
|
+
- 用户身份凭据(用户名、密码、Token、Session ID、JWT)
|
|
8
|
+
- 个人身份信息(身份证号、手机号、邮箱、银行卡号)
|
|
9
|
+
- 系统敏感配置(数据库密码、API Key、私钥、证书)
|
|
10
|
+
- 漏洞的本质是 缺乏加密、脱敏、访问控制或最小化原则。
|
|
11
|
+
|
|
12
|
+
## 2. 漏洞影响
|
|
13
|
+
|
|
14
|
+
- 账号接管:用户凭证或 Token 泄露 → 伪造请求控制账号。
|
|
15
|
+
- 身份冒充:Session ID、JWT 泄露 → 跳过认证,直接操作业务。
|
|
16
|
+
- 数据泄露:手机号、身份证号、银行卡号泄露 → 触发合规风险(GDPR/等保)。
|
|
17
|
+
- 横向攻击:Redis/MySQL/消息队列口令泄露 → 攻击者可扩展为 RCE、数据篡改。
|
|
18
|
+
|
|
19
|
+
## 3. 典型业务场景
|
|
20
|
+
|
|
21
|
+
### 3.1 接口返回中包含敏感字段
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
# Bad Code:
|
|
25
|
+
return {
|
|
26
|
+
"username": user.username,
|
|
27
|
+
"email": user.email,
|
|
28
|
+
"password": user.password,
|
|
29
|
+
"id_card": user.id_card
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
# Good Code:
|
|
35
|
+
# 仅返回必要字段,并对敏感信息做脱敏处理
|
|
36
|
+
return {
|
|
37
|
+
"username": user.username,
|
|
38
|
+
"email": user.email,
|
|
39
|
+
"id_card": mask_id_card(user.id_card) # 仅显示部分
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 3.2 配置文件中硬编码密钥 / Token
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
# Bad Code:
|
|
47
|
+
# 配置中硬编码敏感密钥
|
|
48
|
+
DB_PASSWORD = "123456"
|
|
49
|
+
SECRET_KEY = "myjwt-secret"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
# Good Code:
|
|
54
|
+
# 使用环境变量或安全配置中心(KMS、Vault)
|
|
55
|
+
import os
|
|
56
|
+
|
|
57
|
+
DB_PASSWORD = os.getenv("DB_PASSWORD")
|
|
58
|
+
SECRET_KEY = os.getenv("JWT_SECRET")
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 3.3 未使用 HTTPS 或 TLS 加密
|
|
62
|
+
|
|
63
|
+
- 请求用户登录或注册接口走 http,传输过程被中间人拦截。
|
|
64
|
+
- 与 Redis、MySQL 交互不启用 SSL。
|
|
65
|
+
|
|
66
|
+
```nginx
|
|
67
|
+
# Bad Code:
|
|
68
|
+
# Nginx 配置,未启用 HTTPS
|
|
69
|
+
server {
|
|
70
|
+
listen 80;
|
|
71
|
+
server_name example.com;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```nginx
|
|
76
|
+
# Good Code:
|
|
77
|
+
# 强制 HTTPS,启用 TLS1.2+
|
|
78
|
+
server {
|
|
79
|
+
listen 443 ssl;
|
|
80
|
+
server_name example.com;
|
|
81
|
+
|
|
82
|
+
ssl_certificate /etc/ssl/cert.pem;
|
|
83
|
+
ssl_certificate_key /etc/ssl/key.pem;
|
|
84
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 4. 漏洞修复方案
|
|
89
|
+
|
|
90
|
+
### 4.1 【必须】接入自动化检测工具(如 CodeCC)
|
|
91
|
+
|
|
92
|
+
- 对代码、配置文件、日志进行扫描,发现硬编码的密码、Token、私钥等敏感信息。
|
|
93
|
+
|
|
94
|
+
### 4.2 【必须】禁止 DEBUG 模式上线
|
|
95
|
+
|
|
96
|
+
- 生产环境关闭调试模式,避免异常栈和环境变量暴露。
|
|
97
|
+
|
|
98
|
+
### 4.3 【必须】禁止明文 Cookie、未加密连接
|
|
99
|
+
|
|
100
|
+
- Session Cookie 设置 Secure + HttpOnly,禁止 HTTP 明文传输。
|
|
101
|
+
|
|
102
|
+
### 4.4 【必须】使用字段白名单,仅返回必要业务字段
|
|
103
|
+
|
|
104
|
+
- 响应接口仅返回必要数据,避免冗余敏感字段泄露。
|
|
105
|
+
|
|
106
|
+
### 4.5 【建议】所有用户相关请求强制 HTTPS
|
|
107
|
+
|
|
108
|
+
- 对 Web/APP/小程序接口启用 TLS,全站 HTTPS。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 反序列化漏洞
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 反序列化漏洞是指应用程序在反序列化不可信数据时,攻击者通过构造恶意序列化对象,触发类的特殊方法(如构造器、readObject()、`__wakeup()` 等),最终执行任意代码或逻辑。
|
|
6
|
+
- 本质:反序列化时,程序会自动实例化对象并调用其中的方法,攻击者利用可控输入触发危险 Gadget 链。
|
|
7
|
+
|
|
8
|
+
## 2. 漏洞影响
|
|
9
|
+
|
|
10
|
+
- 远程代码执行(RCE):攻击者可执行系统命令,直接控制服务器。
|
|
11
|
+
- 越权与逻辑绕过:绕过认证、加载恶意配置或篡改缓存。
|
|
12
|
+
- 拒绝服务(DoS):构造超大对象、循环引用导致内存耗尽。
|
|
13
|
+
- 供应链攻击:利用第三方库(如 Commons-Collections)中的 Gadget 链触发漏洞。
|
|
14
|
+
|
|
15
|
+
## 3. 典型业务场景
|
|
16
|
+
|
|
17
|
+
### 3.1 Java 反序列化(Commons-Collections 链)
|
|
18
|
+
|
|
19
|
+
- Java 原生 ObjectInputStream.readObject() 在加载 Commons-Collections、Spring 等常见库时,可能被攻击者构造链条利用,最终执行 Runtime.exec()。
|
|
20
|
+
|
|
21
|
+
### 3.2 Python pickle.loads() 处理用户输入
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
import pickle
|
|
25
|
+
data = request.GET.get("data")
|
|
26
|
+
obj = pickle.loads(data) # 漏洞点:可控输入
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- 攻击者可通过恶意 pickle 数据包执行任意代码。
|
|
30
|
+
|
|
31
|
+
### 3.3 PHP unserialize() 外部数据可控
|
|
32
|
+
|
|
33
|
+
```php
|
|
34
|
+
$data = $_POST["data"];
|
|
35
|
+
$obj = unserialize($data); // 漏洞点:可控输入
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- 如果项目中存在魔术方法 `__wakeup()` / `__destruct()`,攻击者可利用反序列化链实现命令执行或文件删除。
|
|
39
|
+
|
|
40
|
+
## 4. 漏洞修复方案
|
|
41
|
+
|
|
42
|
+
### 4.1 【必须】禁用不安全反序列化接口(pickle/unserialize)
|
|
43
|
+
|
|
44
|
+
- 严禁对用户可控数据直接调用 pickle.loads()、unserialize()、ObjectInputStream.readObject()。
|
|
45
|
+
|
|
46
|
+
### 4.2 【必须】使用 JSON/Protobuf 等安全格式
|
|
47
|
+
|
|
48
|
+
- 替代不安全的二进制序列化方式,使用 JSON、Protobuf、MessagePack 等明确定义字段的安全数据交换格式。
|
|
49
|
+
|
|
50
|
+
### 4.3 【必须】引入白名单类/安全库(Kryo、Jackson)
|
|
51
|
+
|
|
52
|
+
- 仅允许反序列化可信类型(白名单);使用支持安全模式的库,例如:
|
|
53
|
+
- Jackson 启用 enableDefaultTyping(false),避免自动反序列化任意类。
|
|
54
|
+
- Kryo 提供类注册机制,限制可反序列化对象。
|
|
55
|
+
|
|
56
|
+
### 4.4 【建议】反序列化数据前签名校验
|
|
57
|
+
|
|
58
|
+
- 对序列化数据增加 HMAC/数字签名 校验,确保数据未被篡改。
|
|
59
|
+
- 仅反序列化可信来源的数据,避免跨域或外部传输的直接反序列化。
|