@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,798 @@
1
+ [
2
+ {
3
+ "id": "PROTO-SMUG-001",
4
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 6\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\nG",
5
+ "tags": [
6
+ "cl-te",
7
+ "quick",
8
+ "critical",
9
+ "desync"
10
+ ],
11
+ "expected_block": true,
12
+ "severity_hint": "Critical",
13
+ "notes": "CL.TE desync: Front-end uses CL, back-end uses TE",
14
+ "destructive": false,
15
+ "category": "Protocol"
16
+ },
17
+ {
18
+ "id": "PROTO-SMUG-002",
19
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 4\r\nTransfer-Encoding: chunked\r\n\r\n12\r\nSMUGGLED REQUEST\r\n0\r\n\r\n",
20
+ "tags": [
21
+ "te-cl",
22
+ "quick",
23
+ "critical",
24
+ "desync"
25
+ ],
26
+ "expected_block": true,
27
+ "severity_hint": "Critical",
28
+ "notes": "TE.CL desync: Front-end uses TE, back-end uses CL",
29
+ "destructive": false,
30
+ "category": "Protocol"
31
+ },
32
+ {
33
+ "id": "PROTO-SMUG-003",
34
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: identity\r\n\r\n5\r\nhello\r\n0\r\n\r\n",
35
+ "tags": [
36
+ "te-te",
37
+ "quick",
38
+ "critical",
39
+ "dual-encoding"
40
+ ],
41
+ "expected_block": true,
42
+ "severity_hint": "Critical",
43
+ "notes": "TE.TE desync: Duplicate Transfer-Encoding headers",
44
+ "destructive": false,
45
+ "category": "Protocol"
46
+ },
47
+ {
48
+ "id": "PROTO-SMUG-004",
49
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 10\r\nContent-Length: 20\r\n\r\ntest",
50
+ "tags": [
51
+ "duplicate-cl",
52
+ "quick",
53
+ "critical"
54
+ ],
55
+ "expected_block": true,
56
+ "severity_hint": "Critical",
57
+ "notes": "Duplicate Content-Length headers with different values",
58
+ "destructive": false,
59
+ "category": "Protocol"
60
+ },
61
+ {
62
+ "id": "PROTO-SMUG-005",
63
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n Transfer-Encoding: identity\r\n\r\n0\r\n\r\n",
64
+ "tags": [
65
+ "space-prefix",
66
+ "obfuscation"
67
+ ],
68
+ "expected_block": true,
69
+ "severity_hint": "High",
70
+ "notes": "Space before Transfer-Encoding header",
71
+ "destructive": false,
72
+ "category": "Protocol"
73
+ },
74
+ {
75
+ "id": "PROTO-SMUG-006",
76
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding : chunked\r\n\r\n0\r\n\r\n",
77
+ "tags": [
78
+ "space-before-colon",
79
+ "obfuscation"
80
+ ],
81
+ "expected_block": true,
82
+ "severity_hint": "High",
83
+ "notes": "Space before colon in Transfer-Encoding",
84
+ "destructive": false,
85
+ "category": "Protocol"
86
+ },
87
+ {
88
+ "id": "PROTO-SMUG-007",
89
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: cow\r\n\r\n0\r\n\r\n",
90
+ "tags": [
91
+ "invalid-encoding",
92
+ "te-te"
93
+ ],
94
+ "expected_block": true,
95
+ "severity_hint": "Critical",
96
+ "notes": "Invalid Transfer-Encoding value (cow)",
97
+ "destructive": false,
98
+ "category": "Protocol"
99
+ },
100
+ {
101
+ "id": "PROTO-SMUG-008",
102
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: \r\n\r\n0\r\n\r\n",
103
+ "tags": [
104
+ "empty-encoding",
105
+ "te-te"
106
+ ],
107
+ "expected_block": true,
108
+ "severity_hint": "High",
109
+ "notes": "Empty Transfer-Encoding value",
110
+ "destructive": false,
111
+ "category": "Protocol"
112
+ },
113
+ {
114
+ "id": "PROTO-SMUG-009",
115
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: x\r\n\r\n0\r\n\r\n",
116
+ "tags": [
117
+ "invalid-encoding",
118
+ "single-char"
119
+ ],
120
+ "expected_block": true,
121
+ "severity_hint": "High",
122
+ "notes": "Single character Transfer-Encoding",
123
+ "destructive": false,
124
+ "category": "Protocol"
125
+ },
126
+ {
127
+ "id": "PROTO-SMUG-010",
128
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 0\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n",
129
+ "tags": [
130
+ "cl-te",
131
+ "zero-cl",
132
+ "quick"
133
+ ],
134
+ "expected_block": true,
135
+ "severity_hint": "Critical",
136
+ "notes": "CL.TE with CL:0 but chunked body",
137
+ "destructive": false,
138
+ "category": "Protocol"
139
+ },
140
+ {
141
+ "id": "PROTO-SMUG-011",
142
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nContent-Length: 100\r\n\r\n0\r\n\r\n",
143
+ "tags": [
144
+ "te-cl",
145
+ "conflicting"
146
+ ],
147
+ "expected_block": true,
148
+ "severity_hint": "Critical",
149
+ "notes": "Both TE and CL headers present (TE should take precedence per RFC)",
150
+ "destructive": false,
151
+ "category": "Protocol"
152
+ },
153
+ {
154
+ "id": "PROTO-SMUG-012",
155
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0 \r\n\r\n",
156
+ "tags": [
157
+ "chunk-trailing-space"
158
+ ],
159
+ "expected_block": true,
160
+ "severity_hint": "Medium",
161
+ "notes": "Chunk size with trailing space",
162
+ "destructive": false,
163
+ "category": "Protocol"
164
+ },
165
+ {
166
+ "id": "PROTO-SMUG-013",
167
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n 0\r\n\r\n",
168
+ "tags": [
169
+ "chunk-leading-space"
170
+ ],
171
+ "expected_block": true,
172
+ "severity_hint": "Medium",
173
+ "notes": "Chunk size with leading space",
174
+ "destructive": false,
175
+ "category": "Protocol"
176
+ },
177
+ {
178
+ "id": "PROTO-SMUG-014",
179
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0\n\n",
180
+ "tags": [
181
+ "lf-only",
182
+ "line-ending"
183
+ ],
184
+ "expected_block": true,
185
+ "severity_hint": "High",
186
+ "notes": "LF-only line endings instead of CRLF",
187
+ "destructive": false,
188
+ "category": "Protocol"
189
+ },
190
+ {
191
+ "id": "PROTO-SMUG-015",
192
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n00000\r\n\r\n",
193
+ "tags": [
194
+ "chunk-zero-padding"
195
+ ],
196
+ "expected_block": true,
197
+ "severity_hint": "Low",
198
+ "notes": "Chunk size with leading zeros",
199
+ "destructive": false,
200
+ "category": "Protocol"
201
+ },
202
+ {
203
+ "id": "PROTO-SMUG-016",
204
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: -5\r\n\r\n",
205
+ "tags": [
206
+ "negative-cl"
207
+ ],
208
+ "expected_block": true,
209
+ "severity_hint": "High",
210
+ "notes": "Negative Content-Length value",
211
+ "destructive": false,
212
+ "category": "Protocol"
213
+ },
214
+ {
215
+ "id": "PROTO-SMUG-017",
216
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: +10\r\n\r\ntest",
217
+ "tags": [
218
+ "plus-sign-cl"
219
+ ],
220
+ "expected_block": true,
221
+ "severity_hint": "Medium",
222
+ "notes": "Content-Length with explicit plus sign",
223
+ "destructive": false,
224
+ "category": "Protocol"
225
+ },
226
+ {
227
+ "id": "PROTO-SMUG-018",
228
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 0x10\r\n\r\n",
229
+ "tags": [
230
+ "hex-cl"
231
+ ],
232
+ "expected_block": true,
233
+ "severity_hint": "High",
234
+ "notes": "Hexadecimal Content-Length value",
235
+ "destructive": false,
236
+ "category": "Protocol"
237
+ },
238
+ {
239
+ "id": "PROTO-SMUG-019",
240
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\nFF\r\n[255 bytes of data]\r\n0\r\n\r\n",
241
+ "tags": [
242
+ "large-chunk"
243
+ ],
244
+ "expected_block": false,
245
+ "severity_hint": "Low",
246
+ "notes": "Large but valid chunk size (0xFF = 255)",
247
+ "destructive": false,
248
+ "category": "Protocol"
249
+ },
250
+ {
251
+ "id": "PROTO-SMUG-020",
252
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n-1\r\n\r\n",
253
+ "tags": [
254
+ "negative-chunk"
255
+ ],
256
+ "expected_block": true,
257
+ "severity_hint": "High",
258
+ "notes": "Negative chunk size",
259
+ "destructive": false,
260
+ "category": "Protocol"
261
+ },
262
+ {
263
+ "id": "PROTO-SMUG-021",
264
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\nG\r\n\r\n",
265
+ "tags": [
266
+ "invalid-hex-chunk"
267
+ ],
268
+ "expected_block": true,
269
+ "severity_hint": "High",
270
+ "notes": "Invalid hexadecimal chunk size (G is not a hex digit)",
271
+ "destructive": false,
272
+ "category": "Protocol"
273
+ },
274
+ {
275
+ "id": "PROTO-SMUG-022",
276
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n5;foo=bar\r\nhello\r\n0\r\n\r\n",
277
+ "tags": [
278
+ "chunk-extension"
279
+ ],
280
+ "expected_block": false,
281
+ "severity_hint": "Low",
282
+ "notes": "Valid chunk extension (allowed per RFC 7230)",
283
+ "destructive": false,
284
+ "category": "Protocol"
285
+ },
286
+ {
287
+ "id": "PROTO-SMUG-023",
288
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n5;x=y;a=b\r\nhello\r\n0\r\n\r\n",
289
+ "tags": [
290
+ "multiple-chunk-extensions"
291
+ ],
292
+ "expected_block": false,
293
+ "severity_hint": "Low",
294
+ "notes": "Multiple chunk extensions",
295
+ "destructive": false,
296
+ "category": "Protocol"
297
+ },
298
+ {
299
+ "id": "PROTO-SMUG-024",
300
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n5;x=\"y\"\r\nhello\r\n0\r\n\r\n",
301
+ "tags": [
302
+ "quoted-chunk-extension"
303
+ ],
304
+ "expected_block": false,
305
+ "severity_hint": "Low",
306
+ "notes": "Quoted chunk extension value",
307
+ "destructive": false,
308
+ "category": "Protocol"
309
+ },
310
+ {
311
+ "id": "PROTO-SMUG-025",
312
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked, gzip\r\n\r\n0\r\n\r\n",
313
+ "tags": [
314
+ "comma-separated-te"
315
+ ],
316
+ "expected_block": false,
317
+ "severity_hint": "Low",
318
+ "notes": "Comma-separated Transfer-Encoding values (valid per RFC)",
319
+ "destructive": false,
320
+ "category": "Protocol"
321
+ },
322
+ {
323
+ "id": "PROTO-SMUG-026",
324
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: gzip, chunked\r\n\r\n0\r\n\r\n",
325
+ "tags": [
326
+ "multiple-encodings"
327
+ ],
328
+ "expected_block": false,
329
+ "severity_hint": "Low",
330
+ "notes": "Multiple encodings with chunked last (valid)",
331
+ "destructive": false,
332
+ "category": "Protocol"
333
+ },
334
+ {
335
+ "id": "PROTO-SMUG-027",
336
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n",
337
+ "tags": [
338
+ "get-with-te"
339
+ ],
340
+ "expected_block": true,
341
+ "severity_hint": "High",
342
+ "notes": "GET request with Transfer-Encoding (unusual)",
343
+ "destructive": false,
344
+ "category": "Protocol"
345
+ },
346
+ {
347
+ "id": "PROTO-SMUG-028",
348
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 10\r\n\r\n",
349
+ "tags": [
350
+ "get-with-cl"
351
+ ],
352
+ "expected_block": true,
353
+ "severity_hint": "Medium",
354
+ "notes": "GET request with Content-Length (unusual)",
355
+ "destructive": false,
356
+ "category": "Protocol"
357
+ },
358
+ {
359
+ "id": "PROTO-SMUG-029",
360
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0\r\nTrailer: value\r\n\r\n",
361
+ "tags": [
362
+ "trailer-headers"
363
+ ],
364
+ "expected_block": false,
365
+ "severity_hint": "Low",
366
+ "notes": "Valid trailer headers after chunked body",
367
+ "destructive": false,
368
+ "category": "Protocol"
369
+ },
370
+ {
371
+ "id": "PROTO-SMUG-030",
372
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0\r\nContent-Length: 10\r\n\r\n",
373
+ "tags": [
374
+ "trailer-cl",
375
+ "suspicious"
376
+ ],
377
+ "expected_block": true,
378
+ "severity_hint": "Critical",
379
+ "notes": "Content-Length in trailer headers (forbidden per RFC)",
380
+ "destructive": false,
381
+ "category": "Protocol"
382
+ },
383
+ {
384
+ "id": "PROTO-SMUG-031",
385
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0\r\nTransfer-Encoding: identity\r\n\r\n",
386
+ "tags": [
387
+ "trailer-te",
388
+ "suspicious"
389
+ ],
390
+ "expected_block": true,
391
+ "severity_hint": "Critical",
392
+ "notes": "Transfer-Encoding in trailer headers (forbidden per RFC)",
393
+ "destructive": false,
394
+ "category": "Protocol"
395
+ },
396
+ {
397
+ "id": "PROTO-SMUG-032",
398
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\nFFFFFFFF\r\n",
399
+ "tags": [
400
+ "huge-chunk",
401
+ "destructive"
402
+ ],
403
+ "expected_block": true,
404
+ "severity_hint": "Critical",
405
+ "notes": "Extremely large chunk size (4GB) - resource exhaustion",
406
+ "destructive": true,
407
+ "category": "Protocol"
408
+ },
409
+ {
410
+ "id": "PROTO-SMUG-033",
411
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 4294967295\r\n\r\n",
412
+ "tags": [
413
+ "huge-cl",
414
+ "destructive"
415
+ ],
416
+ "expected_block": true,
417
+ "severity_hint": "Critical",
418
+ "notes": "Maximum 32-bit Content-Length - resource exhaustion",
419
+ "destructive": true,
420
+ "category": "Protocol"
421
+ },
422
+ {
423
+ "id": "PROTO-SMUG-034",
424
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nA\r\n1\r\nB\r\n1\r\nC\r\n0\r\n\r\n",
425
+ "tags": [
426
+ "multiple-small-chunks"
427
+ ],
428
+ "expected_block": false,
429
+ "severity_hint": "Low",
430
+ "notes": "Multiple valid 1-byte chunks",
431
+ "destructive": false,
432
+ "category": "Protocol"
433
+ },
434
+ {
435
+ "id": "PROTO-SMUG-035",
436
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-encoding: chunked\r\n\r\n0\r\n\r\n",
437
+ "tags": [
438
+ "lowercase-te"
439
+ ],
440
+ "expected_block": false,
441
+ "severity_hint": "Low",
442
+ "notes": "Lowercase transfer-encoding (should be case-insensitive)",
443
+ "destructive": false,
444
+ "category": "Protocol"
445
+ },
446
+ {
447
+ "id": "PROTO-SMUG-036",
448
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\ncontent-length: 4\r\n\r\ntest",
449
+ "tags": [
450
+ "lowercase-cl"
451
+ ],
452
+ "expected_block": false,
453
+ "severity_hint": "Low",
454
+ "notes": "Lowercase content-length (should be case-insensitive)",
455
+ "destructive": false,
456
+ "category": "Protocol"
457
+ },
458
+ {
459
+ "id": "PROTO-SMUG-037",
460
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: \tchunked\r\n\r\n0\r\n\r\n",
461
+ "tags": ["tab-prefix", "te-obfuscation"],
462
+ "expected_block": true,
463
+ "severity_hint": "High",
464
+ "notes": "Tab character before chunked value",
465
+ "destructive": false,
466
+ "category": "Protocol"
467
+ },
468
+ {
469
+ "id": "PROTO-SMUG-038",
470
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: x\r\n\r\n0\r\n\r\n",
471
+ "tags": ["duplicate-te", "second-invalid"],
472
+ "expected_block": true,
473
+ "severity_hint": "Critical",
474
+ "notes": "Duplicate TE with second invalid",
475
+ "destructive": false,
476
+ "category": "Protocol"
477
+ },
478
+ {
479
+ "id": "PROTO-SMUG-039",
480
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: x\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n",
481
+ "tags": ["duplicate-te", "first-invalid"],
482
+ "expected_block": true,
483
+ "severity_hint": "Critical",
484
+ "notes": "Duplicate TE with first invalid",
485
+ "destructive": false,
486
+ "category": "Protocol"
487
+ },
488
+ {
489
+ "id": "PROTO-SMUG-040",
490
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 0\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n0\r\n\r\n",
491
+ "tags": ["cl-zero", "te-chunked"],
492
+ "expected_block": true,
493
+ "severity_hint": "Critical",
494
+ "notes": "CL:0 with TE:chunked body",
495
+ "destructive": false,
496
+ "category": "Protocol"
497
+ },
498
+ {
499
+ "id": "PROTO-SMUG-041",
500
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\n Transfer-Encoding: chunked\r\nContent-Length: 4\r\n\r\ntest",
501
+ "tags": ["leading-space", "te-header"],
502
+ "expected_block": true,
503
+ "severity_hint": "Critical",
504
+ "notes": "Leading space on TE header",
505
+ "destructive": false,
506
+ "category": "Protocol"
507
+ },
508
+ {
509
+ "id": "PROTO-SMUG-042",
510
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nX-Forwarded-For: x\r\nTransfer-Encoding: chunked\r\nContent-Length: 4\r\n\r\ntest",
511
+ "tags": ["cl-te", "xff"],
512
+ "expected_block": true,
513
+ "severity_hint": "Critical",
514
+ "notes": "CL+TE with XFF header",
515
+ "destructive": false,
516
+ "category": "Protocol"
517
+ },
518
+ {
519
+ "id": "PROTO-SMUG-043",
520
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding:\r\n chunked\r\n\r\n0\r\n\r\n",
521
+ "tags": ["folded-header", "te"],
522
+ "expected_block": true,
523
+ "severity_hint": "Critical",
524
+ "notes": "Folded TE header (line continuation)",
525
+ "destructive": false,
526
+ "category": "Protocol"
527
+ },
528
+ {
529
+ "id": "PROTO-SMUG-044",
530
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nContent-Length : 4\r\n\r\ntest",
531
+ "tags": ["space-colon", "cl"],
532
+ "expected_block": true,
533
+ "severity_hint": "High",
534
+ "notes": "Space before colon on CL",
535
+ "destructive": false,
536
+ "category": "Protocol"
537
+ },
538
+ {
539
+ "id": "PROTO-SMUG-045",
540
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 6\r\n\r\nPOST /admin HTTP/1.1\r\nHost: example.com",
541
+ "tags": ["request-smuggling", "admin-access"],
542
+ "expected_block": true,
543
+ "severity_hint": "Critical",
544
+ "notes": "Smuggle admin path request",
545
+ "destructive": false,
546
+ "category": "Protocol"
547
+ },
548
+ {
549
+ "id": "PROTO-SMUG-046",
550
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\nGET /admin HTTP/1.1\r\nHost: example.com\r\n\r\n",
551
+ "tags": ["te-smuggle", "admin-access"],
552
+ "expected_block": true,
553
+ "severity_hint": "Critical",
554
+ "notes": "TE smuggle to admin path",
555
+ "destructive": false,
556
+ "category": "Protocol"
557
+ },
558
+ {
559
+ "id": "PROTO-SMUG-047",
560
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding\t: chunked\r\n\r\n0\r\n\r\n",
561
+ "tags": ["tab-before-colon", "te"],
562
+ "expected_block": true,
563
+ "severity_hint": "High",
564
+ "notes": "Tab before colon in TE",
565
+ "destructive": false,
566
+ "category": "Protocol"
567
+ },
568
+ {
569
+ "id": "PROTO-SMUG-048",
570
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked, identity\r\n\r\n0\r\n\r\n",
571
+ "tags": ["comma-separated", "te"],
572
+ "expected_block": true,
573
+ "severity_hint": "Critical",
574
+ "notes": "Comma-separated TE values",
575
+ "destructive": false,
576
+ "category": "Protocol"
577
+ },
578
+ {
579
+ "id": "PROTO-SMUG-049",
580
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer_Encoding: chunked\r\nContent-Length: 4\r\n\r\ntest",
581
+ "tags": ["underscore", "te-bypass"],
582
+ "expected_block": true,
583
+ "severity_hint": "High",
584
+ "notes": "Underscore instead of hyphen in TE",
585
+ "destructive": false,
586
+ "category": "Protocol"
587
+ },
588
+ {
589
+ "id": "PROTO-SMUG-050",
590
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 30\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\nPOST / HTTP/1.1\r\nX: X",
591
+ "tags": ["cl-te", "prefix-injection"],
592
+ "expected_block": true,
593
+ "severity_hint": "Critical",
594
+ "notes": "CL.TE request prefix injection",
595
+ "destructive": false,
596
+ "category": "Protocol"
597
+ },
598
+ {
599
+ "id": "PROTO-SMUG-051",
600
+ "payload": "GET / HTTP/1.1\r\nHost: evil.com\r\nHost: example.com\r\n\r\n",
601
+ "tags": ["duplicate-host", "host-override"],
602
+ "expected_block": true,
603
+ "severity_hint": "Critical",
604
+ "notes": "Duplicate Host header",
605
+ "destructive": false,
606
+ "category": "Protocol"
607
+ },
608
+ {
609
+ "id": "PROTO-SMUG-052",
610
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nX-Forwarded-Host: evil.com\r\n\r\n",
611
+ "tags": ["host-override", "xfh"],
612
+ "expected_block": true,
613
+ "severity_hint": "High",
614
+ "notes": "X-Forwarded-Host override",
615
+ "destructive": false,
616
+ "category": "Protocol"
617
+ },
618
+ {
619
+ "id": "PROTO-SMUG-053",
620
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nX-Host: evil.com\r\n\r\n",
621
+ "tags": ["host-override", "x-host"],
622
+ "expected_block": true,
623
+ "severity_hint": "High",
624
+ "notes": "X-Host header override",
625
+ "destructive": false,
626
+ "category": "Protocol"
627
+ },
628
+ {
629
+ "id": "PROTO-SMUG-054",
630
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nX-Original-URL: /admin\r\n\r\n",
631
+ "tags": ["path-override", "x-original-url"],
632
+ "expected_block": true,
633
+ "severity_hint": "Critical",
634
+ "notes": "X-Original-URL path override",
635
+ "destructive": false,
636
+ "category": "Protocol"
637
+ },
638
+ {
639
+ "id": "PROTO-SMUG-055",
640
+ "payload": "GET / HTTP/1.1\r\nHost: example.com\r\nX-Rewrite-URL: /admin\r\n\r\n",
641
+ "tags": ["path-override", "x-rewrite-url"],
642
+ "expected_block": true,
643
+ "severity_hint": "Critical",
644
+ "notes": "X-Rewrite-URL path override",
645
+ "destructive": false,
646
+ "category": "Protocol"
647
+ },
648
+ {
649
+ "id": "PROTO-SMUG-056",
650
+ "payload": "GET @evil.com/ HTTP/1.1\r\nHost: example.com\r\n\r\n",
651
+ "tags": ["absolute-uri", "host-confusion"],
652
+ "expected_block": true,
653
+ "severity_hint": "Critical",
654
+ "notes": "Absolute URI with @ confusion",
655
+ "destructive": false,
656
+ "category": "Protocol"
657
+ },
658
+ {
659
+ "id": "PROTO-SMUG-057",
660
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: \n chunked\r\n\r\n0\r\n\r\n",
661
+ "tags": ["newline-fold", "te"],
662
+ "expected_block": true,
663
+ "severity_hint": "Critical",
664
+ "notes": "Newline folded TE value",
665
+ "destructive": false,
666
+ "category": "Protocol"
667
+ },
668
+ {
669
+ "id": "PROTO-SMUG-058",
670
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n1;foo=bar\r\na\r\n0\r\n\r\n",
671
+ "tags": ["chunk-extension", "parameter"],
672
+ "expected_block": false,
673
+ "severity_hint": "Low",
674
+ "notes": "Chunk extension parameter",
675
+ "destructive": false,
676
+ "category": "Protocol"
677
+ },
678
+ {
679
+ "id": "PROTO-SMUG-059",
680
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\n1\r\na\r\n0\r\nX-Trailer: test\r\n\r\n",
681
+ "tags": ["trailer-header", "te"],
682
+ "expected_block": false,
683
+ "severity_hint": "Low",
684
+ "notes": "TE with trailer header",
685
+ "destructive": false,
686
+ "category": "Protocol"
687
+ },
688
+ {
689
+ "id": "PROTO-SMUG-060",
690
+ "payload": "GPOST / HTTP/1.1\r\nHost: example.com\r\n\r\n",
691
+ "tags": ["method-mutation", "malformed"],
692
+ "expected_block": true,
693
+ "severity_hint": "High",
694
+ "notes": "Invalid/mutated HTTP method",
695
+ "destructive": false,
696
+ "category": "Protocol"
697
+ },
698
+ {
699
+ "id": "PROTO-SMUG-061",
700
+ "payload": "GET / HTTP/1.1\rHost: example.com\r\n\r\n",
701
+ "tags": ["bare-cr", "malformed"],
702
+ "expected_block": true,
703
+ "severity_hint": "Critical",
704
+ "notes": "Bare CR instead of CRLF",
705
+ "destructive": false,
706
+ "category": "Protocol"
707
+ },
708
+ {
709
+ "id": "PROTO-SMUG-062",
710
+ "payload": "GET / HTTP/1.1\nHost: example.com\n\n",
711
+ "tags": ["bare-lf", "unix-style"],
712
+ "expected_block": true,
713
+ "severity_hint": "High",
714
+ "notes": "Bare LF (Unix-style newlines)",
715
+ "destructive": false,
716
+ "category": "Protocol"
717
+ },
718
+ {
719
+ "id": "PROTO-SMUG-063",
720
+ "payload": "GET / HTTP/1.1\r\n\rHost: example.com\r\n\r\n",
721
+ "tags": ["embedded-cr", "malformed"],
722
+ "expected_block": true,
723
+ "severity_hint": "Critical",
724
+ "notes": "Embedded bare CR",
725
+ "destructive": false,
726
+ "category": "Protocol"
727
+ },
728
+ {
729
+ "id": "PROTO-SMUG-064",
730
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: -1\r\n\r\n",
731
+ "tags": ["negative-cl", "malformed"],
732
+ "expected_block": true,
733
+ "severity_hint": "Critical",
734
+ "notes": "Negative Content-Length",
735
+ "destructive": false,
736
+ "category": "Protocol"
737
+ },
738
+ {
739
+ "id": "PROTO-SMUG-065",
740
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 9999999999999\r\n\r\n",
741
+ "tags": ["overflow-cl", "dos"],
742
+ "expected_block": true,
743
+ "severity_hint": "Critical",
744
+ "notes": "Integer overflow Content-Length",
745
+ "destructive": false,
746
+ "category": "Protocol"
747
+ },
748
+ {
749
+ "id": "PROTO-SMUG-066",
750
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 4 \r\n\r\ntest",
751
+ "tags": ["trailing-space", "cl"],
752
+ "expected_block": true,
753
+ "severity_hint": "High",
754
+ "notes": "Trailing space in CL value",
755
+ "destructive": false,
756
+ "category": "Protocol"
757
+ },
758
+ {
759
+ "id": "PROTO-SMUG-067",
760
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 04\r\n\r\ntest",
761
+ "tags": ["leading-zero", "cl"],
762
+ "expected_block": true,
763
+ "severity_hint": "High",
764
+ "notes": "Leading zero in CL",
765
+ "destructive": false,
766
+ "category": "Protocol"
767
+ },
768
+ {
769
+ "id": "PROTO-SMUG-068",
770
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: +4\r\n\r\ntest",
771
+ "tags": ["plus-sign", "cl"],
772
+ "expected_block": true,
773
+ "severity_hint": "High",
774
+ "notes": "Plus sign in CL",
775
+ "destructive": false,
776
+ "category": "Protocol"
777
+ },
778
+ {
779
+ "id": "PROTO-SMUG-069",
780
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 0x04\r\n\r\ntest",
781
+ "tags": ["hex-cl", "malformed"],
782
+ "expected_block": true,
783
+ "severity_hint": "Critical",
784
+ "notes": "Hex Content-Length",
785
+ "destructive": false,
786
+ "category": "Protocol"
787
+ },
788
+ {
789
+ "id": "PROTO-SMUG-070",
790
+ "payload": "POST / HTTP/1.1\r\nHost: example.com\r\nTransfer-Encoding: chunked\r\n\r\nffffffff\r\n",
791
+ "tags": ["huge-chunk", "dos"],
792
+ "expected_block": true,
793
+ "severity_hint": "Critical",
794
+ "notes": "Extremely large chunk size",
795
+ "destructive": false,
796
+ "category": "Protocol"
797
+ }
798
+ ]