@hoanghainh/komagu 2.4.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.
Files changed (247) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +202 -0
  3. package/README.md +1 -0
  4. package/assess/lsa/examples/eval-run-6/gptoss-a/ai-run-stats.json +87 -0
  5. package/assess/lsa/examples/eval-run-6/gptoss-a/auth-model.md +120 -0
  6. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/index.json +60 -0
  7. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-001.json +383 -0
  8. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/injection-002.json +205 -0
  9. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-001.json +838 -0
  10. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/privilege-002.json +124 -0
  11. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-001.json +778 -0
  12. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-002.json +546 -0
  13. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-003.json +661 -0
  14. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-004.json +659 -0
  15. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-005.json +612 -0
  16. package/assess/lsa/examples/eval-run-6/gptoss-a/batches/routes-006.json +106 -0
  17. package/assess/lsa/examples/eval-run-6/gptoss-a/coverage.json +19 -0
  18. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-001.json +516 -0
  19. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-002.json +332 -0
  20. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-003.json +218 -0
  21. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-004.json +561 -0
  22. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-005.json +316 -0
  23. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/bola-routes-006.json +14 -0
  24. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-001.json +782 -0
  25. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/inj-injection-002.json +418 -0
  26. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-001.json +627 -0
  27. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/priv-privilege-002.json +253 -0
  28. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-1.json +68 -0
  29. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-10.json +68 -0
  30. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-11.json +61 -0
  31. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-12.json +60 -0
  32. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-13.json +60 -0
  33. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-14.json +66 -0
  34. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-15.json +69 -0
  35. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-16.json +60 -0
  36. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-17.json +61 -0
  37. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-18.json +69 -0
  38. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-19.json +64 -0
  39. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-2.json +60 -0
  40. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-20.json +60 -0
  41. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-21.json +61 -0
  42. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-22.json +50 -0
  43. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-3.json +60 -0
  44. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-4.json +60 -0
  45. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-5.json +60 -0
  46. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-6.json +70 -0
  47. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-7.json +60 -0
  48. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-8.json +60 -0
  49. package/assess/lsa/examples/eval-run-6/gptoss-a/findings/verified-9.json +60 -0
  50. package/assess/lsa/examples/eval-run-6/gptoss-a/findings.json +4857 -0
  51. package/assess/lsa/examples/eval-run-6/gptoss-a/mass-assignment.candidates.json +232 -0
  52. package/assess/lsa/examples/eval-run-6/gptoss-a/report.ja.md +2112 -0
  53. package/assess/lsa/examples/eval-run-6/gptoss-a/report.md +2112 -0
  54. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-001.json +425 -0
  55. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-002.json +333 -0
  56. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-003.json +400 -0
  57. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-004.json +403 -0
  58. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-005.json +398 -0
  59. package/assess/lsa/examples/eval-run-6/gptoss-a/routes/routes-006.json +63 -0
  60. package/assess/lsa/examples/eval-run-6/gptoss-a/score.json +82 -0
  61. package/assess/lsa/examples/eval-run-6/gptoss-a/stack-profile.json +225 -0
  62. package/assess/lsa/examples/eval-run-6/gptoss-b/ai-run-stats.json +91 -0
  63. package/assess/lsa/examples/eval-run-6/gptoss-b/auth-model.md +120 -0
  64. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/index.json +60 -0
  65. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-001.json +383 -0
  66. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/injection-002.json +205 -0
  67. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-001.json +838 -0
  68. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/privilege-002.json +124 -0
  69. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-001.json +778 -0
  70. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-002.json +546 -0
  71. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-003.json +661 -0
  72. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-004.json +659 -0
  73. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-005.json +612 -0
  74. package/assess/lsa/examples/eval-run-6/gptoss-b/batches/routes-006.json +106 -0
  75. package/assess/lsa/examples/eval-run-6/gptoss-b/coverage.json +21 -0
  76. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-001.json +593 -0
  77. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-002.json +367 -0
  78. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-003.json +207 -0
  79. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-004.json +477 -0
  80. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-005.json +341 -0
  81. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/bola-routes-006.json +14 -0
  82. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-001.json +821 -0
  83. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/inj-injection-002.json +410 -0
  84. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-001.json +649 -0
  85. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/priv-privilege-002.json +222 -0
  86. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-1.json +60 -0
  87. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-10.json +67 -0
  88. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-11.json +68 -0
  89. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-12.json +60 -0
  90. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-13.json +60 -0
  91. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-14.json +64 -0
  92. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-15.json +70 -0
  93. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-16.json +60 -0
  94. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-17.json +61 -0
  95. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-18.json +60 -0
  96. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-19.json +65 -0
  97. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-2.json +60 -0
  98. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-20.json +60 -0
  99. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-21.json +62 -0
  100. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-22.json +50 -0
  101. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-3.json +60 -0
  102. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-4.json +60 -0
  103. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-5.json +60 -0
  104. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-6.json +60 -0
  105. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-7.json +64 -0
  106. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-8.json +60 -0
  107. package/assess/lsa/examples/eval-run-6/gptoss-b/findings/verified-9.json +60 -0
  108. package/assess/lsa/examples/eval-run-6/gptoss-b/findings.json +4966 -0
  109. package/assess/lsa/examples/eval-run-6/gptoss-b/mass-assignment.candidates.json +232 -0
  110. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-001.json +425 -0
  111. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-002.json +333 -0
  112. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-003.json +400 -0
  113. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-004.json +403 -0
  114. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-005.json +398 -0
  115. package/assess/lsa/examples/eval-run-6/gptoss-b/routes/routes-006.json +63 -0
  116. package/assess/lsa/examples/eval-run-6/gptoss-b/score.json +87 -0
  117. package/assess/lsa/examples/eval-run-6/gptoss-b/stack-profile.json +225 -0
  118. package/assess/lsa/examples/eval-run-6/ground-truth.json +851 -0
  119. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/ai-run-stats.json +96 -0
  120. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/auth-model.md +191 -0
  121. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/index.json +60 -0
  122. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-001.json +383 -0
  123. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/injection-002.json +205 -0
  124. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-001.json +838 -0
  125. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/privilege-002.json +124 -0
  126. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-001.json +778 -0
  127. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-002.json +546 -0
  128. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-003.json +661 -0
  129. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-004.json +659 -0
  130. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-005.json +612 -0
  131. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/batches/routes-006.json +106 -0
  132. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/coverage.json +31 -0
  133. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-001.json +527 -0
  134. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-002.json +568 -0
  135. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-003.json +467 -0
  136. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-004.json +342 -0
  137. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-005.json +693 -0
  138. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/bola-routes-006.json +16 -0
  139. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-001.json +1123 -0
  140. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/inj-injection-002.json +391 -0
  141. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-001.json +726 -0
  142. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/priv-privilege-002.json +306 -0
  143. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-1.json +137 -0
  144. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-10.json +106 -0
  145. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-11.json +81 -0
  146. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-12.json +135 -0
  147. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-13.json +135 -0
  148. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-14.json +135 -0
  149. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-15.json +110 -0
  150. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-16.json +116 -0
  151. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-17.json +141 -0
  152. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-18.json +135 -0
  153. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-19.json +140 -0
  154. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-2.json +135 -0
  155. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-20.json +82 -0
  156. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-21.json +74 -0
  157. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-22.json +99 -0
  158. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-3.json +140 -0
  159. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-4.json +145 -0
  160. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-5.json +135 -0
  161. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-6.json +135 -0
  162. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-7.json +87 -0
  163. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-8.json +125 -0
  164. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings/verified-9.json +135 -0
  165. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/findings.json +6989 -0
  166. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/mass-assignment.candidates.json +232 -0
  167. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/memory.log +36 -0
  168. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-001.json +425 -0
  169. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-002.json +333 -0
  170. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-003.json +400 -0
  171. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-004.json +403 -0
  172. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-005.json +398 -0
  173. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/routes/routes-006.json +63 -0
  174. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/score.json +106 -0
  175. package/assess/lsa/examples/eval-run-6/qwen-16k-nothink/stack-profile.json +225 -0
  176. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/auth-model.md +517 -0
  177. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-001.json +5 -0
  178. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-002.json +428 -0
  179. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-003.json +388 -0
  180. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-004.json +463 -0
  181. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-005.json +5 -0
  182. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/bola-routes-006.json +67 -0
  183. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings/inj-injection-001.json +964 -0
  184. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/findings.partial.json +1872 -0
  185. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/memory.log +194 -0
  186. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/score.partial.json +108 -0
  187. package/assess/lsa/examples/eval-run-6/qwen-16k-partial/stack-profile.json +225 -0
  188. package/assess/lsa/scripts/detect_stack.py +13 -5
  189. package/assess/lsa/scripts/find_injection.py +35 -2
  190. package/assess/lsa/scripts/java_routes.py +323 -0
  191. package/assess/lsa/scripts/laravel_routes.py +102 -0
  192. package/assess/lsa/scripts/lsa_common.py +72 -2
  193. package/assess/lsa/scripts/map_routes.py +40 -161
  194. package/assess/lsa/scripts/merge_findings.py +2 -0
  195. package/assess/lsa/tests/EVAL-RESULTS.md +126 -0
  196. package/assess/lsa/tests/test_eval_run_6.py +104 -0
  197. package/assess/lsa/tests/test_java_legacy_realistic.py +453 -0
  198. package/assess/lsa/tests/test_laravel_routes.py +95 -0
  199. package/contracts/schemas/persona-suite.schema.json +38 -2
  200. package/examples/member-portal/backend-dotnet/Dockerfile +2 -1
  201. package/examples/member-portal/backend-spring/Dockerfile +2 -0
  202. package/examples/member-portal/docker-compose.yml +1 -1
  203. package/examples/member-portal/frontend/Dockerfile +3 -2
  204. package/examples/member-portal/frontend/package-lock.json +24 -656
  205. package/examples/member-portal/frontend/package.json +1 -1
  206. package/operate/ai/client.py +22 -9
  207. package/operate/ai/runner.py +24 -4
  208. package/operate/cli/__init__.py +1 -1
  209. package/operate/cli/commands/fix.py +4 -0
  210. package/operate/cli/commands/leak_check.py +75 -0
  211. package/operate/cli/commands/protect.py +32 -3
  212. package/operate/cli/commands/scan.py +8 -1
  213. package/operate/cli/commands/test.py +131 -15
  214. package/operate/cli/main.py +5 -3
  215. package/operate/cross_user_tester/persona_matrix.py +118 -25
  216. package/operate/cross_user_tester/runner.py +190 -7
  217. package/operate/cross_user_tester/session_config.py +180 -0
  218. package/operate/cross_user_tester/session_http.py +288 -0
  219. package/operate/devsecops/leak_check.py +314 -0
  220. package/operate/remediator/runner.py +18 -1
  221. package/operate/remediator/strategies.py +2 -2
  222. package/operate/simulate/scenarios.py +2 -2
  223. package/operate/tests/mock_legacy_session_app.py +160 -0
  224. package/operate/tests/test_ai_reasoning_effort.py +65 -0
  225. package/operate/tests/test_ai_route_inventory.py +53 -0
  226. package/operate/tests/test_cross_user_session.py +565 -0
  227. package/operate/tests/test_docker_packaging.py +3 -3
  228. package/operate/tests/test_headless_ai.py +6 -0
  229. package/operate/tests/test_leak_check.py +250 -0
  230. package/operate/tests/test_legacy_session_edge.py +192 -0
  231. package/operate/tests/test_pilot_safeguards.py +245 -0
  232. package/operate/tests/test_remediator_java_legacy.py +330 -0
  233. package/package.json +2 -1
  234. package/remediate/authz/patcher.py +120 -11
  235. package/remediate/authz/tests/test_bola_patcher.py +4 -1
  236. package/remediate/edge/coraza/Caddyfile +1 -1
  237. package/remediate/edge/coraza/Dockerfile +9 -0
  238. package/remediate/edge/coraza/rules/coraza-crs-custom.conf +12 -0
  239. package/remediate/edge/coraza/virtual_patcher.py +24 -0
  240. package/remediate/edge/docker-compose.yml +7 -2
  241. package/remediate/edge/kong/kong-legacy-session.yaml +51 -0
  242. package/remediate/edge/mock-backend/Dockerfile +2 -0
  243. package/remediate/edge/tests/test_edge_security.py +21 -1
  244. package/remediate/resilience/terraform/backup_worm.tf +39 -1
  245. package/remediate/resilience/terraform/main.tf +15 -3
  246. package/remediate/resilience/terraform/variables.tf +11 -0
  247. package/remediate/resilience/tests/test_resilience.py +16 -0
