dpyproxy 2.2.0__py3-none-any.whl

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 (59) hide show
  1. dpyproxy/__init__.py +1 -0
  2. dpyproxy/__main__.py +4 -0
  3. dpyproxy-2.2.0.dist-info/METADATA +296 -0
  4. dpyproxy-2.2.0.dist-info/RECORD +59 -0
  5. dpyproxy-2.2.0.dist-info/WHEEL +4 -0
  6. dpyproxy-2.2.0.dist-info/entry_points.txt +2 -0
  7. dpyproxy-2.2.0.dist-info/licenses/LICENSE +201 -0
  8. enumerators/DnsProxyMode.py +39 -0
  9. enumerators/DnsResolvers.py +141 -0
  10. enumerators/HttpMethod.py +17 -0
  11. enumerators/Modules.py +38 -0
  12. enumerators/Port.py +11 -0
  13. enumerators/TcpProxyMode.py +17 -0
  14. enumerators/TlsVersion.py +21 -0
  15. enumerators/__init__.py +0 -0
  16. exception/DnsException.py +7 -0
  17. exception/ParserException.py +7 -0
  18. exception/__init__.py +0 -0
  19. main.py +94 -0
  20. modules/Module.py +45 -0
  21. modules/__init__.py +0 -0
  22. modules/dns/DnsModeDeterminator.py +358 -0
  23. modules/dns/DnsModule.py +113 -0
  24. modules/dns/DnsProxy.py +277 -0
  25. modules/dns/DnsResolver.py +18 -0
  26. modules/dns/__init__.py +0 -0
  27. modules/http/HttpModule.py +69 -0
  28. modules/http/HttpStrategies.py +849 -0
  29. modules/http/HttpUtils.py +94 -0
  30. modules/http/__init__.py +0 -0
  31. modules/tls/TcpProxy.py +106 -0
  32. modules/tls/TlsModule.py +173 -0
  33. modules/tls/__init__.py +0 -0
  34. network/DomainResolver.py +472 -0
  35. network/NetworkAddress.py +10 -0
  36. network/WrappedSocket.py +97 -0
  37. network/__init__.py +0 -0
  38. network/protocols/Dns.py +62 -0
  39. network/protocols/Http.py +109 -0
  40. network/protocols/Socksv4.py +70 -0
  41. network/protocols/Socksv5.py +106 -0
  42. network/protocols/Tls.py +113 -0
  43. network/protocols/__init__.py +0 -0
  44. network/tcp/Forwarder.py +203 -0
  45. network/tcp/TcpConnectionHandler.py +264 -0
  46. network/tcp/WrappedTcpSocket.py +30 -0
  47. network/tcp/__init__.py +0 -0
  48. network/udp/__init__.py +0 -0
  49. test/Sink.py +23 -0
  50. test/__init__.py +0 -0
  51. test/test_dns.py +98 -0
  52. test/test_http.py +57 -0
  53. test/test_tls.py +63 -0
  54. util/DnsAutoModeRuntimeMeasurement.py +62 -0
  55. util/DnsReachabilityCollector.py +160 -0
  56. util/DnsResolversDomainResolver.py +36 -0
  57. util/Util.py +62 -0
  58. util/__init__.py +0 -0
  59. util/constants.py +8 -0
