blitzstrike 2.4.67 → 2.4.69

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.
@@ -8,221 +8,632 @@
8
8
  "name": "SQL Injection",
9
9
  "cwe": "CWE-89",
10
10
  "real_world": "User input is interpolated into a SQL query by string concatenation instead of parameterization. The single most-reported web class; real disclosures range from boolean/UNION extraction to stacked queries for admin takeover.",
11
- "detection_signatures": ["raw string-interpolated query into a SQL sink", "no prepare()/parameterization", "cross-file: concatenated variable with no visible source"],
12
- "chain_templates": ["sqli_to_rce", "sqli_to_hash_dump_and_crack", "sql_injection_to_rce", "second_order_sqli"],
13
- "references": ["CWE-89", "OWASP A03:2021 Injection"],
14
- "bypass_techniques": ["comment/whitespace obfuscation to slip past keyword filters", "hex + double-URL encoding of payloads", "second-order: store payload, trigger on a later read", "time-based blind when output is suppressed", "chunked/case-mangled keywords"],
15
- "crown_jewels": ["credential + session tables", "admin/role tables", "PII and financial records", "password-hash dumps for offline cracking"]
11
+ "detection_signatures": [
12
+ "raw string-interpolated query into a SQL sink",
13
+ "no prepare()/parameterization",
14
+ "cross-file: concatenated variable with no visible source"
15
+ ],
16
+ "chain_templates": [
17
+ "sqli_to_rce",
18
+ "sqli_to_hash_dump_and_crack",
19
+ "sql_injection_to_rce",
20
+ "second_order_sqli"
21
+ ],
22
+ "references": [
23
+ "CWE-89",
24
+ "OWASP A03:2021 Injection"
25
+ ],
26
+ "bypass_techniques": [
27
+ "comment/whitespace obfuscation to slip past keyword filters",
28
+ "hex + double-URL encoding of payloads",
29
+ "second-order: store payload, trigger on a later read",
30
+ "time-based blind when output is suppressed",
31
+ "chunked/case-mangled keywords"
32
+ ],
33
+ "crown_jewels": [
34
+ "credential + session tables",
35
+ "admin/role tables",
36
+ "PII and financial records",
37
+ "password-hash dumps for offline cracking"
38
+ ]
16
39
  },
17
40
  {
18
41
  "id": "ssrf",
19
42
  "name": "Server-Side Request Forgery",
20
43
  "cwe": "CWE-918",
21
44
  "real_world": "A server fetches an attacker-supplied URL with no host allowlist, letting it reach cloud metadata endpoints, internal services, or the loopback interface.",
22
- "detection_signatures": ["server-side fetch of a request-controlled URL", "no host/allowlist validation"],
23
- "chain_templates": ["ssrf_cloud_metadata", "ssrf_to_redis_rce", "blind_ssrf_to_oob_exfil"],
24
- "references": ["CWE-918", "OWASP A10:2021 SSRF"],
25
- "bypass_techniques": ["DNS rebinding to pass host checks", "decimal/octal/hex + IPv6 IP encodings", "redirect chains to a blocklisted host", "gopher/dict/file URL schemes", "localhost aliases (0, 127.1, ::1)"],
26
- "crown_jewels": ["cloud metadata (169.254.169.254) for instance credentials", "internal admin panels + APIs", "internal Redis/DB/Elasticsearch", "cloud IAM / STS AssumeRole endpoints"]
45
+ "detection_signatures": [
46
+ "server-side fetch of a request-controlled URL",
47
+ "no host/allowlist validation"
48
+ ],
49
+ "chain_templates": [
50
+ "ssrf_cloud_metadata",
51
+ "ssrf_to_redis_rce",
52
+ "blind_ssrf_to_oob_exfil"
53
+ ],
54
+ "references": [
55
+ "CWE-918",
56
+ "OWASP A10:2021 SSRF"
57
+ ],
58
+ "bypass_techniques": [
59
+ "DNS rebinding to pass host checks",
60
+ "decimal/octal/hex + IPv6 IP encodings",
61
+ "redirect chains to a blocklisted host",
62
+ "gopher/dict/file URL schemes",
63
+ "localhost aliases (0, 127.1, ::1)"
64
+ ],
65
+ "crown_jewels": [
66
+ "cloud metadata (169.254.169.254) for instance credentials",
67
+ "internal admin panels + APIs",
68
+ "internal Redis/DB/Elasticsearch",
69
+ "cloud IAM / STS AssumeRole endpoints"
70
+ ]
27
71
  },
