@hoanghainh/komagu 2.5.0 → 2.6.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.
- package/CHANGELOG.md +17 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
- package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
- package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
- package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
- package/assess/lsa/scripts/laravel_routes.py +102 -0
- package/assess/lsa/scripts/map_routes.py +4 -1
- package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
- package/assess/lsa/tests/test_eval_run_6.py +104 -0
- package/assess/lsa/tests/test_laravel_routes.py +95 -0
- package/operate/ai/client.py +22 -9
- package/operate/ai/runner.py +4 -2
- package/operate/cli/__init__.py +1 -1
- package/operate/cli/commands/scan.py +8 -1
- package/operate/tests/test_ai_reasoning_effort.py +65 -0
- package/operate/tests/test_ai_route_inventory.py +53 -0
- package/package.json +1 -1
|
@@ -0,0 +1,2112 @@
|
|
|
1
|
+
# Security Audit Report — repo
|
|
2
|
+
|
|
3
|
+
> **Classification: CONFIDENTIAL.** AI-assisted static review. All findings require human review (record decisions in `review-log.md`, created from `templates/review-log.md`) before they are shared outside the team.
|
|
4
|
+
|
|
5
|
+
| Item | Value |
|
|
6
|
+
|---|---|
|
|
7
|
+
| Date | 2026-11-11 |
|
|
8
|
+
| Kit version | 0.3.1 |
|
|
9
|
+
| Scope | BOLA/IDOR; SQL/HQL/NoSQL queries built from input; BFLA (missing role checks); mass assignment |
|
|
10
|
+
| Stacks | php, php-codeigniter, php-laravel, java-servlet, java-jsp, java-struts1, java-spring-mvc, java-mybatis, java-hibernate, dotnet-webforms, dotnet-handlers, dotnet-mvc, classic-asp, perl-cgi, coldfusion, node-express, python-flask, sql-procedures |
|
|
11
|
+
| Endpoints inventoried | 74 (candidates: 74) |
|
|
12
|
+
| Endpoints audited for BOLA | 74 |
|
|
13
|
+
| Injection candidates reviewed | 38 |
|
|
14
|
+
| Privileged routes audited for BFLA | 0 |
|
|
15
|
+
| Mass assignment candidates reviewed | 15 |
|
|
16
|
+
|
|
17
|
+
## 1. Executive summary
|
|
18
|
+
|
|
19
|
+
<!-- LLM: reporter agent writes max 8 bullets here -->
|
|
20
|
+
|
|
21
|
+
## 2. Findings overview
|
|
22
|
+
|
|
23
|
+
| Severity | critical | high | medium | low | info |
|
|
24
|
+
|---|---|---|---|---|---|
|
|
25
|
+
| Count | 51 | 41 | 15 | 0 | 0 |
|
|
26
|
+
|
|
27
|
+
| Category | Count |
|
|
28
|
+
|---|---|
|
|
29
|
+
| bola | 45 |
|
|
30
|
+
| sql_injection | 32 |
|
|
31
|
+
| nosql_injection | 4 |
|
|
32
|
+
| bfla | 12 |
|
|
33
|
+
| mass_assignment | 14 |
|
|
34
|
+
|
|
35
|
+
Status: unverified=0, confirmed=41, likely=66, rejected=2, needs_review=0
|
|
36
|
+
|
|
37
|
+
## Trend and time to fix
|
|
38
|
+
|
|
39
|
+
| Date | Open | New | Regressed | Fixed | Suppressed |
|
|
40
|
+
|---|---|---|---|---|---|
|
|
41
|
+
| 2026-11-11 | 107 | 107 | 0 | 0 | 0 |
|
|
42
|
+
|
|
43
|
+
No findings fixed yet.
|
|
44
|
+
|
|
45
|
+
## Outlook & Debt Forecast
|
|
46
|
+
|
|
47
|
+
> **Note:** Reliable forecasting requires at least 6 scans spanning at least 28 days. Requires at least 6 snapshots over at least 28 days (current: 1 snapshots over 0 days).
|
|
48
|
+
|
|
49
|
+
## 3. Findings
|
|
50
|
+
|
|
51
|
+
| ID | Sev | Conf | Status | Category | Endpoint | Location | Title |
|
|
52
|
+
|---|---|---|---|---|---|---|---|
|
|
53
|
+
| BFLA-R-0003-1 | critical | high | confirmed | bfla | | `classic-asp/shop/member.asp:10` | Unrestricted member deletion in classic‑asp shop |
|
|
54
|
+
| BFLA-R-0007-1 | critical | high | confirmed | bfla | | `dotnet-legacy/Web/Controllers/AdminController.cs:12` | Unrestricted user deletion in ASP.NET MVC Admin controller |
|
|
55
|
+
| BFLA-R-0009-1 | critical | high | confirmed | bfla | | `dotnet-legacy/Web/Controllers/AdminController.cs:30` | Export endpoint controlled by request parameter in ASP.NET MVC |
|
|
56
|
+
| BFLA-R-0023-1 | critical | medium | likely | bfla | | `java-legacy/src/com/acme/web/AdminUserController.java:13` | Unrestricted user deletion in Spring MVC Admin controller |
|
|
57
|
+
| BFLA-R-0030-1 | critical | medium | likely | bfla | | `node-express/routes/admin.js:8` | Unrestricted user deletion in Express route |
|
|
58
|
+
| BFLA-R-0032-1 | critical | medium | likely | bfla | | `node-express/routes/admin.js:16` | Export endpoint controlled by query param in Express |
|
|
59
|
+
| BFLA-R-0057-1 | critical | medium | likely | bfla | | `php-plain/admin.php:6` | Unrestricted user view in php‑plain admin.php |
|
|
60
|
+
| BFLA-R-0058-1 | critical | medium | likely | bfla | | `php-plain/admin.php:10` | Unrestricted user deletion in php‑plain admin.php |
|
|
61
|
+
| BFLA-R-0059-1 | critical | high | confirmed | bfla | | `php-plain/manage_users.php:6` | Unrestricted user deletion in php‑plain manage_users.php |
|
|
62
|
+
| BFLA-R-0063-1 | critical | high | confirmed | bfla | | `php-plain/profile.php:6` | Unrestricted role change in php‑plain profile.php |
|
|
63
|
+
| BFLA-R-0066-1 | critical | high | confirmed | bfla | | `php-plain/admin/delete_user.php:5` | Unrestricted user deletion in php‑plain delete_user.php |
|
|
64
|
+
| BFLA-R-0067-1 | critical | high | confirmed | bfla | | `php-plain/admin/promote.php:5` | User promotion controlled by request parameter in php‑plain |
|
|
65
|
+
| INJ-I-0001 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:6` | SQL Injection in classic-asp/shop/member.asp:6 |
|
|
66
|
+
| INJ-I-0002 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:7` | SQL Injection in classic-asp/shop/member.asp:7 |
|
|
67
|
+
| INJ-I-0003 | critical | medium | likely | sql_injection | | `classic-asp/shop/member.asp:10` | SQL Injection in classic-asp/shop/member.asp:10 |
|
|
68
|
+
| INJ-I-0004 | critical | medium | likely | sql_injection | | `classic-asp/shop/order.asp:6` | SQL Injection in classic-asp/shop/order.asp:6 |
|
|
69
|
+
| INJ-I-0006 | critical | high | confirmed | sql_injection | | `coldfusion/app/OrderService.cfc:5` | SQL Injection in coldfusion/app/OrderService.cfc:5 |
|
|
70
|
+
| INJ-I-0007 | critical | high | confirmed | sql_injection | | `coldfusion/app/order.cfm:3` | SQL Injection in coldfusion/app/order.cfm:3 |
|
|
71
|
+
| INJ-I-0008 | critical | medium | likely | sql_injection | | `dotnet-legacy/Web/Controllers/InvoiceController.cs:28` | SQL Injection in dotnet-legacy/Web/Controllers/InvoiceController.cs:28 |
|
|
72
|
+
| INJ-I-0009 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` | SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7 |
|
|
73
|
+
| INJ-I-0010 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8` | SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8 |
|
|
74
|
+
| INJ-I-0011 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13 |
|
|
75
|
+
| INJ-I-0012 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19 |
|
|
76
|
+
| INJ-I-0013 | critical | high | confirmed | sql_injection | | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20` | SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20 |
|
|
77
|
+
| INJ-I-0014 | critical | high | confirmed | sql_injection | | `java-legacy/WebContent/order/detail.jsp:5` | SQL Injection in java-legacy/WebContent/order/detail.jsp:5 |
|
|
78
|
+
| INJ-I-0015 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/mapper/OrderMapper.xml:9` | SQL Injection in java-legacy/src/com/acme/mapper/OrderMapper.xml:9 |
|
|
79
|
+
| INJ-I-0016 | critical | high | confirmed | sql_injection | | `java-legacy/src/com/acme/struts/EditUserAction.java:13` | SQL Injection in java-legacy/src/com/acme/struts/EditUserAction.java:13 |
|
|
80
|
+
| INJ-I-0017 | critical | high | confirmed | sql_injection | | `java-legacy/src/com/acme/web/InvoiceController.java:29` | SQL Injection in java-legacy/src/com/acme/web/InvoiceController.java:29 |
|
|
81
|
+
| INJ-I-0018 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/web/OrderServlet.java:15` | SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:15 |
|
|
82
|
+
| INJ-I-0019 | critical | medium | likely | sql_injection | | `java-legacy/src/com/acme/web/OrderServlet.java:17` | SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:17 |
|
|
83
|
+
| INJ-I-0020 | critical | high | confirmed | sql_injection | | `node-express/routes/orders.js:17` | SQL Injection in node-express/routes/orders.js:17 |
|
|
84
|
+
| INJ-I-0021 | critical | high | confirmed | sql_injection | | `node-express/routes/orders.js:29` | SQL Injection in node-express/routes/orders.js:29 |
|
|
85
|
+
| INJ-I-0022 | critical | high | confirmed | nosql_injection | | `node-express/routes/orders.js:21` | NoSQL Injection in node-express/routes/orders.js:21 |
|
|
86
|
+
| INJ-I-0023 | critical | high | confirmed | nosql_injection | | `node-express/routes/orders.js:25` | NoSQL Injection in node-express/routes/orders.js:25 |
|
|
87
|
+
| INJ-I-0024 | critical | high | confirmed | sql_injection | | `perl-cgi/cgi-bin/order.cgi:13` | SQL Injection in perl-cgi/cgi-bin/order.cgi:13 |
|
|
88
|
+
| INJ-I-0025 | critical | high | confirmed | sql_injection | | `perl-cgi/cgi-bin/order.cgi:19` | SQL Injection in perl-cgi/cgi-bin/order.cgi:19 |
|
|
89
|
+
| INJ-I-0026 | critical | medium | likely | sql_injection | | `php-codeigniter/application/controllers/Invoice.php:10` | SQL Injection in php-codeigniter/application/controllers/Invoice.php:10 |
|
|
90
|
+
| INJ-I-0027 | critical | high | confirmed | sql_injection | | `php-plain/admin.php:8` | SQL Injection in php-plain/admin.php:12 |
|
|
91
|
+
| INJ-I-0028 | critical | high | confirmed | sql_injection | | `php-plain/admin.php:12` | SQL Injection in php-plain/admin.php:12 |
|
|
92
|
+
| INJ-I-0029 | critical | high | confirmed | nosql_injection | | `php-plain/mongo_find.php:5` | NoSQL Injection in php-plain/mongo_find.php:6 |
|
|
93
|
+
| INJ-I-0030 | critical | high | confirmed | nosql_injection | | `php-plain/mongo_find.php:6` | NoSQL Injection in php-plain/mongo_find.php:6 |
|
|
94
|
+
| INJ-I-0031 | critical | high | confirmed | sql_injection | | `php-plain/order_detail.php:6` | SQL Injection in php-plain/order_detail.php:6 |
|
|
95
|
+
| INJ-I-0032 | critical | high | confirmed | sql_injection | | `php-plain/search.php:8` | SQL Injection in php-plain/search.php:8 |
|
|
96
|
+
| INJ-I-0033 | critical | high | confirmed | sql_injection | | `php-plain/search.php:9` | SQL Injection in php-plain/search.php:9 |
|
|
97
|
+
| INJ-I-0034 | critical | high | confirmed | sql_injection | | `php-plain/search.php:14` | SQL Injection in php-plain/search.php:14 |
|
|
98
|
+
| INJ-I-0036 | critical | high | confirmed | sql_injection | | `python-flask/app.py:29` | SQL Injection in python-flask/app.py:29 |
|
|
99
|
+
| INJ-I-0037 | critical | medium | likely | sql_injection | | `sql-procs/sp_search_orders.sql:5` | SQL Injection in sql-procs/sp_search_orders.sql:5 |
|
|
100
|
+
| INJ-I-0038 | critical | medium | likely | sql_injection | | `sql-procs/sp_search_orders.sql:6` | SQL Injection in sql-procs/sp_search_orders.sql:6 |
|
|
101
|
+
| MASS-M-0003-1 | critical | high | confirmed | mass_assignment | | `java-legacy/src/com/acme/web/AccountController.java:14` | Unrestricted binding of Account object in Spring MVC |
|
|
102
|
+
| MASS-M-0004-1 | critical | medium | likely | mass_assignment | | `java-legacy/src/com/acme/web/AccountController.java:27` | Unrestricted binding of Account object in Spring MVC |
|
|
103
|
+
| MASS-M-0005-1 | critical | medium | likely | mass_assignment | | `java-legacy/src/com/acme/web/ProfileServlet.java:12` | Unrestricted binding of Account object via BeanUtils in Java servlet |
|
|
104
|
+
| BOLA-R-0001 | high | medium | likely | bola | ANY /user/edit.do | `java-legacy/src/com/acme/struts/EditUserAction.java:10` | BOLA in POST /user/edit.do: missing owner verification |
|
|
105
|
+
| BOLA-R-0002 | high | medium | likely | bola | ANY /classic-asp/shop/member.asp?mode=edit | `classic-asp/shop/member.asp:6` | BOLA in GET /classic-asp/shop/member.asp?mode=edit: missing owner verification |
|
|
106
|
+
| BOLA-R-0003 | high | medium | likely | bola | ANY /classic-asp/shop/member.asp?mode=delete | `classic-asp/shop/member.asp:10` | BOLA in GET /classic-asp/shop/member.asp?mode=delete: missing owner verification |
|
|
107
|
+
| BOLA-R-0004 | high | medium | likely | bola | ANY /classic-asp/shop/order.asp | `classic-asp/shop/order.asp:5` | BOLA in GET /classic-asp/shop/order.asp: missing owner verification |
|
|
108
|
+
| BOLA-R-0005 | high | medium | likely | bola | ANY /coldfusion/app/OrderService.cfc?method=getOrder | `coldfusion/app/OrderService.cfc:4` | BOLA in GET /coldfusion/app/OrderService.cfc?method=getOrder: missing owner verification |
|
|
109
|
+
| BOLA-R-0006 | high | medium | likely | bola | ANY /coldfusion/app/order.cfm | `coldfusion/app/order.cfm:2` | BOLA in GET /coldfusion/app/order.cfm: missing owner verification |
|
|
110
|
+
| BOLA-R-0007 | high | medium | likely | bola | POST /Admin/DeleteUser | `dotnet-legacy/Web/Controllers/AdminController.cs:12` | BOLA in POST /Admin/DeleteUser: missing owner verification |
|
|
111
|
+
| BOLA-R-0009 | high | medium | likely | bola | POST /Admin/Export | `dotnet-legacy/Web/Controllers/AdminController.cs:32` | BOLA in GET /Admin/Export: missing owner verification |
|
|
112
|
+
| BOLA-R-0010 | high | medium | likely | bola | POST /Customer/Edit | `dotnet-legacy/Web/Controllers/CustomerController.cs:12` | BOLA in POST /Customer/Edit: missing owner verification |
|
|
113
|
+
| BOLA-R-0011 | high | medium | likely | bola | POST /Customer/EditName | `dotnet-legacy/Web/Controllers/CustomerController.cs:20` | BOLA in POST /Customer/EditName: missing owner verification |
|
|
114
|
+
| BOLA-R-0012 | high | medium | likely | bola | POST /Customer/Refresh | `dotnet-legacy/Web/Controllers/CustomerController.cs:27` | BOLA in POST /Customer/Refresh: missing owner verification |
|
|
115
|
+
| BOLA-R-0013 | high | medium | likely | bola | ANY /Invoice/Details | `dotnet-legacy/Web/Controllers/InvoiceController.cs:11` | BOLA in GET /Invoice/Details: missing owner verification |
|
|
116
|
+
| BOLA-R-0015 | high | medium | likely | bola | POST /Invoice/Search | `dotnet-legacy/Web/Controllers/InvoiceController.cs:26` | BOLA in POST /Invoice/Search: missing owner verification |
|
|
117
|
+
| BOLA-R-0016 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Handlers/GetFile.ashx | `dotnet-legacy/Web/Handlers/GetFile.ashx:8` | BOLA in ANY /dotnet-legacy/Web/Handlers/GetFile.ashx: missing owner verification |
|
|
118
|
+
| BOLA-R-0017 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Orders/EditOrder.aspx | `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` | BOLA in POST /dotnet-legacy/Web/Orders/EditOrder.aspx: missing owner verification |
|
|
119
|
+
| BOLA-R-0018 | high | medium | likely | bola | ANY /dotnet-legacy/Web/Orders/OrderDetail.aspx | `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10` | BOLA in GET /dotnet-legacy/Web/Orders/OrderDetail.aspx: missing owner verification |
|
|
120
|
+
| BOLA-R-0019 | high | medium | likely | bola | ANY /java-legacy/WebContent/order/detail.jsp | `java-legacy/WebContent/order/detail.jsp:3` | BOLA in GET /java-legacy/WebContent/order/detail.jsp: missing owner verification |
|
|
121
|
+
| BOLA-R-0020 | high | medium | likely | bola | POST /account/save | `java-legacy/src/com/acme/web/AccountController.java:13` | BOLA in POST /account/save: missing owner verification |
|
|
122
|
+
| BOLA-R-0021 | high | medium | likely | bola | POST /account/rename | `java-legacy/src/com/acme/web/AccountController.java:19` | BOLA in POST /account/rename: missing owner verification |
|
|
123
|
+
| BOLA-R-0022 | high | medium | likely | bola | PUT /account/api | `java-legacy/src/com/acme/web/AccountController.java:25` | BOLA in PUT /account/api: missing owner verification |
|
|
124
|
+
| BOLA-R-0023 | high | medium | likely | bola | POST /admin/users/{id}/delete | `java-legacy/src/com/acme/web/AdminUserController.java:13` | BOLA in POST /admin/users/{id}/delete: missing owner verification |
|
|
125
|
+
| BOLA-R-0025 | high | medium | likely | bola | GET /invoices/{id} | `java-legacy/src/com/acme/web/InvoiceController.java:15` | BOLA in GET /invoices/{id}: missing owner verification |
|
|
126
|
+
| BOLA-R-0027 | high | medium | likely | bola | GET /invoices/search | `java-legacy/src/com/acme/web/InvoiceController.java:27` | BOLA in GET /invoices/search: missing owner verification |
|
|
127
|
+
| BOLA-R-0028 | high | medium | likely | bola | GET /order/view | `java-legacy/src/com/acme/web/OrderServlet.java:8` | BOLA in GET /order/view: missing owner verification |
|
|
128
|
+
| BOLA-R-0029 | high | medium | likely | bola | POST <see web.xml servlet-mapping> | `java-legacy/src/com/acme/web/ProfileServlet.java:9` | BOLA in POST /ProfileServlet: missing owner verification |
|
|
129
|
+
| BOLA-R-0030 | high | medium | likely | bola | POST /admin/users/:id/delete | `node-express/routes/admin.js:8` | BOLA in POST /admin/users/:id/delete: missing owner verification |
|
|
130
|
+
| BOLA-R-0033 | high | medium | likely | bola | GET /orders/:id | `node-express/routes/orders.js:8` | BOLA in GET /orders/:id: missing owner verification |
|
|
131
|
+
| BOLA-R-0043 | high | medium | likely | bola | ANY /perl-cgi/cgi-bin/order.cgi | `perl-cgi/cgi-bin/order.cgi:13` | BOLA in ANY /perl-cgi/cgi-bin/order.cgi: missing owner verification |
|
|
132
|
+
| BOLA-R-0044 | high | medium | likely | bola | ANY /invoice/view/{id} | `php-codeigniter/application/controllers/Invoice.php:10` | BOLA in ANY /invoice/view/{id}: missing owner verification |
|
|
133
|
+
| BOLA-R-0046 | high | medium | likely | bola | ANY /invoice/update | `php-codeigniter/application/controllers/Invoice.php:23` | BOLA in ANY /invoice/update: missing owner verification |
|
|
134
|
+
| BOLA-R-0057-1 | high | medium | likely | bola | GET /account/rename | `php-plain/admin.php:7` | BOLA in GET /account/rename: missing owner verification |
|
|
135
|
+
| BOLA-R-0057-2 | high | medium | likely | bola | POST /account/rename | `php-plain/admin.php:6` | BOLA in POST /account/rename: missing owner verification |
|
|
136
|
+
| BOLA-R-0058-1 | high | medium | likely | bola | POST /account/rename | `php-plain/admin.php:11` | BOLA in POST /account/rename: missing owner verification |
|
|
137
|
+
| BOLA-R-0059-1 | high | high | confirmed | bola | POST /php-plain/manage_users.php | `php-plain/manage_users.php:5` | BOLA in POST /php-plain/manage_users.php: missing owner verification |
|
|
138
|
+
| BOLA-R-0061-1 | high | high | confirmed | bola | GET /php-plain/order_detail.php | `php-plain/order_detail.php:5` | BOLA in GET /php-plain/order_detail.php: missing owner verification |
|
|
139
|
+
| BOLA-R-0066-1 | high | medium | likely | bola | POST /php-plain/admin/delete_user.php | `php-plain/admin/delete_user.php:5` | BOLA in POST /php-plain/admin/delete_user.php: missing owner verification |
|
|
140
|
+
| BOLA-R-0067-1 | high | medium | likely | bola | POST /php-plain/admin/promote.php | `php-plain/admin/promote.php:5` | BOLA in POST /php-plain/admin/promote.php: missing owner verification |
|
|
141
|
+
| BOLA-R-0069-1 | high | high | confirmed | bola | GET /orders/<int:order_id> | `python-flask/app.py:12` | BOLA in GET /orders/<int:order_id>: missing owner verification |
|
|
142
|
+
| BOLA-R-0073 | high | high | confirmed | bola | POST /users/<int:uid>/name | `python-flask/profile.py:16` | BOLA in POST /users/<int:uid>/name: missing owner verification |
|
|
143
|
+
| BOLA-R-0074 | high | high | confirmed | bola | PATCH /users/<int:uid> | `python-flask/profile.py:24` | BOLA in PATCH /users/<int:uid>: missing owner verification |
|
|
144
|
+
| MASS-M-0009-1 | high | high | confirmed | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:23` | Team owner_id is writable via mass assignment |
|
|
145
|
+
| BOLA-R-0052-verdict | medium | medium | likely | bola | POST /register | `php-laravel/routes/web.php:6` | Missing ownership check at php-laravel/routes/web.php:6 (from auditor verdict) |
|
|
146
|
+
| BOLA-R-0053-verdict | medium | medium | likely | bola | POST /posts | `php-laravel/routes/web.php:7` | Missing ownership check at php-laravel/routes/web.php:7 (from auditor verdict) |
|
|
147
|
+
| BOLA-R-0054-verdict | medium | medium | likely | bola | POST /teams | `php-laravel/routes/web.php:8` | Missing ownership check at php-laravel/routes/web.php:8 (from auditor verdict) |
|
|
148
|
+
| BOLA-R-0055-verdict | medium | medium | likely | bola | POST /account/rename | `php-laravel/routes/web.php:9` | Missing ownership check at php-laravel/routes/web.php:9 (from auditor verdict) |
|
|
149
|
+
| BOLA-R-0056-verdict | medium | medium | likely | bola | POST /account/profile | `php-laravel/routes/web.php:10` | Missing ownership check at php-laravel/routes/web.php:10 (from auditor verdict) |
|
|
150
|
+
| MASS-M-0001-verdict | medium | medium | likely | mass_assignment | | `dotnet-legacy/Web/Controllers/CustomerController.cs:12` | Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:12 (from auditor verdict) |
|
|
151
|
+
| MASS-M-0002-verdict | medium | medium | likely | mass_assignment | | `dotnet-legacy/Web/Controllers/CustomerController.cs:30` | Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:30 (from auditor verdict) |
|
|
152
|
+
| MASS-M-0006-1 | medium | high | confirmed | mass_assignment | | `node-express/routes/profile.js:8` | Unknown model fields in whole object binding |
|
|
153
|
+
| MASS-M-0007-1 | medium | high | confirmed | mass_assignment | | `node-express/routes/profile.js:16` | Unknown model fields in whole object binding |
|
|
154
|
+
| MASS-M-0008-1 | medium | medium | likely | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:13` | Unknown model fields in whole object binding |
|
|
155
|
+
| MASS-M-0010-1 | medium | medium | likely | mass_assignment | | `php-laravel/app/Http/Controllers/AccountController.php:36` | Unknown model fields in whole object binding |
|
|
156
|
+
| MASS-M-0011-verdict | medium | medium | likely | mass_assignment | | `php-plain/profile.php:6` | Mass assignment at php-plain/profile.php:6 (from auditor verdict) |
|
|
157
|
+
| MASS-M-0012-verdict | medium | medium | likely | mass_assignment | | `php-plain/profile.php:10` | Mass assignment at php-plain/profile.php:10 (from auditor verdict) |
|
|
158
|
+
| MASS-M-0014-1 | medium | medium | likely | mass_assignment | | `python-flask/profile.py:10` | Unknown model fields in whole object binding |
|
|
159
|
+
| MASS-M-0015-1 | medium | medium | likely | mass_assignment | | `python-flask/profile.py:27` | Unknown model fields in whole object binding |
|
|
160
|
+
|
|
161
|
+
### BFLA-R-0003-1 — Unrestricted member deletion in classic‑asp shop
|
|
162
|
+
|
|
163
|
+
- **Severity / confidence:** critical / high
|
|
164
|
+
- **Status:** confirmed
|
|
165
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
166
|
+
- **Endpoint:** - -
|
|
167
|
+
- **Location:** `classic-asp/shop/member.asp:10`
|
|
168
|
+
|
|
169
|
+
**Impact.** Any logged‑in user can delete any member record
|
|
170
|
+
|
|
171
|
+
**Evidence.**
|
|
172
|
+
|
|
173
|
+
- `classic-asp/shop/member.asp:10` — DELETE statement executed without any role check
|
|
174
|
+
|
|
175
|
+
**Recommendation.** Add a server‑side admin role check before executing the DELETE
|
|
176
|
+
|
|
177
|
+
*Verifier:* confirmed — checked: classic-asp/shop/member.asp lines 1-11, classic-asp/shop/inc/auth.asp line 2. The code performs a DELETE without any role or ownership check. The included auth.asp only verifies that a user is logged in, not that they are an admin.
|
|
178
|
+
|
|
179
|
+
### BFLA-R-0007-1 — Unrestricted user deletion in ASP.NET MVC Admin controller
|
|
180
|
+
|
|
181
|
+
- **Severity / confidence:** critical / high
|
|
182
|
+
- **Status:** confirmed
|
|
183
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
184
|
+
- **Endpoint:** - -
|
|
185
|
+
- **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:12`
|
|
186
|
+
|
|
187
|
+
**Impact.** Any authenticated user can delete any user account
|
|
188
|
+
|
|
189
|
+
**Evidence.**
|
|
190
|
+
|
|
191
|
+
- `dotnet-legacy/Web/Controllers/AdminController.cs:12` — db.Users.Remove executed without admin role check
|
|
192
|
+
|
|
193
|
+
**Recommendation.** Add [Authorize(Roles="Admin")] to DeleteUser action
|
|
194
|
+
|
|
195
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 6-18. DeleteUser action lacks an admin role guard; only the class-level [Authorize] ensures authentication.
|
|
196
|
+
|
|
197
|
+
### BFLA-R-0009-1 — Export endpoint controlled by request parameter in ASP.NET MVC
|
|
198
|
+
|
|
199
|
+
- **Severity / confidence:** critical / high
|
|
200
|
+
- **Status:** confirmed
|
|
201
|
+
- **Category:** bfla (role_from_request) — CWE-269, CWE-285
|
|
202
|
+
- **Endpoint:** - -
|
|
203
|
+
- **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:30`
|
|
204
|
+
|
|
205
|
+
**Impact.** Any user can export all user data by setting isAdmin=true
|
|
206
|
+
|
|
207
|
+
**Evidence.**
|
|
208
|
+
|
|
209
|
+
- `dotnet-legacy/Web/Controllers/AdminController.cs:32` — uses Request.QueryString["isAdmin"] to grant access
|
|
210
|
+
|
|
211
|
+
**Recommendation.** Validate admin role from session before allowing export
|
|
212
|
+
|
|
213
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 30-36. Export action grants access based solely on a request query string parameter, with no server‑side role validation.
|
|
214
|
+
|
|
215
|
+
### BFLA-R-0023-1 — Unrestricted user deletion in Spring MVC Admin controller
|
|
216
|
+
|
|
217
|
+
- **Severity / confidence:** critical / medium
|
|
218
|
+
- **Status:** likely
|
|
219
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
220
|
+
- **Endpoint:** - -
|
|
221
|
+
- **Location:** `java-legacy/src/com/acme/web/AdminUserController.java:13`
|
|
222
|
+
|
|
223
|
+
**Impact.** Any authenticated user can delete any user account
|
|
224
|
+
|
|
225
|
+
**Evidence.**
|
|
226
|
+
|
|
227
|
+
- `java-legacy/src/com/acme/web/AdminUserController.java:13` — delete method lacks @PreAuthorize
|
|
228
|
+
|
|
229
|
+
**Recommendation.** Add @PreAuthorize("hasRole('ADMIN')") to delete method
|
|
230
|
+
|
|
231
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AdminUserController.java, java-legacy/src/com/acme/web/AdminUserController.java lines 13-15, java-legacy/src/com/acme/web/AdminUserController.java lines 19-23. No @PreAuthorize or other role check is visible on the delete method. Global security configuration is not shown.
|
|
232
|
+
|
|
233
|
+
### BFLA-R-0030-1 — Unrestricted user deletion in Express route
|
|
234
|
+
|
|
235
|
+
- **Severity / confidence:** critical / medium
|
|
236
|
+
- **Status:** likely
|
|
237
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
238
|
+
- **Endpoint:** - -
|
|
239
|
+
- **Location:** `node-express/routes/admin.js:8`
|
|
240
|
+
|
|
241
|
+
**Impact.** Any logged‑in user can delete any user account
|
|
242
|
+
|
|
243
|
+
**Evidence.**
|
|
244
|
+
|
|
245
|
+
- `node-express/routes/admin.js:8` — DELETE route without admin guard
|
|
246
|
+
|
|
247
|
+
**Recommendation.** Add requireAdmin middleware before delete handler
|
|
248
|
+
|
|
249
|
+
*Verifier:* likely — checked: node-express/routes/admin.js, node-express/routes/admin.js lines 8-9, node-express/routes/admin.js lines 5-6. The delete route only uses ensureLoggedIn; no admin guard is present in the visible code.
|
|
250
|
+
|
|
251
|
+
### BFLA-R-0032-1 — Export endpoint controlled by query param in Express
|
|
252
|
+
|
|
253
|
+
- **Severity / confidence:** critical / medium
|
|
254
|
+
- **Status:** likely
|
|
255
|
+
- **Category:** bfla (role_from_request) — CWE-269, CWE-285
|
|
256
|
+
- **Endpoint:** - -
|
|
257
|
+
- **Location:** `node-express/routes/admin.js:16`
|
|
258
|
+
|
|
259
|
+
**Impact.** Any user can export all user data by setting isAdmin=true
|
|
260
|
+
|
|
261
|
+
**Evidence.**
|
|
262
|
+
|
|
263
|
+
- `node-express/routes/admin.js:17` — uses req.query.isAdmin to grant access
|
|
264
|
+
|
|
265
|
+
**Recommendation.** Validate admin role from session before allowing export
|
|
266
|
+
|
|
267
|
+
*Verifier:* likely — checked: node-express/routes/admin.js, node-express/routes/admin.js lines 16-18. Export endpoint checks only a query parameter; no role validation is visible.
|
|
268
|
+
|
|
269
|
+
### BFLA-R-0057-1 — Unrestricted user view in php‑plain admin.php
|
|
270
|
+
|
|
271
|
+
- **Severity / confidence:** critical / medium
|
|
272
|
+
- **Status:** likely
|
|
273
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
274
|
+
- **Endpoint:** - -
|
|
275
|
+
- **Location:** `php-plain/admin.php:6`
|
|
276
|
+
|
|
277
|
+
**Impact.** Any logged‑in user can view any user record
|
|
278
|
+
|
|
279
|
+
**Evidence.**
|
|
280
|
+
|
|
281
|
+
- `php-plain/admin.php:6` — SELECT without role check
|
|
282
|
+
|
|
283
|
+
**Recommendation.** Add server‑side admin role check before executing SELECT
|
|
284
|
+
|
|
285
|
+
*Verifier:* likely — checked: php-plain/admin.php, php-plain/admin.php lines 6-9, php-plain/inc/auth.php. Only a login check is performed; no admin role check is present in the visible code.
|
|
286
|
+
|
|
287
|
+
### BFLA-R-0058-1 — Unrestricted user deletion in php‑plain admin.php
|
|
288
|
+
|
|
289
|
+
- **Severity / confidence:** critical / medium
|
|
290
|
+
- **Status:** likely
|
|
291
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
292
|
+
- **Endpoint:** - -
|
|
293
|
+
- **Location:** `php-plain/admin.php:10`
|
|
294
|
+
|
|
295
|
+
**Impact.** Any logged‑in user can delete any user record
|
|
296
|
+
|
|
297
|
+
**Evidence.**
|
|
298
|
+
|
|
299
|
+
- `php-plain/admin.php:10` — DELETE without role check
|
|
300
|
+
|
|
301
|
+
**Recommendation.** Add server‑side admin role check before executing DELETE
|
|
302
|
+
|
|
303
|
+
*Verifier:* likely — checked: php-plain/admin.php, php-plain/admin.php lines 10-12, php-plain/inc/auth.php. The delete action lacks any admin role verification in the visible code.
|
|
304
|
+
|
|
305
|
+
### BFLA-R-0059-1 — Unrestricted user deletion in php‑plain manage_users.php
|
|
306
|
+
|
|
307
|
+
- **Severity / confidence:** critical / high
|
|
308
|
+
- **Status:** confirmed
|
|
309
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
310
|
+
- **Endpoint:** - -
|
|
311
|
+
- **Location:** `php-plain/manage_users.php:6`
|
|
312
|
+
|
|
313
|
+
**Impact.** Any logged‑in user can delete any user record
|
|
314
|
+
|
|
315
|
+
**Evidence.**
|
|
316
|
+
|
|
317
|
+
- `php-plain/manage_users.php:6` — DELETE without server‑side role check
|
|
318
|
+
|
|
319
|
+
**Recommendation.** Add server‑side admin role check before executing DELETE
|
|
320
|
+
|
|
321
|
+
*Verifier:* confirmed — checked: php-plain/manage_users.php:1-8, php-plain/inc/auth.php:1-7. The POST handler deletes a user by id without any role or ownership guard.
|
|
322
|
+
|
|
323
|
+
### BFLA-R-0063-1 — Unrestricted role change in php‑plain profile.php
|
|
324
|
+
|
|
325
|
+
- **Severity / confidence:** critical / high
|
|
326
|
+
- **Status:** confirmed
|
|
327
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
328
|
+
- **Endpoint:** - -
|
|
329
|
+
- **Location:** `php-plain/profile.php:6`
|
|
330
|
+
|
|
331
|
+
**Impact.** Any logged‑in user can change their own role to admin
|
|
332
|
+
|
|
333
|
+
**Evidence.**
|
|
334
|
+
|
|
335
|
+
- `php-plain/profile.php:10` — user->role set from $_POST['role'] without check
|
|
336
|
+
|
|
337
|
+
**Recommendation.** Validate role changes against allowed values and enforce admin check
|
|
338
|
+
|
|
339
|
+
*Verifier:* confirmed — checked: php-plain/profile.php:1-11, php-plain/inc/auth.php:1-7. The script assigns any POSTed field to the user object, including role, without checking the current user's privileges.
|
|
340
|
+
|
|
341
|
+
### BFLA-R-0066-1 — Unrestricted user deletion in php‑plain delete_user.php
|
|
342
|
+
|
|
343
|
+
- **Severity / confidence:** critical / high
|
|
344
|
+
- **Status:** confirmed
|
|
345
|
+
- **Category:** bfla (missing_role_check) — CWE-285
|
|
346
|
+
- **Endpoint:** - -
|
|
347
|
+
- **Location:** `php-plain/admin/delete_user.php:5`
|
|
348
|
+
|
|
349
|
+
**Impact.** Any logged‑in user can delete any user record
|
|
350
|
+
|
|
351
|
+
**Evidence.**
|
|
352
|
+
|
|
353
|
+
- `php-plain/admin/delete_user.php:5` — DELETE without role check
|
|
354
|
+
|
|
355
|
+
**Recommendation.** Add server‑side admin role check before executing DELETE
|
|
356
|
+
|
|
357
|
+
*Verifier:* confirmed — checked: php-plain/admin/delete_user.php:1-8, php-plain/inc/auth.php:1-7. The file contains only a login check in auth.php and a DELETE statement that uses the supplied id. No role or ownership check is present.
|
|
358
|
+
|
|
359
|
+
### BFLA-R-0067-1 — User promotion controlled by request parameter in php‑plain
|
|
360
|
+
|
|
361
|
+
- **Severity / confidence:** critical / high
|
|
362
|
+
- **Status:** confirmed
|
|
363
|
+
- **Category:** bfla (role_from_request) — CWE-269, CWE-285
|
|
364
|
+
- **Endpoint:** - -
|
|
365
|
+
- **Location:** `php-plain/admin/promote.php:5`
|
|
366
|
+
|
|
367
|
+
**Impact.** Any logged‑in user can promote themselves to admin
|
|
368
|
+
|
|
369
|
+
**Evidence.**
|
|
370
|
+
|
|
371
|
+
- `php-plain/admin/promote.php:5` — role assignment from $_POST['is_admin']
|
|
372
|
+
|
|
373
|
+
**Recommendation.** Validate admin role from session before allowing promotion
|
|
374
|
+
|
|
375
|
+
*Verifier:* confirmed — checked: php-plain/admin/promote.php:1-8, php-plain/inc/auth.php:1-7. The code updates the role based solely on a POST parameter. No role verification or ownership check is performed.
|
|
376
|
+
|
|
377
|
+
### INJ-I-0001 — SQL Injection in classic-asp/shop/member.asp:6
|
|
378
|
+
|
|
379
|
+
- **Severity / confidence:** critical / medium
|
|
380
|
+
- **Status:** likely
|
|
381
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
382
|
+
- **Endpoint:** - -
|
|
383
|
+
- **Location:** `classic-asp/shop/member.asp:6`
|
|
384
|
+
|
|
385
|
+
**Evidence.**
|
|
386
|
+
|
|
387
|
+
- `classic-asp/shop/member.asp:6` — Unsanitized input concatenated into query
|
|
388
|
+
`sql = "UPDATE members SET name = '" & Replace(Request.Form("name"), "'", "''") & "'"`
|
|
389
|
+
|
|
390
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
391
|
+
|
|
392
|
+
*Verifier:* likely — checked: classic-asp/shop/member.asp lines 6-8, classic-asp/shop/inc/auth.asp lines 1-3. No ownership or role check is visible in the code context. The authentication include only verifies that a user is logged in, not that the user owns the member record.
|
|
393
|
+
|
|
394
|
+
### INJ-I-0002 — SQL Injection in classic-asp/shop/member.asp:7
|
|
395
|
+
|
|
396
|
+
- **Severity / confidence:** critical / medium
|
|
397
|
+
- **Status:** likely
|
|
398
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
399
|
+
- **Endpoint:** - -
|
|
400
|
+
- **Location:** `classic-asp/shop/member.asp:7`
|
|
401
|
+
|
|
402
|
+
**Evidence.**
|
|
403
|
+
|
|
404
|
+
- `classic-asp/shop/member.asp:7` — Unsanitized input concatenated into query
|
|
405
|
+
`sql = sql & " WHERE member_id = " & Request.Form("member_id")`
|
|
406
|
+
|
|
407
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
408
|
+
|
|
409
|
+
*Verifier:* likely — checked: classic-asp/shop/member.asp lines 6-8, classic-asp/shop/inc/auth.asp lines 1-3. The query concatenates the member_id from the form with no ownership or role guard shown in the context.
|
|
410
|
+
|
|
411
|
+
### INJ-I-0003 — SQL Injection in classic-asp/shop/member.asp:10
|
|
412
|
+
|
|
413
|
+
- **Severity / confidence:** critical / medium
|
|
414
|
+
- **Status:** likely
|
|
415
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
416
|
+
- **Endpoint:** - -
|
|
417
|
+
- **Location:** `classic-asp/shop/member.asp:10`
|
|
418
|
+
|
|
419
|
+
**Evidence.**
|
|
420
|
+
|
|
421
|
+
- `classic-asp/shop/member.asp:10` — Unsanitized input concatenated into query
|
|
422
|
+
`conn.Execute "DELETE FROM members WHERE member_id = " & Request.QueryString("member_id")`
|
|
423
|
+
|
|
424
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
425
|
+
|
|
426
|
+
*Verifier:* likely — checked: classic-asp/shop/member.asp lines 9-11, classic-asp/shop/inc/auth.asp lines 1-3. The DELETE statement uses a member_id from the query string with no visible ownership check.
|
|
427
|
+
|
|
428
|
+
### INJ-I-0004 — SQL Injection in classic-asp/shop/order.asp:6
|
|
429
|
+
|
|
430
|
+
- **Severity / confidence:** critical / medium
|
|
431
|
+
- **Status:** likely
|
|
432
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
433
|
+
- **Endpoint:** - -
|
|
434
|
+
- **Location:** `classic-asp/shop/order.asp:6`
|
|
435
|
+
|
|
436
|
+
**Evidence.**
|
|
437
|
+
|
|
438
|
+
- `classic-asp/shop/order.asp:6` — Unsanitized input concatenated into query
|
|
439
|
+
`Set rs = conn.Execute("SELECT * FROM orders WHERE id = " & id)`
|
|
440
|
+
|
|
441
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
442
|
+
|
|
443
|
+
*Verifier:* likely — checked: classic-asp/shop/order.asp lines 5-7, classic-asp/shop/inc/auth.asp lines 1-3. The SELECT query uses an id from the request without casting or an ownership guard in the visible code.
|
|
444
|
+
|
|
445
|
+
### INJ-I-0006 — SQL Injection in coldfusion/app/OrderService.cfc:5
|
|
446
|
+
|
|
447
|
+
- **Severity / confidence:** critical / high
|
|
448
|
+
- **Status:** confirmed
|
|
449
|
+
- **Category:** sql_injection (template_placeholder) — CWE-89
|
|
450
|
+
- **Endpoint:** - -
|
|
451
|
+
- **Location:** `coldfusion/app/OrderService.cfc:5`
|
|
452
|
+
|
|
453
|
+
**Evidence.**
|
|
454
|
+
|
|
455
|
+
- `coldfusion/app/OrderService.cfc:5` — Unsanitized input interpolated into query
|
|
456
|
+
`SELECT * FROM orders WHERE id = #arguments.orderId#`
|
|
457
|
+
|
|
458
|
+
**Recommendation.** Use cfqueryparam or parameterized queries; avoid unescaped interpolation
|
|
459
|
+
|
|
460
|
+
*Verifier:* confirmed — checked: coldfusion/app/OrderService.cfc:5. The query interpolates the unsanitized argument directly into the SQL string. No ownership or role check, no parameter binding, and no integer cast is present in the visible code.
|
|
461
|
+
|
|
462
|
+
### INJ-I-0007 — SQL Injection in coldfusion/app/order.cfm:3
|
|
463
|
+
|
|
464
|
+
- **Severity / confidence:** critical / high
|
|
465
|
+
- **Status:** confirmed
|
|
466
|
+
- **Category:** sql_injection (template_placeholder) — CWE-89
|
|
467
|
+
- **Endpoint:** - -
|
|
468
|
+
- **Location:** `coldfusion/app/order.cfm:3`
|
|
469
|
+
|
|
470
|
+
**Evidence.**
|
|
471
|
+
|
|
472
|
+
- `coldfusion/app/order.cfm:3` — Unsanitized input interpolated into query
|
|
473
|
+
`SELECT * FROM orders WHERE id = #url.id#`
|
|
474
|
+
|
|
475
|
+
**Recommendation.** Use cfqueryparam or parameterized queries; avoid unescaped interpolation
|
|
476
|
+
|
|
477
|
+
*Verifier:* confirmed — checked: coldfusion/app/order.cfm:3. The first query uses the raw URL parameter in the WHERE clause. Although a second query later uses cfqueryparam and includes a user_id check, the vulnerable query is executed and its result is output, providing an injection vector.
|
|
478
|
+
|
|
479
|
+
### INJ-I-0008 — SQL Injection in dotnet-legacy/Web/Controllers/InvoiceController.cs:28
|
|
480
|
+
|
|
481
|
+
- **Severity / confidence:** critical / medium
|
|
482
|
+
- **Status:** likely
|
|
483
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
484
|
+
- **Endpoint:** - -
|
|
485
|
+
- **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:28`
|
|
486
|
+
|
|
487
|
+
**Evidence.**
|
|
488
|
+
|
|
489
|
+
- `dotnet-legacy/Web/Controllers/InvoiceController.cs:28` — Unsanitized user input concatenated into query
|
|
490
|
+
`var list = db.Database.SqlQuery<Invoice>("SELECT * FROM Invoices WHERE Customer = '" + customer + "'").ToList();`
|
|
491
|
+
|
|
492
|
+
**Recommendation.** Use parameterized queries or escape the input before concatenation
|
|
493
|
+
|
|
494
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs:26-28. The code concatenates the user‑supplied customer string directly into the SQL query. No parameter binding, cast, or ownership/role check is visible in the provided context.
|
|
495
|
+
|
|
496
|
+
### INJ-I-0009 — SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7
|
|
497
|
+
|
|
498
|
+
- **Severity / confidence:** critical / high
|
|
499
|
+
- **Status:** confirmed
|
|
500
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
501
|
+
- **Endpoint:** - -
|
|
502
|
+
- **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7`
|
|
503
|
+
|
|
504
|
+
**Evidence.**
|
|
505
|
+
|
|
506
|
+
- `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` — Unsanitized input concatenated into query
|
|
507
|
+
`Dim sql As String = "UPDATE Orders SET Note = '" & txtNote.Text & "'"`
|
|
508
|
+
|
|
509
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
510
|
+
|
|
511
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7, dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8. Both the Note and OrderId values are concatenated into the SQL string without any parameterization or ownership check. The subsequent safe query does not mitigate the earlier vulnerable execution.
|
|
512
|
+
|
|
513
|
+
### INJ-I-0010 — SQL Injection in dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8
|
|
514
|
+
|
|
515
|
+
- **Severity / confidence:** critical / high
|
|
516
|
+
- **Status:** confirmed
|
|
517
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
518
|
+
- **Endpoint:** - -
|
|
519
|
+
- **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8`
|
|
520
|
+
|
|
521
|
+
**Evidence.**
|
|
522
|
+
|
|
523
|
+
- `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8` — Unsanitized input concatenated into query
|
|
524
|
+
`sql &= " WHERE OrderId = " & hfOrderId.Value`
|
|
525
|
+
|
|
526
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
527
|
+
|
|
528
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb:8. The OrderId is concatenated directly into the SQL string. No ownership or role validation is present in the visible code.
|
|
529
|
+
|
|
530
|
+
### INJ-I-0011 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13
|
|
531
|
+
|
|
532
|
+
- **Severity / confidence:** critical / high
|
|
533
|
+
- **Status:** confirmed
|
|
534
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
535
|
+
- **Endpoint:** - -
|
|
536
|
+
- **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13`
|
|
537
|
+
|
|
538
|
+
**Evidence.**
|
|
539
|
+
|
|
540
|
+
- `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13` — Unsanitized input concatenated into query
|
|
541
|
+
`var cmd = new SqlCommand("SELECT * FROM Orders WHERE OrderId = " + id, conn);`
|
|
542
|
+
|
|
543
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
544
|
+
|
|
545
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13. The id from the query string is concatenated into the SQL command without parameterization or ownership verification. The later safe query does not prevent the execution of the vulnerable statement.
|
|
546
|
+
|
|
547
|
+
### INJ-I-0012 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19
|
|
548
|
+
|
|
549
|
+
- **Severity / confidence:** critical / high
|
|
550
|
+
- **Status:** confirmed
|
|
551
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
552
|
+
- **Endpoint:** - -
|
|
553
|
+
- **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19`
|
|
554
|
+
|
|
555
|
+
**Evidence.**
|
|
556
|
+
|
|
557
|
+
- `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:19` — Unsanitized input concatenated into query
|
|
558
|
+
`string sql2 = string.Format("SELECT * FROM Logs WHERE Ref = '{0}'", Request["ref"]);`
|
|
559
|
+
|
|
560
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
561
|
+
|
|
562
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13-22. The query string is built by string.Format with user-supplied Request["ref"]. No parameter binding, no ownership or role check is visible in the code_context.
|
|
563
|
+
|
|
564
|
+
### INJ-I-0013 — SQL Injection in dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20
|
|
565
|
+
|
|
566
|
+
- **Severity / confidence:** critical / high
|
|
567
|
+
- **Status:** confirmed
|
|
568
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
569
|
+
- **Endpoint:** - -
|
|
570
|
+
- **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20`
|
|
571
|
+
|
|
572
|
+
**Evidence.**
|
|
573
|
+
|
|
574
|
+
- `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:20` — Unsanitized input concatenated into query
|
|
575
|
+
`string sql3 = $"DELETE FROM Carts WHERE CartId = {Request.Form["cart"]}";`
|
|
576
|
+
|
|
577
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
578
|
+
|
|
579
|
+
*Verifier:* confirmed — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:13-22. The DELETE statement concatenates Request.Form["cart"] directly into the SQL. No compensating control is present in the visible code.
|
|
580
|
+
|
|
581
|
+
### INJ-I-0014 — SQL Injection in java-legacy/WebContent/order/detail.jsp:5
|
|
582
|
+
|
|
583
|
+
- **Severity / confidence:** critical / high
|
|
584
|
+
- **Status:** confirmed
|
|
585
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
586
|
+
- **Endpoint:** - -
|
|
587
|
+
- **Location:** `java-legacy/WebContent/order/detail.jsp:5`
|
|
588
|
+
|
|
589
|
+
**Evidence.**
|
|
590
|
+
|
|
591
|
+
- `java-legacy/WebContent/order/detail.jsp:5` — Unsanitized input concatenated into query
|
|
592
|
+
`ResultSet rs = c.createStatement().executeQuery("SELECT * FROM orders WHERE order_no = '" + no + "'");`
|
|
593
|
+
|
|
594
|
+
**Recommendation.** Use prepared statements with parameter binding; avoid string concatenation
|
|
595
|
+
|
|
596
|
+
*Verifier:* confirmed — checked: java-legacy/WebContent/order/detail.jsp:1-6. The query concatenates the request parameter "no" into the SQL string. No ownership or role check is shown.
|
|
597
|
+
|
|
598
|
+
### INJ-I-0015 — SQL Injection in java-legacy/src/com/acme/mapper/OrderMapper.xml:9
|
|
599
|
+
|
|
600
|
+
- **Severity / confidence:** critical / medium
|
|
601
|
+
- **Status:** likely
|
|
602
|
+
- **Category:** sql_injection (dynamic_identifier) — CWE-89
|
|
603
|
+
- **Endpoint:** - -
|
|
604
|
+
- **Location:** `java-legacy/src/com/acme/mapper/OrderMapper.xml:9`
|
|
605
|
+
|
|
606
|
+
**Evidence.**
|
|
607
|
+
|
|
608
|
+
- `java-legacy/src/com/acme/mapper/OrderMapper.xml:9` — Dynamic identifier interpolated without sanitization
|
|
609
|
+
`ORDER BY ${orderBy}`
|
|
610
|
+
|
|
611
|
+
**Recommendation.** Validate the orderBy value against an allow‑list or use a parameterized query
|
|
612
|
+
|
|
613
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/mapper/OrderMapper.xml:9. The ORDER BY clause interpolates the ${orderBy} variable without any visible allow‑list or type enforcement in the snippet.
|
|
614
|
+
|
|
615
|
+
### INJ-I-0016 — SQL Injection in java-legacy/src/com/acme/struts/EditUserAction.java:13
|
|
616
|
+
|
|
617
|
+
- **Severity / confidence:** critical / high
|
|
618
|
+
- **Status:** confirmed
|
|
619
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
620
|
+
- **Endpoint:** - -
|
|
621
|
+
- **Location:** `java-legacy/src/com/acme/struts/EditUserAction.java:13`
|
|
622
|
+
|
|
623
|
+
**Evidence.**
|
|
624
|
+
|
|
625
|
+
- `java-legacy/src/com/acme/struts/EditUserAction.java:13` — Unsanitized input concatenated into query
|
|
626
|
+
`PreparedStatement ps = conn.prepareStatement("UPDATE users SET email = '" + email + "' WHERE id = " + userId);`
|
|
627
|
+
|
|
628
|
+
**Recommendation.** Use parameterized queries; avoid string concatenation
|
|
629
|
+
|
|
630
|
+
*Verifier:* confirmed — checked: java-legacy/src/com/acme/struts/EditUserAction.java:10-15. The UPDATE statement concatenates the email and userId parameters directly. No parameter binding or ownership check is visible.
|
|
631
|
+
|
|
632
|
+
### INJ-I-0017 — SQL Injection in java-legacy/src/com/acme/web/InvoiceController.java:29
|
|
633
|
+
|
|
634
|
+
- **Severity / confidence:** critical / high
|
|
635
|
+
- **Status:** confirmed
|
|
636
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
637
|
+
- **Endpoint:** - -
|
|
638
|
+
- **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:29`
|
|
639
|
+
|
|
640
|
+
**Evidence.**
|
|
641
|
+
|
|
642
|
+
- `java-legacy/src/com/acme/web/InvoiceController.java:29` — Unsanitized input concatenated into query
|
|
643
|
+
`model.addAttribute("list", session.createQuery("from Invoice i where i.customer = '" + customer + "'").list());`
|
|
644
|
+
|
|
645
|
+
**Recommendation.** Use parameterized queries or named parameters; avoid string concatenation
|
|
646
|
+
|
|
647
|
+
*Verifier:* confirmed — checked: java-legacy/src/com/acme/web/InvoiceController.java:27-31. The HQL query concatenates the customer request parameter. No ownership or role check is present in the code_context.
|
|
648
|
+
|
|
649
|
+
### INJ-I-0018 — SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:15
|
|
650
|
+
|
|
651
|
+
- **Severity / confidence:** critical / medium
|
|
652
|
+
- **Status:** likely
|
|
653
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
654
|
+
- **Endpoint:** - -
|
|
655
|
+
- **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:15`
|
|
656
|
+
|
|
657
|
+
**Evidence.**
|
|
658
|
+
|
|
659
|
+
- `java-legacy/src/com/acme/web/OrderServlet.java:15` — Unsanitized request parameter concatenated into query
|
|
660
|
+
`ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
|
|
661
|
+
- `java-legacy/src/com/acme/web/OrderServlet.java:17` — Unsanitized request parameter used in dynamic SQL
|
|
662
|
+
`sb.append(" AND order_id = ").append(id);`
|
|
663
|
+
|
|
664
|
+
**Recommendation.** Use prepared statements or validate the id before use
|
|
665
|
+
|
|
666
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java:15-17. Both SQL statements build the query string by concatenating the request parameter `id` directly. No cast, parameter binding, or ownership check is shown.
|
|
667
|
+
|
|
668
|
+
### INJ-I-0019 — SQL Injection in java-legacy/src/com/acme/web/OrderServlet.java:17
|
|
669
|
+
|
|
670
|
+
- **Severity / confidence:** critical / medium
|
|
671
|
+
- **Status:** likely
|
|
672
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
673
|
+
- **Endpoint:** - -
|
|
674
|
+
- **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:17`
|
|
675
|
+
|
|
676
|
+
**Evidence.**
|
|
677
|
+
|
|
678
|
+
- `java-legacy/src/com/acme/web/OrderServlet.java:15` — Unsanitized request parameter concatenated into query
|
|
679
|
+
`ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
|
|
680
|
+
- `java-legacy/src/com/acme/web/OrderServlet.java:17` — Unsanitized request parameter used in dynamic SQL
|
|
681
|
+
`sb.append(" AND order_id = ").append(id);`
|
|
682
|
+
|
|
683
|
+
**Recommendation.** Use prepared statements or validate the id before use
|
|
684
|
+
|
|
685
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java:15-17. Same code as INJ-I-0018; no visible mitigation.
|
|
686
|
+
|
|
687
|
+
### INJ-I-0020 — SQL Injection in node-express/routes/orders.js:17
|
|
688
|
+
|
|
689
|
+
- **Severity / confidence:** critical / high
|
|
690
|
+
- **Status:** confirmed
|
|
691
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
692
|
+
- **Endpoint:** - -
|
|
693
|
+
- **Location:** `node-express/routes/orders.js:17`
|
|
694
|
+
|
|
695
|
+
**Evidence.**
|
|
696
|
+
|
|
697
|
+
- `node-express/routes/orders.js:17` — Unsanitized input concatenated into query
|
|
698
|
+
`db.query("SELECT * FROM reports WHERE month = '" + req.query.month + "'", function (e, rows) { res.json(rows); });`
|
|
699
|
+
|
|
700
|
+
**Recommendation.** Use parameterized queries or query builders; avoid string concatenation
|
|
701
|
+
|
|
702
|
+
*Verifier:* confirmed — checked: node-express/routes/orders.js:17. The query concatenates user input directly into the SQL string with no sanitization, casting, or parameter binding. No ownership or role check is present on this route.
|
|
703
|
+
|
|
704
|
+
### INJ-I-0021 — SQL Injection in node-express/routes/orders.js:29
|
|
705
|
+
|
|
706
|
+
- **Severity / confidence:** critical / high
|
|
707
|
+
- **Status:** confirmed
|
|
708
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
709
|
+
- **Endpoint:** - -
|
|
710
|
+
- **Location:** `node-express/routes/orders.js:29`
|
|
711
|
+
|
|
712
|
+
**Evidence.**
|
|
713
|
+
|
|
714
|
+
- `node-express/routes/orders.js:29` — Unsanitized input concatenated into query
|
|
715
|
+
`db.query('SELECT COUNT(*) AS n FROM orders WHERE shop_id = ${req.query.shop}', function (e, r) { res.json(r); });`
|
|
716
|
+
|
|
717
|
+
**Recommendation.** Use parameterized queries or query builders; avoid string concatenation
|
|
718
|
+
|
|
719
|
+
*Verifier:* confirmed — checked: node-express/routes/orders.js:29. The query interpolates req.query.shop directly into the SQL string. No cast, binding, or authorization guard is visible.
|
|
720
|
+
|
|
721
|
+
### INJ-I-0022 — NoSQL Injection in node-express/routes/orders.js:21
|
|
722
|
+
|
|
723
|
+
- **Severity / confidence:** critical / high
|
|
724
|
+
- **Status:** confirmed
|
|
725
|
+
- **Category:** nosql_injection (string_concatenation) — CWE-89
|
|
726
|
+
- **Endpoint:** - -
|
|
727
|
+
- **Location:** `node-express/routes/orders.js:21`
|
|
728
|
+
|
|
729
|
+
**Evidence.**
|
|
730
|
+
|
|
731
|
+
- `node-express/routes/orders.js:21` — Unsanitized request body used directly as query filter
|
|
732
|
+
`db.collection('users').findOne(req.body, function (e, u) { res.json(!!u); });`
|
|
733
|
+
|
|
734
|
+
**Recommendation.** Validate and sanitize query objects; avoid passing raw request bodies to database
|
|
735
|
+
|
|
736
|
+
*Verifier:* confirmed — checked: node-express/routes/orders.js:21. The request body is passed directly to findOne without validation or sanitization. No role or ownership check is present.
|
|
737
|
+
|
|
738
|
+
### INJ-I-0023 — NoSQL Injection in node-express/routes/orders.js:25
|
|
739
|
+
|
|
740
|
+
- **Severity / confidence:** critical / high
|
|
741
|
+
- **Status:** confirmed
|
|
742
|
+
- **Category:** nosql_injection (string_concatenation) — CWE-89
|
|
743
|
+
- **Endpoint:** - -
|
|
744
|
+
- **Location:** `node-express/routes/orders.js:25`
|
|
745
|
+
|
|
746
|
+
**Evidence.**
|
|
747
|
+
|
|
748
|
+
- `node-express/routes/orders.js:25` — Unsanitized input concatenated into $where string
|
|
749
|
+
`db.collection('items').find({ $where: "this.name == '" + req.query.n + "'" }).toArray(function (e, r) { res.json(r); });`
|
|
750
|
+
|
|
751
|
+
**Recommendation.** Avoid $where with user input; use parameterized queries or safe query operators
|
|
752
|
+
|
|
753
|
+
*Verifier:* confirmed — checked: node-express/routes/orders.js:25. The $where string concatenates user input directly, enabling NoSQL injection. No validation or authorization guard is visible.
|
|
754
|
+
|
|
755
|
+
### INJ-I-0024 — SQL Injection in perl-cgi/cgi-bin/order.cgi:13
|
|
756
|
+
|
|
757
|
+
- **Severity / confidence:** critical / high
|
|
758
|
+
- **Status:** confirmed
|
|
759
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
760
|
+
- **Endpoint:** - -
|
|
761
|
+
- **Location:** `perl-cgi/cgi-bin/order.cgi:13`
|
|
762
|
+
|
|
763
|
+
**Evidence.**
|
|
764
|
+
|
|
765
|
+
- `perl-cgi/cgi-bin/order.cgi:13` — Unsanitized input concatenated into query
|
|
766
|
+
`$dbh->prepare("SELECT * FROM orders WHERE id = $id");`
|
|
767
|
+
|
|
768
|
+
**Recommendation.** Use placeholders and bind parameters; avoid string interpolation
|
|
769
|
+
|
|
770
|
+
*Verifier:* confirmed — checked: perl-cgi/cgi-bin/order.cgi:13. The prepared statement interpolates $id directly into the SQL string. No parameter binding or sanitization is used. The later safe query does not mitigate this earlier vulnerability.
|
|
771
|
+
|
|
772
|
+
### INJ-I-0025 — SQL Injection in perl-cgi/cgi-bin/order.cgi:19
|
|
773
|
+
|
|
774
|
+
- **Severity / confidence:** critical / high
|
|
775
|
+
- **Status:** confirmed
|
|
776
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
777
|
+
- **Endpoint:** - -
|
|
778
|
+
- **Location:** `perl-cgi/cgi-bin/order.cgi:19`
|
|
779
|
+
|
|
780
|
+
**Evidence.**
|
|
781
|
+
|
|
782
|
+
- `perl-cgi/cgi-bin/order.cgi:19` — Unsanitized input concatenated into query
|
|
783
|
+
`$dbh->do("DELETE FROM carts WHERE cart_id = " . $q->param('cart'));`
|
|
784
|
+
|
|
785
|
+
**Recommendation.** Use placeholders and bind parameters; avoid string concatenation
|
|
786
|
+
|
|
787
|
+
*Verifier:* confirmed — checked: perl-cgi/cgi-bin/order.cgi:13-19. The DELETE statement concatenates user input directly into the SQL string and no ownership or role check is present in the visible code.
|
|
788
|
+
|
|
789
|
+
### INJ-I-0026 — SQL Injection in php-codeigniter/application/controllers/Invoice.php:10
|
|
790
|
+
|
|
791
|
+
- **Severity / confidence:** critical / medium
|
|
792
|
+
- **Status:** likely
|
|
793
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
794
|
+
- **Endpoint:** - -
|
|
795
|
+
- **Location:** `php-codeigniter/application/controllers/Invoice.php:10`
|
|
796
|
+
|
|
797
|
+
**Evidence.**
|
|
798
|
+
|
|
799
|
+
- `php-codeigniter/application/controllers/Invoice.php:10` — Unsanitized URL segment concatenated into query
|
|
800
|
+
`$q = $this->db->query("SELECT * FROM invoices WHERE id = $id");`
|
|
801
|
+
|
|
802
|
+
**Recommendation.** Use parameterized queries or escape the input before concatenation
|
|
803
|
+
|
|
804
|
+
*Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:10. The `view` method concatenates the `$id` variable directly into the query. No parameter binding, cast, or ownership check is present in the snippet.
|
|
805
|
+
|
|
806
|
+
### INJ-I-0027 — SQL Injection in php-plain/admin.php:12
|
|
807
|
+
|
|
808
|
+
- **Severity / confidence:** critical / high
|
|
809
|
+
- **Status:** confirmed
|
|
810
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
811
|
+
- **Endpoint:** - -
|
|
812
|
+
- **Location:** `php-plain/admin.php:8`
|
|
813
|
+
|
|
814
|
+
**Evidence.**
|
|
815
|
+
|
|
816
|
+
- `php-plain/admin.php:12` — Unsanitized input concatenated into query
|
|
817
|
+
`mysql_query("DELETE FROM users WHERE id = $id");`
|
|
818
|
+
|
|
819
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
820
|
+
|
|
821
|
+
*Verifier:* confirmed — checked: php-plain/admin.php:10-12, php-plain/inc/auth.php:1-7, php-plain/inc/db.php:1-4. The DELETE query uses unsanitized POST data and the included auth file only verifies login, not ownership or role.
|
|
822
|
+
|
|
823
|
+
### INJ-I-0028 — SQL Injection in php-plain/admin.php:12
|
|
824
|
+
|
|
825
|
+
- **Severity / confidence:** critical / high
|
|
826
|
+
- **Status:** confirmed
|
|
827
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
828
|
+
- **Endpoint:** - -
|
|
829
|
+
- **Location:** `php-plain/admin.php:12`
|
|
830
|
+
|
|
831
|
+
**Evidence.**
|
|
832
|
+
|
|
833
|
+
- `php-plain/admin.php:12` — Unsanitized input concatenated into query
|
|
834
|
+
`mysql_query("DELETE FROM users WHERE id = $id");`
|
|
835
|
+
|
|
836
|
+
**Recommendation.** Use parameterized queries or prepared statements; avoid string concatenation
|
|
837
|
+
|
|
838
|
+
*Verifier:* confirmed — checked: php-plain/admin.php:10-12, php-plain/inc/auth.php:1-7, php-plain/inc/db.php:1-4. Same as INJ-I-0027; no compensating control is visible.
|
|
839
|
+
|
|
840
|
+
### INJ-I-0029 — NoSQL Injection in php-plain/mongo_find.php:6
|
|
841
|
+
|
|
842
|
+
- **Severity / confidence:** critical / high
|
|
843
|
+
- **Status:** confirmed
|
|
844
|
+
- **Category:** nosql_injection (string_concatenation) — CWE-89
|
|
845
|
+
- **Endpoint:** - -
|
|
846
|
+
- **Location:** `php-plain/mongo_find.php:5`
|
|
847
|
+
|
|
848
|
+
**Evidence.**
|
|
849
|
+
|
|
850
|
+
- `php-plain/mongo_find.php:6` — Unsanitized input concatenated into $where string
|
|
851
|
+
`$docs = $coll->find(array('$where' => "this.name == '" . $_GET['n'] . "'"));`
|
|
852
|
+
|
|
853
|
+
**Recommendation.** Avoid $where with user input; use safe query operators or parameterized queries
|
|
854
|
+
|
|
855
|
+
*Verifier:* confirmed — checked: php-plain/mongo_find.php:5-6, php-plain/inc/auth.php:1-7. The $where clause concatenates user input; no ownership or role check is present in the visible code.
|
|
856
|
+
|
|
857
|
+
### INJ-I-0030 — NoSQL Injection in php-plain/mongo_find.php:6
|
|
858
|
+
|
|
859
|
+
- **Severity / confidence:** critical / high
|
|
860
|
+
- **Status:** confirmed
|
|
861
|
+
- **Category:** nosql_injection (string_concatenation) — CWE-89
|
|
862
|
+
- **Endpoint:** - -
|
|
863
|
+
- **Location:** `php-plain/mongo_find.php:6`
|
|
864
|
+
|
|
865
|
+
**Evidence.**
|
|
866
|
+
|
|
867
|
+
- `php-plain/mongo_find.php:6` — Unsanitized input concatenated into $where string
|
|
868
|
+
`$docs = $coll->find(array('$where' => "this.name == '" . $_GET['n'] . "'"));`
|
|
869
|
+
|
|
870
|
+
**Recommendation.** Avoid $where with user input; use safe query operators or parameterized queries
|
|
871
|
+
|
|
872
|
+
*Verifier:* confirmed — checked: php-plain/mongo_find.php:5-6, php-plain/inc/auth.php:1-7. Same as INJ-I-0029; no compensating control is visible.
|
|
873
|
+
|
|
874
|
+
### INJ-I-0031 — SQL Injection in php-plain/order_detail.php:6
|
|
875
|
+
|
|
876
|
+
- **Severity / confidence:** critical / high
|
|
877
|
+
- **Status:** confirmed
|
|
878
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
879
|
+
- **Endpoint:** - -
|
|
880
|
+
- **Location:** `php-plain/order_detail.php:6`
|
|
881
|
+
|
|
882
|
+
**Evidence.**
|
|
883
|
+
|
|
884
|
+
- `php-plain/order_detail.php:5` — Unsanitized GET parameter
|
|
885
|
+
`$id = $_GET['id'];`
|
|
886
|
+
- `php-plain/order_detail.php:6` — Unsanitized input concatenated into query
|
|
887
|
+
`$res = mysql_query("SELECT * FROM orders WHERE id = " . $id);`
|
|
888
|
+
|
|
889
|
+
**Recommendation.** Use a prepared statement with bound parameters instead of string concatenation
|
|
890
|
+
|
|
891
|
+
*Verifier:* confirmed — checked: php-plain/order_detail.php:5-6, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The GET parameter is concatenated directly into a mysql_query without any sanitization, casting, or prepared statement. No ownership or role check is present.
|
|
892
|
+
|
|
893
|
+
### INJ-I-0032 — SQL Injection in php-plain/search.php:8
|
|
894
|
+
|
|
895
|
+
- **Severity / confidence:** critical / high
|
|
896
|
+
- **Status:** confirmed
|
|
897
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
898
|
+
- **Endpoint:** - -
|
|
899
|
+
- **Location:** `php-plain/search.php:8`
|
|
900
|
+
|
|
901
|
+
**Evidence.**
|
|
902
|
+
|
|
903
|
+
- `php-plain/search.php:6` — Unsanitized GET parameter
|
|
904
|
+
`$sort = $_GET['sort'];`
|
|
905
|
+
- `php-plain/search.php:9` — Unsanitized input concatenated into ORDER BY clause
|
|
906
|
+
`$sql .= " ORDER BY " . $sort;`
|
|
907
|
+
|
|
908
|
+
**Recommendation.** Validate ORDER BY values against an allow‑list or use parameterized queries
|
|
909
|
+
|
|
910
|
+
*Verifier:* confirmed — checked: php-plain/search.php:6-9, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The ORDER BY clause is built from an unsanitized GET parameter with no allow‑list or integer cast. No ownership or role check is present.
|
|
911
|
+
|
|
912
|
+
### INJ-I-0033 — SQL Injection in php-plain/search.php:9
|
|
913
|
+
|
|
914
|
+
- **Severity / confidence:** critical / high
|
|
915
|
+
- **Status:** confirmed
|
|
916
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
917
|
+
- **Endpoint:** - -
|
|
918
|
+
- **Location:** `php-plain/search.php:9`
|
|
919
|
+
|
|
920
|
+
**Evidence.**
|
|
921
|
+
|
|
922
|
+
- `php-plain/search.php:6` — Unsanitized GET parameter
|
|
923
|
+
`$sort = $_GET['sort'];`
|
|
924
|
+
- `php-plain/search.php:9` — Unsanitized input concatenated into ORDER BY clause
|
|
925
|
+
`$sql .= " ORDER BY " . $sort;`
|
|
926
|
+
|
|
927
|
+
**Recommendation.** Validate ORDER BY values against an allow‑list or use parameterized queries
|
|
928
|
+
|
|
929
|
+
*Verifier:* confirmed — checked: php-plain/search.php:6-9, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. Same as INJ-I-0032: unsanitized ORDER BY input with no guard.
|
|
930
|
+
|
|
931
|
+
### INJ-I-0034 — SQL Injection in php-plain/search.php:14
|
|
932
|
+
|
|
933
|
+
- **Severity / confidence:** critical / high
|
|
934
|
+
- **Status:** confirmed
|
|
935
|
+
- **Category:** sql_injection (string_concatenation) — CWE-89
|
|
936
|
+
- **Endpoint:** - -
|
|
937
|
+
- **Location:** `php-plain/search.php:14`
|
|
938
|
+
|
|
939
|
+
**Evidence.**
|
|
940
|
+
|
|
941
|
+
- `php-plain/search.php:13` — Unsanitized GET parameter interpolated into query
|
|
942
|
+
`$q = <<<SQL
|
|
943
|
+
SELECT * FROM products
|
|
944
|
+
WHERE category = '{$_GET['cat']}'
|
|
945
|
+
SQL;`
|
|
946
|
+
|
|
947
|
+
**Recommendation.** Use parameterized queries or escape the input before interpolation
|
|
948
|
+
|
|
949
|
+
*Verifier:* confirmed — checked: php-plain/search.php:13-15, php-plain/inc/auth.php:3-6, php-plain/inc/db.php:1-4. The heredoc interpolates a GET parameter directly into the SQL string. No escaping or parameterization is used.
|
|
950
|
+
|
|
951
|
+
### INJ-I-0036 — SQL Injection in python-flask/app.py:29
|
|
952
|
+
|
|
953
|
+
- **Severity / confidence:** critical / high
|
|
954
|
+
- **Status:** confirmed
|
|
955
|
+
- **Category:** sql_injection (string_interpolation) — CWE-89
|
|
956
|
+
- **Endpoint:** - -
|
|
957
|
+
- **Location:** `python-flask/app.py:29`
|
|
958
|
+
|
|
959
|
+
**Evidence.**
|
|
960
|
+
|
|
961
|
+
- `python-flask/app.py:29` — Unsanitized f-string interpolation into query
|
|
962
|
+
`cur.execute(f"SELECT * FROM products WHERE name LIKE '%{q}%'")`
|
|
963
|
+
|
|
964
|
+
**Recommendation.** Use a parameterized query instead of f-string interpolation
|
|
965
|
+
|
|
966
|
+
*Verifier:* confirmed — checked: python-flask/app.py:24-30, python-flask/app.py:10-20. The search route uses an f‑string to build a query with user input. No parameter binding or sanitization is performed, and no ownership check is present.
|
|
967
|
+
|
|
968
|
+
### INJ-I-0037 — SQL Injection in sql-procs/sp_search_orders.sql:5
|
|
969
|
+
|
|
970
|
+
- **Severity / confidence:** critical / medium
|
|
971
|
+
- **Status:** likely
|
|
972
|
+
- **Category:** sql_injection (stored_procedure_dynamic_sql) — CWE-89
|
|
973
|
+
- **Endpoint:** - -
|
|
974
|
+
- **Location:** `sql-procs/sp_search_orders.sql:5`
|
|
975
|
+
|
|
976
|
+
**Evidence.**
|
|
977
|
+
|
|
978
|
+
- `sql-procs/sp_search_orders.sql:5` — Dynamic SQL built from user‑supplied parameters without sanitization
|
|
979
|
+
`SET @sql = 'SELECT * FROM Orders WHERE Customer = ''' + @Customer + ''' ORDER BY ' + @Sort`
|
|
980
|
+
|
|
981
|
+
**Recommendation.** Avoid dynamic SQL; use parameterized queries or validate the parameters
|
|
982
|
+
|
|
983
|
+
*Verifier:* likely — checked: sql-procs/sp_search_orders.sql line 5. The stored procedure builds dynamic SQL from @Customer and @Sort without any visible sanitization or allow‑list. No ownership or role check is present in the provided code.
|
|
984
|
+
|
|
985
|
+
### INJ-I-0038 — SQL Injection in sql-procs/sp_search_orders.sql:6
|
|
986
|
+
|
|
987
|
+
- **Severity / confidence:** critical / medium
|
|
988
|
+
- **Status:** likely
|
|
989
|
+
- **Category:** sql_injection (stored_procedure_dynamic_sql) — CWE-89
|
|
990
|
+
- **Endpoint:** - -
|
|
991
|
+
- **Location:** `sql-procs/sp_search_orders.sql:6`
|
|
992
|
+
|
|
993
|
+
**Evidence.**
|
|
994
|
+
|
|
995
|
+
- `sql-procs/sp_search_orders.sql:6` — Execution of unsanitized dynamic SQL
|
|
996
|
+
`EXEC(@sql)`
|
|
997
|
+
|
|
998
|
+
**Recommendation.** Avoid dynamic SQL; use parameterized queries or validate the parameters
|
|
999
|
+
|
|
1000
|
+
*Verifier:* likely — checked: sql-procs/sp_search_orders.sql line 6. Execution of the unsanitized @sql string is shown, but no control is visible in the snippet.
|
|
1001
|
+
|
|
1002
|
+
### MASS-M-0003-1 — Unrestricted binding of Account object in Spring MVC
|
|
1003
|
+
|
|
1004
|
+
- **Severity / confidence:** critical / high
|
|
1005
|
+
- **Status:** confirmed
|
|
1006
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1007
|
+
- **Endpoint:** - -
|
|
1008
|
+
- **Location:** `java-legacy/src/com/acme/web/AccountController.java:14`
|
|
1009
|
+
|
|
1010
|
+
**Impact.** role, balance
|
|
1011
|
+
|
|
1012
|
+
**Evidence.**
|
|
1013
|
+
|
|
1014
|
+
- `java-legacy/src/com/acme/web/AccountController.java:27` — accountDao.save(account) with whole object binding, no allowlist
|
|
1015
|
+
|
|
1016
|
+
**Recommendation.** Use a DTO or explicit property copying to prevent privileged field updates
|
|
1017
|
+
|
|
1018
|
+
*Verifier:* confirmed — checked: java-legacy/src/com/acme/web/AccountController.java:1-30. The controller accepts a full Account model from the request and persists it directly. No role check or property allow‑list is present.
|
|
1019
|
+
|
|
1020
|
+
### MASS-M-0004-1 — Unrestricted binding of Account object in Spring MVC
|
|
1021
|
+
|
|
1022
|
+
- **Severity / confidence:** critical / medium
|
|
1023
|
+
- **Status:** likely
|
|
1024
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1025
|
+
- **Endpoint:** - -
|
|
1026
|
+
- **Location:** `java-legacy/src/com/acme/web/AccountController.java:27`
|
|
1027
|
+
|
|
1028
|
+
**Impact.** role, balance
|
|
1029
|
+
|
|
1030
|
+
**Evidence.**
|
|
1031
|
+
|
|
1032
|
+
- `java-legacy/src/com/acme/web/AccountController.java:27` — accountDao.save(account) with whole object binding, no allowlist
|
|
1033
|
+
|
|
1034
|
+
**Recommendation.** Use a DTO or explicit property copying to prevent privileged field updates
|
|
1035
|
+
|
|
1036
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java:13-15. The controller binds the entire Account object via @ModelAttribute and persists it without any visible ownership or role check, nor an allow‑list. No global filter or configuration is shown in the provided context.
|
|
1037
|
+
|
|
1038
|
+
### MASS-M-0005-1 — Unrestricted binding of Account object via BeanUtils in Java servlet
|
|
1039
|
+
|
|
1040
|
+
- **Severity / confidence:** critical / medium
|
|
1041
|
+
- **Status:** likely
|
|
1042
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1043
|
+
- **Endpoint:** - -
|
|
1044
|
+
- **Location:** `java-legacy/src/com/acme/web/ProfileServlet.java:12`
|
|
1045
|
+
|
|
1046
|
+
**Impact.** role, balance
|
|
1047
|
+
|
|
1048
|
+
**Evidence.**
|
|
1049
|
+
|
|
1050
|
+
- `java-legacy/src/com/acme/web/ProfileServlet.java:12` — BeanUtils.populate(account, request.getParameterMap()) binds all request parameters
|
|
1051
|
+
|
|
1052
|
+
**Recommendation.** Use explicit property setting or an allowlist to prevent privileged field updates
|
|
1053
|
+
|
|
1054
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/ProfileServlet.java:10-13. BeanUtils.populate() binds all request parameters to the Account object with no visible filtering or ownership enforcement in the snippet.
|
|
1055
|
+
|
|
1056
|
+
### BOLA-R-0001 — BOLA in POST /user/edit.do: missing owner verification
|
|
1057
|
+
|
|
1058
|
+
- **Severity / confidence:** high / medium
|
|
1059
|
+
- **Status:** likely
|
|
1060
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1061
|
+
- **Endpoint:** ANY /user/edit.do
|
|
1062
|
+
- **Location:** `java-legacy/src/com/acme/struts/EditUserAction.java:10`
|
|
1063
|
+
|
|
1064
|
+
**Evidence.**
|
|
1065
|
+
|
|
1066
|
+
- `java-legacy/src/com/acme/struts/EditUserAction.java:10` — The user_id comes from the request and is used directly in the UPDATE without verifying that the target user belongs to the current session user.
|
|
1067
|
+
`String userId = request.getParameter("user_id");
|
|
1068
|
+
String email = request.getParameter("email");
|
|
1069
|
+
Connection conn = DataSourceHolder.get().getConnection();
|
|
1070
|
+
PreparedStatement ps = conn.prepareStatement("UPDATE users SET email = '" + email + "' WHERE id = " + userId);
|
|
1071
|
+
ps.executeUpdate();`
|
|
1072
|
+
|
|
1073
|
+
**Recommendation.** Add an ownership check that ensures the user_id belongs to the current session user before performing the UPDATE.
|
|
1074
|
+
|
|
1075
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/struts/EditUserAction.java lines 10-14. The user_id from the request is used directly in an UPDATE statement without any ownership verification or parameter binding.
|
|
1076
|
+
|
|
1077
|
+
### BOLA-R-0002 — BOLA in GET /classic-asp/shop/member.asp?mode=edit: missing owner verification
|
|
1078
|
+
|
|
1079
|
+
- **Severity / confidence:** high / medium
|
|
1080
|
+
- **Status:** likely
|
|
1081
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1082
|
+
- **Endpoint:** ANY /classic-asp/shop/member.asp?mode=edit
|
|
1083
|
+
- **Location:** `classic-asp/shop/member.asp:6`
|
|
1084
|
+
|
|
1085
|
+
**Evidence.**
|
|
1086
|
+
|
|
1087
|
+
- `classic-asp/shop/member.asp:6` — member_id comes from the request form and is used directly in the UPDATE without checking that the member belongs to the current session user.
|
|
1088
|
+
`sql = "UPDATE members SET name = '" & Replace(Request.Form("name"), "'", "''") & "'"
|
|
1089
|
+
sql = sql & " WHERE member_id = " & Request.Form("member_id")`
|
|
1090
|
+
|
|
1091
|
+
**Recommendation.** Add an ownership check that ensures the member_id belongs to the current user before performing the UPDATE.
|
|
1092
|
+
|
|
1093
|
+
*Verifier:* likely — checked: classic-asp/shop/member.asp:6-8, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The UPDATE statement uses Request.Form("member_id") directly without any ownership check or parameter binding. No role or ownership helper is invoked in the visible code.
|
|
1094
|
+
|
|
1095
|
+
### BOLA-R-0003 — BOLA in GET /classic-asp/shop/member.asp?mode=delete: missing owner verification
|
|
1096
|
+
|
|
1097
|
+
- **Severity / confidence:** high / medium
|
|
1098
|
+
- **Status:** likely
|
|
1099
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1100
|
+
- **Endpoint:** ANY /classic-asp/shop/member.asp?mode=delete
|
|
1101
|
+
- **Location:** `classic-asp/shop/member.asp:10`
|
|
1102
|
+
|
|
1103
|
+
**Evidence.**
|
|
1104
|
+
|
|
1105
|
+
- `classic-asp/shop/member.asp:10` — member_id comes from the query string and is used directly in the DELETE without verifying ownership.
|
|
1106
|
+
`conn.Execute "DELETE FROM members WHERE member_id = " & Request.QueryString("member_id")`
|
|
1107
|
+
|
|
1108
|
+
**Recommendation.** Add an ownership check that ensures the member_id belongs to the current user before performing the DELETE.
|
|
1109
|
+
|
|
1110
|
+
*Verifier:* likely — checked: classic-asp/shop/member.asp:9-11, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The DELETE statement concatenates Request.QueryString("member_id") directly. No ownership verification is present in the shown code.
|
|
1111
|
+
|
|
1112
|
+
### BOLA-R-0004 — BOLA in GET /classic-asp/shop/order.asp: missing owner verification
|
|
1113
|
+
|
|
1114
|
+
- **Severity / confidence:** high / medium
|
|
1115
|
+
- **Status:** likely
|
|
1116
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1117
|
+
- **Endpoint:** ANY /classic-asp/shop/order.asp
|
|
1118
|
+
- **Location:** `classic-asp/shop/order.asp:5`
|
|
1119
|
+
|
|
1120
|
+
**Evidence.**
|
|
1121
|
+
|
|
1122
|
+
- `classic-asp/shop/order.asp:5` — The order id is taken from the request and the order is fetched without scoping to the current user.
|
|
1123
|
+
`id = Request("id")
|
|
1124
|
+
Set rs = conn.Execute("SELECT * FROM orders WHERE id = " & id)
|
|
1125
|
+
Response.Write Server.HTMLEncode(rs("address"))`
|
|
1126
|
+
|
|
1127
|
+
**Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
|
|
1128
|
+
|
|
1129
|
+
*Verifier:* likely — checked: classic-asp/shop/order.asp:5-7, classic-asp/shop/order.asp:12-13, classic-asp/shop/inc/auth.asp:1-3, classic-asp/shop/inc/conn.asp:1-4. The first SELECT retrieves the order by id without scoping to the current user and its result is output. The later scoped query is not used for output.
|
|
1130
|
+
|
|
1131
|
+
### BOLA-R-0005 — BOLA in GET /coldfusion/app/OrderService.cfc?method=getOrder: missing owner verification
|
|
1132
|
+
|
|
1133
|
+
- **Severity / confidence:** high / medium
|
|
1134
|
+
- **Status:** likely
|
|
1135
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1136
|
+
- **Endpoint:** ANY /coldfusion/app/OrderService.cfc?method=getOrder
|
|
1137
|
+
- **Location:** `coldfusion/app/OrderService.cfc:4`
|
|
1138
|
+
|
|
1139
|
+
**Evidence.**
|
|
1140
|
+
|
|
1141
|
+
- `coldfusion/app/OrderService.cfc:4` — The order id is taken from the request argument and the query is executed without scoping to the current user.
|
|
1142
|
+
`<cfquery name="q" datasource="shop">
|
|
1143
|
+
SELECT * FROM orders WHERE id = #arguments.orderId#
|
|
1144
|
+
</cfquery>`
|
|
1145
|
+
|
|
1146
|
+
**Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
|
|
1147
|
+
|
|
1148
|
+
*Verifier:* likely — checked: coldfusion/app/OrderService.cfc:4-6. The query interpolates #arguments.orderId# directly. No ownership check or parameter binding is visible.
|
|
1149
|
+
|
|
1150
|
+
### BOLA-R-0006 — BOLA in GET /coldfusion/app/order.cfm: missing owner verification
|
|
1151
|
+
|
|
1152
|
+
- **Severity / confidence:** high / medium
|
|
1153
|
+
- **Status:** likely
|
|
1154
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1155
|
+
- **Endpoint:** ANY /coldfusion/app/order.cfm
|
|
1156
|
+
- **Location:** `coldfusion/app/order.cfm:2`
|
|
1157
|
+
|
|
1158
|
+
**Evidence.**
|
|
1159
|
+
|
|
1160
|
+
- `coldfusion/app/order.cfm:2` — The order id is taken from the URL and the query is executed without scoping to the current user.
|
|
1161
|
+
`<cfquery name="qOrder" datasource="shop">
|
|
1162
|
+
SELECT * FROM orders WHERE id = #url.id#
|
|
1163
|
+
</cfquery>`
|
|
1164
|
+
|
|
1165
|
+
**Recommendation.** Add a WHERE clause that binds the order id to the current session user before returning data.
|
|
1166
|
+
|
|
1167
|
+
*Verifier:* likely — checked: coldfusion/app/order.cfm:2-4, coldfusion/app/order.cfm:5-9. The unscoped query qOrder uses #url.id# and its result is displayed. The scoped query qMine is not used for output.
|
|
1168
|
+
|
|
1169
|
+
### BOLA-R-0007 — BOLA in POST /Admin/DeleteUser: missing owner verification
|
|
1170
|
+
|
|
1171
|
+
- **Severity / confidence:** high / medium
|
|
1172
|
+
- **Status:** likely
|
|
1173
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1174
|
+
- **Endpoint:** POST /Admin/DeleteUser
|
|
1175
|
+
- **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:12`
|
|
1176
|
+
|
|
1177
|
+
**Evidence.**
|
|
1178
|
+
|
|
1179
|
+
- `dotnet-legacy/Web/Controllers/AdminController.cs:12` — Any authenticated user can delete any user because there is no ownership or role check.
|
|
1180
|
+
`public ActionResult DeleteUser(int id)
|
|
1181
|
+
{
|
|
1182
|
+
var u = db.Users.Find(id);
|
|
1183
|
+
db.Users.Remove(u);
|
|
1184
|
+
db.SaveChanges();
|
|
1185
|
+
return RedirectToAction("Index");
|
|
1186
|
+
}`
|
|
1187
|
+
|
|
1188
|
+
**Recommendation.** Restrict this action to administrators only or add an ownership check that ensures the target user is not the current user.
|
|
1189
|
+
|
|
1190
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 6-12. The controller is marked with [Authorize] but no role or ownership check is visible in the provided code. The absence of a role check is not confirmed, so the finding is likely.
|
|
1191
|
+
|
|
1192
|
+
### BOLA-R-0009 — BOLA in GET /Admin/Export: missing owner verification
|
|
1193
|
+
|
|
1194
|
+
- **Severity / confidence:** high / medium
|
|
1195
|
+
- **Status:** likely
|
|
1196
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1197
|
+
- **Endpoint:** POST /Admin/Export
|
|
1198
|
+
- **Location:** `dotnet-legacy/Web/Controllers/AdminController.cs:32`
|
|
1199
|
+
|
|
1200
|
+
**Evidence.**
|
|
1201
|
+
|
|
1202
|
+
- `dotnet-legacy/Web/Controllers/AdminController.cs:32` — The endpoint is not protected by a role check; any authenticated user can retrieve all users by setting isAdmin=true.
|
|
1203
|
+
`if (Request.QueryString["isAdmin"] == "true")
|
|
1204
|
+
{
|
|
1205
|
+
return Json(db.Users.ToList(), JsonRequestBehavior.AllowGet);
|
|
1206
|
+
}`
|
|
1207
|
+
|
|
1208
|
+
**Recommendation.** Add an [Authorize(Roles="Admin")] attribute or remove the isAdmin query parameter and enforce role checks server‑side.
|
|
1209
|
+
|
|
1210
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/AdminController.cs lines 30-36. The Export action relies solely on a query‑string flag and lacks any role or ownership guard in the visible code.
|
|
1211
|
+
|
|
1212
|
+
### BOLA-R-0010 — BOLA in POST /Customer/Edit: missing owner verification
|
|
1213
|
+
|
|
1214
|
+
- **Severity / confidence:** high / medium
|
|
1215
|
+
- **Status:** likely
|
|
1216
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1217
|
+
- **Endpoint:** POST /Customer/Edit
|
|
1218
|
+
- **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:12`
|
|
1219
|
+
|
|
1220
|
+
**Evidence.**
|
|
1221
|
+
|
|
1222
|
+
- `dotnet-legacy/Web/Controllers/CustomerController.cs:14` — Marks the supplied customer entity as modified without checking that the current user owns it
|
|
1223
|
+
`db.Entry(customer).State = System.Data.Entity.EntityState.Modified;`
|
|
1224
|
+
|
|
1225
|
+
**Recommendation.** Ensure the current user is the owner of the customer before applying changes
|
|
1226
|
+
|
|
1227
|
+
*Verifier:* likely — checked: Reviewed CustomerController.cs lines 11-16. No ownership check, cast, or allow‑list is visible in the method body.
|
|
1228
|
+
|
|
1229
|
+
### BOLA-R-0011 — BOLA in POST /Customer/EditName: missing owner verification
|
|
1230
|
+
|
|
1231
|
+
- **Severity / confidence:** high / medium
|
|
1232
|
+
- **Status:** likely
|
|
1233
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1234
|
+
- **Endpoint:** POST /Customer/EditName
|
|
1235
|
+
- **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:20`
|
|
1236
|
+
|
|
1237
|
+
**Evidence.**
|
|
1238
|
+
|
|
1239
|
+
- `dotnet-legacy/Web/Controllers/CustomerController.cs:22` — Saves the customer entity without verifying that the current user owns it
|
|
1240
|
+
`db.SaveChanges();`
|
|
1241
|
+
|
|
1242
|
+
**Recommendation.** Add an ownership check before saving the customer entity
|
|
1243
|
+
|
|
1244
|
+
*Verifier:* likely — checked: Reviewed CustomerController.cs lines 20-23. The method only calls SaveChanges(); no ownership verification is shown.
|
|
1245
|
+
|
|
1246
|
+
### BOLA-R-0012 — BOLA in POST /Customer/Refresh: missing owner verification
|
|
1247
|
+
|
|
1248
|
+
- **Severity / confidence:** high / medium
|
|
1249
|
+
- **Status:** likely
|
|
1250
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1251
|
+
- **Endpoint:** POST /Customer/Refresh
|
|
1252
|
+
- **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:27`
|
|
1253
|
+
|
|
1254
|
+
**Evidence.**
|
|
1255
|
+
|
|
1256
|
+
- `dotnet-legacy/Web/Controllers/CustomerController.cs:29` — Loads a customer by ID without checking that the current user owns it
|
|
1257
|
+
`var customer = db.Customers.Find(id);`
|
|
1258
|
+
|
|
1259
|
+
**Recommendation.** Verify ownership before updating the customer record
|
|
1260
|
+
|
|
1261
|
+
*Verifier:* likely — checked: Reviewed CustomerController.cs lines 27-32. Customer is loaded by id and updated without any ownership check in the visible code.
|
|
1262
|
+
|
|
1263
|
+
### BOLA-R-0013 — BOLA in GET /Invoice/Details: missing owner verification
|
|
1264
|
+
|
|
1265
|
+
- **Severity / confidence:** high / medium
|
|
1266
|
+
- **Status:** likely
|
|
1267
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1268
|
+
- **Endpoint:** ANY /Invoice/Details
|
|
1269
|
+
- **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:11`
|
|
1270
|
+
|
|
1271
|
+
**Evidence.**
|
|
1272
|
+
|
|
1273
|
+
- `dotnet-legacy/Web/Controllers/InvoiceController.cs:11` — The invoice is fetched by id without scoping to the current user.
|
|
1274
|
+
`public ActionResult Details(int id)
|
|
1275
|
+
{
|
|
1276
|
+
var inv = db.Invoices.Find(id);
|
|
1277
|
+
return View(inv);
|
|
1278
|
+
}`
|
|
1279
|
+
|
|
1280
|
+
**Recommendation.** Add a WHERE clause that binds the invoice id to the current session user before returning data.
|
|
1281
|
+
|
|
1282
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs lines 11-15. Details retrieves an invoice by id without scoping to the current user; no ownership check is shown.
|
|
1283
|
+
|
|
1284
|
+
### BOLA-R-0015 — BOLA in POST /Invoice/Search: missing owner verification
|
|
1285
|
+
|
|
1286
|
+
- **Severity / confidence:** high / medium
|
|
1287
|
+
- **Status:** likely
|
|
1288
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1289
|
+
- **Endpoint:** POST /Invoice/Search
|
|
1290
|
+
- **Location:** `dotnet-legacy/Web/Controllers/InvoiceController.cs:26`
|
|
1291
|
+
|
|
1292
|
+
**Evidence.**
|
|
1293
|
+
|
|
1294
|
+
- `dotnet-legacy/Web/Controllers/InvoiceController.cs:26` — The query is built from user input and returns all invoices for the given customer without scoping to the current user.
|
|
1295
|
+
`public ActionResult Search(string customer)
|
|
1296
|
+
{
|
|
1297
|
+
var list = db.Database.SqlQuery<Invoice>("SELECT * FROM Invoices WHERE Customer = '" + customer + "'").ToList();
|
|
1298
|
+
return View(list);
|
|
1299
|
+
}`
|
|
1300
|
+
|
|
1301
|
+
**Recommendation.** Add a WHERE clause that binds the customer to the current session user or use parameterized queries with ownership checks.
|
|
1302
|
+
|
|
1303
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/InvoiceController.cs lines 26-30. The Search action builds a raw SQL query from user input and does not enforce ownership or parameter binding.
|
|
1304
|
+
|
|
1305
|
+
### BOLA-R-0016 — BOLA in ANY /dotnet-legacy/Web/Handlers/GetFile.ashx: missing owner verification
|
|
1306
|
+
|
|
1307
|
+
- **Severity / confidence:** high / medium
|
|
1308
|
+
- **Status:** likely
|
|
1309
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1310
|
+
- **Endpoint:** ANY /dotnet-legacy/Web/Handlers/GetFile.ashx
|
|
1311
|
+
- **Location:** `dotnet-legacy/Web/Handlers/GetFile.ashx:8`
|
|
1312
|
+
|
|
1313
|
+
**Evidence.**
|
|
1314
|
+
|
|
1315
|
+
- `dotnet-legacy/Web/Handlers/GetFile.ashx:8` — Accepts a file identifier from the request without verifying that the current user owns the file
|
|
1316
|
+
`string fileId = context.Request.QueryString["file_id"];`
|
|
1317
|
+
- `dotnet-legacy/Web/Handlers/GetFile.ashx:10` — Serves the file directly after path resolution, allowing arbitrary file access
|
|
1318
|
+
`context.Response.TransmitFile(path);`
|
|
1319
|
+
|
|
1320
|
+
**Recommendation.** Add an ownership check to ensure the current user is authorized to download the requested file
|
|
1321
|
+
|
|
1322
|
+
*Verifier:* likely — checked: Reviewed GetFile.ashx lines 8-10. File ID is taken directly from the query string and used to transmit a file; no ownership guard is present.
|
|
1323
|
+
|
|
1324
|
+
### BOLA-R-0017 — BOLA in POST /dotnet-legacy/Web/Orders/EditOrder.aspx: missing owner verification
|
|
1325
|
+
|
|
1326
|
+
- **Severity / confidence:** high / medium
|
|
1327
|
+
- **Status:** likely
|
|
1328
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1329
|
+
- **Endpoint:** ANY /dotnet-legacy/Web/Orders/EditOrder.aspx
|
|
1330
|
+
- **Location:** `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7`
|
|
1331
|
+
|
|
1332
|
+
**Evidence.**
|
|
1333
|
+
|
|
1334
|
+
- `dotnet-legacy/Web/Orders/EditOrder.aspx.vb:7` — The OrderId is taken from a hidden field and used directly in the UPDATE without verifying that the order belongs to the current user.
|
|
1335
|
+
`Dim sql As String = "UPDATE Orders SET Note = '" & txtNote.Text & "'"
|
|
1336
|
+
sql &= " WHERE OrderId = " & hfOrderId.Value
|
|
1337
|
+
Using conn As New SqlConnection(ConnStr)
|
|
1338
|
+
Dim cmd As New SqlCommand(sql, conn)
|
|
1339
|
+
conn.Open()
|
|
1340
|
+
cmd.ExecuteNonQuery()
|
|
1341
|
+
End Using`
|
|
1342
|
+
|
|
1343
|
+
**Recommendation.** Add an ownership check that ensures the OrderId belongs to the current session user before executing the UPDATE.
|
|
1344
|
+
|
|
1345
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Orders/EditOrder.aspx.vb lines 7-13. The UPDATE statement uses a hidden field value directly; no ownership verification is visible.
|
|
1346
|
+
|
|
1347
|
+
### BOLA-R-0018 — BOLA in GET /dotnet-legacy/Web/Orders/OrderDetail.aspx: missing owner verification
|
|
1348
|
+
|
|
1349
|
+
- **Severity / confidence:** high / medium
|
|
1350
|
+
- **Status:** likely
|
|
1351
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1352
|
+
- **Endpoint:** ANY /dotnet-legacy/Web/Orders/OrderDetail.aspx
|
|
1353
|
+
- **Location:** `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10`
|
|
1354
|
+
|
|
1355
|
+
**Evidence.**
|
|
1356
|
+
|
|
1357
|
+
- `dotnet-legacy/Web/Orders/OrderDetail.aspx.cs:10` — The first query fetches the order by id without scoping to the current user; the safe query is never used.
|
|
1358
|
+
`string id = Request.QueryString["id"];
|
|
1359
|
+
using (var conn = new SqlConnection(ConnStr))
|
|
1360
|
+
{
|
|
1361
|
+
var cmd = new SqlCommand("SELECT * FROM Orders WHERE OrderId = " + id, conn);
|
|
1362
|
+
conn.Open();
|
|
1363
|
+
var r = cmd.ExecuteReader();
|
|
1364
|
+
var safe = new SqlCommand("SELECT * FROM Orders WHERE OrderId = @id AND UserId = @uid", conn);`
|
|
1365
|
+
|
|
1366
|
+
**Recommendation.** Replace the first query with a query that includes a WHERE clause binding OrderId to the current session user.
|
|
1367
|
+
|
|
1368
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Orders/OrderDetail.aspx.cs lines 10-22. No ownership or role check is visible in the provided code. The first query uses the raw id from the query string without scoping to the current user, and the safe query is never executed.
|
|
1369
|
+
|
|
1370
|
+
### BOLA-R-0019 — BOLA in GET /java-legacy/WebContent/order/detail.jsp: missing owner verification
|
|
1371
|
+
|
|
1372
|
+
- **Severity / confidence:** high / medium
|
|
1373
|
+
- **Status:** likely
|
|
1374
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1375
|
+
- **Endpoint:** ANY /java-legacy/WebContent/order/detail.jsp
|
|
1376
|
+
- **Location:** `java-legacy/WebContent/order/detail.jsp:3`
|
|
1377
|
+
|
|
1378
|
+
**Evidence.**
|
|
1379
|
+
|
|
1380
|
+
- `java-legacy/WebContent/order/detail.jsp:3` — The order number is taken from the request and used directly in the SELECT without scoping to the current user.
|
|
1381
|
+
`String no = request.getParameter("no");
|
|
1382
|
+
Connection c = (Connection) application.getAttribute("conn");
|
|
1383
|
+
ResultSet rs = c.createStatement().executeQuery("SELECT * FROM orders WHERE order_no = '" + no + "'");`
|
|
1384
|
+
|
|
1385
|
+
**Recommendation.** Add a WHERE clause that binds the order number to the current session user before returning data.
|
|
1386
|
+
|
|
1387
|
+
*Verifier:* likely — checked: java-legacy/WebContent/order/detail.jsp lines 1-6. The order number is concatenated directly into the SQL statement with no ownership check or parameter binding shown.
|
|
1388
|
+
|
|
1389
|
+
### BOLA-R-0020 — BOLA in POST /account/save: missing owner verification
|
|
1390
|
+
|
|
1391
|
+
- **Severity / confidence:** high / medium
|
|
1392
|
+
- **Status:** likely
|
|
1393
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1394
|
+
- **Endpoint:** POST /account/save
|
|
1395
|
+
- **Location:** `java-legacy/src/com/acme/web/AccountController.java:13`
|
|
1396
|
+
|
|
1397
|
+
**Evidence.**
|
|
1398
|
+
|
|
1399
|
+
- `java-legacy/src/com/acme/web/AccountController.java:13` — The account ID comes from the request body and is persisted without checking that the current user owns the account.
|
|
1400
|
+
`accountDao.save(account);`
|
|
1401
|
+
|
|
1402
|
+
**Recommendation.** Add an ownership check that the current user owns the account before saving.
|
|
1403
|
+
|
|
1404
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 13-15. The account is saved without checking that the current session user owns the account; no ownership or role check is visible.
|
|
1405
|
+
|
|
1406
|
+
### BOLA-R-0021 — BOLA in POST /account/rename: missing owner verification
|
|
1407
|
+
|
|
1408
|
+
- **Severity / confidence:** high / medium
|
|
1409
|
+
- **Status:** likely
|
|
1410
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1411
|
+
- **Endpoint:** POST /account/rename
|
|
1412
|
+
- **Location:** `java-legacy/src/com/acme/web/AccountController.java:19`
|
|
1413
|
+
|
|
1414
|
+
**Evidence.**
|
|
1415
|
+
|
|
1416
|
+
- `java-legacy/src/com/acme/web/AccountController.java:19` — The account ID is taken from the form and renamed without verifying ownership.
|
|
1417
|
+
`accountDao.rename(form.getId(), form.getName());`
|
|
1418
|
+
|
|
1419
|
+
**Recommendation.** Verify that the current user owns the account before performing the rename.
|
|
1420
|
+
|
|
1421
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 19-21. The rename operation uses the id from the form without verifying ownership or applying a role check.
|
|
1422
|
+
|
|
1423
|
+
### BOLA-R-0022 — BOLA in PUT /account/api: missing owner verification
|
|
1424
|
+
|
|
1425
|
+
- **Severity / confidence:** high / medium
|
|
1426
|
+
- **Status:** likely
|
|
1427
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1428
|
+
- **Endpoint:** PUT /account/api
|
|
1429
|
+
- **Location:** `java-legacy/src/com/acme/web/AccountController.java:25`
|
|
1430
|
+
|
|
1431
|
+
**Evidence.**
|
|
1432
|
+
|
|
1433
|
+
- `java-legacy/src/com/acme/web/AccountController.java:25` — The account ID is supplied in the request body and persisted without checking that the current user owns it.
|
|
1434
|
+
`return accountDao.save(account);`
|
|
1435
|
+
|
|
1436
|
+
**Recommendation.** Add an ownership check before saving the account.
|
|
1437
|
+
|
|
1438
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AccountController.java lines 25-28. No ownership or role check is visible in the update method; the account is persisted directly from the request body.
|
|
1439
|
+
|
|
1440
|
+
### BOLA-R-0023 — BOLA in POST /admin/users/{id}/delete: missing owner verification
|
|
1441
|
+
|
|
1442
|
+
- **Severity / confidence:** high / medium
|
|
1443
|
+
- **Status:** likely
|
|
1444
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1445
|
+
- **Endpoint:** POST /admin/users/{id}/delete
|
|
1446
|
+
- **Location:** `java-legacy/src/com/acme/web/AdminUserController.java:13`
|
|
1447
|
+
|
|
1448
|
+
**Evidence.**
|
|
1449
|
+
|
|
1450
|
+
- `java-legacy/src/com/acme/web/AdminUserController.java:13` — No role or ownership check; any authenticated user can delete any user.
|
|
1451
|
+
`userDao.deleteById(id);`
|
|
1452
|
+
|
|
1453
|
+
**Recommendation.** Require an admin role and verify that the target user is not the current user before deletion.
|
|
1454
|
+
|
|
1455
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/AdminUserController.java lines 13-15. The delete action lacks any @PreAuthorize or explicit ownership check; the only role guard appears on a different method.
|
|
1456
|
+
|
|
1457
|
+
### BOLA-R-0025 — BOLA in GET /invoices/{id}: missing owner verification
|
|
1458
|
+
|
|
1459
|
+
- **Severity / confidence:** high / medium
|
|
1460
|
+
- **Status:** likely
|
|
1461
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1462
|
+
- **Endpoint:** GET /invoices/{id}
|
|
1463
|
+
- **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:15`
|
|
1464
|
+
|
|
1465
|
+
**Evidence.**
|
|
1466
|
+
|
|
1467
|
+
- `java-legacy/src/com/acme/web/InvoiceController.java:15` — The invoice ID is taken from the URL and the invoice is returned without checking that it belongs to the current user.
|
|
1468
|
+
`model.addAttribute("invoice", invoiceDao.findById(id));`
|
|
1469
|
+
|
|
1470
|
+
**Recommendation.** Add an ownership check that the invoice belongs to the current user before returning it.
|
|
1471
|
+
|
|
1472
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/InvoiceController.java lines 15-18. The invoice is retrieved by ID without verifying that it belongs to the current user.
|
|
1473
|
+
|
|
1474
|
+
### BOLA-R-0027 — BOLA in GET /invoices/search: missing owner verification
|
|
1475
|
+
|
|
1476
|
+
- **Severity / confidence:** high / medium
|
|
1477
|
+
- **Status:** likely
|
|
1478
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1479
|
+
- **Endpoint:** GET /invoices/search
|
|
1480
|
+
- **Location:** `java-legacy/src/com/acme/web/InvoiceController.java:27`
|
|
1481
|
+
|
|
1482
|
+
**Evidence.**
|
|
1483
|
+
|
|
1484
|
+
- `java-legacy/src/com/acme/web/InvoiceController.java:27` — The customer value is supplied by the user and the query returns invoices for any customer, exposing all invoices.
|
|
1485
|
+
`session.createQuery("from Invoice i where i.customer = '" + customer + "'").list();`
|
|
1486
|
+
|
|
1487
|
+
**Recommendation.** Restrict the query to invoices owned by the current user or validate the customer against the current user.
|
|
1488
|
+
|
|
1489
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/InvoiceController.java lines 27-30. The search query concatenates user input directly; no ownership filter or parameter binding is present.
|
|
1490
|
+
|
|
1491
|
+
### BOLA-R-0028 — BOLA in GET /order/view: missing owner verification
|
|
1492
|
+
|
|
1493
|
+
- **Severity / confidence:** high / medium
|
|
1494
|
+
- **Status:** likely
|
|
1495
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1496
|
+
- **Endpoint:** GET /order/view
|
|
1497
|
+
- **Location:** `java-legacy/src/com/acme/web/OrderServlet.java:8`
|
|
1498
|
+
|
|
1499
|
+
**Evidence.**
|
|
1500
|
+
|
|
1501
|
+
- `java-legacy/src/com/acme/web/OrderServlet.java:8` — The order ID comes from the request and the order is fetched without verifying that it belongs to the logged‑in user.
|
|
1502
|
+
`ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = '" + id + "'");`
|
|
1503
|
+
|
|
1504
|
+
**Recommendation.** Add an ownership check that the order belongs to the current user before returning it.
|
|
1505
|
+
|
|
1506
|
+
*Verifier:* likely — checked: java-legacy/src/com/acme/web/OrderServlet.java lines 11-15. The order is fetched by ID from the request without any check that the logged‑in user owns it.
|
|
1507
|
+
|
|
1508
|
+
### BOLA-R-0029 — BOLA in POST /ProfileServlet: missing owner verification
|
|
1509
|
+
|
|
1510
|
+
- **Severity / confidence:** high / medium
|
|
1511
|
+
- **Status:** likely
|
|
1512
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1513
|
+
- **Endpoint:** POST <see web.xml servlet-mapping>
|
|
1514
|
+
- **Location:** `java-legacy/src/com/acme/web/ProfileServlet.java:9`
|
|
1515
|
+
|
|
1516
|
+
**Evidence.**
|
|
1517
|
+
|
|
1518
|
+
- `java-legacy/src/com/acme/web/ProfileServlet.java:12` — Populates an Account object from request parameters without checking that the current user owns the account
|
|
1519
|
+
`BeanUtils.populate(account, request.getParameterMap());`
|
|
1520
|
+
|
|
1521
|
+
**Recommendation.** Verify that the current user is authorized to modify the account before persisting changes
|
|
1522
|
+
|
|
1523
|
+
*Verifier:* likely — checked: Reviewed ProfileServlet.java lines 9-13. Account object is populated from request parameters without any ownership validation in the shown code.
|
|
1524
|
+
|
|
1525
|
+
### BOLA-R-0030 — BOLA in POST /admin/users/:id/delete: missing owner verification
|
|
1526
|
+
|
|
1527
|
+
- **Severity / confidence:** high / medium
|
|
1528
|
+
- **Status:** likely
|
|
1529
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1530
|
+
- **Endpoint:** POST /admin/users/:id/delete
|
|
1531
|
+
- **Location:** `node-express/routes/admin.js:8`
|
|
1532
|
+
|
|
1533
|
+
**Evidence.**
|
|
1534
|
+
|
|
1535
|
+
- `node-express/routes/admin.js:8` — Only a logged‑in user is required; no role or ownership check, so any authenticated user can delete any user.
|
|
1536
|
+
`User.deleteOne({ _id: req.params.id }, function () { res.sendStatus(204); });`
|
|
1537
|
+
|
|
1538
|
+
**Recommendation.** Require an admin role and verify that the target user is not the current user before deletion.
|
|
1539
|
+
|
|
1540
|
+
*Verifier:* likely — checked: node-express/routes/admin.js:8-10. The route handler only checks that a user is logged in via `ensureLoggedIn`. No role check (`requireAdmin`) or ownership verification is present in the visible code. Therefore a compensating control is not observable.
|
|
1541
|
+
|
|
1542
|
+
### BOLA-R-0033 — BOLA in GET /orders/:id: missing owner verification
|
|
1543
|
+
|
|
1544
|
+
- **Severity / confidence:** high / medium
|
|
1545
|
+
- **Status:** likely
|
|
1546
|
+
- **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
|
|
1547
|
+
- **Endpoint:** GET /orders/:id
|
|
1548
|
+
- **Location:** `node-express/routes/orders.js:8`
|
|
1549
|
+
|
|
1550
|
+
**Evidence.**
|
|
1551
|
+
|
|
1552
|
+
- `node-express/routes/orders.js:8` — The order ID comes from the request and is used without checking that the order belongs to the authenticated user.
|
|
1553
|
+
`Order.findById(req.params.id, function (err, order) { res.json(order); });`
|
|
1554
|
+
|
|
1555
|
+
**Recommendation.** Add an ownership check by filtering on the authenticated user’s ID or by loading the order and verifying its owner before returning it.
|
|
1556
|
+
|
|
1557
|
+
*Verifier:* likely — checked: node-express/routes/orders.js:8-10. The handler retrieves an order by ID without filtering on the authenticated user. No ownership check or role guard is visible in the provided snippet.
|
|
1558
|
+
|
|
1559
|
+
### BOLA-R-0043 — BOLA in ANY /perl-cgi/cgi-bin/order.cgi: missing owner verification
|
|
1560
|
+
|
|
1561
|
+
- **Severity / confidence:** high / medium
|
|
1562
|
+
- **Status:** likely
|
|
1563
|
+
- **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
|
|
1564
|
+
- **Endpoint:** ANY /perl-cgi/cgi-bin/order.cgi
|
|
1565
|
+
- **Location:** `perl-cgi/cgi-bin/order.cgi:13`
|
|
1566
|
+
|
|
1567
|
+
**Evidence.**
|
|
1568
|
+
|
|
1569
|
+
- `perl-cgi/cgi-bin/order.cgi:13` — The order ID is taken directly from the request and the query does not constrain the result to the authenticated user.
|
|
1570
|
+
`$sth = $dbh->prepare("SELECT * FROM orders WHERE id = $id");`
|
|
1571
|
+
|
|
1572
|
+
**Recommendation.** Modify the query to include a user_id filter or verify the owner after fetching the record.
|
|
1573
|
+
|
|
1574
|
+
*Verifier:* likely — checked: perl-cgi/cgi-bin/order.cgi:13-15. The first prepared statement selects `orders` solely by `id` and is executed immediately. Although a second query later includes `user_id`, the initial query is still vulnerable. No ownership guard is present in the shown code.
|
|
1575
|
+
|
|
1576
|
+
### BOLA-R-0044 — BOLA in ANY /invoice/view/{id}: missing owner verification
|
|
1577
|
+
|
|
1578
|
+
- **Severity / confidence:** high / medium
|
|
1579
|
+
- **Status:** likely
|
|
1580
|
+
- **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
|
|
1581
|
+
- **Endpoint:** ANY /invoice/view/{id}
|
|
1582
|
+
- **Location:** `php-codeigniter/application/controllers/Invoice.php:10`
|
|
1583
|
+
|
|
1584
|
+
**Evidence.**
|
|
1585
|
+
|
|
1586
|
+
- `php-codeigniter/application/controllers/Invoice.php:10` — The invoice ID is taken from the request and the query does not restrict to the authenticated user’s invoices.
|
|
1587
|
+
`$q = $this->db->query("SELECT * FROM invoices WHERE id = $id");`
|
|
1588
|
+
|
|
1589
|
+
**Recommendation.** Add a WHERE clause that includes the current user’s ID or load the invoice and compare its owner before returning it.
|
|
1590
|
+
|
|
1591
|
+
*Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:10-12. The `view` method runs a raw query against `invoices` using the supplied `id` without scoping to the current user. No ownership check is visible.
|
|
1592
|
+
|
|
1593
|
+
### BOLA-R-0046 — BOLA in ANY /invoice/update: missing owner verification
|
|
1594
|
+
|
|
1595
|
+
- **Severity / confidence:** high / medium
|
|
1596
|
+
- **Status:** likely
|
|
1597
|
+
- **Category:** bola (missing_ownership_check) — CWE-639, CWE-284
|
|
1598
|
+
- **Endpoint:** ANY /invoice/update
|
|
1599
|
+
- **Location:** `php-codeigniter/application/controllers/Invoice.php:23`
|
|
1600
|
+
|
|
1601
|
+
**Evidence.**
|
|
1602
|
+
|
|
1603
|
+
- `php-codeigniter/application/controllers/Invoice.php:23` — The invoice ID is taken from the request and the update statement does not verify that the invoice belongs to the authenticated user.
|
|
1604
|
+
`$this->db->query("UPDATE invoices SET note = ? WHERE id = ?", array($note, $id));`
|
|
1605
|
+
|
|
1606
|
+
**Recommendation.** Include the authenticated user’s ID in the WHERE clause or verify ownership before performing the update.
|
|
1607
|
+
|
|
1608
|
+
*Verifier:* likely — checked: php-codeigniter/application/controllers/Invoice.php:23-24. The `update` method updates an invoice by `id` without verifying that the invoice belongs to the authenticated user. No ownership guard is present in the snippet.
|
|
1609
|
+
|
|
1610
|
+
### BOLA-R-0057-1 — BOLA in GET /account/rename: missing owner verification
|
|
1611
|
+
|
|
1612
|
+
- **Severity / confidence:** high / medium
|
|
1613
|
+
- **Status:** likely
|
|
1614
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1615
|
+
- **Endpoint:** GET /account/rename
|
|
1616
|
+
- **Location:** `php-plain/admin.php:7`
|
|
1617
|
+
|
|
1618
|
+
**Evidence.**
|
|
1619
|
+
|
|
1620
|
+
- `php-plain/admin.php:7` — Object ID comes from the request
|
|
1621
|
+
`$uid = (int)$_GET['uid'];`
|
|
1622
|
+
- `php-plain/admin.php:8` — Query does not restrict by current user
|
|
1623
|
+
`$r = mysql_query("SELECT * FROM users WHERE id = " . $uid);`
|
|
1624
|
+
|
|
1625
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership after fetching the record
|
|
1626
|
+
|
|
1627
|
+
*Verifier:* likely — checked: php-plain/admin.php lines 5-9, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The code shows a direct lookup of a user by id from the request with no ownership or role check. No global filter or other control is visible in the provided context.
|
|
1628
|
+
|
|
1629
|
+
### BOLA-R-0057-2 — BOLA in POST /account/rename: missing owner verification
|
|
1630
|
+
|
|
1631
|
+
- **Severity / confidence:** high / medium
|
|
1632
|
+
- **Status:** likely
|
|
1633
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1634
|
+
- **Endpoint:** POST /account/rename
|
|
1635
|
+
- **Location:** `php-plain/admin.php:6`
|
|
1636
|
+
|
|
1637
|
+
**Evidence.**
|
|
1638
|
+
|
|
1639
|
+
- `php-plain/admin.php:11` — Object ID comes from the request
|
|
1640
|
+
`$id = $_POST['id'];`
|
|
1641
|
+
- `php-plain/admin.php:12` — Delete query does not restrict by current user
|
|
1642
|
+
`mysql_query("DELETE FROM users WHERE id = $id");`
|
|
1643
|
+
|
|
1644
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
|
|
1645
|
+
|
|
1646
|
+
*Verifier:* likely — checked: php-plain/admin.php lines 10-13, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The delete action uses the id from the request without any ownership or role verification. No compensating control is shown.
|
|
1647
|
+
|
|
1648
|
+
### BOLA-R-0058-1 — BOLA in POST /account/rename: missing owner verification
|
|
1649
|
+
|
|
1650
|
+
- **Severity / confidence:** high / medium
|
|
1651
|
+
- **Status:** likely
|
|
1652
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1653
|
+
- **Endpoint:** POST /account/rename
|
|
1654
|
+
- **Location:** `php-plain/admin.php:11`
|
|
1655
|
+
|
|
1656
|
+
**Evidence.**
|
|
1657
|
+
|
|
1658
|
+
- `php-plain/admin.php:11` — Object ID comes from the request
|
|
1659
|
+
`$id = $_POST['id'];`
|
|
1660
|
+
- `php-plain/admin.php:12` — Delete query does not restrict by current user
|
|
1661
|
+
`mysql_query("DELETE FROM users WHERE id = $id");`
|
|
1662
|
+
|
|
1663
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
|
|
1664
|
+
|
|
1665
|
+
*Verifier:* likely — checked: php-plain/admin.php lines 10-13, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. Same as BOLA-R-0057-2: no ownership or role check is present in the visible code.
|
|
1666
|
+
|
|
1667
|
+
### BOLA-R-0059-1 — BOLA in POST /php-plain/manage_users.php: missing owner verification
|
|
1668
|
+
|
|
1669
|
+
- **Severity / confidence:** high / high
|
|
1670
|
+
- **Status:** confirmed
|
|
1671
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1672
|
+
- **Endpoint:** POST /php-plain/manage_users.php
|
|
1673
|
+
- **Location:** `php-plain/manage_users.php:5`
|
|
1674
|
+
|
|
1675
|
+
**Evidence.**
|
|
1676
|
+
|
|
1677
|
+
- `php-plain/manage_users.php:5` — Object ID comes from the request
|
|
1678
|
+
`if ($_SERVER['REQUEST_METHOD'] === 'POST') {`
|
|
1679
|
+
- `php-plain/manage_users.php:6` — Query does not restrict by current user
|
|
1680
|
+
`$stmt = $db->prepare("DELETE FROM users WHERE id = ?");`
|
|
1681
|
+
|
|
1682
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
|
|
1683
|
+
|
|
1684
|
+
*Verifier:* confirmed — checked: php-plain/manage_users.php:5-8. The POST handler deletes a user by id without any role or ownership check. The only role check is in the HTML link, not in the request handling code.
|
|
1685
|
+
|
|
1686
|
+
### BOLA-R-0061-1 — BOLA in GET /php-plain/order_detail.php: missing owner verification
|
|
1687
|
+
|
|
1688
|
+
- **Severity / confidence:** high / high
|
|
1689
|
+
- **Status:** confirmed
|
|
1690
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1691
|
+
- **Endpoint:** GET /php-plain/order_detail.php
|
|
1692
|
+
- **Location:** `php-plain/order_detail.php:5`
|
|
1693
|
+
|
|
1694
|
+
**Evidence.**
|
|
1695
|
+
|
|
1696
|
+
- `php-plain/order_detail.php:5` — Object ID comes from the request
|
|
1697
|
+
`$id = $_GET['id'];`
|
|
1698
|
+
- `php-plain/order_detail.php:6` — Query does not restrict by current user
|
|
1699
|
+
`$res = mysql_query("SELECT * FROM orders WHERE id = " . $id);`
|
|
1700
|
+
|
|
1701
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership after fetching the record
|
|
1702
|
+
|
|
1703
|
+
*Verifier:* confirmed — checked: php-plain/order_detail.php:5-6. The query selects an order by id without scoping to the current user and no ownership check is present.
|
|
1704
|
+
|
|
1705
|
+
### BOLA-R-0066-1 — BOLA in POST /php-plain/admin/delete_user.php: missing owner verification
|
|
1706
|
+
|
|
1707
|
+
- **Severity / confidence:** high / medium
|
|
1708
|
+
- **Status:** likely
|
|
1709
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1710
|
+
- **Endpoint:** POST /php-plain/admin/delete_user.php
|
|
1711
|
+
- **Location:** `php-plain/admin/delete_user.php:5`
|
|
1712
|
+
|
|
1713
|
+
**Evidence.**
|
|
1714
|
+
|
|
1715
|
+
- `php-plain/admin/delete_user.php:5` — Object ID comes from the request
|
|
1716
|
+
`$id = (int)$_POST['id'];`
|
|
1717
|
+
- `php-plain/admin/delete_user.php:6` — Query does not restrict by current user
|
|
1718
|
+
`$stmt = $db->prepare("DELETE FROM users WHERE id = ?");`
|
|
1719
|
+
|
|
1720
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before deletion
|
|
1721
|
+
|
|
1722
|
+
*Verifier:* likely — checked: php-plain/admin/delete_user.php lines 5-7, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The delete query uses a bound parameter but does not restrict by the current user. No ownership or role check is visible.
|
|
1723
|
+
|
|
1724
|
+
### BOLA-R-0067-1 — BOLA in POST /php-plain/admin/promote.php: missing owner verification
|
|
1725
|
+
|
|
1726
|
+
- **Severity / confidence:** high / medium
|
|
1727
|
+
- **Status:** likely
|
|
1728
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1729
|
+
- **Endpoint:** POST /php-plain/admin/promote.php
|
|
1730
|
+
- **Location:** `php-plain/admin/promote.php:5`
|
|
1731
|
+
|
|
1732
|
+
**Evidence.**
|
|
1733
|
+
|
|
1734
|
+
- `php-plain/admin/promote.php:5` — Object ID comes from the request
|
|
1735
|
+
`if ($_POST['is_admin'] == '1') {`
|
|
1736
|
+
- `php-plain/admin/promote.php:6` — Query does not restrict by current user
|
|
1737
|
+
`$stmt = $db->prepare("UPDATE users SET role = 'admin' WHERE id = ?");`
|
|
1738
|
+
|
|
1739
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the session user or verify ownership before role change
|
|
1740
|
+
|
|
1741
|
+
*Verifier:* likely — checked: php-plain/admin/promote.php lines 5-7, php-plain/inc/auth.php lines 1-7, php-plain/inc/db.php lines 1-4. The promotion logic checks a request parameter but does not verify that the requester owns the target user or has an admin role. No compensating control is shown.
|
|
1742
|
+
|
|
1743
|
+
### BOLA-R-0069-1 — BOLA in GET /orders/<int:order_id>: missing owner verification
|
|
1744
|
+
|
|
1745
|
+
- **Severity / confidence:** high / high
|
|
1746
|
+
- **Status:** confirmed
|
|
1747
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1748
|
+
- **Endpoint:** GET /orders/<int:order_id>
|
|
1749
|
+
- **Location:** `python-flask/app.py:12`
|
|
1750
|
+
|
|
1751
|
+
**Evidence.**
|
|
1752
|
+
|
|
1753
|
+
- `python-flask/app.py:12` — Query does not restrict by current user
|
|
1754
|
+
`cur.execute("SELECT * FROM orders WHERE id = %s" % order_id)`
|
|
1755
|
+
|
|
1756
|
+
**Recommendation.** Add a WHERE clause that binds the user ID to the current_user.id or verify ownership after fetching the record
|
|
1757
|
+
|
|
1758
|
+
*Verifier:* confirmed — checked: python-flask/app.py:8-13. The route '/orders/<int:order_id>' retrieves an order by id without filtering by user_id. The only ownership check is in the '/orders/mine/<int:order_id>' route.
|
|
1759
|
+
|
|
1760
|
+
### BOLA-R-0073 — BOLA in POST /users/<int:uid>/name: missing owner verification
|
|
1761
|
+
|
|
1762
|
+
- **Severity / confidence:** high / high
|
|
1763
|
+
- **Status:** confirmed
|
|
1764
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1765
|
+
- **Endpoint:** POST /users/<int:uid>/name
|
|
1766
|
+
- **Location:** `python-flask/profile.py:16`
|
|
1767
|
+
|
|
1768
|
+
**Evidence.**
|
|
1769
|
+
|
|
1770
|
+
- `python-flask/profile.py:18` — Loads the target user by ID without checking that the current user owns the record
|
|
1771
|
+
`user = User.query.get(uid)`
|
|
1772
|
+
|
|
1773
|
+
**Recommendation.** Verify that the current user owns the user record before allowing a name change
|
|
1774
|
+
|
|
1775
|
+
*Verifier:* confirmed — checked: python-flask/profile.py lines 16-20. The function loads a User by uid and updates the name without any ownership check or role verification. No compensating control is present in the visible code.
|
|
1776
|
+
|
|
1777
|
+
### BOLA-R-0074 — BOLA in PATCH /users/<int:uid>: missing owner verification
|
|
1778
|
+
|
|
1779
|
+
- **Severity / confidence:** high / high
|
|
1780
|
+
- **Status:** confirmed
|
|
1781
|
+
- **Category:** bola (missing_ownership_check) — CWE-284, CWE-639
|
|
1782
|
+
- **Endpoint:** PATCH /users/<int:uid>
|
|
1783
|
+
- **Location:** `python-flask/profile.py:24`
|
|
1784
|
+
|
|
1785
|
+
**Evidence.**
|
|
1786
|
+
|
|
1787
|
+
- `python-flask/profile.py:26` — Loads the target user by ID without verifying ownership
|
|
1788
|
+
`user = User.query.get(uid)`
|
|
1789
|
+
|
|
1790
|
+
**Recommendation.** Add an ownership check before applying updates to the user record
|
|
1791
|
+
|
|
1792
|
+
*Verifier:* confirmed — checked: python-flask/profile.py lines 24-30. The function loads a User by uid and applies arbitrary updates without verifying that the current user owns the record. No compensating control is present in the visible code.
|
|
1793
|
+
|
|
1794
|
+
### MASS-M-0009-1 — Team owner_id is writable via mass assignment
|
|
1795
|
+
|
|
1796
|
+
- **Severity / confidence:** high / high
|
|
1797
|
+
- **Status:** confirmed
|
|
1798
|
+
- **Category:** mass_assignment (privileged_field_writable) — CWE-915
|
|
1799
|
+
- **Endpoint:** - -
|
|
1800
|
+
- **Location:** `php-laravel/app/Http/Controllers/AccountController.php:23`
|
|
1801
|
+
|
|
1802
|
+
**Impact.** Any authenticated user can set the owner_id of a Team, effectively taking ownership of any team.
|
|
1803
|
+
|
|
1804
|
+
**Evidence.**
|
|
1805
|
+
|
|
1806
|
+
- `php-laravel/app/Http/Controllers/AccountController.php:23` — Whole object binding: Team::create($request->all());
|
|
1807
|
+
- `php-laravel/app/Models/Team.php:8` — fillable includes privileged field owner_id
|
|
1808
|
+
|
|
1809
|
+
**Recommendation.** Remove owner_id from $fillable or set it server‑side after validating ownership.
|
|
1810
|
+
|
|
1811
|
+
*Verifier:* confirmed — checked: php-laravel/app/Http/Controllers/AccountController.php: lines 21-24, php-laravel/app/Models/Team.php: line 8. Team::create($request->all()) uses the model’s $fillable which includes the privileged field owner_id, allowing an attacker to set ownership.
|
|
1812
|
+
|
|
1813
|
+
### BOLA-R-0052-verdict — Missing ownership check at php-laravel/routes/web.php:6 (from auditor verdict)
|
|
1814
|
+
|
|
1815
|
+
- **Severity / confidence:** medium / medium
|
|
1816
|
+
- **Status:** likely
|
|
1817
|
+
- **Category:** bola (missing_ownership_check) — CWE-284
|
|
1818
|
+
- **Endpoint:** POST /register
|
|
1819
|
+
- **Location:** `php-laravel/routes/web.php:6`
|
|
1820
|
+
|
|
1821
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1822
|
+
|
|
1823
|
+
**Evidence.**
|
|
1824
|
+
|
|
1825
|
+
- `php-laravel/routes/web.php:6` — The auditor judged this route 'needs_review' but wrote no finding
|
|
1826
|
+
|
|
1827
|
+
**Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
|
|
1828
|
+
|
|
1829
|
+
*Verifier:* likely — checked: php-laravel/routes/web.php line 6. The route definition does not show any ownership or role check. No ownership verification is visible in the provided code context.
|
|
1830
|
+
|
|
1831
|
+
### BOLA-R-0053-verdict — Missing ownership check at php-laravel/routes/web.php:7 (from auditor verdict)
|
|
1832
|
+
|
|
1833
|
+
- **Severity / confidence:** medium / medium
|
|
1834
|
+
- **Status:** likely
|
|
1835
|
+
- **Category:** bola (missing_ownership_check) — CWE-284
|
|
1836
|
+
- **Endpoint:** POST /posts
|
|
1837
|
+
- **Location:** `php-laravel/routes/web.php:7`
|
|
1838
|
+
|
|
1839
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1840
|
+
|
|
1841
|
+
**Evidence.**
|
|
1842
|
+
|
|
1843
|
+
- `php-laravel/routes/web.php:7` — The auditor judged this route 'needs_review' but wrote no finding
|
|
1844
|
+
|
|
1845
|
+
**Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
|
|
1846
|
+
|
|
1847
|
+
*Verifier:* likely — checked: php-laravel/routes/web.php line 7. The route definition does not contain any ownership or role check. No ownership verification is visible in the provided code context.
|
|
1848
|
+
|
|
1849
|
+
### BOLA-R-0054-verdict — Missing ownership check at php-laravel/routes/web.php:8 (from auditor verdict)
|
|
1850
|
+
|
|
1851
|
+
- **Severity / confidence:** medium / medium
|
|
1852
|
+
- **Status:** likely
|
|
1853
|
+
- **Category:** bola (missing_ownership_check) — CWE-284
|
|
1854
|
+
- **Endpoint:** POST /teams
|
|
1855
|
+
- **Location:** `php-laravel/routes/web.php:8`
|
|
1856
|
+
|
|
1857
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1858
|
+
|
|
1859
|
+
**Evidence.**
|
|
1860
|
+
|
|
1861
|
+
- `php-laravel/routes/web.php:8` — The auditor judged this route 'needs_review' but wrote no finding
|
|
1862
|
+
|
|
1863
|
+
**Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
|
|
1864
|
+
|
|
1865
|
+
*Verifier:* likely — checked: php-laravel/routes/web.php line 8. The route definition does not contain any ownership or role check. No ownership verification is visible in the provided code context.
|
|
1866
|
+
|
|
1867
|
+
### BOLA-R-0055-verdict — Missing ownership check at php-laravel/routes/web.php:9 (from auditor verdict)
|
|
1868
|
+
|
|
1869
|
+
- **Severity / confidence:** medium / medium
|
|
1870
|
+
- **Status:** likely
|
|
1871
|
+
- **Category:** bola (missing_ownership_check) — CWE-284
|
|
1872
|
+
- **Endpoint:** POST /account/rename
|
|
1873
|
+
- **Location:** `php-laravel/routes/web.php:9`
|
|
1874
|
+
|
|
1875
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1876
|
+
|
|
1877
|
+
**Evidence.**
|
|
1878
|
+
|
|
1879
|
+
- `php-laravel/routes/web.php:9` — The auditor judged this route 'needs_review' but wrote no finding
|
|
1880
|
+
|
|
1881
|
+
**Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
|
|
1882
|
+
|
|
1883
|
+
*Verifier:* likely — checked: php-laravel/routes/web.php:6-9. The route definition is shown, but the controller implementation is not visible in the provided context, so ownership checks cannot be confirmed or denied.
|
|
1884
|
+
|
|
1885
|
+
### BOLA-R-0056-verdict — Missing ownership check at php-laravel/routes/web.php:10 (from auditor verdict)
|
|
1886
|
+
|
|
1887
|
+
- **Severity / confidence:** medium / medium
|
|
1888
|
+
- **Status:** likely
|
|
1889
|
+
- **Category:** bola (missing_ownership_check) — CWE-284
|
|
1890
|
+
- **Endpoint:** POST /account/profile
|
|
1891
|
+
- **Location:** `php-laravel/routes/web.php:10`
|
|
1892
|
+
|
|
1893
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1894
|
+
|
|
1895
|
+
**Evidence.**
|
|
1896
|
+
|
|
1897
|
+
- `php-laravel/routes/web.php:10` — The auditor judged this route 'needs_review' but wrote no finding
|
|
1898
|
+
|
|
1899
|
+
**Recommendation.** Bind the object lookup to the current user or tenant, or check ownership before using it.
|
|
1900
|
+
|
|
1901
|
+
*Verifier:* likely — checked: php-laravel/routes/web.php:6-10. Only the route definition is visible; the controller logic that might enforce ownership is not shown.
|
|
1902
|
+
|
|
1903
|
+
### MASS-M-0001-verdict — Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:12 (from auditor verdict)
|
|
1904
|
+
|
|
1905
|
+
- **Severity / confidence:** medium / medium
|
|
1906
|
+
- **Status:** likely
|
|
1907
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1908
|
+
- **Endpoint:** - -
|
|
1909
|
+
- **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:12`
|
|
1910
|
+
|
|
1911
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1912
|
+
|
|
1913
|
+
**Evidence.**
|
|
1914
|
+
|
|
1915
|
+
- `dotnet-legacy/Web/Controllers/CustomerController.cs:12` — The auditor judged this candidate 'needs_review' but wrote no finding
|
|
1916
|
+
|
|
1917
|
+
**Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
|
|
1918
|
+
|
|
1919
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/CustomerController.cs:12-15. The Edit action accepts a Customer model and marks it Modified without any [Bind] include or ownership check in the snippet. The [Authorize] attribute only ensures authentication, not ownership.
|
|
1920
|
+
|
|
1921
|
+
### MASS-M-0002-verdict — Mass assignment at dotnet-legacy/Web/Controllers/CustomerController.cs:30 (from auditor verdict)
|
|
1922
|
+
|
|
1923
|
+
- **Severity / confidence:** medium / medium
|
|
1924
|
+
- **Status:** likely
|
|
1925
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1926
|
+
- **Endpoint:** - -
|
|
1927
|
+
- **Location:** `dotnet-legacy/Web/Controllers/CustomerController.cs:30`
|
|
1928
|
+
|
|
1929
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
1930
|
+
|
|
1931
|
+
**Evidence.**
|
|
1932
|
+
|
|
1933
|
+
- `dotnet-legacy/Web/Controllers/CustomerController.cs:30` — The auditor judged this candidate 'needs_review' but wrote no finding
|
|
1934
|
+
|
|
1935
|
+
**Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
|
|
1936
|
+
|
|
1937
|
+
*Verifier:* likely — checked: dotnet-legacy/Web/Controllers/CustomerController.cs: lines 26-31. The code shows a mass assignment via TryUpdateModel(customer) but no ownership or role check, integer cast, or allow‑list is visible in the provided snippet.
|
|
1938
|
+
|
|
1939
|
+
### MASS-M-0006-1 — Unknown model fields in whole object binding
|
|
1940
|
+
|
|
1941
|
+
- **Severity / confidence:** medium / high
|
|
1942
|
+
- **Status:** confirmed
|
|
1943
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1944
|
+
- **Endpoint:** - -
|
|
1945
|
+
- **Location:** `node-express/routes/profile.js:8`
|
|
1946
|
+
|
|
1947
|
+
**Impact.** Unable to determine if privileged fields are writable.
|
|
1948
|
+
|
|
1949
|
+
**Evidence.**
|
|
1950
|
+
|
|
1951
|
+
- `node-express/routes/profile.js:8` — Location taken from the Tier 1 inventory
|
|
1952
|
+
|
|
1953
|
+
**Recommendation.** Review the User model definition and ensure privileged fields are not mass‑assignable.
|
|
1954
|
+
|
|
1955
|
+
*Verifier:* confirmed — checked: node-express/routes/profile.js: lines 7-9. User.findByIdAndUpdate(req.user._id, req.body, ...) performs a whole‑object bind with no allow‑list or ownership check.
|
|
1956
|
+
|
|
1957
|
+
### MASS-M-0007-1 — Unknown model fields in whole object binding
|
|
1958
|
+
|
|
1959
|
+
- **Severity / confidence:** medium / high
|
|
1960
|
+
- **Status:** confirmed
|
|
1961
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1962
|
+
- **Endpoint:** - -
|
|
1963
|
+
- **Location:** `node-express/routes/profile.js:16`
|
|
1964
|
+
|
|
1965
|
+
**Impact.** Unable to determine if privileged fields are writable.
|
|
1966
|
+
|
|
1967
|
+
**Evidence.**
|
|
1968
|
+
|
|
1969
|
+
- `node-express/routes/profile.js:16` — Location taken from the Tier 1 inventory
|
|
1970
|
+
|
|
1971
|
+
**Recommendation.** Review the User model definition and ensure privileged fields are not mass‑assignable.
|
|
1972
|
+
|
|
1973
|
+
*Verifier:* confirmed — checked: node-express/routes/profile.js: lines 16-17. new User(req.body) followed by user.save() allows all fields from the request to be persisted without filtering.
|
|
1974
|
+
|
|
1975
|
+
### MASS-M-0008-1 — Unknown model fields in whole object binding
|
|
1976
|
+
|
|
1977
|
+
- **Severity / confidence:** medium / medium
|
|
1978
|
+
- **Status:** likely
|
|
1979
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1980
|
+
- **Endpoint:** - -
|
|
1981
|
+
- **Location:** `php-laravel/app/Http/Controllers/AccountController.php:13`
|
|
1982
|
+
|
|
1983
|
+
**Impact.** Unable to determine if privileged fields are writable due to missing field list.
|
|
1984
|
+
|
|
1985
|
+
**Evidence.**
|
|
1986
|
+
|
|
1987
|
+
- `php-laravel/app/Http/Controllers/AccountController.php:13` — Whole object binding: User::create($request->all());
|
|
1988
|
+
|
|
1989
|
+
**Recommendation.** Inspect the User model to confirm which fields are mass‑assignable and restrict privileged ones.
|
|
1990
|
+
|
|
1991
|
+
*Verifier:* likely — checked: php-laravel/app/Http/Controllers/AccountController.php: line 13. The User model definition is not shown; therefore it is unclear whether privileged fields are protected by $fillable/$guarded.
|
|
1992
|
+
|
|
1993
|
+
### MASS-M-0010-1 — Unknown model fields in whole object binding
|
|
1994
|
+
|
|
1995
|
+
- **Severity / confidence:** medium / medium
|
|
1996
|
+
- **Status:** likely
|
|
1997
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
1998
|
+
- **Endpoint:** - -
|
|
1999
|
+
- **Location:** `php-laravel/app/Http/Controllers/AccountController.php:36`
|
|
2000
|
+
|
|
2001
|
+
**Impact.** Unable to determine if privileged fields are writable.
|
|
2002
|
+
|
|
2003
|
+
**Evidence.**
|
|
2004
|
+
|
|
2005
|
+
- `php-laravel/app/Http/Controllers/AccountController.php:23` — Whole object binding: Team::create($request->all());
|
|
2006
|
+
|
|
2007
|
+
**Recommendation.** Review the Team model definition and ensure privileged fields are not mass‑assignable.
|
|
2008
|
+
|
|
2009
|
+
*Verifier:* likely — checked: AccountController.php: lines 18-23 (team creation), AccountController.php: lines 36-37 (profile update). The controller performs whole‑object binding via $request->all() but the model’s $fillable/$guarded definition is not shown. No visible field whitelist or ownership check is present in the provided code.
|
|
2010
|
+
|
|
2011
|
+
### MASS-M-0011-verdict — Mass assignment at php-plain/profile.php:6 (from auditor verdict)
|
|
2012
|
+
|
|
2013
|
+
- **Severity / confidence:** medium / medium
|
|
2014
|
+
- **Status:** likely
|
|
2015
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
2016
|
+
- **Endpoint:** - -
|
|
2017
|
+
- **Location:** `php-plain/profile.php:6`
|
|
2018
|
+
|
|
2019
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
2020
|
+
|
|
2021
|
+
**Evidence.**
|
|
2022
|
+
|
|
2023
|
+
- `php-plain/profile.php:6` — The auditor judged this candidate 'needs_review' but wrote no finding
|
|
2024
|
+
|
|
2025
|
+
**Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
|
|
2026
|
+
|
|
2027
|
+
*Verifier:* likely — checked: php-plain/profile.php:6-8. The code iterates over $_POST and assigns each field to the user object without any allow‑list or ownership check. The included auth.php only verifies login, not ownership.
|
|
2028
|
+
|
|
2029
|
+
### MASS-M-0012-verdict — Mass assignment at php-plain/profile.php:10 (from auditor verdict)
|
|
2030
|
+
|
|
2031
|
+
- **Severity / confidence:** medium / medium
|
|
2032
|
+
- **Status:** likely
|
|
2033
|
+
- **Category:** mass_assignment (privileged_field_writable) — CWE-915
|
|
2034
|
+
- **Endpoint:** - -
|
|
2035
|
+
- **Location:** `php-plain/profile.php:10`
|
|
2036
|
+
|
|
2037
|
+
**Impact.** Generated from the auditor's 'needs_review' verdict; the model wrote no finding for it.
|
|
2038
|
+
|
|
2039
|
+
**Evidence.**
|
|
2040
|
+
|
|
2041
|
+
- `php-plain/profile.php:10` — The auditor judged this candidate 'needs_review' but wrote no finding
|
|
2042
|
+
|
|
2043
|
+
**Recommendation.** Bind only an explicit allow-list of fields; never bind role, owner or balance fields.
|
|
2044
|
+
|
|
2045
|
+
*Verifier:* likely — checked: php-plain/profile.php:10. The assignment of $_POST['role'] to $user->role occurs without any guard or allow‑list in the visible code.
|
|
2046
|
+
|
|
2047
|
+
### MASS-M-0014-1 — Unknown model fields in whole object binding
|
|
2048
|
+
|
|
2049
|
+
- **Severity / confidence:** medium / medium
|
|
2050
|
+
- **Status:** likely
|
|
2051
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
2052
|
+
- **Endpoint:** - -
|
|
2053
|
+
- **Location:** `python-flask/profile.py:10`
|
|
2054
|
+
|
|
2055
|
+
**Impact.** Unable to determine if privileged fields are writable.
|
|
2056
|
+
|
|
2057
|
+
**Evidence.**
|
|
2058
|
+
|
|
2059
|
+
- `python-flask/profile.py:10` — Location taken from the Tier 1 inventory
|
|
2060
|
+
|
|
2061
|
+
**Recommendation.** Use a DTO or explicit field mapping to prevent mass assignment of privileged fields.
|
|
2062
|
+
|
|
2063
|
+
*Verifier:* likely — checked: profile.py: lines 8-12 (POST route creating User with **request.json). The constructor receives all JSON fields directly; no field filtering or guard is shown in the provided code.
|
|
2064
|
+
|
|
2065
|
+
### MASS-M-0015-1 — Unknown model fields in whole object binding
|
|
2066
|
+
|
|
2067
|
+
- **Severity / confidence:** medium / medium
|
|
2068
|
+
- **Status:** likely
|
|
2069
|
+
- **Category:** mass_assignment (whole_object_binding) — CWE-915
|
|
2070
|
+
- **Endpoint:** - -
|
|
2071
|
+
- **Location:** `python-flask/profile.py:27`
|
|
2072
|
+
|
|
2073
|
+
**Impact.** Unable to determine if privileged fields are writable.
|
|
2074
|
+
|
|
2075
|
+
**Evidence.**
|
|
2076
|
+
|
|
2077
|
+
- `python-flask/profile.py:27` — Location taken from the Tier 1 inventory
|
|
2078
|
+
|
|
2079
|
+
**Recommendation.** Validate and whitelist request fields before setting attributes.
|
|
2080
|
+
|
|
2081
|
+
*Verifier:* likely — checked: profile.py: lines 24-29 (PATCH route with setattr loop). All JSON keys are set on the user object without any whitelist or guard. No compensating control is visible in the snippet.
|
|
2082
|
+
|
|
2083
|
+
## 4. Systemic fixes
|
|
2084
|
+
|
|
2085
|
+
<!-- LLM: reporter agent writes max 5 systemic fixes here -->
|
|
2086
|
+
|
|
2087
|
+
## 5. Coverage and limitations
|
|
2088
|
+
|
|
2089
|
+
- missing from inventory: 0
|
|
2090
|
+
- bola routes without verdict: 0
|
|
2091
|
+
- injection candidates without verdict: 0
|
|
2092
|
+
- bfla routes without verdict: 0
|
|
2093
|
+
- mass candidates without verdict: 0
|
|
2094
|
+
- findings without verification: 0
|
|
2095
|
+
|
|
2096
|
+
<!-- LLM: reporter agent lists limitations here -->
|
|
2097
|
+
|
|
2098
|
+
## Appendix A — Findings rejected by the verifier
|
|
2099
|
+
|
|
2100
|
+
| ID | Location | Reason |
|
|
2101
|
+
|---|---|---|
|
|
2102
|
+
| INJ-I-0005 | `classic-asp/shop/order.asp:12` | The query includes an ownership check by binding the user_id to the session value and casts the sid to a long, preventing injection and ensuring the user can only access their own orders. |
|
|
2103
|
+
| MASS-M-0013-1 | `php-plain/register.php:4` | The code does not bind all POST values to a model; it explicitly inserts only email, name, and role columns. The evidence claiming whole‑object binding is incorrect. |
|
|
2104
|
+
|
|
2105
|
+
## Appendix B — Method
|
|
2106
|
+
|
|
2107
|
+
1. Deterministic pre-scan (stack detection, endpoint candidates, query-building candidates).
|
|
2108
|
+
2. AI agents: auth-model extraction, route inventory, BOLA audit, injection audit.
|
|
2109
|
+
3. Independent AI verifier tries to refute each finding.
|
|
2110
|
+
4. Human review and sign-off (`review-log.md`).
|
|
2111
|
+
|
|
2112
|
+
This is not a penetration test. Absence of findings does not prove absence of vulnerabilities.
|