@@ -0,0 +1,849 @@
1
+ from modules.http.HttpUtils import HttpUtils
2
+
3
+
4
+ class HttpStrategies:
5
+ """
6
+ Implements circumvention methods for HTTP-based censorship.
7
+ Incorporates various basic manipulations of HTTP traffic to bypass censorship,
8
+ as well as http request smuggling techniques.
9
+ """
10
+
11
+ @staticmethod
12
+ def manipulations(data: bytes, strategy: int, http_smuggling_uncensored_url: str):
13
+ data = data.decode("ASCII", errors="ignore")
14
+ data_list = HttpStrategies.deconstruction(data)
15
+ manipulation = HttpStrategies.switch_manipulation[strategy]
16
+
17
+ if not HttpStrategies.strategy_is_valid(strategy):
18
+ raise ValueError(f"Invalid http strategy {strategy}")
19
+
20
+ if HttpStrategies.strategy_is_smuggling(strategy):
21
+ data_list = HttpStrategies.prepare_request_for_smuggling(data_list, strategy, http_smuggling_uncensored_url)
22
+
23
+ data_list = manipulation(data_list, strategy)
24
+ data = HttpStrategies.reconstruction(data_list)
25
+ data = data.encode("ASCII", errors="ignore")
26
+ return data
27
+
28
+ @staticmethod
29
+ def prepare_request_for_smuggling(
30
+ data_list: list[list[str]], smuggling: int, uncensored_domain: str
31
+ ) -> list[list[str]]:
32
+
33
+ request_line_01 = ["GET", " ", "/" + uncensored_domain.split("/", 3)[3], " ", "HTTP/1.1", "\x0d\x0a"]
34
+ host_header_01 = ["Host:", " ", uncensored_domain.split("/", 3)[2], "\x0d\x0a"]
35
+ request_line = data_list[0]
36
+ host_header = data_list[HttpUtils.index_host_header(data_list, 1)]
37
+
38
+ # constructing the headers
39
+ content_length_header = ["Content-Length:", " ", "", "\x0d\x0a"]
40
+ transfer_encoding_header = ["Transfer-Encoding:", " ", "chunked", "\x0d\x0a"]
41
+ if smuggling <= 112 or (121 <= smuggling <= 128): # CLTE
42
+ content_length_header[2] = str(
43
+ len("".join(request_line)) + len("".join(host_header)) + len("".join(["0", "\x0d\x0a", "\x0d\x0a"])) + 2
44
+ ) # +2 for the \x0D\x0A after headers
45
+ if (113 <= smuggling <= 120) or smuggling == 129: # TECL
46
+ content_length_header[2] = "0"
47
+
48
+ # combining all parts of the smuggling request
49
+ data_list = []
50
+ data_list.append(request_line_01)
51
+ data_list.append(host_header_01)
52
+ data_list.append(content_length_header)
53
+ data_list.append(transfer_encoding_header)
54
+ data_list.append(["\x0d\x0a"])
55
+ if smuggling <= 112 or (121 <= smuggling <= 128): # CLTE
56
+ data_list.append(["0", "\x0d\x0a", "\x0d\x0a"])
57
+ data_list.append(request_line)
58
+ data_list.append(host_header)
59
+ data_list.append(["\x0d\x0a"])
60
+ if (113 <= smuggling <= 120) or smuggling == 29: # TECL
61
+ data_list.append([format(len("".join(request_line)), "X"), "\x0d\x0a"])
62
+ data_list.append(request_line)
63
+ data_list.append(["\x0d\x0a"])
64
+ data_list.append([format(len("".join(host_header)), "X"), "\x0d\x0a"])
65
+ data_list.append(host_header)
66
+ data_list.append(["\x0d\x0a"])
67
+ data_list.append(["0", "\x0d\x0a", "\x0d\x0a"])
68
+ return data_list
69
+
70
+ @staticmethod
71
+ def deconstruction(data: str) -> list[list[str]]:
72
+ data_list = []
73
+ parts = data.split("\x0d\x0a\x0d\x0a", 1)
74
+ header_block = parts[0]
75
+ body_block = parts[1] if len(parts) > 1 else ""
76
+ for line in header_block.split("\x0d\x0a"):
77
+ line_list = []
78
+ element = ""
79
+ for char in line:
80
+ if char == " ":
81
+ if element:
82
+ line_list.append(element)
83
+ element = ""
84
+ line_list.append(" ")
85
+ else:
86
+ element += char
87
+ if element:
88
+ line_list.append(element)
89
+ line_list.append("\x0d\x0a")
90
+ data_list.append(line_list)
91
+ data_list.append(["\x0d\x0a"])
92
+ data_list.append([body_block])
93
+ return data_list
94
+
95
+ @staticmethod
96
+ def reconstruction(data_list: list[list[str]]) -> str:
97
+ data = ""
98
+ for line in data_list:
99
+ for element in line:
100
+ data += element
101
+ return data
102
+
103
+ # - - - - - - - - - - Specific Manipulations - - - - - - - - - - #
104
+
105
+ @staticmethod # for test purposes
106
+ def no_manipulation(data_list: list[list[str]], strategy: int) -> list[list[str]]:
107
+ return data_list
108
+
109
+ @staticmethod
110
+ def altering_http_version(data_list: list[list[str]], strategy: int) -> list[list[str]]:
111
+ if strategy == 1:
112
+ data_list[0][4] = HttpUtils.duplicate(data_list[0][4], 0, len(data_list[0][4]))
113
+ if strategy == 2:
114
+ data_list[0][4] = HttpUtils.replace(data_list[0][4], "OPTIONS", 1, 0, 8)
115
+ return data_list
116
+
117
+ @staticmethod
118
+ def splitting_request_line(data_list: list[list[str]], strategy: int) -> list[list[str]]:
119
+ if strategy == 3:
120
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x09", 14, "middle")
121
+ if strategy == 4:
122
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x09", 1434, "end")
123
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "1", 507, "start")
124
+ if strategy == 5:
125
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1, "end")
126
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "g", 1013, "end")
127
+ return data_list
128
+
129
+ @staticmethod
130
+ def case_changes(data_list: list[list[str]], strategy: int) -> list[list[str]]:
131
+ if strategy == 6:
132
+ data_list[HttpUtils.index_host_header(data_list, 1)] = [
133
+ e.lower() for e in data_list[HttpUtils.index_host_header(data_list, 1)]
134
+ ]
135
+ if strategy == 7:
136
+ data_list[HttpUtils.index_host_header(data_list, 1)] = [
137
+ e.upper() for e in data_list[HttpUtils.index_host_header(data_list, 1)]
138
+ ]
139
+ return data_list
140
+
141
+ @staticmethod
142
+ def request_line_whitespaces(data_list: list[list[str]], strategy: int) -> list[list[str]]:
143
+ if strategy == 8:
144
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x09", 1, "end")
145
+ if strategy == 9:
146
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x09", 1, "start")
147
+ if strategy == 10:
148
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x0a", 1, "start")
149
+ if strategy == 11:
150
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x0b", 1, "end")
151
+ if strategy == 12:
152
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x0d", 2, "end")
153
+ if strategy == 13:
154
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x09", 1, "end")
155
+ if strategy == 14:
156
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x09", 1, "start")
157
+ if strategy == 15:
158
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x0c", 1, "start")
159
+ if strategy == 16:
160
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x0d", 1, "start")
161
+ if strategy == 17:
162
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1, "end")
163
+ if strategy == 18:
164
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1, "start")
165
+ if strategy == 19:
166
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x0a\x09\x0a\x09", 1, "end")
167
+ if strategy == 20:
168
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x0a\x09", 1, "end")
169
+ if strategy == 21:
170
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x0a\x20\x0a\x20", 1, "end")
171
+ if strategy == 22:
172
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x20\x0a\x09", 1, "end")
173
+ if strategy == 23:
174
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x20", 1, "end")
175
+ return data_list
176
+
177
+ @staticmethod
178
+ def host_header_whitespaces(data_list: list[list[str]], strategy: int) -> list[list[str]]:
179
+ if strategy == 24:
180
+ data_list.insert(
181
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
182
+ )
183
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
184
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x0a", 1, "end"
185
+ )
186
+ if strategy == 25:
187
+ data_list.insert(
188
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
189
+ )
190
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
191
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x0a", 1, "random"
192
+ )
193
+ if strategy == 26:
194
+ data_list.insert(
195
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
196
+ )
197
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
198
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x20\x0a", 1, "end"
199
+ )
200
+ if strategy == 27:
201
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
202
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x09", 1, "end"
203
+ )
204
+ if strategy == 28:
205
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
206
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x09", 1, "end"
207
+ )
208
+ if strategy == 29:
209
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
210
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x09", 1, "start"
211
+ )
212
+ if strategy == 30:
213
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
214
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x0a\x0a", 1, "start"
215
+ )
216
+ if strategy == 31:
217
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
218
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x0a ", 1, "start"
219
+ )
220
+ if strategy == 32:
221
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
222
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x0a", 1, "end"
223
+ )
224
+ if strategy == 33:
225
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
226
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x20\x0a", 1, "start"
227
+ )
228
+ if strategy == 34:
229
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
230
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x20", 1, "end"
231
+ )
232
+ if strategy == 35:
233
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
234
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x20", 1, "end"
235
+ )
236
+ if strategy == 36:
237
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.insert(
238
+ data_list[HttpUtils.index_host_header(data_list, 1)][0], "\x20", 1, "start"
239
+ )
240
+ if strategy == 37:
241
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
242
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x20", 2, "start"
243
+ )
244
+ return data_list
245
+
246
+ @staticmethod
247
+ def path_manipulation(data_list: list[list[str]], strategy: int) -> list[list[str]]:
248
+ if strategy == 38:
249
+ data_list[0].insert(2, data_list[0][2])
250
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "3", 1004, "middle")
251
+ data_list[0][3] = HttpUtils.replace(data_list[0][3], "&ultrasurf", 1, 0, len(data_list[0][3]))
252
+ if strategy == 39:
253
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x3f", 1, "start")
254
+ return data_list
255
+
256
+ @staticmethod
257
+ def method_manipulation(data_list: list[list[str]], strategy: int) -> list[list[str]]:
258
+ if strategy == 40:
259
+ data_list[0].insert(0, data_list[0][0])
260
+ if strategy == 41:
261
+ data_list[0][0] = HttpUtils.replace(data_list[0][0], "\x3a", 1, 0, len(data_list[0][0]))
262
+ if strategy == 42:
263
+ data_list[0][0] = HttpUtils.replace(data_list[0][0], "HTTP/1.1", 1, 0, len(data_list[0][0]))
264
+ return data_list
265
+
266
+ @staticmethod
267
+ def host_header_shield(data_list: list[list[str]], strategy: int) -> list[list[str]]:
268
+ if strategy == 43:
269
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1, "start")
270
+ data_list.insert(
271
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
272
+ )
273
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.replace(
274
+ data_list[HttpUtils.index_host_header(data_list, 1)][2],
275
+ "/?ultrasurf",
276
+ 1,
277
+ 0,
278
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][2]),
279
+ )
280
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
281
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
282
+ "/",
283
+ 64,
284
+ 0,
285
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
286
+ )
287
+ if strategy == 44:
288
+ data_list.insert(
289
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
290
+ )
291
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
292
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
293
+ "a",
294
+ 64,
295
+ 0,
296
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
297
+ )
298
+ if strategy == 45:
299
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x09", 1, "end")
300
+ data_list.insert(
301
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
302
+ )
303
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
304
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
305
+ "a",
306
+ 64,
307
+ 0,
308
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
309
+ )
310
+ if strategy == 46:
311
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x0a", 1, "start")
312
+ data_list.insert(
313
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
314
+ )
315
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
316
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
317
+ "\x2f",
318
+ 64,
319
+ 0,
320
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
321
+ )
322
+ if strategy == 47:
323
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x20", 1, "end")
324
+ data_list.insert(
325
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
326
+ )
327
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
328
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
329
+ "\x2f",
330
+ 64,
331
+ 0,
332
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
333
+ )
334
+ if strategy == 48:
335
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x20", 1, "start")
336
+ data_list.insert(
337
+ HttpUtils.index_host_header(data_list, 1), data_list[HttpUtils.index_host_header(data_list, 1)][:]
338
+ )
339
+ data_list[HttpUtils.index_host_header(data_list, 1)][0] = HttpUtils.replace(
340
+ data_list[HttpUtils.index_host_header(data_list, 1)][0],
341
+ "\xc2\xb0",
342
+ 32,
343
+ 0,
344
+ len(data_list[HttpUtils.index_host_header(data_list, 1)][0]),
345
+ )
346
+ return data_list
347
+
348
+ @staticmethod
349
+ def long_request(data_list: list[list[str]], strategy: int) -> list[list[str]]:
350
+ if strategy == 49:
351
+ data_list[0][2] = HttpUtils.replace(data_list[0][2], "/", 1434, 0, len(data_list[0][2]))
352
+ if strategy == 50:
353
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
354
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x20", 1413, "start"
355
+ )
356
+ if strategy == 51:
357
+ data_list[HttpUtils.index_host_header(data_list, 1)][2] = HttpUtils.insert(
358
+ data_list[HttpUtils.index_host_header(data_list, 1)][2], "\x20", 1434, "start"
359
+ )
360
+ if strategy == 52:
361
+ data_list[0].insert(0, data_list[0][0])
362
+ data_list[0][1] = HttpUtils.replace(data_list[0][1], "a", 1407, 0, len(data_list[0][1]))
363
+ if strategy == 53:
364
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x09", 2568, "end")
365
+ if strategy == 54:
366
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x0a", 4336, "start")
367
+ if strategy == 55:
368
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x20", 1413, "end")
369
+ if strategy == 56:
370
+ data_list[0][0] = HttpUtils.insert(data_list[0][0], "\x20", 1720, "end")
371
+ if strategy == 57:
372
+ data_list[0].insert(2, data_list[0][2])
373
+ data_list[0][2] = HttpUtils.replace(data_list[0][2], "a", 1, 0, len(data_list[0][2]))
374
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "a", 1408, "start")
375
+ if strategy == 58:
376
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x0d", 1434, "end")
377
+ if strategy == 59:
378
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1413, "end")
379
+ if strategy == 60:
380
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x20", 1, "start")
381
+ data_list[0][2] = HttpUtils.replace(data_list[0][2], "3", 511, 0, len(data_list[0][2]))
382
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "&", 1, "start")
383
+ if strategy == 61:
384
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x23", 1413, "end")
385
+ if strategy == 62:
386
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x23", 1, "end")
387
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\xc3", 470, "end")
388
+ if strategy == 63:
389
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x3f", 1413, "end")
390
+ if strategy == 64:
391
+ data_list[0][2] = HttpUtils.insert(data_list[0][2], "\x3f", 1413, "start")
392
+ if strategy == 65:
393
+ data_list[0][2] = HttpUtils.replace(data_list[0][2], "/", 1414, 0, len(data_list[0][2]))
394
+ if strategy == 66:
395
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x20", 1434, "end")
396
+ if strategy == 67:
397
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x20", 1434, "start")
398
+ if strategy == 68:
399
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\x25", 1434, "middle")
400
+ if strategy == 69:
401
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\xc2\x81", 773, "end")
402
+ if strategy == 70:
403
+ data_list[0][4] = HttpUtils.insert(data_list[0][4], "\xc3\x8b", 717, "middle")
404
+ return data_list
405
+
406
+ # - - - - - - - - - - HTTP Request Smuggling - - - - - - - - - - #
407
+
408
+ @staticmethod
409
+ def http_request_smuggling_CLTE_CL_manipulated(data_list: list[list[str]], smuggling: int) -> list[list[str]]:
410
+ if smuggling == 101:
411
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.insert(
412
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0], ":", 1, "end"
413
+ )
414
+ if smuggling == 102:
415
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.insert(
416
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0], "\x20", 1, "index", index=-1
417
+ )
418
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
419
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x20", 1, "end"
420
+ )
421
+ if smuggling == 103:
422
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.insert(
423
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0], "\x09", 1, "index", index=-1
424
+ )
425
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
426
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x09", 1, "end"
427
+ )
428
+ if smuggling == 104:
429
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
430
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "'", 1, "start"
431
+ )
432
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
433
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "'", 1, "end"
434
+ )
435
+ if smuggling == 105:
436
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
437
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x20", 1, "start"
438
+ )
439
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
440
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x20", 1, "end"
441
+ )
442
+ if smuggling == 106:
443
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
444
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x20\x0aX: X", 1, "end"
445
+ )
446
+ if smuggling == 107:
447
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
448
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\xc3\xbf\x0aX: X", 1, "end"
449
+ )
450
+ if smuggling == 108:
451
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.insert(
452
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0], "\x0b", 1, "end"
453
+ )
454
+ if smuggling == 109:
455
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
456
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x0a\x0aX: X", 1, "end"
457
+ )
458
+ if smuggling == 110:
459
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
460
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\x0a", 1, "end"
461
+ )
462
+ if smuggling == 111:
463
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.replace(
464
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0],
465
+ "Content_Encoding:",
466
+ 1,
467
+ 0,
468
+ len(data_list[HttpUtils.index_content_length_header(data_list, 1)][0]),
469
+ )
470
+ if smuggling == 112:
471
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0] = HttpUtils.insert(
472
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][0], "\xc3\xbf", 1, "start"
473
+ )
474
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2] = HttpUtils.insert(
475
+ data_list[HttpUtils.index_content_length_header(data_list, 1)][2], "\xc3\xbf", 1, "end"
476
+ )
477
+ return data_list
478
+
479
+ @staticmethod
480
+ def http_request_smuggling_TECL_TE_manipulated(data_list: list[list[str]], smuggling: int) -> list[list[str]]:
481
+ if smuggling == 113:
482
+ data_list.insert(
483
+ HttpUtils.index_transfer_encoding_header(data_list, 1),
484
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][:],
485
+ )
486
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 2)][2] = HttpUtils.replace(
487
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 2)][2],
488
+ "identity\x0d\x0a",
489
+ 1,
490
+ 0,
491
+ len(data_list[HttpUtils.index_transfer_encoding_header(data_list, 2)][2]),
492
+ )
493
+ if smuggling == 114:
494
+ data_list.insert(
495
+ HttpUtils.index_transfer_encoding_header(data_list, 1),
496
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][:],
497
+ )
498
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 2)][0] = HttpUtils.insert(
499
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 2)][0], " ", 1, "start"
500
+ )
501
+ if smuggling == 115:
502
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
503
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x20", 1, "start"
504
+ )
505
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
506
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x20", 1, "end"
507
+ )
508
+ if smuggling == 116:
509
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
510
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x09", 1, "start"
511
+ )
512
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
513
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x09", 1, "end"
514
+ )
515
+ if smuggling == 117:
516
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
517
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x0d", 1, "index", index=-1
518
+ )
519
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
520
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x0d", 1, "end"
521
+ )
522
+ if smuggling == 118:
523
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.replace(
524
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0],
525
+ "Content-Encoding:",
526
+ 1,
527
+ 0,
528
+ len(data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0]),
529
+ )
530
+ if smuggling == 119:
531
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
532
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\xc3\xbf", 1, "start"
533
+ )
534
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
535
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\xc3\xbf", 1, "end"
536
+ )
537
+ if smuggling == 120:
538
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.replace(
539
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0],
540
+ "Transfer_Encoding:",
541
+ 1,
542
+ 0,
543
+ len(data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0]),
544
+ )
545
+ return data_list
546
+
547
+ @staticmethod
548
+ def http_request_smuggling_CLTE_TE_manipulated(data_list: list[list[str]], smuggling: int) -> list[list[str]]:
549
+ if smuggling == 121:
550
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)] = [
551
+ "TRANSFER-ENCODING:",
552
+ " ",
553
+ "CHUNKED",
554
+ "\x0d\x0a",
555
+ ]
556
+ if smuggling == 122:
557
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)] = [
558
+ "TrAnSFer-EnCODinG:",
559
+ " ",
560
+ "cHuNkeD",
561
+ "\x0d\x0a",
562
+ ]
563
+ if smuggling == 123:
564
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
565
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], ":", 1, "end"
566
+ )
567
+ if smuggling == 124:
568
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
569
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x20", 1, "index", index=-1
570
+ )
571
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
572
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x20", 1, "end"
573
+ )
574
+ if smuggling == 125:
575
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
576
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x09", 1, "index", index=-1
577
+ )
578
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
579
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x09", 1, "end"
580
+ )
581
+ if smuggling == 126:
582
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
583
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x0a", 1, "end"
584
+ )
585
+ if smuggling == 127:
586
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0] = HttpUtils.insert(
587
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][0], "\x0a", 1, "start"
588
+ )
589
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2] = HttpUtils.insert(
590
+ data_list[HttpUtils.index_transfer_encoding_header(data_list, 1)][2], "\x0a", 1, "end"
591
+ )
592
+ return data_list
593
+
594
+ @staticmethod
595
+ def smuggling_with_no_manipulation(data_list: list[list[str]], smuggling: int) -> list[list[str]]:
596
+ if smuggling == 128:
597
+ return data_list
598
+ if smuggling == 129:
599
+ return data_list
600
+
601
+ # http_request_smuggling_TECL_CL_manipulated not implemented, since the study showed no relevant techniques
602
+
603
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
604
+
605
+ # description of technique after technique
606
+
607
+ switch_manipulation = {
608
+ ### BASIC MANIPULATIONS
609
+ 0: no_manipulation, # no manipulation
610
+ # - - - - - #
611
+ 1: altering_http_version,
612
+ # HTTP:version / duplicating version
613
+ 2: altering_http_version,
614
+ # HTTP:version / replacing HTTP/"..." with "OPTIONS"
615
+ # - - - - - #
616
+ 3: splitting_request_line,
617
+ # HTTP:version / inserting 14* "\x09" in the middle of value
618
+ 4: splitting_request_line,
619
+ # HTTP:path / inserting 1434* "\x09" at the end of value
620
+ # HTTP:path / inserting 507* "1" at the start of value
621
+ 5: splitting_request_line,
622
+ # HTTP:path / inserting 1* "\x20" at the end of value
623
+ # HTTP:path / inserting 1013* "g" at the end of value
624
+ # - - - - - #
625
+ 6: case_changes,
626
+ # HTTP:host / line in lower case
627
+ 7: case_changes,
628
+ # HTTP:host / line in upper case
629
+ # - - - - - #
630
+ 8: request_line_whitespaces,
631
+ # HTTP:methode / inserting 1* "\x09" at the end of value
632
+ 9: request_line_whitespaces,
633
+ # HTTP:methode / inserting 1* "\x09" at the start of value
634
+ 10: request_line_whitespaces,
635
+ # HTTP:methode / inserting 1* "\x0A" at the start of value
636
+ 11: request_line_whitespaces,
637
+ # HTTP:methode / inserting 1* "\x0B" at the end of value
638
+ 12: request_line_whitespaces,
639
+ # HTTP:methode / inserting 2* "\x0D" at the end of value
640
+ 13: request_line_whitespaces,
641
+ # HTTP:path / inserting 1* "\x09" at the end of value
642
+ 14: request_line_whitespaces,
643
+ # HTTP:path / inserting 1* "\x09" at the start of value
644
+ 15: request_line_whitespaces,
645
+ # HTTP:path / inserting 1* "\x0C" at the start of value
646
+ 16: request_line_whitespaces,
647
+ # HTTP:path / inserting 1* "\x0D" at the start of value
648
+ 17: request_line_whitespaces,
649
+ # HTTP:path / inserting 1* "\x20" at the end of value
650
+ 18: request_line_whitespaces,
651
+ # HTTP:path / inserting 1* "\x20" at the start of value
652
+ 19: request_line_whitespaces,
653
+ # HTTP:version / inserting 1* "\x0A\x09\x0A\x09" at the end of value
654
+ 20: request_line_whitespaces,
655
+ # HTTP:version / inserting 1* "\x0A\x09" at the end of value
656
+ 21: request_line_whitespaces,
657
+ # HTTP:version / inserting 1* "\x0A\x20\x0A " at the end of value
658
+ 22: request_line_whitespaces,
659
+ # HTTP:version / inserting 1* "\x20\x0A\x09" at the end of value
660
+ 23: request_line_whitespaces,
661
+ # HTTP:version / inserting 1* "\x20" at the end of value
662
+ # - - - - - #
663
+ 24: host_header_whitespaces,
664
+ # HTTP:host / duplicating: inserting 1* "\x0A" at the end of value
665
+ # , second: nothing changed
666
+ 25: host_header_whitespaces,
667
+ # HTTP:host / duplicating: inserting 1* "\x0A" at random of name
668
+ # , second: nothing changed
669
+ 26: host_header_whitespaces,
670
+ # HTTP:host / duplicating: inserting 1* "\x20\x0A" at the end of name
671
+ # , second: nothing changed
672
+ 27: host_header_whitespaces,
673
+ # HTTP:host / inserting 1* "\x09" at the end of name
674
+ 28: host_header_whitespaces,
675
+ # HTTP:host / inserting 1* "\x09" at the end of value
676
+ 29: host_header_whitespaces,
677
+ # HTTP:host / inserting 1* "\x09" at the start of value
678
+ 30: host_header_whitespaces,
679
+ # HTTP:host / inserting 1* "\x0A\x0A" at the start of value
680
+ 31: host_header_whitespaces,
681
+ # HTTP:host / inserting 1* "\x0A " at the start of value
682
+ 32: host_header_whitespaces,
683
+ # HTTP:host / inserting 1* "\x0A" at the end of value
684
+ 33: host_header_whitespaces,
685
+ # HTTP:host / inserting 1* "\x20\x0A" at the start of name
686
+ 34: host_header_whitespaces,
687
+ # HTTP:host / inserting 1* "\x20" at the end of name
688
+ 35: host_header_whitespaces,
689
+ # HTTP:host / inserting 1* "\x20" at the end of value
690
+ 36: host_header_whitespaces,
691
+ # HTTP:host / inserting 1* "\x20" at the start of name
692
+ 37: host_header_whitespaces,
693
+ # HTTP:host / inserting 2* "\x20" at the start of value
694
+ # - - - - - #
695
+ 38: path_manipulation,
696
+ # HTTP:path / duplicating: inserting 1004* "3" in the middle of value
697
+ # , second: replacing value with "&ultrasurf"
698
+ 39: path_manipulation,
699
+ # HTTP:path / inserting 1* "\x3F" at the start of value
700
+ # - - - - - #
701
+ 40: method_manipulation,
702
+ # HTTP:method / duplicating: first nothing changed, second nothing changed
703
+ 41: method_manipulation,
704
+ # HTTP:method / replacing method with "\x3A"
705
+ 42: method_manipulation,
706
+ # HTTP:method / replacing method with "HTTP/1.1"
707
+ # - - - - - #
708
+ 43: host_header_shield,
709
+ # HTTP:path / inserting 1* "\x20" at the start of value
710
+ # HTTP:host / duplicating: replacing name with 64* "/" and replacing value with "/?ultrasurf"
711
+ # , second: nothing changed
712
+ 44: host_header_shield,
713
+ # HTTP:host / duplicating: replacing name with 64* "a", second: nothing changed
714
+ 45: host_header_shield,
715
+ # HTTP:method / inserting 1* "\x09" at the end of value
716
+ # HTTP:host / duplicating: replacing name with 64* "a", second: nothing changed
717
+ 46: host_header_shield,
718
+ # HTTP:method / inserting 1* "\x0A" at the start of value
719
+ # HTTP:host / duplicating: replacing name with 64* "\x2F", second: nothing changed
720
+ 47: host_header_shield,
721
+ # HTTP:method / inserting 1* "\x20" at the end of value
722
+ # HTTP:host / duplicating: replacing name with 64* "\x2F", second: nothing changed
723
+ 48: host_header_shield,
724
+ # HTTP:path / inserting 1* "\x20" at the start of value
725
+ # HTTP:host / duplicating: replacing name with 32* "\xC2\xB0", second: nothing changed
726
+ # - - - - - #
727
+ 49: long_request,
728
+ # HTTP:path / replacing value with 1434* "/"
729
+ 50: long_request,
730
+ # HTTP:host / inserting 1413* "\x20" at the start of value
731
+ 51: long_request,
732
+ # HTTP:host / inserting 1434* "\x20" at the start of value
733
+ 52: long_request,
734
+ # HTTP:method / duplicating: first nothing changed, second: replacing name with 1407* "a"
735
+ 53: long_request,
736
+ # HTTP:method / inserting 2568* "\x09" at the end of value
737
+ 54: long_request,
738
+ # HTTP:method / inserting 4336* "\x0A" at the start of value
739
+ 55: long_request,
740
+ # HTTP:method / inserting 1413* "\x20" at the end of value
741
+ 56: long_request,
742
+ # HTTP:method / inserting 1720* "\x20" at the end of value
743
+ 57: long_request,
744
+ # HTTP:path / duplicating: first: replacing value with 1* "a", second: nothing changed
745
+ # HTTP:path / first: inserting 1408* "a" at the start of value
746
+ 58: long_request,
747
+ # HTTP:path / inserting 1434* "\x0D" at the end of value
748
+ 59: long_request,
749
+ # HTTP:path / inserting 1413* "\x20" at the end of value
750
+ 60: long_request,
751
+ # HTTP:path / inserting 1* "\x20" at the start of value
752
+ # HTTP:path / replacing value with 511* "3"
753
+ # HTTP:path / inserting 1* "&" at the start of value
754
+ 61: long_request,
755
+ # HTTP:path / inserting 1413* "\x23" at the end of value
756
+ 62: long_request,
757
+ # HTTP:path / inserting 1* "\x23" at the end of value
758
+ # HTTP:path / inserting 470* "\xC3" at the end of value
759
+ 63: long_request,
760
+ # HTTP:path / inserting 1413* "\x3F" at the end of value
761
+ 64: long_request,
762
+ # HTTP:path / inserting 1413* "\x3F" at the start of value
763
+ 65: long_request,
764
+ # HTTP:path / replacing value with 1414* "/"
765
+ 66: long_request,
766
+ # HTTP:version / inserting 1434* "\x20" at the end of value
767
+ 67: long_request,
768
+ # HTTP:version / inserting 1434* "\x20" at the start of value
769
+ 68: long_request,
770
+ # HTTP:version / inserting 1434* "\x25" in the middle of value
771
+ 69: long_request,
772
+ # HTTP:version / inserting 773* "\xC2\x81" at the end of value
773
+ 70: long_request,
774
+ # HTTP:version / inserting 717* "\xC3\x8B" in the middle of value
775
+ ### SMUGGLING MANIPULATIONS
776
+ 101: http_request_smuggling_CLTE_CL_manipulated,
777
+ # Double Colon: Content-Length:: <len>
778
+ 102: http_request_smuggling_CLTE_CL_manipulated,
779
+ # White-Space Injection: Content-Length\x20: <len>\x20
780
+ 103: http_request_smuggling_CLTE_CL_manipulated,
781
+ # White-Space Injection: Content-Length\x09: <len>\x09
782
+ 104: http_request_smuggling_CLTE_CL_manipulated,
783
+ # Wrapping: Content-Length: ’<len>’
784
+ 105: http_request_smuggling_CLTE_CL_manipulated,
785
+ # Wrapping: Content-Length:\x20<len>\x20
786
+ 106: http_request_smuggling_CLTE_CL_manipulated,
787
+ # Wrapping: Content-Length: <len>\x20\x0AX: X
788
+ 107: http_request_smuggling_CLTE_CL_manipulated,
789
+ # Wrapping: Content-Length: <len>\xC3\xBF\x0AX: X
790
+ 108: http_request_smuggling_CLTE_CL_manipulated,
791
+ # Wrapping: Content-Length:\x0B <len>
792
+ 109: http_request_smuggling_CLTE_CL_manipulated,
793
+ # Wrapping: Content-Length: <len>\x0A\x0AX: X
794
+ 110: http_request_smuggling_CLTE_CL_manipulated,
795
+ # Wrapping: Content-Length: <len>\x0A
796
+ 111: http_request_smuggling_CLTE_CL_manipulated,
797
+ # Invalid Header: Content-Encoding: <len>
798
+ 112: http_request_smuggling_CLTE_CL_manipulated,
799
+ # Invalid Header: \xC3\xBFContent-Length: <len>\xC3\xBF
800
+ # - - - - - #
801
+ 113: http_request_smuggling_TECL_TE_manipulated,
802
+ # Header manipulation: Transfer-Encoding: identity\x0D\x0A
803
+ 114: http_request_smuggling_TECL_TE_manipulated,
804
+ # Header manipulation: Transfer-Encoding: chunked
805
+ 115: http_request_smuggling_TECL_TE_manipulated,
806
+ # White-Space Injection: \x20Transfer-Encoding: chunked\x20
807
+ 116: http_request_smuggling_TECL_TE_manipulated,
808
+ # White-Space Injection: \x09Transfer-Encoding: chunked\x09
809
+ 117: http_request_smuggling_TECL_TE_manipulated,
810
+ # White-Space Injection: Transfer-Encoding\x0D: chunked\x0D
811
+ 118: http_request_smuggling_TECL_TE_manipulated,
812
+ # Invalid Header: Content-Encoding: chunked
813
+ 119: http_request_smuggling_TECL_TE_manipulated,
814
+ # Invalid Header: \xC3\xBFTransfer-Encoding:chunked\xC3\xBF
815
+ 120: http_request_smuggling_TECL_TE_manipulated,
816
+ # Invalid Header: Transfer_Encoding: chunked
817
+ # - - - - - #
818
+ 121: http_request_smuggling_CLTE_TE_manipulated,
819
+ # Letter Case: TRANSFER-ENCODING: CHUNKED
820
+ 122: http_request_smuggling_CLTE_TE_manipulated,
821
+ # Letter Case: TrAnSFer-EnCODinG: cHuNkeD
822
+ 123: http_request_smuggling_CLTE_TE_manipulated,
823
+ # Double Colon: Transfer-Encoding:: chunked
824
+ 124: http_request_smuggling_CLTE_TE_manipulated,
825
+ # White-Space Injection: Transfer-Encoding\x20: chunked\x20
826
+ 125: http_request_smuggling_CLTE_TE_manipulated,
827
+ # White-Space Injection: Transfer-Encoding\x09: chunked\x09
828
+ 126: http_request_smuggling_CLTE_TE_manipulated,
829
+ # White-Space Injection: Transfer-Encoding:\x0A chunked
830
+ 127: http_request_smuggling_CLTE_TE_manipulated,
831
+ # White-Space Injection: \x0ATransfer-Encoding: chunked\x0A
832
+ # - - - - - #
833
+ 128: smuggling_with_no_manipulation,
834
+ # CL/TE
835
+ 129: smuggling_with_no_manipulation,
836
+ # TE/CL
837
+ }
838
+
839
+ @staticmethod
840
+ def strategy_is_valid(strategy: int) -> bool:
841
+ return HttpStrategies.strategy_is_basic(strategy) or HttpStrategies.strategy_is_smuggling(strategy)
842
+
843
+ @staticmethod
844
+ def strategy_is_basic(strategy: int) -> bool:
845
+ return strategy in range(1, 71)
846
+
847
+ @staticmethod
848
+ def strategy_is_smuggling(strategy: int) -> bool:
849
+ return strategy in range(101, 130)