28
72
  {
29
73
  "id": "ssti",
30
74
  "name": "Server-Side Template Injection",
31
75
  "cwe": "CWE-1336",
32
76
  "real_world": "User input reaches a template engine (Jinja2, Twig, Freemarker, ERB, …) that evaluates expressions, yielding code execution via template syntax like {{7*7}}.",
33
- "detection_signatures": ["template render of request input", "expression evaluation in a template engine"],
34
- "chain_templates": ["ssti_template_injection_rce", "ssti_to_full_rce"],
35
- "references": ["CWE-1336", "OWASP A03:2021 Injection"],
36
- "bypass_techniques": ["sandbox escape via attribute/object introspection", "unicode/alternate delimiter to dodge input filters", "chaining globals/locals to reach builtins", "engine-specific escapes (Jinja2 → Python, Twig → PHP)"],
37
- "crown_jewels": ["direct RCE", "config files + secrets", "template/partials with injected backdoors"]
77
+ "detection_signatures": [
78
+ "template render of request input",
79
+ "expression evaluation in a template engine"
80
+ ],
81
+ "chain_templates": [
82
+ "ssti_template_injection_rce",
83
+ "ssti_to_full_rce"
84
+ ],
85
+ "references": [
86
+ "CWE-1336",
87
+ "OWASP A03:2021 Injection"
88
+ ],
89
+ "bypass_techniques": [
90
+ "sandbox escape via attribute/object introspection",
91
+ "unicode/alternate delimiter to dodge input filters",
92
+ "chaining globals/locals to reach builtins",
93
+ "engine-specific escapes (Jinja2 → Python, Twig → PHP)"
94
+ ],
95
+ "crown_jewels": [
96
+ "direct RCE",
97
+ "config files + secrets",
98
+ "template/partials with injected backdoors"
99
+ ]
38
100
  },
39
101
  {
40
102
  "id": "xxe",
41
103
  "name": "XML External Entity Injection",
42
104
  "cwe": "CWE-611",
43
105
  "real_world": "An XML parser resolves external entities, letting an attacker read local files or hit internal URLs via DOCTYPE entity definitions.",
44
- "detection_signatures": ["XML parse without disabling external entities", "DOCTYPE/ENTITY processing"],
45
- "chain_templates": ["xxe_to_ssrf_and_file_read"],
46
- "references": ["CWE-611", "OWASP A03:2021 Injection"],
47
- "bypass_techniques": ["parameter entities + external DTD for blind exfiltration", "OOB (out-of-band) via FTP/HTTP entity callbacks", "UTF-7/UTF-16 encodings to dodge ASCII filters", "XInclude when DOCTYPE is blocked"],
48
- "crown_jewels": ["local files (/etc/passwd, app keys, .env)", "internal SSRF via entity", "cloud metadata via file:// + SSRF chain"]
106
+ "detection_signatures": [
107
+ "XML parse without disabling external entities",
108
+ "DOCTYPE/ENTITY processing"
109
+ ],
110
+ "chain_templates": [
111
+ "xxe_to_ssrf_and_file_read"
112
+ ],
113
+ "references": [
114
+ "CWE-611",
115
+ "OWASP A03:2021 Injection"
116
+ ],
117
+ "bypass_techniques": [
118
+ "parameter entities + external DTD for blind exfiltration",
119
+ "OOB (out-of-band) via FTP/HTTP entity callbacks",
120
+ "UTF-7/UTF-16 encodings to dodge ASCII filters",
121
+ "XInclude when DOCTYPE is blocked"
122
+ ],
123
+ "crown_jewels": [
124
+ "local files (/etc/passwd, app keys, .env)",
125
+ "internal SSRF via entity",
126
+ "cloud metadata via file:// + SSRF chain"
127
+ ]
49
128
  },
50
129
  {
51
130
  "id": "deserialization",
52
131
  "name": "Insecure Deserialization",
53
132
  "cwe": "CWE-502",
54
133
  "real_world": "Attacker-controlled serialized data is deserialized and escalated through a magic-method gadget chain (__destruct/__wakeup/__toString) into code execution or object injection.",
55
- "detection_signatures": ["unserialize()/pickle.loads/yaml.load of request data", "a magic-method gadget in scope"],
56
- "chain_templates": ["deserialization_pop_chain", "deserialization_to_rce", "appkey_leak_deserialization_rce"],
57
- "references": ["CWE-502", "OWASP A08:2021 Software and Data Integrity Failures"],
58
- "bypass_techniques": ["custom gadget chains for the app's own classes", "phar:// stream wrappers to trigger unserialize", "wrapper formats (pickle, yaml, jsonpickle)", "encrypted-session forgery once a secret leaks"],
59
- "crown_jewels": ["RCE via gadget chain", "session/cookie forgery", "admin object injection"]
134
+ "detection_signatures": [
135
+ "unserialize()/pickle.loads/yaml.load of request data",
136
+ "a magic-method gadget in scope"
137
+ ],
138
+ "chain_templates": [
139
+ "deserialization_pop_chain",
140
+ "deserialization_to_rce",
141
+ "appkey_leak_deserialization_rce"
142
+ ],
143
+ "references": [
144
+ "CWE-502",
145
+ "OWASP A08:2021 Software and Data Integrity Failures"
146
+ ],
147
+ "bypass_techniques": [
148
+ "custom gadget chains for the app's own classes",
149
+ "phar:// stream wrappers to trigger unserialize",
150
+ "wrapper formats (pickle, yaml, jsonpickle)",
151
+ "encrypted-session forgery once a secret leaks"
152
+ ],
153
+ "crown_jewels": [
154
+ "RCE via gadget chain",
155
+ "session/cookie forgery",
156
+ "admin object injection"
157
+ ]
60
158
  },