@@ -0,0 +1,964 @@
1
+ {
2
+ "batch_id": "injection-001",
3
+ "findings": [
4
+ {
5
+ "finding_id": "INJ-I-0001",
6
+ "category": "sql_injection",
7
+ "subtype": "string_concatenation",
8
+ "title": "SQL Injection in member.asp via string concatenation",
9
+ "candidate_id": "I-0001",
10
+ "location": {
11
+ "file": "classic-asp/shop/member.asp",
12
+ "start_line": 6
13
+ },
14
+ "evidence": [
15
+ {
16
+ "file": "classic-asp/shop/member.asp",
17
+ "line": 6,
18
+ "code": "sql = \"UPDATE members SET name = '\" & Replace(Request.Form(\"name\"), \"'\", \"''\") & \"'\"",
19
+ "why": "User input concatenated into SQL"
20
+ },
21
+ {
22
+ "file": "classic-asp/shop/member.asp",
23
+ "line": 7,
24
+ "code": "sql = sql & \" WHERE member_id = \" & Request.Form(\"member_id\")",
25
+ "why": "User input concatenated into SQL"
26
+ },
27
+ {
28
+ "file": "classic-asp/shop/member.asp",
29
+ "line": 8,
30
+ "code": "conn.Execute sql",
31
+ "why": "Sink executes constructed query"
32
+ }
33
+ ],
34
+ "data_flow": [
35
+ "Request.Form (name)",
36
+ "$u",
37
+ "sql (member.asp:6-7)",
38
+ "conn.Execute (member.asp:8)"
39
+ ],
40
+ "attack_scenario": "A crafted name or member_id changes the WHERE clause and bypasses the password check.",
41
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
42
+ "severity": "critical",
43
+ "confidence": "high",
44
+ "cwe": [
45
+ "CWE-89"
46
+ ],
47
+ "owasp": [
48
+ "A03:2021"
49
+ ],
50
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
51
+ "status": "unverified"
52
+ },
53
+ {
54
+ "finding_id": "INJ-I-0003",
55
+ "category": "sql_injection",
56
+ "subtype": "string_concatenation",
57
+ "title": "SQL Injection in member.asp DELETE query",
58
+ "candidate_id": "I-0003",
59
+ "location": {
60
+ "file": "classic-asp/shop/member.asp",
61
+ "start_line": 10
62
+ },
63
+ "evidence": [
64
+ {
65
+ "file": "classic-asp/shop/member.asp",
66
+ "line": 10,
67
+ "code": "conn.Execute \"DELETE FROM members WHERE member_id = \" & Request.QueryString(\"member_id\")",
68
+ "why": "User input concatenated into SQL"
69
+ }
70
+ ],
71
+ "data_flow": [
72
+ "Request.QueryString (member_id)",
73
+ "sql string",
74
+ "conn.Execute"
75
+ ],
76
+ "attack_scenario": "A crafted member_id changes the WHERE clause and bypasses the password check.",
77
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
78
+ "severity": "critical",
79
+ "confidence": "high",
80
+ "cwe": [
81
+ "CWE-89"
82
+ ],
83
+ "owasp": [
84
+ "A03:2021"
85
+ ],
86
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
87
+ "status": "unverified"
88
+ },
89
+ {
90
+ "finding_id": "INJ-I-0004",
91
+ "category": "sql_injection",
92
+ "subtype": "string_concatenation",
93
+ "title": "SQL Injection in order.asp.vb via string concatenation",
94
+ "candidate_id": "I-0004",
95
+ "location": {
96
+ "file": "classic-asp/shop/order.asp",
97
+ "start_line": 6
98
+ },
99
+ "evidence": [
100
+ {
101
+ "file": "classic-asp/shop/order.asp",
102
+ "line": 6,
103
+ "why": "Location taken from the Tier 1 inventory"
104
+ }
105
+ ],
106
+ "data_flow": [
107
+ "Request (id)",
108
+ "sql string",
109
+ "conn.Execute"
110
+ ],
111
+ "attack_scenario": "A crafted id changes the WHERE clause and bypasses the password check.",
112
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
113
+ "severity": "critical",
114
+ "confidence": "high",
115
+ "cwe": [
116
+ "CWE-89"
117
+ ],
118
+ "owasp": [
119
+ "A03:2021"
120
+ ],
121
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
122
+ "status": "unverified"
123
+ },
124
+ {
125
+ "finding_id": "INJ-I-0006",
126
+ "category": "sql_injection",
127
+ "subtype": "template_placeholder",
128
+ "title": "SQL Injection in OrderService.cfc via ColdFusion interpolation",
129
+ "candidate_id": "I-0006",
130
+ "location": {
131
+ "file": "coldfusion/app/OrderService.cfc",
132
+ "start_line": 5
133
+ },
134
+ "evidence": [
135
+ {
136
+ "file": "coldfusion/app/OrderService.cfc",
137
+ "line": 5,
138
+ "code": "SELECT * FROM orders WHERE id = #arguments.orderId#",
139
+ "why": "User input interpolated into SQL without cfqueryparam"
140
+ }
141
+ ],
142
+ "data_flow": [
143
+ "arguments.orderId",
144
+ "sql string",
145
+ "<cfquery>"
146
+ ],
147
+ "attack_scenario": "A crafted orderId changes the WHERE clause and bypasses the password check.",
148
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
149
+ "severity": "critical",
150
+ "confidence": "high",
151
+ "cwe": [
152
+ "CWE-89"
153
+ ],
154
+ "owasp": [
155
+ "A03:2021"
156
+ ],
157
+ "recommendation": "Use cfqueryparam or parameterized queries instead of string interpolation.",
158
+ "status": "unverified"
159
+ },
160
+ {
161
+ "finding_id": "INJ-I-0007",
162
+ "category": "sql_injection",
163
+ "subtype": "template_placeholder",
164
+ "title": "SQL Injection in order.cfm via ColdFusion interpolation",
165
+ "candidate_id": "I-0007",
166
+ "location": {
167
+ "file": "coldfusion/app/order.cfm",
168
+ "start_line": 3
169
+ },
170
+ "evidence": [
171
+ {
172
+ "file": "coldfusion/app/order.cfm",
173
+ "line": 3,
174
+ "code": "SELECT * FROM orders WHERE id = #url.id#",
175
+ "why": "User input interpolated into SQL without cfqueryparam"
176
+ }
177
+ ],
178
+ "data_flow": [
179
+ "url.id",
180
+ "sql string",
181
+ "<cfquery>"
182
+ ],
183
+ "attack_scenario": "A crafted id changes the WHERE clause and bypasses the password check.",
184
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
185
+ "severity": "critical",
186
+ "confidence": "high",
187
+ "cwe": [
188
+ "CWE-89"
189
+ ],
190
+ "owasp": [
191
+ "A03:2021"
192
+ ],
193
+ "recommendation": "Use cfqueryparam or parameterized queries instead of string interpolation.",
194
+ "status": "unverified"
195
+ },
196
+ {
197
+ "finding_id": "INJ-I-0009",
198
+ "category": "sql_injection",
199
+ "subtype": "string_concatenation",
200
+ "title": "SQL Injection in OrderDetail.aspx.cs via string concatenation",
201
+ "candidate_id": "I-0009",
202
+ "location": {
203
+ "file": "dotnet-legacy/Web/Orders/EditOrder.aspx.vb",
204
+ "start_line": 7
205
+ },
206
+ "evidence": [
207
+ {
208
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
209
+ "line": 10,
210
+ "code": "string id = Request.QueryString[\"id\"];",
211
+ "why": "source: QueryString"
212
+ },
213
+ {
214
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
215
+ "line": 13,
216
+ "code": "var cmd = new SqlCommand(\"SELECT * FROM Orders WHERE OrderId = \" + id, conn);",
217
+ "why": "concatenated into SQL"
218
+ },
219
+ {
220
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
221
+ "line": 15,
222
+ "code": "var r = cmd.ExecuteReader();",
223
+ "why": "sink"
224
+ }
225
+ ],
226
+ "data_flow": [
227
+ "Request.QueryString (id)",
228
+ "id",
229
+ "SqlCommand (OrderDetail.aspx.cs:13)",
230
+ "cmd.ExecuteReader"
231
+ ],
232
+ "attack_scenario": "A crafted id changes the WHERE clause and bypasses the password check.",
233
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
234
+ "severity": "critical",
235
+ "confidence": "high",
236
+ "cwe": [
237
+ "CWE-89"
238
+ ],
239
+ "owasp": [
240
+ "A03:2021"
241
+ ],
242
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
243
+ "status": "unverified"
244
+ },
245
+ {
246
+ "finding_id": "INJ-I-0010",
247
+ "category": "sql_injection",
248
+ "subtype": "format_string",
249
+ "title": "SQL Injection in OrderDetail.aspx.cs via string.Format",
250
+ "candidate_id": "I-0010",
251
+ "location": {
252
+ "file": "dotnet-legacy/Web/Orders/EditOrder.aspx.vb",
253
+ "start_line": 8
254
+ },
255
+ "evidence": [
256
+ {
257
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
258
+ "line": 19,
259
+ "code": "string sql2 = string.Format(\"SELECT * FROM Logs WHERE Ref = '{0}'\", Request[\"ref\"]);",
260
+ "why": "concatenated into SQL"
261
+ },
262
+ {
263
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
264
+ "line": 21,
265
+ "code": "new SqlCommand(sql2, conn).ExecuteReader();",
266
+ "why": "sink"
267
+ }
268
+ ],
269
+ "data_flow": [
270
+ "Request (ref)",
271
+ "sql2",
272
+ "SqlCommand"
273
+ ],
274
+ "attack_scenario": "A crafted ref changes the WHERE clause and bypasses the password check.",
275
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
276
+ "severity": "critical",
277
+ "confidence": "high",
278
+ "cwe": [
279
+ "CWE-89"
280
+ ],
281
+ "owasp": [
282
+ "A03:2021"
283
+ ],
284
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
285
+ "status": "unverified"
286
+ },
287
+ {
288
+ "finding_id": "INJ-I-0011",
289
+ "category": "sql_injection",
290
+ "subtype": "string_interpolation",
291
+ "title": "SQL Injection in OrderDetail.aspx.cs via string interpolation",
292
+ "candidate_id": "I-0011",
293
+ "location": {
294
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
295
+ "start_line": 13
296
+ },
297
+ "evidence": [
298
+ {
299
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
300
+ "line": 20,
301
+ "code": "string sql3 = $\"DELETE FROM Carts WHERE CartId = {Request.Form[\"cart\"]}\";",
302
+ "why": "concatenated into SQL"
303
+ },
304
+ {
305
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
306
+ "line": 22,
307
+ "code": "new SqlCommand(sql3, conn).ExecuteNonQuery();",
308
+ "why": "sink"
309
+ }
310
+ ],
311
+ "data_flow": [
312
+ "Request.Form (cart)",
313
+ "sql3",
314
+ "SqlCommand"
315
+ ],
316
+ "attack_scenario": "A crafted cart changes the WHERE clause and bypasses the password check.",
317
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
318
+ "severity": "critical",
319
+ "confidence": "high",
320
+ "cwe": [
321
+ "CWE-89"
322
+ ],
323
+ "owasp": [
324
+ "A03:2021"
325
+ ],
326
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
327
+ "status": "unverified"
328
+ },
329
+ {
330
+ "finding_id": "INJ-I-0012",
331
+ "category": "sql_injection",
332
+ "subtype": "string_concatenation",
333
+ "title": "SQL Injection in detail.jsp via string concatenation",
334
+ "candidate_id": "I-0012",
335
+ "location": {
336
+ "file": "dotnet-legacy/Web/Orders/OrderDetail.aspx.cs",
337
+ "start_line": 19
338
+ },
339
+ "evidence": [
340
+ {
341
+ "file": "java-legacy/WebContent/order/detail.jsp",
342
+ "line": 5,
343
+ "code": "ResultSet rs = c.createStatement().executeQuery(\"SELECT * FROM orders WHERE order_no = '\" + no + \"'\");",
344
+ "why": "User input concatenated into SQL"
345
+ }
346
+ ],
347
+ "data_flow": [
348
+ "request.getParameter (no)",
349
+ "sql string",
350
+ "executeQuery"
351
+ ],
352
+ "attack_scenario": "A crafted no changes the WHERE clause and bypasses the password check.",
353
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
354
+ "severity": "critical",
355
+ "confidence": "high",
356
+ "cwe": [
357
+ "CWE-89"
358
+ ],
359
+ "owasp": [
360
+ "A03:2021"
361
+ ],
362
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
363
+ "status": "unverified"
364
+ },
365
+ {
366
+ "finding_id": "INJ-I-0016",
367
+ "category": "sql_injection",
368
+ "subtype": "string_concatenation",
369
+ "title": "SQL Injection in EditUserAction.java via string concatenation",
370
+ "candidate_id": "I-0016",
371
+ "location": {
372
+ "file": "java-legacy/src/com/acme/struts/EditUserAction.java",
373
+ "start_line": 13
374
+ },
375
+ "evidence": [
376
+ {
377
+ "file": "java-legacy/src/com/acme/struts/EditUserAction.java",
378
+ "line": 10,
379
+ "code": "String email = request.getParameter(\"email\");",
380
+ "why": "source: Request"
381
+ },
382
+ {
383
+ "file": "java-legacy/src/com/acme/struts/EditUserAction.java",
384
+ "line": 13,
385
+ "code": "PreparedStatement ps = conn.prepareStatement(\"UPDATE users SET email = '\" + email + \"' WHERE id = \" + userId);",
386
+ "why": "concatenated into SQL"
387
+ },
388
+ {
389
+ "file": "java-legacy/src/com/acme/struts/EditUserAction.java",
390
+ "line": 14,
391
+ "code": "ps.executeUpdate();",
392
+ "why": "sink"
393
+ }
394
+ ],
395
+ "data_flow": [
396
+ "request.getParameter (email)",
397
+ "sql string",
398
+ "prepareStatement"
399
+ ],
400
+ "attack_scenario": "A crafted email changes the WHERE clause and bypasses the password check.",
401
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
402
+ "severity": "critical",
403
+ "confidence": "high",
404
+ "cwe": [
405
+ "CWE-89"
406
+ ],
407
+ "owasp": [
408
+ "A03:2021"
409
+ ],
410
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
411
+ "status": "unverified"
412
+ },
413
+ {
414
+ "finding_id": "INJ-I-0017",
415
+ "category": "sql_injection",
416
+ "subtype": "string_concatenation",
417
+ "title": "HQL Injection in InvoiceController.java via string concatenation",
418
+ "candidate_id": "I-0017",
419
+ "location": {
420
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
421
+ "start_line": 29
422
+ },
423
+ "evidence": [
424
+ {
425
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
426
+ "line": 28,
427
+ "code": "public String search(@RequestParam(\"customer\") String customer, Model model) {",
428
+ "why": "source: Request"
429
+ },
430
+ {
431
+ "file": "java-legacy/src/com/acme/web/InvoiceController.java",
432
+ "line": 29,
433
+ "code": "model.addAttribute(\"list\", session.createQuery(\"from Invoice i where i.customer = '\" + customer + \"'\").list());",
434
+ "why": "concatenated into SQL"
435
+ }
436
+ ],
437
+ "data_flow": [
438
+ "@RequestParam (customer)",
439
+ "sql string",
440
+ "session.createQuery"
441
+ ],
442
+ "attack_scenario": "A crafted customer changes the WHERE clause and bypasses the password check.",
443
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
444
+ "severity": "critical",
445
+ "confidence": "high",
446
+ "cwe": [
447
+ "CWE-89"
448
+ ],
449
+ "owasp": [
450
+ "A03:2021"
451
+ ],
452
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
453
+ "status": "unverified"
454
+ },
455
+ {
456
+ "finding_id": "INJ-I-0020",
457
+ "category": "sql_injection",
458
+ "subtype": "string_concatenation",
459
+ "title": "SQL Injection in orders.js via string concatenation",
460
+ "candidate_id": "I-0020",
461
+ "location": {
462
+ "file": "node-express/routes/orders.js",
463
+ "start_line": 17
464
+ },
465
+ "evidence": [
466
+ {
467
+ "file": "node-express/routes/orders.js",
468
+ "line": 17,
469
+ "code": "db.query(\"SELECT * FROM reports WHERE month = '\" + req.query.month + \"'\", function (e, rows) { res.json(rows); });",
470
+ "why": "User input concatenated into SQL"
471
+ }
472
+ ],
473
+ "data_flow": [
474
+ "req.query.month",
475
+ "sql string",
476
+ "db.query"
477
+ ],
478
+ "attack_scenario": "A crafted month changes the WHERE clause and bypasses the password check.",
479
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
480
+ "severity": "critical",
481
+ "confidence": "high",
482
+ "cwe": [
483
+ "CWE-89"
484
+ ],
485
+ "owasp": [
486
+ "A03:2021"
487
+ ],
488
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
489
+ "status": "unverified"
490
+ },
491
+ {
492
+ "finding_id": "INJ-I-0021",
493
+ "category": "sql_injection",
494
+ "subtype": "string_interpolation",
495
+ "title": "SQL Injection in orders.js via template literal interpolation",
496
+ "candidate_id": "I-0021",
497
+ "location": {
498
+ "file": "node-express/routes/orders.js",
499
+ "start_line": 29
500
+ },
501
+ "evidence": [
502
+ {
503
+ "file": "node-express/routes/orders.js",
504
+ "line": 29,
505
+ "code": "db.query(`SELECT COUNT(*) AS n FROM orders WHERE shop_id = ${req.query.shop}`, function (e, r) { res.json(r); });",
506
+ "why": "User input interpolated into SQL"
507
+ }
508
+ ],
509
+ "data_flow": [
510
+ "req.query.shop",
511
+ "sql string",
512
+ "db.query"
513
+ ],
514
+ "attack_scenario": "A crafted shop changes the WHERE clause and bypasses the password check.",
515
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
516
+ "severity": "critical",
517
+ "confidence": "high",
518
+ "cwe": [
519
+ "CWE-89"
520
+ ],
521
+ "owasp": [
522
+ "A03:2021"
523
+ ],
524
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
525
+ "status": "unverified"
526
+ },
527
+ {
528
+ "finding_id": "INJ-I-0022",
529
+ "category": "nosql_injection",
530
+ "subtype": "operator_injection",
531
+ "title": "NoSQL Injection in orders.js via direct object injection",
532
+ "candidate_id": "I-0022",
533
+ "location": {
534
+ "file": "node-express/routes/orders.js",
535
+ "start_line": 21
536
+ },
537
+ "evidence": [
538
+ {
539
+ "file": "node-express/routes/orders.js",
540
+ "line": 21,
541
+ "code": "db.collection('users').findOne(req.body, function (e, u) { res.json(!!u); });",
542
+ "why": "User input passed directly as filter object"
543
+ }
544
+ ],
545
+ "data_flow": [
546
+ "req.body",
547
+ "filter object",
548
+ "findOne"
549
+ ],
550
+ "attack_scenario": "A crafted req.body injects malicious operators into the query.",
551
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
552
+ "severity": "critical",
553
+ "confidence": "high",
554
+ "cwe": [
555
+ "CWE-89"
556
+ ],
557
+ "owasp": [
558
+ "A03:2021"
559
+ ],
560
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
561
+ "status": "unverified"
562
+ },
563
+ {
564
+ "finding_id": "INJ-I-0023",
565
+ "category": "nosql_injection",
566
+ "subtype": "string_concatenation",
567
+ "title": "NoSQL Injection in orders.js via $where string concatenation",
568
+ "candidate_id": "I-0023",
569
+ "location": {
570
+ "file": "node-express/routes/orders.js",
571
+ "start_line": 25
572
+ },
573
+ "evidence": [
574
+ {
575
+ "file": "node-express/routes/orders.js",
576
+ "line": 25,
577
+ "code": "db.collection('items').find({ $where: \"this.name == '\" + req.query.n + \"'\" }).toArray(function (e, r) { res.json(r); });",
578
+ "why": "User input concatenated into SQL"
579
+ }
580
+ ],
581
+ "data_flow": [
582
+ "req.query.n",
583
+ "$where string",
584
+ "find"
585
+ ],
586
+ "attack_scenario": "A crafted n changes the WHERE clause and bypasses the password check.",
587
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
588
+ "severity": "critical",
589
+ "confidence": "high",
590
+ "cwe": [
591
+ "CWE-89"
592
+ ],
593
+ "owasp": [
594
+ "A03:2021"
595
+ ],
596
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
597
+ "status": "unverified"
598
+ },
599
+ {
600
+ "finding_id": "INJ-I-0024",
601
+ "category": "sql_injection",
602
+ "subtype": "string_concatenation",
603
+ "title": "SQL Injection in order.cgi via string concatenation",
604
+ "candidate_id": "I-0024",
605
+ "location": {
606
+ "file": "perl-cgi/cgi-bin/order.cgi",
607
+ "start_line": 13
608
+ },
609
+ "evidence": [
610
+ {
611
+ "file": "perl-cgi/cgi-bin/order.cgi",
612
+ "line": 11,
613
+ "code": "my $id = $q->param('id');",
614
+ "why": "source: Request"
615
+ },
616
+ {
617
+ "file": "perl-cgi/cgi-bin/order.cgi",
618
+ "line": 13,
619
+ "code": "my $sth = $dbh->prepare(\"SELECT * FROM orders WHERE id = $id\");",
620
+ "why": "concatenated into SQL"
621
+ },
622
+ {
623
+ "file": "perl-cgi/cgi-bin/order.cgi",
624
+ "line": 14,
625
+ "code": "$sth->execute();",
626
+ "why": "sink"
627
+ }
628
+ ],
629
+ "data_flow": [
630
+ "$q->param (id)",
631
+ "$id",
632
+ "prepare"
633
+ ],
634
+ "attack_scenario": "A crafted id changes the WHERE clause and bypasses the password check.",
635
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
636
+ "severity": "critical",
637
+ "confidence": "high",
638
+ "cwe": [
639
+ "CWE-89"
640
+ ],
641
+ "owasp": [
642
+ "A03:2021"
643
+ ],
644
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
645
+ "status": "unverified"
646
+ },
647
+ {
648
+ "finding_id": "INJ-I-0025",
649
+ "category": "sql_injection",
650
+ "subtype": "string_concatenation",
651
+ "title": "SQL Injection in order.cgi via string concatenation",
652
+ "candidate_id": "I-0025",
653
+ "location": {
654
+ "file": "perl-cgi/cgi-bin/order.cgi",
655
+ "start_line": 19
656
+ },
657
+ "evidence": [
658
+ {
659
+ "file": "perl-cgi/cgi-bin/order.cgi",
660
+ "line": 19,
661
+ "code": "$dbh->do(\"DELETE FROM carts WHERE cart_id = \" . $q->param('cart'));",
662
+ "why": "User input concatenated into SQL"
663
+ }
664
+ ],
665
+ "data_flow": [
666
+ "$q->param (cart)",
667
+ "sql string",
668
+ "do"
669
+ ],
670
+ "attack_scenario": "A crafted cart changes the WHERE clause and bypasses the password check.",
671
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
672
+ "severity": "critical",
673
+ "confidence": "high",
674
+ "cwe": [
675
+ "CWE-89"
676
+ ],
677
+ "owasp": [
678
+ "A03:2021"
679
+ ],
680
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
681
+ "status": "unverified"
682
+ },
683
+ {
684
+ "finding_id": "INJ-I-0028",
685
+ "category": "sql_injection",
686
+ "subtype": "string_concatenation",
687
+ "title": "SQL Injection in admin.php via string concatenation",
688
+ "candidate_id": "I-0028",
689
+ "location": {
690
+ "file": "php-plain/admin.php",
691
+ "start_line": 12
692
+ },
693
+ "evidence": [
694
+ {
695
+ "file": "php-plain/admin.php",
696
+ "line": 11,
697
+ "code": "$id = $_POST['id'];",
698
+ "why": "source: POST body"
699
+ },
700
+ {
701
+ "file": "php-plain/admin.php",
702
+ "line": 12,
703
+ "code": "mysql_query(\"DELETE FROM users WHERE id = $id\");",
704
+ "why": "concatenated into SQL"
705
+ }
706
+ ],
707
+ "data_flow": [
708
+ "$_POST['id']",
709
+ "$id",
710
+ "mysql_query"
711
+ ],
712
+ "attack_scenario": "A crafted id changes the WHERE clause and bypasses the password check.",
713
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
714
+ "severity": "critical",
715
+ "confidence": "high",
716
+ "cwe": [
717
+ "CWE-89"
718
+ ],
719
+ "owasp": [
720
+ "A03:2021"
721
+ ],
722
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
723
+ "status": "unverified"
724
+ },
725
+ {
726
+ "finding_id": "INJ-I-0029",
727
+ "category": "nosql_injection",
728
+ "subtype": "operator_injection",
729
+ "title": "NoSQL Injection in mongo_find.php via direct object injection",
730
+ "candidate_id": "I-0029",
731
+ "location": {
732
+ "file": "php-plain/mongo_find.php",
733
+ "start_line": 5
734
+ },
735
+ "evidence": [
736
+ {
737
+ "file": "php-plain/mongo_find.php",
738
+ "line": 5,
739
+ "code": "$doc = $coll->findOne(array('login' => $_GET['login'], 'pass' => $_GET['pass']));",
740
+ "why": "User input passed directly as filter object"
741
+ }
742
+ ],
743
+ "data_flow": [
744
+ "$_GET['login']",
745
+ "filter object",
746
+ "findOne"
747
+ ],
748
+ "attack_scenario": "A crafted login changes the WHERE clause and bypasses the password check.",
749
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
750
+ "severity": "critical",
751
+ "confidence": "high",
752
+ "cwe": [
753
+ "CWE-89"
754
+ ],
755
+ "owasp": [
756
+ "A03:2021"
757
+ ],
758
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
759
+ "status": "unverified"
760
+ },
761
+ {
762
+ "finding_id": "INJ-I-0030",
763
+ "category": "nosql_injection",
764
+ "subtype": "string_concatenation",
765
+ "title": "NoSQL Injection in mongo_find.php via $where string concatenation",
766
+ "candidate_id": "I-0030",
767
+ "location": {
768
+ "file": "php-plain/mongo_find.php",
769
+ "start_line": 6
770
+ },
771
+ "evidence": [
772
+ {
773
+ "file": "php-plain/mongo_find.php",
774
+ "line": 6,
775
+ "code": "$docs = $coll->find(array('$where' => \"this.name == '\" . $_GET['n'] . \"'\"));",
776
+ "why": "User input concatenated into SQL"
777
+ }
778
+ ],
779
+ "data_flow": [
780
+ "$_GET['n']",
781
+ "$where string",
782
+ "find"
783
+ ],
784
+ "attack_scenario": "A crafted n changes the WHERE clause and bypasses the password check.",
785
+ "impact": "Authentication bypass; read/modify any table the DB user can access.",
786
+ "severity": "critical",
787
+ "confidence": "high",
788
+ "cwe": [
789
+ "CWE-89"
790
+ ],
791
+ "owasp": [
792
+ "A03:2021"
793
+ ],
794
+ "recommendation": "Use parameterized queries or prepared statements instead of string concatenation.",
795
+ "status": "unverified"
796
+ }
797
+ ],
798
+ "candidate_verdicts": [
799
+ {
800
+ "candidate_id": "I-0001",
801
+ "verdict": "vulnerable",
802
+ "finding_ids": [
803
+ "INJ-I-0001"
804
+ ]
805
+ },
806
+ {
807
+ "candidate_id": "I-0002",
808
+ "verdict": "vulnerable",
809
+ "finding_ids": [
810
+ "INJ-I-0001"
811
+ ]
812
+ },
813
+ {
814
+ "candidate_id": "I-0003",
815
+ "verdict": "vulnerable",
816
+ "finding_ids": [
817
+ "INJ-I-0003"
818
+ ]
819
+ },
820
+ {
821
+ "candidate_id": "I-0004",
822
+ "verdict": "vulnerable",
823
+ "finding_ids": [
824
+ "INJ-I-0004"
825
+ ]
826
+ },
827
+ {
828
+ "candidate_id": "I-0005",
829
+ "verdict": "safe",
830
+ "reason": "Strict type cast (CLng) prevents SQL injection syntax manipulation."
831
+ },
832
+ {
833
+ "candidate_id": "I-0006",
834
+ "verdict": "vulnerable",
835
+ "finding_ids": [
836
+ "INJ-I-0006"
837
+ ]
838
+ },
839
+ {
840
+ "candidate_id": "I-0007",
841
+ "verdict": "vulnerable",
842
+ "finding_ids": [
843
+ "INJ-I-0007"
844
+ ]
845
+ },
846
+ {
847
+ "candidate_id": "I-0009",
848
+ "verdict": "vulnerable",
849
+ "finding_ids": [
850
+ "INJ-I-0009"
851
+ ]
852
+ },
853
+ {
854
+ "candidate_id": "I-0010",
855
+ "verdict": "vulnerable",
856
+ "finding_ids": [
857
+ "INJ-I-0010"
858
+ ]
859
+ },
860
+ {
861
+ "candidate_id": "I-0011",
862
+ "verdict": "vulnerable",
863
+ "finding_ids": [
864
+ "INJ-I-0011"
865
+ ]
866
+ },
867
+ {
868
+ "candidate_id": "I-0012",
869
+ "verdict": "vulnerable",
870
+ "finding_ids": [
871
+ "INJ-I-0012"
872
+ ]
873
+ },
874
+ {
875
+ "candidate_id": "I-0014",
876
+ "verdict": "vulnerable",
877
+ "finding_ids": [
878
+ "INJ-I-0012"
879
+ ]
880
+ },
881
+ {
882
+ "candidate_id": "I-0016",
883
+ "verdict": "vulnerable",
884
+ "finding_ids": [
885
+ "INJ-I-0016"
886
+ ]
887
+ },
888
+ {
889
+ "candidate_id": "I-0017",
890
+ "verdict": "vulnerable",
891
+ "finding_ids": [
892
+ "INJ-I-0017"
893
+ ]
894
+ },
895
+ {
896
+ "candidate_id": "I-0020",
897
+ "verdict": "vulnerable",
898
+ "finding_ids": [
899
+ "INJ-I-0020"
900
+ ]
901
+ },
902
+ {
903
+ "candidate_id": "I-0021",
904
+ "verdict": "vulnerable",
905
+ "finding_ids": [
906
+ "INJ-I-0021"
907
+ ]
908
+ },
909
+ {
910
+ "candidate_id": "I-0022",
911
+ "verdict": "vulnerable",
912
+ "finding_ids": [
913
+ "INJ-I-0022"
914
+ ]
915
+ },
916
+ {
917
+ "candidate_id": "I-0023",
918
+ "verdict": "vulnerable",
919
+ "finding_ids": [
920
+ "INJ-I-0023"
921
+ ]
922
+ },
923
+ {
924
+ "candidate_id": "I-0024",
925
+ "verdict": "vulnerable",
926
+ "finding_ids": [
927
+ "INJ-I-0024"
928
+ ]
929
+ },
930
+ {
931
+ "candidate_id": "I-0025",
932
+ "verdict": "vulnerable",
933
+ "finding_ids": [
934
+ "INJ-I-0025"
935
+ ]
936
+ },
937
+ {
938
+ "candidate_id": "I-0027",
939
+ "verdict": "safe",
940
+ "reason": "Strict type cast ((int)) prevents SQL injection syntax manipulation."
941
+ },
942
+ {
943
+ "candidate_id": "I-0028",
944
+ "verdict": "vulnerable",
945
+ "finding_ids": [
946
+ "INJ-I-0028"
947
+ ]
948
+ },
949
+ {
950
+ "candidate_id": "I-0029",
951
+ "verdict": "vulnerable",
952
+ "finding_ids": [
953
+ "INJ-I-0029"
954
+ ]
955
+ },
956
+ {
957
+ "candidate_id": "I-0030",
958
+ "verdict": "vulnerable",
959
+ "finding_ids": [
960
+ "INJ-I-0030"
961
+ ]
962
+ }
963
+ ]
964
+ }