ccgx-workflow 1.0.0 → 1.0.1
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 +37 -5
- package/README.zh-CN.md +35 -5
- package/dist/cli.mjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.SJPbUy5_.mjs} +17 -110
- package/package.json +2 -1
- package/templates/commands/agents/phase-runner.md +321 -321
- package/templates/commands/autonomous.md +792 -792
- package/templates/commands/cancel.md +132 -132
- package/templates/commands/debug.md +226 -226
- package/templates/commands/status.md +206 -206
- package/templates/commands/team.md +484 -0
- package/templates/hooks/ccg-session-state.cjs +510 -510
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
- package/templates/scripts/invoke-model.mjs +64 -0
- package/templates/skills/domains/ai/SKILL.md +35 -35
- package/templates/skills/domains/ai/agent-dev.md +242 -242
- package/templates/skills/domains/ai/llm-security.md +288 -288
- package/templates/skills/domains/ai/rag-system.md +542 -542
- package/templates/skills/domains/architecture/SKILL.md +43 -43
- package/templates/skills/domains/architecture/api-design.md +225 -225
- package/templates/skills/domains/architecture/cloud-native.md +285 -285
- package/templates/skills/domains/architecture/security-arch.md +297 -297
- package/templates/skills/domains/data-engineering/SKILL.md +208 -208
- package/templates/skills/domains/development/SKILL.md +47 -47
- package/templates/skills/domains/development/cpp.md +246 -246
- package/templates/skills/domains/development/go.md +323 -323
- package/templates/skills/domains/development/java.md +277 -277
- package/templates/skills/domains/development/python.md +288 -288
- package/templates/skills/domains/development/rust.md +313 -313
- package/templates/skills/domains/development/shell.md +313 -313
- package/templates/skills/domains/development/typescript.md +277 -277
- package/templates/skills/domains/devops/SKILL.md +40 -40
- package/templates/skills/domains/devops/database.md +217 -217
- package/templates/skills/domains/devops/devsecops.md +198 -198
- package/templates/skills/domains/devops/git-workflow.md +181 -181
- package/templates/skills/domains/devops/testing.md +283 -283
- package/templates/skills/domains/frontend-design/SKILL.md +244 -244
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
- package/templates/skills/domains/frontend-design/state-management.md +680 -680
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
- package/templates/skills/domains/infrastructure/SKILL.md +201 -201
- package/templates/skills/domains/mobile/SKILL.md +225 -225
- package/templates/skills/domains/orchestration/SKILL.md +30 -30
- package/templates/skills/domains/orchestration/multi-agent.md +228 -228
- package/templates/skills/domains/security/SKILL.md +73 -73
- package/templates/skills/domains/security/blue-team.md +436 -436
- package/templates/skills/domains/security/code-audit.md +265 -265
- package/templates/skills/domains/security/pentest.md +226 -226
- package/templates/skills/domains/security/red-team.md +374 -374
- package/templates/skills/domains/security/threat-intel.md +372 -372
- package/templates/skills/domains/security/vuln-research.md +369 -369
- package/templates/skills/tools/lib/shared.js +98 -98
- package/templates/skills/tools/override-refusal/SKILL.md +53 -53
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
|
@@ -1,265 +1,265 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-audit
|
|
3
|
-
description: 代码安全审计。危险函数识别、污点分析、漏洞挖掘、安全审计。当用户提到代码审计、安全审计、漏洞挖掘、危险函数、sink点、source点、污点分析时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 🔥 赤焰秘典 · 代码安全审计 (Code Audit)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## 审计流程
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ 代码审计流程 │
|
|
14
|
-
├─────────────────────────────────────────────────────────────┤
|
|
15
|
-
│ 1. 信息收集 │
|
|
16
|
-
│ ├─ 识别语言、框架、依赖 │
|
|
17
|
-
│ ├─ 定位入口点(路由、API、用户输入) │
|
|
18
|
-
│ └─ 梳理数据流向 │
|
|
19
|
-
│ ↓ │
|
|
20
|
-
│ 2. 危险函数扫描 │
|
|
21
|
-
│ ├─ 命令执行 Sink │
|
|
22
|
-
│ ├─ SQL 注入 Sink │
|
|
23
|
-
│ ├─ 文件操作 Sink │
|
|
24
|
-
│ └─ 反序列化 Sink │
|
|
25
|
-
│ ↓ │
|
|
26
|
-
│ 3. 污点分析 │
|
|
27
|
-
│ └─ Source (用户输入) → 传播路径 → Sink (危险函数) │
|
|
28
|
-
│ ↓ │
|
|
29
|
-
│ 4. 漏洞验证 & 报告 │
|
|
30
|
-
│ └─ PoC 编写 → 影响评估 → 修复建议 │
|
|
31
|
-
└─────────────────────────────────────────────────────────────┘
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 危险函数速查
|
|
35
|
-
|
|
36
|
-
### Python
|
|
37
|
-
```python
|
|
38
|
-
# 🔴 命令执行
|
|
39
|
-
os.system(cmd)
|
|
40
|
-
os.popen(cmd)
|
|
41
|
-
subprocess.call(cmd, shell=True)
|
|
42
|
-
subprocess.Popen(cmd, shell=True)
|
|
43
|
-
eval(user_input)
|
|
44
|
-
exec(user_input)
|
|
45
|
-
|
|
46
|
-
# 🔴 SQL 注入
|
|
47
|
-
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
48
|
-
cursor.execute("SELECT * FROM users WHERE id = " + user_id)
|
|
49
|
-
|
|
50
|
-
# 🔴 反序列化
|
|
51
|
-
pickle.loads(user_data)
|
|
52
|
-
yaml.load(user_data) # 不安全
|
|
53
|
-
marshal.loads(user_data)
|
|
54
|
-
|
|
55
|
-
# 🔴 文件操作
|
|
56
|
-
open(user_path, 'r') # 路径穿越
|
|
57
|
-
shutil.copy(user_src, user_dst)
|
|
58
|
-
|
|
59
|
-
# 🔴 SSRF
|
|
60
|
-
requests.get(user_url)
|
|
61
|
-
urllib.request.urlopen(user_url)
|
|
62
|
-
|
|
63
|
-
# ✅ 安全替代
|
|
64
|
-
subprocess.run([cmd, arg1, arg2], shell=False)
|
|
65
|
-
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
|
|
66
|
-
yaml.safe_load(user_data)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Java
|
|
70
|
-
```java
|
|
71
|
-
// 🔴 命令执行
|
|
72
|
-
Runtime.getRuntime().exec(userInput);
|
|
73
|
-
new ProcessBuilder(userInput).start();
|
|
74
|
-
|
|
75
|
-
// 🔴 SQL 注入
|
|
76
|
-
Statement stmt = conn.createStatement();
|
|
77
|
-
stmt.execute("SELECT * FROM users WHERE id = " + userId);
|
|
78
|
-
|
|
79
|
-
// 🔴 反序列化
|
|
80
|
-
ObjectInputStream ois = new ObjectInputStream(userInputStream);
|
|
81
|
-
ois.readObject();
|
|
82
|
-
|
|
83
|
-
// 🔴 SSRF
|
|
84
|
-
new URL(userUrl).openConnection();
|
|
85
|
-
HttpClient.newHttpClient().send(request);
|
|
86
|
-
|
|
87
|
-
// 🔴 XXE
|
|
88
|
-
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(userXml);
|
|
89
|
-
|
|
90
|
-
// ✅ 安全替代
|
|
91
|
-
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
|
|
92
|
-
pstmt.setInt(1, userId);
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### JavaScript/Node.js
|
|
96
|
-
```javascript
|
|
97
|
-
// 🔴 命令执行
|
|
98
|
-
child_process.exec(userInput);
|
|
99
|
-
eval(userInput);
|
|
100
|
-
new Function(userInput)();
|
|
101
|
-
|
|
102
|
-
// 🔴 原型污染
|
|
103
|
-
Object.assign(target, userInput);
|
|
104
|
-
_.merge(target, userInput);
|
|
105
|
-
JSON.parse(userInput); // 配合 __proto__
|
|
106
|
-
|
|
107
|
-
// 🔴 SQL 注入
|
|
108
|
-
db.query(`SELECT * FROM users WHERE id = ${userId}`);
|
|
109
|
-
|
|
110
|
-
// 🔴 XSS
|
|
111
|
-
element.innerHTML = userInput;
|
|
112
|
-
document.write(userInput);
|
|
113
|
-
|
|
114
|
-
// ✅ 安全替代
|
|
115
|
-
child_process.execFile(cmd, [arg1, arg2]);
|
|
116
|
-
db.query("SELECT * FROM users WHERE id = ?", [userId]);
|
|
117
|
-
element.textContent = userInput;
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Go
|
|
121
|
-
```go
|
|
122
|
-
// 🔴 命令执行
|
|
123
|
-
exec.Command("sh", "-c", userInput).Run()
|
|
124
|
-
|
|
125
|
-
// 🔴 SQL 注入
|
|
126
|
-
db.Query("SELECT * FROM users WHERE id = " + userId)
|
|
127
|
-
|
|
128
|
-
// 🔴 路径穿越
|
|
129
|
-
filepath.Join(baseDir, userPath) // 未校验 ..
|
|
130
|
-
|
|
131
|
-
// 🔴 SSTI
|
|
132
|
-
template.HTML(userInput)
|
|
133
|
-
|
|
134
|
-
// ✅ 安全替代
|
|
135
|
-
exec.Command(cmd, arg1, arg2).Run()
|
|
136
|
-
db.Query("SELECT * FROM users WHERE id = ?", userId)
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## 污点分析
|
|
140
|
-
|
|
141
|
-
### 概念
|
|
142
|
-
```
|
|
143
|
-
Source (污点源) → 传播路径 → Sink (汇聚点)
|
|
144
|
-
用户可控输入 数据流转 危险函数调用
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### Source 识别
|
|
148
|
-
```python
|
|
149
|
-
# HTTP 请求参数
|
|
150
|
-
request.args.get('param')
|
|
151
|
-
request.form.get('param')
|
|
152
|
-
request.json.get('param')
|
|
153
|
-
request.headers.get('header')
|
|
154
|
-
request.cookies.get('cookie')
|
|
155
|
-
|
|
156
|
-
# 文件输入
|
|
157
|
-
open(file).read()
|
|
158
|
-
sys.stdin.read()
|
|
159
|
-
|
|
160
|
-
# 环境变量
|
|
161
|
-
os.environ.get('VAR')
|
|
162
|
-
|
|
163
|
-
# 数据库查询结果(二次注入)
|
|
164
|
-
cursor.fetchone()
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### 传播追踪
|
|
168
|
-
```python
|
|
169
|
-
# 示例:追踪污点传播
|
|
170
|
-
user_input = request.args.get('id') # Source
|
|
171
|
-
processed = user_input.strip() # 传播
|
|
172
|
-
query = f"SELECT * FROM users WHERE id = {processed}" # 传播
|
|
173
|
-
cursor.execute(query) # Sink!
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## 快速扫描命令
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
# Python 危险函数
|
|
180
|
-
grep -rn "eval\|exec\|os.system\|subprocess\|pickle.loads" --include="*.py" .
|
|
181
|
-
|
|
182
|
-
# Java 危险函数
|
|
183
|
-
grep -rn "Runtime.exec\|ProcessBuilder\|ObjectInputStream\|Statement.execute" --include="*.java" .
|
|
184
|
-
|
|
185
|
-
# JavaScript 危险函数
|
|
186
|
-
grep -rn "eval\|child_process\|innerHTML\|document.write" --include="*.js" .
|
|
187
|
-
|
|
188
|
-
# Go 危险函数
|
|
189
|
-
grep -rn "exec.Command\|template.HTML" --include="*.go" .
|
|
190
|
-
|
|
191
|
-
# SQL 注入模式
|
|
192
|
-
grep -rn "execute.*+\|execute.*f\"\|Query.*+" --include="*.py" --include="*.java" .
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## 漏洞报告格式
|
|
196
|
-
|
|
197
|
-
```markdown
|
|
198
|
-
## [漏洞类型] - [严重程度: Critical/High/Medium/Low]
|
|
199
|
-
|
|
200
|
-
**文件:** `path/to/file.py:行号`
|
|
201
|
-
|
|
202
|
-
**漏洞代码:**
|
|
203
|
-
```python
|
|
204
|
-
# 有问题的代码片段
|
|
205
|
-
user_id = request.args.get('id')
|
|
206
|
-
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**漏洞原理:**
|
|
210
|
-
用户输入直接拼接到 SQL 语句中,未经过滤或参数化,导致 SQL 注入。
|
|
211
|
-
|
|
212
|
-
**污点追踪:**
|
|
213
|
-
```
|
|
214
|
-
request.args.get('id') [Source]
|
|
215
|
-
↓
|
|
216
|
-
f"SELECT ... {user_id}" [传播]
|
|
217
|
-
↓
|
|
218
|
-
cursor.execute(query) [Sink]
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
**PoC:**
|
|
222
|
-
```
|
|
223
|
-
GET /api/users?id=1' OR '1'='1
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
**修复建议:**
|
|
227
|
-
```python
|
|
228
|
-
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
|
|
229
|
-
```
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
## 审计检查清单
|
|
233
|
-
|
|
234
|
-
### 输入验证
|
|
235
|
-
- [ ] 所有用户输入是否经过验证
|
|
236
|
-
- [ ] 是否使用白名单验证
|
|
237
|
-
- [ ] 是否有长度限制
|
|
238
|
-
|
|
239
|
-
### SQL 注入
|
|
240
|
-
- [ ] 是否使用参数化查询
|
|
241
|
-
- [ ] 是否有 ORM 保护
|
|
242
|
-
- [ ] 动态表名/列名是否白名单
|
|
243
|
-
|
|
244
|
-
### 命令注入
|
|
245
|
-
- [ ] 是否避免 shell=True
|
|
246
|
-
- [ ] 参数是否正确转义
|
|
247
|
-
- [ ] 是否使用白名单命令
|
|
248
|
-
|
|
249
|
-
### 文件操作
|
|
250
|
-
- [ ] 路径是否规范化
|
|
251
|
-
- [ ] 是否检查路径穿越
|
|
252
|
-
- [ ] 文件类型是否验证
|
|
253
|
-
|
|
254
|
-
### 认证授权
|
|
255
|
-
- [ ] 敏感操作是否验证身份
|
|
256
|
-
- [ ] 是否有越权检查
|
|
257
|
-
- [ ] 会话管理是否安全
|
|
258
|
-
|
|
259
|
-
### 加密
|
|
260
|
-
- [ ] 是否使用安全算法
|
|
261
|
-
- [ ] 密钥管理是否安全
|
|
262
|
-
- [ ] 是否有硬编码密钥
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
1
|
+
---
|
|
2
|
+
name: code-audit
|
|
3
|
+
description: 代码安全审计。危险函数识别、污点分析、漏洞挖掘、安全审计。当用户提到代码审计、安全审计、漏洞挖掘、危险函数、sink点、source点、污点分析时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🔥 赤焰秘典 · 代码安全审计 (Code Audit)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 审计流程
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ 代码审计流程 │
|
|
14
|
+
├─────────────────────────────────────────────────────────────┤
|
|
15
|
+
│ 1. 信息收集 │
|
|
16
|
+
│ ├─ 识别语言、框架、依赖 │
|
|
17
|
+
│ ├─ 定位入口点(路由、API、用户输入) │
|
|
18
|
+
│ └─ 梳理数据流向 │
|
|
19
|
+
│ ↓ │
|
|
20
|
+
│ 2. 危险函数扫描 │
|
|
21
|
+
│ ├─ 命令执行 Sink │
|
|
22
|
+
│ ├─ SQL 注入 Sink │
|
|
23
|
+
│ ├─ 文件操作 Sink │
|
|
24
|
+
│ └─ 反序列化 Sink │
|
|
25
|
+
│ ↓ │
|
|
26
|
+
│ 3. 污点分析 │
|
|
27
|
+
│ └─ Source (用户输入) → 传播路径 → Sink (危险函数) │
|
|
28
|
+
│ ↓ │
|
|
29
|
+
│ 4. 漏洞验证 & 报告 │
|
|
30
|
+
│ └─ PoC 编写 → 影响评估 → 修复建议 │
|
|
31
|
+
└─────────────────────────────────────────────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 危险函数速查
|
|
35
|
+
|
|
36
|
+
### Python
|
|
37
|
+
```python
|
|
38
|
+
# 🔴 命令执行
|
|
39
|
+
os.system(cmd)
|
|
40
|
+
os.popen(cmd)
|
|
41
|
+
subprocess.call(cmd, shell=True)
|
|
42
|
+
subprocess.Popen(cmd, shell=True)
|
|
43
|
+
eval(user_input)
|
|
44
|
+
exec(user_input)
|
|
45
|
+
|
|
46
|
+
# 🔴 SQL 注入
|
|
47
|
+
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
48
|
+
cursor.execute("SELECT * FROM users WHERE id = " + user_id)
|
|
49
|
+
|
|
50
|
+
# 🔴 反序列化
|
|
51
|
+
pickle.loads(user_data)
|
|
52
|
+
yaml.load(user_data) # 不安全
|
|
53
|
+
marshal.loads(user_data)
|
|
54
|
+
|
|
55
|
+
# 🔴 文件操作
|
|
56
|
+
open(user_path, 'r') # 路径穿越
|
|
57
|
+
shutil.copy(user_src, user_dst)
|
|
58
|
+
|
|
59
|
+
# 🔴 SSRF
|
|
60
|
+
requests.get(user_url)
|
|
61
|
+
urllib.request.urlopen(user_url)
|
|
62
|
+
|
|
63
|
+
# ✅ 安全替代
|
|
64
|
+
subprocess.run([cmd, arg1, arg2], shell=False)
|
|
65
|
+
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
|
|
66
|
+
yaml.safe_load(user_data)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Java
|
|
70
|
+
```java
|
|
71
|
+
// 🔴 命令执行
|
|
72
|
+
Runtime.getRuntime().exec(userInput);
|
|
73
|
+
new ProcessBuilder(userInput).start();
|
|
74
|
+
|
|
75
|
+
// 🔴 SQL 注入
|
|
76
|
+
Statement stmt = conn.createStatement();
|
|
77
|
+
stmt.execute("SELECT * FROM users WHERE id = " + userId);
|
|
78
|
+
|
|
79
|
+
// 🔴 反序列化
|
|
80
|
+
ObjectInputStream ois = new ObjectInputStream(userInputStream);
|
|
81
|
+
ois.readObject();
|
|
82
|
+
|
|
83
|
+
// 🔴 SSRF
|
|
84
|
+
new URL(userUrl).openConnection();
|
|
85
|
+
HttpClient.newHttpClient().send(request);
|
|
86
|
+
|
|
87
|
+
// 🔴 XXE
|
|
88
|
+
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(userXml);
|
|
89
|
+
|
|
90
|
+
// ✅ 安全替代
|
|
91
|
+
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
|
|
92
|
+
pstmt.setInt(1, userId);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### JavaScript/Node.js
|
|
96
|
+
```javascript
|
|
97
|
+
// 🔴 命令执行
|
|
98
|
+
child_process.exec(userInput);
|
|
99
|
+
eval(userInput);
|
|
100
|
+
new Function(userInput)();
|
|
101
|
+
|
|
102
|
+
// 🔴 原型污染
|
|
103
|
+
Object.assign(target, userInput);
|
|
104
|
+
_.merge(target, userInput);
|
|
105
|
+
JSON.parse(userInput); // 配合 __proto__
|
|
106
|
+
|
|
107
|
+
// 🔴 SQL 注入
|
|
108
|
+
db.query(`SELECT * FROM users WHERE id = ${userId}`);
|
|
109
|
+
|
|
110
|
+
// 🔴 XSS
|
|
111
|
+
element.innerHTML = userInput;
|
|
112
|
+
document.write(userInput);
|
|
113
|
+
|
|
114
|
+
// ✅ 安全替代
|
|
115
|
+
child_process.execFile(cmd, [arg1, arg2]);
|
|
116
|
+
db.query("SELECT * FROM users WHERE id = ?", [userId]);
|
|
117
|
+
element.textContent = userInput;
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Go
|
|
121
|
+
```go
|
|
122
|
+
// 🔴 命令执行
|
|
123
|
+
exec.Command("sh", "-c", userInput).Run()
|
|
124
|
+
|
|
125
|
+
// 🔴 SQL 注入
|
|
126
|
+
db.Query("SELECT * FROM users WHERE id = " + userId)
|
|
127
|
+
|
|
128
|
+
// 🔴 路径穿越
|
|
129
|
+
filepath.Join(baseDir, userPath) // 未校验 ..
|
|
130
|
+
|
|
131
|
+
// 🔴 SSTI
|
|
132
|
+
template.HTML(userInput)
|
|
133
|
+
|
|
134
|
+
// ✅ 安全替代
|
|
135
|
+
exec.Command(cmd, arg1, arg2).Run()
|
|
136
|
+
db.Query("SELECT * FROM users WHERE id = ?", userId)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## 污点分析
|
|
140
|
+
|
|
141
|
+
### 概念
|
|
142
|
+
```
|
|
143
|
+
Source (污点源) → 传播路径 → Sink (汇聚点)
|
|
144
|
+
用户可控输入 数据流转 危险函数调用
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Source 识别
|
|
148
|
+
```python
|
|
149
|
+
# HTTP 请求参数
|
|
150
|
+
request.args.get('param')
|
|
151
|
+
request.form.get('param')
|
|
152
|
+
request.json.get('param')
|
|
153
|
+
request.headers.get('header')
|
|
154
|
+
request.cookies.get('cookie')
|
|
155
|
+
|
|
156
|
+
# 文件输入
|
|
157
|
+
open(file).read()
|
|
158
|
+
sys.stdin.read()
|
|
159
|
+
|
|
160
|
+
# 环境变量
|
|
161
|
+
os.environ.get('VAR')
|
|
162
|
+
|
|
163
|
+
# 数据库查询结果(二次注入)
|
|
164
|
+
cursor.fetchone()
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 传播追踪
|
|
168
|
+
```python
|
|
169
|
+
# 示例:追踪污点传播
|
|
170
|
+
user_input = request.args.get('id') # Source
|
|
171
|
+
processed = user_input.strip() # 传播
|
|
172
|
+
query = f"SELECT * FROM users WHERE id = {processed}" # 传播
|
|
173
|
+
cursor.execute(query) # Sink!
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 快速扫描命令
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Python 危险函数
|
|
180
|
+
grep -rn "eval\|exec\|os.system\|subprocess\|pickle.loads" --include="*.py" .
|
|
181
|
+
|
|
182
|
+
# Java 危险函数
|
|
183
|
+
grep -rn "Runtime.exec\|ProcessBuilder\|ObjectInputStream\|Statement.execute" --include="*.java" .
|
|
184
|
+
|
|
185
|
+
# JavaScript 危险函数
|
|
186
|
+
grep -rn "eval\|child_process\|innerHTML\|document.write" --include="*.js" .
|
|
187
|
+
|
|
188
|
+
# Go 危险函数
|
|
189
|
+
grep -rn "exec.Command\|template.HTML" --include="*.go" .
|
|
190
|
+
|
|
191
|
+
# SQL 注入模式
|
|
192
|
+
grep -rn "execute.*+\|execute.*f\"\|Query.*+" --include="*.py" --include="*.java" .
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## 漏洞报告格式
|
|
196
|
+
|
|
197
|
+
```markdown
|
|
198
|
+
## [漏洞类型] - [严重程度: Critical/High/Medium/Low]
|
|
199
|
+
|
|
200
|
+
**文件:** `path/to/file.py:行号`
|
|
201
|
+
|
|
202
|
+
**漏洞代码:**
|
|
203
|
+
```python
|
|
204
|
+
# 有问题的代码片段
|
|
205
|
+
user_id = request.args.get('id')
|
|
206
|
+
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**漏洞原理:**
|
|
210
|
+
用户输入直接拼接到 SQL 语句中,未经过滤或参数化,导致 SQL 注入。
|
|
211
|
+
|
|
212
|
+
**污点追踪:**
|
|
213
|
+
```
|
|
214
|
+
request.args.get('id') [Source]
|
|
215
|
+
↓
|
|
216
|
+
f"SELECT ... {user_id}" [传播]
|
|
217
|
+
↓
|
|
218
|
+
cursor.execute(query) [Sink]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**PoC:**
|
|
222
|
+
```
|
|
223
|
+
GET /api/users?id=1' OR '1'='1
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**修复建议:**
|
|
227
|
+
```python
|
|
228
|
+
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
|
|
229
|
+
```
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 审计检查清单
|
|
233
|
+
|
|
234
|
+
### 输入验证
|
|
235
|
+
- [ ] 所有用户输入是否经过验证
|
|
236
|
+
- [ ] 是否使用白名单验证
|
|
237
|
+
- [ ] 是否有长度限制
|
|
238
|
+
|
|
239
|
+
### SQL 注入
|
|
240
|
+
- [ ] 是否使用参数化查询
|
|
241
|
+
- [ ] 是否有 ORM 保护
|
|
242
|
+
- [ ] 动态表名/列名是否白名单
|
|
243
|
+
|
|
244
|
+
### 命令注入
|
|
245
|
+
- [ ] 是否避免 shell=True
|
|
246
|
+
- [ ] 参数是否正确转义
|
|
247
|
+
- [ ] 是否使用白名单命令
|
|
248
|
+
|
|
249
|
+
### 文件操作
|
|
250
|
+
- [ ] 路径是否规范化
|
|
251
|
+
- [ ] 是否检查路径穿越
|
|
252
|
+
- [ ] 文件类型是否验证
|
|
253
|
+
|
|
254
|
+
### 认证授权
|
|
255
|
+
- [ ] 敏感操作是否验证身份
|
|
256
|
+
- [ ] 是否有越权检查
|
|
257
|
+
- [ ] 会话管理是否安全
|
|
258
|
+
|
|
259
|
+
### 加密
|
|
260
|
+
- [ ] 是否使用安全算法
|
|
261
|
+
- [ ] 密钥管理是否安全
|
|
262
|
+
- [ ] 是否有硬编码密钥
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|