61
159
  {
62
160
  "id": "type_juggling",
63
161
  "name": "PHP Type Juggling (Loose Comparison)",
64
162
  "cwe": "CWE-697",
65
163
  "real_world": "A loose comparison (==) between user input and a hash/secret collapses via the 0e magic-hash or numeric-string coercion, bypassing authentication.",
66
- "detection_signatures": ["loose comparison == of user input against a secret/hash", "0e-prefixed or numeric-string coercion"],
67
- "chain_templates": ["php_type_juggling_auth_bypass"],
68
- "references": ["CWE-697", "OWASP A07:2021 Identification and Authentication Failures"],
69
- "bypass_techniques": ["0e magic hashes (0e1234… == 0e5678…)", "numeric-string coercion (\"1admin\" == 1)", "array comparison (array() == false)", "null/empty-string coercion"],
70
- "crown_jewels": ["authentication bypass", "session/cookie validation bypass", "API token check bypass"]
164
+ "detection_signatures": [
165
+ "loose comparison == of user input against a secret/hash",
166
+ "0e-prefixed or numeric-string coercion"
167
+ ],
168
+ "chain_templates": [
169
+ "php_type_juggling_auth_bypass"
170
+ ],
171
+ "references": [
172
+ "CWE-697",
173
+ "OWASP A07:2021 Identification and Authentication Failures"
174
+ ],
175
+ "bypass_techniques": [
176
+ "0e magic hashes (0e1234… == 0e5678…)",
177
+ "numeric-string coercion (\"1admin\" == 1)",
178
+ "array comparison (array() == false)",
179
+ "null/empty-string coercion"
180
+ ],
181
+ "crown_jewels": [
182
+ "authentication bypass",
183
+ "session/cookie validation bypass",
184
+ "API token check bypass"
185
+ ]
71
186
  },
72
187
  {
73
188
  "id": "mass_assignment",
74
189
  "name": "Mass Assignment",
75
190
  "cwe": "CWE-915",
76
191
  "real_world": "Request data is bound to model fields without an allowlist (extract()/parse_str/framework mass-assign), letting an attacker set privileged fields like role or is_admin.",
77
- "detection_signatures": ["extract()/parse_str of request data without a safe flag", "model binding without an allowlist"],
78
- "chain_templates": ["mass_assignment_to_admin_takeover", "extract_variable_injection_lfi"],
79
- "references": ["CWE-915", "OWASP API6:2023 Unrestricted Access to Sensitive Business Flows"],
80
- "bypass_techniques": ["nested/array parameters to reach guarded fields", "JSON body field injection", "adding is_admin/role/verified fields to a request", "framework default mass-assign without allowlist"],
81
- "crown_jewels": ["role / is_admin / is_verified flags", "subscription tier + pricing fields", "account ownership / org membership"]
192
+ "detection_signatures": [
193
+ "extract()/parse_str of request data without a safe flag",
194
+ "model binding without an allowlist"
195
+ ],
196
+ "chain_templates": [
197
+ "mass_assignment_to_admin_takeover",
198
+ "extract_variable_injection_lfi"
199
+ ],
200
+ "references": [
201
+ "CWE-915",
202
+ "OWASP API6:2023 Unrestricted Access to Sensitive Business Flows"
203
+ ],
204
+ "bypass_techniques": [
205
+ "nested/array parameters to reach guarded fields",
206
+ "JSON body field injection",
207
+ "adding is_admin/role/verified fields to a request",
208
+ "framework default mass-assign without allowlist"
209
+ ],
210
+ "crown_jewels": [
211
+ "role / is_admin / is_verified flags",
212
+ "subscription tier + pricing fields",
213
+ "account ownership / org membership"
214
+ ]
82
215
  },
83
216
  {
84
217
  "id": "prototype_pollution",
85
218
  "name": "Prototype Pollution",
86
219
  "cwe": "CWE-1321",
87
220
  "real_world": "A deep merge of request data into an object pollutes Object.prototype, corrupting logic and escalating to code execution in gadget-heavy runtimes.",
88
- "detection_signatures": ["deep merge/extend of request data into objects", "__proto__ / constructor.prototype assignment"],
89
- "chain_templates": ["prototype_pollution_to_rce"],
90
- "references": ["CWE-1321"],
91
- "bypass_techniques": ["__proto__ via constructor.prototype aliases", "array-key pollution to reach the merge", "gadget chaining to RCE", "property injection to bypass auth/ACL"],
92
- "crown_jewels": ["RCE gadgets (child_process, template engines)", "authentication/ACL bypass", "XSS or property-injection escalation"]
221
+ "detection_signatures": [
222
+ "deep merge/extend of request data into objects",
223
+ "__proto__ / constructor.prototype assignment"
224
+ ],
225
+ "chain_templates": [
226
+ "prototype_pollution_to_rce"
227
+ ],
228
+ "references": [
229
+ "CWE-1321"
230
+ ],
231
+ "bypass_techniques": [
232
+ "__proto__ via constructor.prototype aliases",
233
+ "array-key pollution to reach the merge",
234
+ "gadget chaining to RCE",
235
+ "property injection to bypass auth/ACL"
236
+ ],
237
+ "crown_jewels": [
238
+ "RCE gadgets (child_process, template engines)",
239
+ "authentication/ACL bypass",
240
+ "XSS or property-injection escalation"
241
+ ]
93
242
  },
94
243
  {
95
244
  "id": "crlf_injection",
96
245
  "name": "CRLF Injection / Header Injection",
97
246
  "cwe": "CWE-93",
98
247
  "real_world": "Request-controlled newlines are written into an HTTP header, enabling response splitting, cookie injection, or cache poisoning.",
99
- "detection_signatures": ["request input reaches a header without CR/LF stripping"],
100
- "chain_templates": ["cache_poisoning_xss", "cache_poison_to_stored_xss"],
101
- "references": ["CWE-93", "OWASP A03:2021 Injection"],
102
- "bypass_techniques": ["double-URL-encoded %0d%0a", "unicode line separators (U+2028/U+2029)", "header smuggling via folded headers"],
103
- "crown_jewels": ["Set-Cookie injection → session fixation", "response splitting → XSS", "cache poisoning → stored XSS"]
248
+ "detection_signatures": [
249
+ "request input reaches a header without CR/LF stripping"
250
+ ],
251
+ "chain_templates": [
252
+ "cache_poisoning_xss",
253
+ "cache_poison_to_stored_xss"
254
+ ],
255
+ "references": [
256
+ "CWE-93",
257
+ "OWASP A03:2021 Injection"
258
+ ],
259
+ "bypass_techniques": [
260
+ "double-URL-encoded %0d%0a",
261
+ "unicode line separators (U+2028/U+2029)",
262
+ "header smuggling via folded headers"
263
+ ],
264
+ "crown_jewels": [
265
+ "Set-Cookie injection → session fixation",
266
+ "response splitting → XSS",
267
+ "cache poisoning → stored XSS"
268
+ ]
104
269
  },
105
270
  {
106
271
  "id": "path_confusion",
107
272
  "name": "Path Traversal / Path Confusion",
108
273
  "cwe": "CWE-22",
109
274
  "real_world": "A request-controlled path is normalized or resolved without confinement (../, %2e%2e, absolute paths), reading or writing files outside the intended directory.",
110
- "detection_signatures": ["request input reaches a file path without confinement"],
111
- "chain_templates": ["path_traversal_file_write", "path_traversal_to_credential_theft", "lfi_log_poison_rce", "lfi_to_rce_via_log_poisoning"],
112
- "references": ["CWE-22", "OWASP A01:2021 Broken Access Control"],
113
- "bypass_techniques": ["null-byte truncation (legacy PHP)", "double encoding %252e%252e%252f", "unicode + absolute-path variants", "symlink / wildcard resolution", "log-poisoning to turn LFI into RCE"],
114
- "crown_jewels": ["config files + .env + private keys", "/etc/passwd and shadow", "source code for further audit", "writable dirs for a shell drop"]
275
+ "detection_signatures": [
276
+ "request input reaches a file path without confinement"
277
+ ],
278
+ "chain_templates": [
279
+ "path_traversal_file_write",
280
+ "path_traversal_to_credential_theft",
281
+ "lfi_log_poison_rce",
282
+ "lfi_to_rce_via_log_poisoning"
283
+ ],
284
+ "references": [
285
+ "CWE-22",
286
+ "OWASP A01:2021 Broken Access Control"
287
+ ],
288
+ "bypass_techniques": [
289
+ "null-byte truncation (legacy PHP)",
290
+ "double encoding %252e%252e%252f",
291
+ "unicode + absolute-path variants",
292
+ "symlink / wildcard resolution",
293
+ "log-poisoning to turn LFI into RCE"
294
+ ],
295
+ "crown_jewels": [
296
+ "config files + .env + private keys",
297
+ "/etc/passwd and shadow",
298
+ "source code for further audit",
299
+ "writable dirs for a shell drop"
300
+ ]
115
301
  },
116
302
  {
117
303
  "id": "wrong_sanitizer",
118
304
  "name": "Wrong-Context Sanitization",
119
305
  "cwe": "CWE-20",
120
306
  "real_world": "A value is sanitized for one context (e.g. HTML) but reaches a sink that needs a different context (e.g. SQL), so the sanitizer provides no real protection.",
121
- "detection_signatures": ["a sanitizer/validator for context X feeding a sink that requires context Y"],
122
- "chain_templates": ["second_order_sqli"],
123
- "references": ["CWE-20", "OWASP A03:2021 Injection"],
124
- "bypass_techniques": ["context mismatch (HTML-escape then SQL, or vice-versa)", "double encoding to survive a single decode", "sanitizer that misses alternate encodings"],
125
- "crown_jewels": ["downstream injection (SQLi/XSS/RCE)", "stored data that re-enters a different sink"]
307
+ "detection_signatures": [
308
+ "a sanitizer/validator for context X feeding a sink that requires context Y"
309
+ ],
310
+ "chain_templates": [
311
+ "second_order_sqli"
312
+ ],
313
+ "references": [
314
+ "CWE-20",
315
+ "OWASP A03:2021 Injection"
316
+ ],
317
+ "bypass_techniques": [
318
+ "context mismatch (HTML-escape then SQL, or vice-versa)",
319
+ "double encoding to survive a single decode",
320
+ "sanitizer that misses alternate encodings"
321
+ ],
322
+ "crown_jewels": [
323
+ "downstream injection (SQLi/XSS/RCE)",
324
+ "stored data that re-enters a different sink"
325
+ ]
126
326
  },
127
327
  {
128
328
  "id": "missing_authz",
129
329
  "name": "Missing Authorization (Broken Access Control)",
130
330
  "cwe": "CWE-862",
131
331
  "real_world": "A state-changing handler lacks a capability/ownership check, letting an unauthenticated or low-privilege caller perform an admin action.",
132
- "detection_signatures": ["state-changing operation with no current_user_can/is_user_logged_in check"],
133
- "chain_templates": ["idor_to_admin_takeover", "mass_assignment_to_admin_takeover", "idor_object_reference"],
134
- "references": ["CWE-862", "OWASP A01:2021 Broken Access Control"],
135
- "bypass_techniques": ["HTTP verb tampering (GET vs POST vs PUT)", "sequential/UUID/guessable object-ID enumeration", "cross-tenant / cross-org ID swapping", "header-based authz spoofing"],
136
- "crown_jewels": ["cross-tenant data + employee PII", "admin/moderator endpoints", "financial documents + billing APIs", "org/account management actions"]
332
+ "detection_signatures": [
333
+ "state-changing operation with no current_user_can/is_user_logged_in check"
334
+ ],
335
+ "chain_templates": [
336
+ "idor_to_admin_takeover",
337
+ "mass_assignment_to_admin_takeover",
338
+ "idor_object_reference"
339
+ ],
340
+ "references": [
341
+ "CWE-862",
342
+ "OWASP A01:2021 Broken Access Control"
343
+ ],
344
+ "bypass_techniques": [
345
+ "HTTP verb tampering (GET vs POST vs PUT)",
346
+ "sequential/UUID/guessable object-ID enumeration",
347
+ "cross-tenant / cross-org ID swapping",
348
+ "header-based authz spoofing"
349
+ ],
350
+ "crown_jewels": [
351
+ "cross-tenant data + employee PII",
352
+ "admin/moderator endpoints",
353
+ "financial documents + billing APIs",
354
+ "org/account management actions"
355
+ ]
137
356
  },
138
357
  {
139
358
  "id": "missing_nonce",
140
359
  "name": "Missing Nonce (CSRF)",
141
360
  "cwe": "CWE-352",
142
361
  "real_world": "A state-changing action lacks an anti-CSRF token, letting a victim's browser perform the action on their behalf via a forged request.",
143
- "detection_signatures": ["state-changing operation with no nonce/referer verification"],
144
- "chain_templates": ["nonce_harvest_auth_bypass"],
145
- "references": ["CWE-352", "OWASP A01:2021 Broken Access Control"],
146
- "bypass_techniques": ["empty/null token accepted", "predictable or reusable tokens", "verb switching to skip the check", "referer/Origin header spoofing or absence"],
147
- "crown_jewels": ["password/email change", "money transfer / payment actions", "admin config changes"]
362
+ "detection_signatures": [
363
+ "state-changing operation with no nonce/referer verification"
364
+ ],
365
+ "chain_templates": [
366
+ "nonce_harvest_auth_bypass"
367
+ ],
368
+ "references": [
369
+ "CWE-352",
370
+ "OWASP A01:2021 Broken Access Control"
371
+ ],
372
+ "bypass_techniques": [
373
+ "empty/null token accepted",
374
+ "predictable or reusable tokens",
375
+ "verb switching to skip the check",
376
+ "referer/Origin header spoofing or absence"
377
+ ],
378
+ "crown_jewels": [
379
+ "password/email change",
380
+ "money transfer / payment actions",
381
+ "admin config changes"
382
+ ]
148
383
  },
149
384
  {
150
385
  "id": "file_upload",
151
386
  "name": "Unrestricted File Upload",
152
387
  "cwe": "CWE-434",
153
388
  "real_world": "A file is uploaded with an attacker-controlled name/extension and no server-side filetype whitelist, landing web-reachable for code execution.",
154
- "detection_signatures": ["move_uploaded_file/wp_upload_bits with attacker-controlled name", "no extension/mime whitelist", "uploadAllow=all connector config"],
155
- "chain_templates": ["upload_polyglot_rce", "file_upload_to_rce", "split_controller_upload_bypass"],
156
- "references": ["CWE-434", "OWASP A04:2021 Insecure Design"],
157
- "bypass_techniques": ["double extension (.php.jpg, .jpg.php)", "null-byte + alternate extensions (.pht, .php5, .phtml)", "content-type/mime spoofing", "polyglot files (valid image + payload)"],
158
- "crown_jewels": ["web-reachable upload directory", "avatar/profile/document uploads", "document converters (PDF/Office) with a known chain"]
389
+ "detection_signatures": [
390
+ "move_uploaded_file/wp_upload_bits with attacker-controlled name",
391
+ "no extension/mime whitelist",
392
+ "uploadAllow=all connector config"
393
+ ],
394
+ "chain_templates": [
395
+ "upload_polyglot_rce",
396
+ "file_upload_to_rce",
397
+ "split_controller_upload_bypass"
398
+ ],
399
+ "references": [
400
+ "CWE-434",
401
+ "OWASP A04:2021 Insecure Design"
402
+ ],
403
+ "bypass_techniques": [
404
+ "double extension (.php.jpg, .jpg.php)",
405
+ "null-byte + alternate extensions (.pht, .php5, .phtml)",
406
+ "content-type/mime spoofing",
407
+ "polyglot files (valid image + payload)"
408
+ ],
409
+ "crown_jewels": [
410
+ "web-reachable upload directory",
411
+ "avatar/profile/document uploads",
412
+ "document converters (PDF/Office) with a known chain"
413
+ ]
159
414
  },
160
415
  {
161
416
  "id": "priv_esc",
162
417
  "name": "Privilege Escalation",
163
418
  "cwe": "CWE-269",
164
419
  "real_world": "A role/capability/user change is fed by request input and reachable from a public entry point with no capability check, letting a user self-assign admin.",
165
- "detection_signatures": ["set_role/add_role/add_cap of request input", "cross-file: sink reachable from public hook with no capability check"],
166
- "chain_templates": ["mass_assignment_to_admin_takeover", "idor_to_admin_takeover"],
167
- "references": ["CWE-269", "OWASP A01:2021 Broken Access Control"],
168
- "bypass_techniques": ["role parameter injection in registration/profile", "missing capability check on a public hook", "default-role override", "wp_capabilities/user-meta injection"],
169
- "crown_jewels": ["administrator / superuser role", "tenant-admin role", "org-owner / root capabilities"]
420
+ "detection_signatures": [
421
+ "set_role/add_role/add_cap of request input",
422
+ "cross-file: sink reachable from public hook with no capability check"
423
+ ],
424
+ "chain_templates": [
425
+ "mass_assignment_to_admin_takeover",
426
+ "idor_to_admin_takeover"
427
+ ],
428
+ "references": [
429
+ "CWE-269",
430
+ "OWASP A01:2021 Broken Access Control"
431
+ ],
432
+ "bypass_techniques": [
433
+ "role parameter injection in registration/profile",
434
+ "missing capability check on a public hook",
435
+ "default-role override",
436
+ "wp_capabilities/user-meta injection"
437
+ ],
438
+ "crown_jewels": [
439
+ "administrator / superuser role",
440
+ "tenant-admin role",
441
+ "org-owner / root capabilities"
442
+ ]
170
443
  },
171
444
  {
172
445
  "id": "hardcoded_secret",
173
446
  "name": "Hardcoded Credentials",
174
447
  "cwe": "CWE-798",
175
448
  "real_world": "A secret (API key, database password, access token, private key) is committed in source, exposing it to anyone with repo access. Real disclosures regularly turn a leaked key into account takeover or cloud compromise.",
176
- "detection_signatures": ["secret field assigned a literal", "known secret format (JWT/AWS/GitHub/Slack/…) in source", "high-entropy token under a non-obvious name"],
177
- "chain_templates": ["api_key_leak_to_account_takeover", "appkey_leak_deserialization_rce", "default_creds_to_internal_pivot"],
178
- "references": ["CWE-798", "OWASP A02:2021 Cryptographic Failures"],
179
- "bypass_techniques": ["base64/hex-encoded secrets that evade naive regex", "secrets split across concatenation", "env-masquerading (default value committed)", "minified/bundled assets hiding keys"],
180
- "crown_jewels": ["cloud credentials (AWS/GCP/Azure)", "database credentials", "JWT signing keys", "payment/provider API tokens"]
449
+ "detection_signatures": [
450
+ "secret field assigned a literal",
451
+ "known secret format (JWT/AWS/GitHub/Slack/…) in source",
452
+ "high-entropy token under a non-obvious name"
453
+ ],
454
+ "chain_templates": [
455
+ "api_key_leak_to_account_takeover",
456
+ "appkey_leak_deserialization_rce",
457
+ "default_creds_to_internal_pivot"
458
+ ],
459
+ "references": [
460
+ "CWE-798",
461
+ "OWASP A02:2021 Cryptographic Failures"
462
+ ],
463
+ "bypass_techniques": [
464
+ "base64/hex-encoded secrets that evade naive regex",
465
+ "secrets split across concatenation",
466
+ "env-masquerading (default value committed)",
467
+ "minified/bundled assets hiding keys"
468
+ ],
469
+ "crown_jewels": [
470
+ "cloud credentials (AWS/GCP/Azure)",
471
+ "database credentials",
472
+ "JWT signing keys",
473
+ "payment/provider API tokens"
474
+ ]
181
475
  },
182
476
  {
183
477
  "id": "llm_injection",
184
478
  "name": "LLM Prompt Injection",
185
479
  "cwe": "CWE-77",
186
480
  "real_world": "Untrusted text reaches an LLM call (chat/completion/invoke) without a prompt-injection boundary, letting the input override instructions, leak the system prompt, or steer the model into a privileged action.",
187
- "detection_signatures": ["an LLM provider call (openai/anthropic/langchain/llm) with request input in scope", "no visible system-prompt boundary or output filtering"],
481
+ "detection_signatures": [
482
+ "an LLM provider call (openai/anthropic/langchain/llm) with request input in scope",
483
+ "no visible system-prompt boundary or output filtering"
484
+ ],
188
485
  "chain_templates": [],
189
- "references": ["CWE-77", "OWASP LLM01:2025 Prompt Injection"],
190
- "bypass_techniques": ["delimiter/role confusion to escape the system prompt", "translation/encoding attacks to hide instructions", "context overflow to displace earlier constraints", "indirect injection via fetched documents (RAG)"],
191
- "crown_jewels": ["the system prompt itself", "tool/function-calling surfaces", "RAG-retrieved data", "privileged actions (email/send/pay) gated on model output"],
192
- "validation": ["RUN-TWICE RULE — the extraction/injection must reproduce token-for-token across two fresh sessions (filter out model confabulation)", "NON-GUESSABLE ANCHOR — it must leak an actual verifiable internal key, endpoint URL, or cross-tenant data, not a plausible guess", "OOB PROOF — tool-use or markdown exfiltration must produce a verifiable callback log on your listener"]
486
+ "references": [
487
+ "CWE-77",
488
+ "OWASP LLM01:2025 Prompt Injection"
489
+ ],
490
+ "bypass_techniques": [
491
+ "delimiter/role confusion to escape the system prompt",
492
+ "translation/encoding attacks to hide instructions",
493
+ "context overflow to displace earlier constraints",
494
+ "indirect injection via fetched documents (RAG)"
495
+ ],
496
+ "crown_jewels": [
497
+ "the system prompt itself",
498
+ "tool/function-calling surfaces",
499
+ "RAG-retrieved data",
500
+ "privileged actions (email/send/pay) gated on model output"
501
+ ],
502
+ "validation": [
503
+ "RUN-TWICE RULE — the extraction/injection must reproduce token-for-token across two fresh sessions (filter out model confabulation)",
504
+ "NON-GUESSABLE ANCHOR — it must leak an actual verifiable internal key, endpoint URL, or cross-tenant data, not a plausible guess",
505
+ "OOB PROOF — tool-use or markdown exfiltration must produce a verifiable callback log on your listener"
506
+ ]
193
507
  },
194
508
  {
195
509
  "id": "graphql_exposure",
196
510
  "name": "GraphQL Introspection / Playground Exposure",
197
511
  "cwe": "CWE-200",
198
512
  "real_world": "GraphQL introspection or a playground is left enabled in production, exposing the full schema (every query/mutation/field) and enabling interactive querying for recon.",
199
- "detection_signatures": ["introspection/playground/graphiql set true in a production-reachable config"],
200
- "chain_templates": ["graphql_idor_to_data_theft", "graphql_batching_to_credential_stuffing"],
201
- "references": ["CWE-200", "OWASP API2:2023 Broken Authentication"],
202
- "bypass_techniques": ["alternate introspection queries when the standard one is blocked", "field suggestion / error messages leaking the schema", "aliasing + batching to brute endpoints"],
203
- "crown_jewels": ["the full schema (every query/mutation/field)", "hidden/admin-only fields", "mutation endpoints for destructive actions"]
513
+ "detection_signatures": [
514
+ "introspection/playground/graphiql set true in a production-reachable config"
515
+ ],
516
+ "chain_templates": [
517
+ "graphql_idor_to_data_theft",
518
+ "graphql_batching_to_credential_stuffing"
519
+ ],
520
+ "references": [
521
+ "CWE-200",
522
+ "OWASP API2:2023 Broken Authentication"
523
+ ],
524
+ "bypass_techniques": [
525
+ "alternate introspection queries when the standard one is blocked",
526
+ "field suggestion / error messages leaking the schema",
527
+ "aliasing + batching to brute endpoints"
528
+ ],
529
+ "crown_jewels": [
530
+ "the full schema (every query/mutation/field)",
531
+ "hidden/admin-only fields",
532
+ "mutation endpoints for destructive actions"
533
+ ]
204
534
  },
205
535
  {
206
536
  "id": "oauth_misconfig",
207
537
  "name": "OAuth Redirect URI Misconfiguration",
208
538
  "cwe": "CWE-601",
209
539
  "real_world": "An OAuth redirect_uri/callback is fed by request input with no static allowlist, letting an attacker redirect the authorization code or token to an attacker-controlled endpoint.",
210
- "detection_signatures": ["redirect_uri/callback fed by request input", "no allowlist/whitelist validation nearby"],
211
- "chain_templates": ["oauth_redirect_bypass", "open_redirect_to_oauth_theft"],
212
- "references": ["CWE-601", "OWASP A07:2021 Identification and Authentication Failures"],
213
- "bypass_techniques": ["path/subdomain confusion on the allowlist", "missing or weak state parameter", "authorization-code replay", "OAuth mix-up between IdP and client"],
214
- "crown_jewels": ["the authorization code", "access/refresh tokens", "account-linking flows"]
540
+ "detection_signatures": [
541
+ "redirect_uri/callback fed by request input",
542
+ "no allowlist/whitelist validation nearby"
543
+ ],
544
+ "chain_templates": [
545
+ "oauth_redirect_bypass",
546
+ "open_redirect_to_oauth_theft"
547
+ ],
548
+ "references": [
549
+ "CWE-601",
550
+ "OWASP A07:2021 Identification and Authentication Failures"
551
+ ],
552
+ "bypass_techniques": [
553
+ "path/subdomain confusion on the allowlist",
554
+ "missing or weak state parameter",
555
+ "authorization-code replay",
556
+ "OAuth mix-up between IdP and client"
557
+ ],
558
+ "crown_jewels": [
559
+ "the authorization code",
560
+ "access/refresh tokens",
561
+ "account-linking flows"
562
+ ]
215
563
  },
216
564
  {
217
565
  "id": "grpc_reflection",
218
566
  "name": "gRPC Reflection Exposed",
219
567
  "cwe": "CWE-200",
220
568
  "real_world": "gRPC server reflection is enabled, enumerating every service and method to any caller and leaking the API contract.",
221
- "detection_signatures": ["enable_server_reflection / RegisterReflectionService in production code"],
569
+ "detection_signatures": [
570
+ "enable_server_reflection / RegisterReflectionService in production code"
571
+ ],
222
572
  "chain_templates": [],
223
- "references": ["CWE-200"],
224
- "bypass_techniques": ["grpcurl / reflection API enumeration", "proto extraction to reconstruct the contract", "unauthenticated method invocation once enumerated"],
225
- "crown_jewels": ["the full API contract (every service/method)", "hidden/internal methods", "input schemas for fuzzing"]
573
+ "references": [
574
+ "CWE-200"
575
+ ],
576
+ "bypass_techniques": [
577
+ "grpcurl / reflection API enumeration",
578
+ "proto extraction to reconstruct the contract",
579
+ "unauthenticated method invocation once enumerated"
580
+ ],
581
+ "crown_jewels": [
582
+ "the full API contract (every service/method)",
583
+ "hidden/internal methods",
584
+ "input schemas for fuzzing"
585
+ ]
586
+ },
587
+ {
588
+ "id": "dependency_confusion",
589
+ "cwe": "CWE-427",
590
+ "real_world": "Attacker publishes an internal package name (e.g. company-utils) on the public registry with a higher version; the build resolves it and pulls malicious code into CI/deploy.",
591
+ "detection_signatures": [
592
+ "--index-url / --extra-index-url pointing at a public registry (pypi.org/npmjs.org/rubygems.org) in a manifest or build file",
593
+ "a scoped package (@company/pkg) referenced with no private registry pinned"
594
+ ],
595
+ "chain_templates": [],
596
+ "references": [
597
+ "CWE-427",
598
+ "CWE-494",
599
+ "Microsoft 2021 dependency-confusion research"
600
+ ],
601
+ "bypass_techniques": [
602
+ "scoped-name squatting (npm @scope is not reserved unless registered)",
603
+ "version pinning (>=0.0.1) so a higher attacker version wins",
604
+ "typo/prefix confusion for internal-only names",
605
+ "PEP 503 private-index fallback to public PyPI"
606
+ ],
607
+ "crown_jewels": [
608
+ "the CI/CD build pipeline",
609
+ "artifact/deploy credentials baked into the build",
610
+ "the internal package name registry (what to squat)"
611
+ ]
612
+ },
613
+ {
614
+ "id": "ml_supply_chain",
615
+ "cwe": "CWE-502",
616
+ "real_world": "A poisoned model file (pickle) hosted at a URL or uploaded by a user is loaded via torch.load/joblib.load without the safe flag → arbitrary code execution on load.",
617
+ "detection_signatures": [
618
+ "torch.load(...) without weights_only=True",
619
+ "joblib.load(...) / keras.models.load_model(...) / np.load(...allow_pickle=True) on an untrusted path/URL"
620
+ ],
621
+ "chain_templates": [],
622
+ "references": [
623
+ "CWE-502",
624
+ "OWASP ML02:2025 Data Poisoning",
625
+ "PyTorch weights_only default change (2.6)"
626
+ ],
627
+ "bypass_techniques": [
628
+ "model file masquerading as a benign artifact (weights.pt with a pickle payload)",
629
+ "indirect load: download via URL then load locally",
630
+ "np.load allow_pickle=True with a crafted .npy"
631
+ ],
632
+ "crown_jewels": [
633
+ "the model-serving host (RCE on load)",
634
+ "training data / weights",
635
+ "the inference API surface"
636
+ ]
226
637
  }
227
638
  ]
228
- }
639
+ }