parasort 5.1.0__tar.gz

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.
@@ -0,0 +1,136 @@
1
+ # Changelog
2
+
3
+ All notable changes to Parasort are documented in this file.
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [5.1.0] - 2026-09-13
8
+
9
+ ### Added
10
+ - **Tests + CI**: `tests/` pytest suite (37 tests: core, processing, CLI,
11
+ incl. short-form convention coverage) and `.github/workflows/ci.yml` matrix
12
+ across Python 3.11–3.14 (`pytest`, `build`, `twine check` gate);
13
+ `pip install -e ".[test]"` support.
14
+ - **Streaming input + `-mx` / `--max-urls`**: input files are read line-by-line
15
+ (no giant intermediate lists); aborts with a clear error when stdin+file
16
+ input exceeds INT URLs.
17
+ - **JSONL + stdout mode**: `-f jsonl` writes a single `urls.jsonl`
18
+ (`{"domain","category","url"}` per line); `-o -` / `-st` / `--stdout` streams
19
+ those records to stdout (human output goes to stderr), e.g.
20
+ `parasort -i urls.txt -o - | nuclei -l /dev/stdin`.
21
+ - **CSV split** (`-cs` / `--csv-split`): `single` (default, one `urls.csv`) or
22
+ `per-domain` (one `urls.csv` per domain folder with `category,url` columns).
23
+ - **Normalized dedup** (`-ddn` / `--dedup-normalized`): collapse URLs with
24
+ identical (domain, path, param-name set), ignoring order/case/values
25
+ (`?id=1&a=2` vs `?A=2&ID=1`); runs after exact `-dd`.
26
+ - **Live-check upgrade**: `-m` / `--method auto` (default, HEAD first with GET
27
+ fallback) / `head` / `get`; `-rt` / `--retries 0-10`; `-is` /
28
+ `--include-status` extra live codes (e.g. `403 404`, evaluated even on HTTP
29
+ errors); `-lc` / `--live-cache FILE` with `-ct` / `--cache-ttl` (default
30
+ 86400s) persists results across runs; each unique URL is probed once per run
31
+ (duplicates preserved in output).
32
+ - **Config management**: `--init-config` (`-ic`, create if missing) and
33
+ `--reset-config` (`-rc`, overwrite with built-in defaults); validation now
34
+ keeps valid categories and prints per-category warnings instead of rejecting
35
+ the whole file; `ParaSort.builtin_defaults()` / `reset_config()` API.
36
+ - **Short + long forms**: every new flag follows the project convention
37
+ (`-st`, `-mx`, `-ddn`, `-cs`, `-m`, `-rt`, `-is`, `-lc`, `-ct`, `-ic`, `-rc`).
38
+
39
+ ## [5.0.1] - 2026-09-13
40
+
41
+ ### Fixed
42
+ - `normalize_parameter`: decode until stable (up to 5x, fixes triple-encoding),
43
+ strip repeated `[]` and single `[..]` suffixes (`id[][]` -> `id`, `id[0]` -> `id`,
44
+ `user[name]` -> `user`).
45
+ - `get_domain_from_url`: reject whitespace/garbage hostnames (`"not a url %%%"`
46
+ -> `unknown_domain`), strip trailing dots, validate labels.
47
+ - `dedup_urls`: strip whitespace in output too (previously kept `" url "` verbatim).
48
+ - `param_signature` / `-uq`: param-less or fully-excluded URLs no longer collapse
49
+ to one (empty signature returns `None` = keep).
50
+ - `compare_versions`: pre-release sorts lower (`5.0.0b1 < 5.0.0`), so beta -> release
51
+ triggers `--update`.
52
+ - `fetch_latest_version`: tries `main` then `master` branch.
53
+ - `perform_update`: fixed inverted `capture_output` (silent no longer spams).
54
+ - `load_custom_params_from_file`: strips inline `#` comments (`api_key # prod`
55
+ -> `api_key`).
56
+ - `-vl` / `-lp`: case-insensitive (`-vl SQLI`, `-lp SQLI` work); `-vl all sqli`
57
+ warns and expands to all.
58
+ - `-cp ","`: warns instead of silently ignoring.
59
+ - `--timeout` message/help: `>0 and <=300` (code already allowed `0.5`).
60
+ - Parameter tracking/extraction normalized to lowercase (`ID` and `id` no longer
61
+ listed separately).
62
+ - `show_categories`: trailing `...` only when >5 params.
63
+ - `_validate_config`: empty category lists allowed; entries stripped.
64
+ - `filter_live_urls`: duplicate URLs preserve first-seen order.
65
+ - `--no-color` pre-scan no longer triggers on values (e.g. `-cp` values).
66
+ - `LICENSE`: holder/year normalized to `2025-2026 Ev3rPalestine`.
67
+ - `README`: fixed `Paramters` typo.
68
+
69
+ ## [5.0.0] - 2026-09-12
70
+
71
+ ### Added
72
+ - **Deduplication** (`-dd` / `--dedup`): drop exact duplicate URLs before processing.
73
+ - **Unique params** (`-uq` / `--unique-params`): keep one URL per parameter-name set per domain
74
+ (e.g. `?id=1` and `?id=2` collapse to the first seen).
75
+ - **Output formats** (`-f` / `--format`): `txt` (default, per-domain `*-urls.txt`),
76
+ `json` (per-domain `.json` + `summary.json`) and `csv` (single `urls.csv`).
77
+ - **Category profiles** (`-pf` / `--profile`): `web`
78
+ (sqli, xss, ssrf, lfi, open_redirect) and `api`
79
+ (sqli, auth_bypass, business_logic, info_disclosure, command_injection, ssrf).
80
+ An explicit `-vl` / `--vuln` overrides the profile.
81
+ - **Filters**: `-ed` / `--exclude-domain` (exact or `*` wildcard, case-insensitive) and
82
+ `-xp` / `--exclude-param` (ignored for matching and extraction).
83
+ - **Top-N** (`-tp` / `--top`): keep only the first INT URLs per category per domain.
84
+ - **Live-host check** (`-hc` / `--status-check`): keep only URLs responding HTTP 2xx-3xx
85
+ (concurrent requests, stdlib only) with configurable `-to` / `--timeout` (>0 and <=300s).
86
+ - **Info commands**: `-lp` / `--list-params` (list a category's parameters),
87
+ `-V` / `--version`, `-up` / `--update` (self-update via pip, PyPI first with GitHub fallback).
88
+ - **Packaging**: `pyproject.toml` (PEP 517/621 metadata, single-sourced version),
89
+ `MANIFEST.in`, `.gitignore`; PyPI-ready (`pip install parasort`).
90
+ - **Severity ordering**: categories are now ordered by severity in verbose output and
91
+ JSON/CSV writers.
92
+
93
+ ### Changed
94
+ - **Every CLI argument now has both a short and a long form**
95
+ (e.g. `-c` / `--clear`, `-nc` / `--no-color`, `-vl` / `--vuln`).
96
+ - `--vuln` accepts custom categories added via `parameter_categories.json`
97
+ (previously hardcoded choices rejected them).
98
+ - Minimum Python version is now **3.11+** (was 3.6+).
99
+ - `setup.py` is now a thin shim; all metadata lives in `pyproject.toml`.
100
+ - `--update` upgrades from PyPI first (`pip install --upgrade parasort`),
101
+ falling back to the GitHub URL.
102
+ - Global summary notes that a URL matching N categories is counted in each.
103
+
104
+ ### Fixed
105
+ - Domain extraction broke on credentials (`user:pass@host` returned `user`),
106
+ IPv6 (`[::1]:8080` returned `[`), uppercase hosts (duplicate folders) and
107
+ scheme-less URLs (`example.com/?id=1` went to `unknown_domain`).
108
+ Now uses `hostname` with lowercasing and scheme-less fallback.
109
+ - `normalize_parameter` mangled names containing `amp;` mid-string
110
+ (e.g. `exampleamp;test`); now strips only a leading `amp;` artifact,
111
+ double-decodes, and strips PHP `id[]` suffixes.
112
+ - `clear_parameters` collapsed `?id=1&id=2` to a single `?id=`; now preserves
113
+ order and duplicates (`?id=&id=`).
114
+ - Per-category parameter tracking recorded *every* URL param under *each*
115
+ matched category; now only genuinely matching params are recorded, and
116
+ `uncategorized` params are tracked too.
117
+ - Nested output dirs (`-o a/b/c`) crashed; output dir creation is now
118
+ `parents=True` inside the error-handled path (a file path returns `False`).
119
+ - Missing input file combined with stdin was silently ignored; now warns and
120
+ continues with stdin URLs.
121
+ - `-cp "a,b" c` (mixed comma + space) left `'a,b'` unsplit so it never matched;
122
+ commas are now split in every element.
123
+ - Indented `# comments` in custom-param files were treated as parameters.
124
+ - `--no-color` only cleared `Fore` (leaving `Back`/`Style`) and never applied to
125
+ help text; now clears all three and is pre-scanned before help rendering.
126
+ - Bare config filenames, invalid JSON and malformed configs no longer crash or
127
+ spam silent mode; config structure is validated.
128
+ - `all-parameters.txt` is now written for single-domain runs too.
129
+ - Output file handles are always closed (`try/finally`), even on errors.
130
+ - `README.md` installation/arguments sections updated; fixed
131
+ `custom-urls.txt` vs `custom-params-urls.txt` mismatch.
132
+
133
+ ## [1.5.0] - 2025-08-01
134
+ - Baseline release: URL categorization by vulnerability type, domain-based output,
135
+ parameter extraction (`-ep`), custom parameters (`-cp` / `-cpf`), value clearing
136
+ (`--clear`), verbose/silent modes, file + stdin input, JSON config in `~/.parasort/`.
parasort-5.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Ev3rPalestine
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ include README.md CHANGELOG.md LICENSE parameter_categories.json requirements.txt
2
+ recursive-include tests *.py
@@ -0,0 +1,458 @@
1
+ Metadata-Version: 2.4
2
+ Name: parasort
3
+ Version: 5.1.0
4
+ Summary: URL Parameter Categorization and Extraction Tool for Penetration Testing
5
+ Author-email: Ev3rPalestine <Ev3rPalestine@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Ev3rPalestine/Parasort
8
+ Project-URL: Repository, https://github.com/Ev3rPalestine/Parasort
9
+ Project-URL: Issues, https://github.com/Ev3rPalestine/Parasort/issues
10
+ Keywords: pentesting,bug-bounty,security,url,parameters,sqli,xss
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Security
21
+ Classifier: Topic :: Internet :: WWW/HTTP
22
+ Requires-Python: >=3.11
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: colorama>=0.4.6
26
+ Provides-Extra: test
27
+ Requires-Dist: pytest>=7; extra == "test"
28
+ Dynamic: license-file
29
+
30
+ # Parasort - URL Parameter Categorization & Extraction Tool
31
+
32
+ ![PARASORT Logo](https://img.shields.io/badge/PARASORT-URL%20Parameter%20Categorizer-blue)
33
+ ![Python](https://img.shields.io/badge/Python-3.11%2B-green)
34
+ ![License](https://img.shields.io/badge/License-MIT-yellow)
35
+ ![Author](https://img.shields.io/badge/Author-Ev3rPalestine-orange)
36
+
37
+ ```text
38
+ ██████╗ █████╗ ██████╗ █████╗ ███████╗ ██████╗ ██████╗ ████████╗
39
+ ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔═══██╗██╔══██╗╚══██╔══╝
40
+ ██████╔╝███████║██████╔╝███████║███████╗██║ ██║██████╔╝ ██║
41
+ ██╔═══╝ ██╔══██║██╔══██╗██╔══██║╚════██║██║ ██║██╔══██╗ ██║
42
+ ██║ ██║ ██║██║ ██║██║ ██║███████║╚██████╔╝██║ ██║ ██║
43
+ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
44
+ URL Parameter Categorizer & Extraction
45
+ by Ev3rPalestine
46
+ ```
47
+
48
+ #### A powerful Python tool for automatically categorizing URLs by their parameters & extracting them to streamline penetration testing and vulnerability assessment workflows.
49
+
50
+ ## Features
51
+
52
+ - **Automatic URL Categorization**: Sort URLs by vulnerability type (SQLi, XSS, SSRF, LFI, etc.)
53
+ - **Domain-Based Organization**: Output organized by domain folders
54
+ - **Parameters Extraction**: Extract found parameters in urls for fuzzing or other use
55
+ - **Custom Parameter Search**: Support for custom parameters via command line or file
56
+ - **Parameter Value Clearing**: Clean URLs by keeping only parameter names
57
+ - **Flexible Category Selection**: Choose specific vulnerability types, or use `web` / `api` presets
58
+ - **Dedup & Unique-Params**: Drop exact duplicates (`-dd`), normalized duplicates ignoring order/case/values (`-ddn`), or collapse same-param-set URLs (`-uq`)
59
+ - **Filters**: Exclude domains (`-ed`, supports `*` wildcards) and noisy params (`-xp`)
60
+ - **Top-N Focus**: Keep only the first INT URLs per category per domain (`-tp`)
61
+ - **Input Guard**: Abort oversized runs with `--max-urls`
62
+ - **Live-Host Check**: Keep only live URLs (`-hc`, HEAD-first with GET fallback, `--retries`, `--include-status`, persistent `--live-cache`)
63
+ - **Multiple Output Formats**: Classic `txt`, machine-readable `json`, flat `csv` (single or per-domain via `--csv-split`), or pipe-friendly `jsonl` / stdout (`-o -`, `--stdout`)
64
+ - **Self-Updating**: Upgrade to the latest release with `parasort --update`
65
+ - **Configurable Parameters**: External JSON configuration (`--init-config`, `--reset-config`), per-category validation warnings
66
+ - **Tested**: pytest suite (36 tests) + CI matrix across Python 3.11–3.14
67
+ - **Colorful Output**: Visual feedback with color-coded categories
68
+
69
+ ## Installation
70
+
71
+ ### Prerequisites
72
+ - Python 3.11 or higher
73
+ - pip package manager
74
+
75
+ ### From PyPI (recommended)
76
+
77
+ ```bash
78
+ pip install parasort
79
+ ```
80
+
81
+ Isolated install with [pipx](https://pipx.pypa.io/):
82
+
83
+ ```bash
84
+ pipx install parasort
85
+ ```
86
+
87
+ Upgrade to the latest release:
88
+
89
+ ```bash
90
+ pip install --upgrade parasort
91
+ # or: parasort --update
92
+ ```
93
+
94
+ ### From source
95
+
96
+ ```bash
97
+ git clone https://github.com/Ev3rPalestine/Parasort.git
98
+ cd Parasort
99
+ pip install .
100
+ ```
101
+ ## Example
102
+
103
+ ```bash
104
+ # parasort -i urls.txt
105
+
106
+
107
+ ██████╗ █████╗ ██████╗ █████╗ ███████╗ ██████╗ ██████╗ ████████╗
108
+ ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔═══██╗██╔══██╗╚══██╔══╝
109
+ ██████╔╝███████║██████╔╝███████║███████╗██║ ██║██████╔╝ ██║
110
+ ██╔═══╝ ██╔══██║██╔══██╗██╔══██║╚════██║██║ ██║██╔══██╗ ██║
111
+ ██║ ██║ ██║██║ ██║██║ ██║███████║╚██████╔╝██║ ██║ ██║
112
+ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
113
+ URL Parameter Categorizer & Extraction
114
+ by Ev3rPalestine
115
+
116
+ Processing 858 URLs using 9 categories...
117
+ Processing: example.com
118
+ Processing: example.org
119
+ Processing: example2.com
120
+
121
+ ==================================================
122
+ PROCESSING COMPLETE
123
+ ==================================================
124
+ URLs processed: 858
125
+ Domains found: 22
126
+
127
+ GLOBAL CATEGORY SUMMARY
128
+ --------------------------------------------------
129
+ uncategorized : 641 URLs
130
+ xss : 122 URLs| Parameters: AdvertiserID, _charset_, _gl, belboon, dclid ... (+33 more)
131
+ info_disclosure : 66 URLs| Parameters: v
132
+ sqli : 21 URLs| Parameters: _charset_, cnt, groupId, id, k ... (+13 more)
133
+ business_logic : 8 URLs| Parameters: actionId, advancePaymentId, backLink, calcType, carModel ... (+25 more)
134
+ ssrf : 7 URLs| Parameters: id, image, k, limit, offset ... (+5 more)
135
+ lfi : 6 URLs| Parameters: ANAME, FNAME, LAF_PARTNER, Page, action ... (+9 more)
136
+ open_redirect : 6 URLs| Parameters: id, k, limit, offset, p_l_id ... (+4 more)
137
+ ==================================================
138
+ Output directory: results/
139
+
140
+ ```
141
+
142
+ ## Available Arguments
143
+ ```text
144
+ INPUT / OUTPUT:
145
+ -i, --input FILE Input file containing URLs (optional if using stdin)
146
+ -o, --output DIR Output directory (default: results); use - for stdout JSONL
147
+ -f, --format FORMAT Output format: txt (per-domain *-urls.txt),
148
+ json (per-domain .json + summary.json),
149
+ csv (urls.csv, see -cs) or
150
+ jsonl (single urls.jsonl) (default: txt)
151
+ -st, --stdout Same as -o -: emit JSONL records to stdout (pipe-friendly)
152
+ -mx, --max-urls INT Abort with an error if input exceeds INT URLs (no limit by default)
153
+
154
+ PROCESSING OPTIONS:
155
+ -c, --clear Clear parameter values, keep names only (e.g., -c)
156
+ -v, --verbose Show detailed processing information (e.g., -v)
157
+ -s, --silent Minimal output for scripting (e.g., -s)
158
+ -nc, --no-color Disable colored output (e.g., -nc)
159
+ -ep, --extract-params Extract all parameters to parameters.txt files
160
+ -dd, --dedup Drop exact duplicate URLs before processing
161
+ -ddn, --dedup-normalized
162
+ Drop URLs with identical param sets, ignoring
163
+ order/case/values (e.g., -ddn)
164
+ -uq, --unique-params Keep one URL per param-name set per domain
165
+ -tp, --top INT Keep only the first INT URLs per category per domain
166
+
167
+ VULNERABILITY CATEGORIES:
168
+ -vl, --vuln CATEGORY [CATEGORY ...]
169
+ Vulnerability categories (e.g., -vl sqli xss)
170
+ -pf, --profile PROFILE
171
+ Preset set: web or api (explicit -vl overrides -pf)
172
+
173
+ CUSTOM PARAMETERS:
174
+ -cp, --custom-params PARAM [PARAM ...]
175
+ Custom parameters (comma or space separated,
176
+ e.g., -cp "id,user,cmd" or -cp id user cmd)
177
+ -cpf, --custom-params-file FILE
178
+ File with custom parameters (e.g., -cpf params.txt)
179
+
180
+ FILTERS:
181
+ -ed, --exclude-domain DOMAIN [DOMAIN ...]
182
+ Skip domains (exact or * wildcard, e.g.,
183
+ -ed static.example.com "*.cdn.com")
184
+ -xp, --exclude-param PARAM [PARAM ...]
185
+ Ignore params for matching/extraction
186
+ (e.g., -xp "utm_source,fbclid")
187
+ -cs, --csv-split MODE CSV layout with -f csv: single writes one top-level
188
+ urls.csv (domain,category,url); per-domain writes one
189
+ urls.csv per domain folder (category,url) (default: single)
190
+
191
+ NETWORK:
192
+ -hc, --status-check Keep only live URLs (concurrent probes; 2xx-3xx count
193
+ as live, see -is) (e.g., -hc)
194
+ -m, --method METHOD Live-probe method for -hc: auto is HEAD first with GET
195
+ fallback (fastest), head or get (default: auto)
196
+ -rt, --retries INT Extra attempts per URL when a probe fails with a network
197
+ error, 0-10 (default: 0)
198
+ -is, --include-status CODE [CODE ...]
199
+ Extra HTTP status codes counted as live on top of
200
+ 2xx-3xx (e.g., -is 403 404)
201
+ -lc, --live-cache FILE
202
+ JSON file caching live-check results across runs;
203
+ entries younger than -ct are reused without probing
204
+ (e.g., -lc ~/.parasort/live_cache.json)
205
+ -ct, --cache-ttl SEC Reuse -lc cache entries younger than SEC seconds
206
+ (default: 86400 = 24h)
207
+
208
+ INFORMATION:
209
+ -h, --help Show this help message and exit
210
+ -sc, --show-categories
211
+ List available vulnerability categories
212
+ -lp, --list-params [CATEGORY]
213
+ List parameters of a category (e.g., -lp sqli)
214
+ -V, --version Show version and exit
215
+ -ic, --init-config Create ~/.parasort/parameter_categories.json with built-in
216
+ defaults if missing, print its path, and exit (e.g., -ic)
217
+ -rc, --reset-config Overwrite the config file with built-in defaults,
218
+ discarding customizations, and exit (e.g., -rc)
219
+ -up, --update Update parasort to the latest release via pip
220
+
221
+ EXAMPLES:
222
+ Basic usage:
223
+ parasort -i urls.txt
224
+ parasort -i urls.txt -o results -f json
225
+ cat urls.txt | parasort -o results
226
+
227
+ Specific vulnerabilities / profiles:
228
+ parasort -i urls.txt -o results -vl sqli xss
229
+ parasort -i urls.txt -o results -pf web
230
+
231
+ Custom parameters:
232
+ parasort -i urls.txt -o results -cp "id,user,cmd"
233
+ parasort -i urls.txt -o results -cpf my_params.txt
234
+
235
+ Clean + focus output:
236
+ parasort -i urls.txt -o results -c -dd -uq -tp 20
237
+ parasort -i urls.txt -o results -c -ddn -mx 50000
238
+ parasort -i urls.txt -o results -ed static.example.com "*.cdn.com" -xp "utm_source,fbclid"
239
+
240
+ Machine-readable piping:
241
+ parasort -i urls.txt -o - | nuclei -l /dev/stdin
242
+ parasort -i urls.txt -f jsonl -o results
243
+ parasort -i urls.txt -f csv -cs per-domain
244
+
245
+ Live hosts only:
246
+ parasort -i urls.txt -o results -hc -to 8
247
+ parasort -i urls.txt -o results -hc -m head -rt 2 -is 403 404
248
+ parasort -i urls.txt -o results -hc -lc ~/.parasort/live_cache.json
249
+
250
+ Config:
251
+ parasort -ic
252
+ parasort -rc
253
+
254
+ Advanced options:
255
+ parasort -i urls.txt -o results --clear -v
256
+ ```
257
+
258
+ ## Basic Usage
259
+
260
+ ```bash
261
+ # Show help with all examples
262
+ parasort -h
263
+
264
+ # Show categories / version
265
+ parasort -sc
266
+ parasort -V
267
+
268
+ # Process custom parameters and clearing their values
269
+ parasort -i urls.txt -o results -cp "id,token,api_key,session" -c
270
+
271
+ # Process with specific vulnerabilities only (or a preset profile)
272
+ parasort -i urls.txt -o results -vl sqli xss -v
273
+ parasort -i urls.txt -o results -pf web
274
+
275
+ # Clean duplicates and focus output
276
+ parasort -i urls.txt -o results -dd -uq -tp 20
277
+ parasort -i urls.txt -o results -ddn -mx 50000
278
+
279
+ # Exclude noise, keep machine-readable output
280
+ parasort -i urls.txt -o results -ed "*.cdn.com" -xp "utm_source,fbclid" -f json
281
+
282
+ # Pipe JSONL straight into other tools
283
+ parasort -i urls.txt -o - | nuclei -l /dev/stdin
284
+
285
+ # Live hosts with HEAD-first probing and a persistent cache
286
+ parasort -i urls.txt -o results -hc -m auto -rt 2 -lc ~/.parasort/live_cache.json
287
+
288
+ # Config management
289
+ parasort -ic
290
+ parasort -rc
291
+
292
+ # Silent mode
293
+ parasort -i urls.txt -o results -s
294
+ ```
295
+
296
+ ## Command Line Options
297
+ #### - Input / Output
298
+
299
+ -i, --input FILE - Input file containing URLs (optional if using stdin)
300
+
301
+ -o, --output DIR - Output directory (default: results); use - for stdout JSONL (pipe-friendly)
302
+
303
+ -f, --format FORMAT - Output format: txt, json, csv or jsonl (default: txt)
304
+
305
+ -st, --stdout - Same as -o -: emit JSONL records to stdout; human output goes to stderr (pipe-friendly)
306
+
307
+ -mx, --max-urls INT - Abort with an error if total input (stdin + file) exceeds INT URLs (no limit by default)
308
+
309
+ #### - Processing Options
310
+
311
+ -c, --clear - Clear parameter values, keep names only
312
+
313
+ -v, --verbose - Show detailed processing information
314
+
315
+ -s, --silent - Minimal output (for scripting)
316
+
317
+ -nc, --no-color - Disable colored output
318
+
319
+ -ep, --extract-params - Extract all parameters to parameters.txt files
320
+
321
+ -dd, --dedup - Drop exact duplicate URLs before processing
322
+
323
+ -ddn, --dedup-normalized - Drop URLs sharing (domain, path, param names), ignoring param order, case and values
324
+
325
+ -uq, --unique-params - Keep one URL per param-name set per domain
326
+
327
+ -tp, --top INT - Keep only the first INT URLs per category per domain
328
+
329
+ #### - Vulnerability Categories
330
+
331
+ -vl, --vuln CATEGORY - Vulnerability categories (default: all)
332
+
333
+ Available: all, sqli, xss, ssrf, lfi, open_redirect, command_injection, auth_bypass, business_logic, info_disclosure
334
+ (plus any custom categories added via parameter_categories.json)
335
+
336
+ -pf, --profile PROFILE - Preset set: web or api (explicit -vl overrides -pf)
337
+
338
+ #### - Custom Parameters
339
+
340
+ -cp, --custom-params PARAM - Custom parameters to search for (comma or space separated)
341
+
342
+ -cpf, --custom-params-file FILE - File with custom parameters (one per line)
343
+
344
+ #### - Filters
345
+
346
+ -ed, --exclude-domain DOMAIN - Skip domains (exact or * wildcard, case-insensitive)
347
+
348
+ -xp, --exclude-param PARAM - Ignore params for matching/extraction (comma or space separated)
349
+
350
+ -cs, --csv-split MODE - CSV layout with -f csv: single writes one top-level urls.csv (domain,category,url); per-domain writes one urls.csv per domain folder (category,url) (default: single)
351
+
352
+ #### - Network
353
+
354
+ -hc, --status-check - Keep only live URLs (concurrent probes; 2xx-3xx count as live, see -is)
355
+
356
+ -m, --method METHOD - Live-probe method for -hc: auto is HEAD first with GET fallback (fastest), head or get (default: auto)
357
+
358
+ -rt, --retries INT - Extra attempts per URL when a probe fails with a network error, 0-10 (default: 0)
359
+
360
+ -is, --include-status CODE - Extra HTTP status codes counted as live on top of 2xx-3xx (e.g., -is 403 404)
361
+
362
+ -lc, --live-cache FILE - JSON file caching live-check results across runs; entries younger than -ct are reused without probing
363
+
364
+ -ct, --cache-ttl SEC - Reuse -lc cache entries younger than SEC seconds (default: 86400 = 24h)
365
+
366
+ -to, --timeout SEC - HTTP timeout in seconds for -hc and -up (default: 10)
367
+
368
+ #### - Information
369
+
370
+ -h, --help - Show help message and exit
371
+ -sc, --show-categories - List available vulnerability categories
372
+ -lp, --list-params [CATEGORY] - List parameters of a category (e.g., -lp sqli)
373
+ -V, --version - Show version and exit
374
+ -ic, --init-config - Create ~/.parasort/parameter_categories.json with built-in defaults if missing, print its path, and exit
375
+ -rc, --reset-config - Overwrite the config file with built-in defaults, discarding customizations, and exit
376
+ -up, --update - Update parasort to the latest release via pip
377
+
378
+
379
+ ## Output Structure
380
+
381
+ The tool creates domain-based folders with categorized URL files (txt format):
382
+
383
+ ```bash
384
+ results/
385
+ ├── example.com/
386
+ │ ├── sqli-urls.txt
387
+ │ ├── xss-urls.txt
388
+ │ ├── ssrf-urls.txt
389
+ │ ├── custom-params-urls.txt
390
+ │ ├── parameters.txt
391
+ │ └── uncategorized-urls.txt
392
+ ├── target.org/
393
+ │ ├── sqli-urls.txt
394
+ │ ├── xss-urls.txt
395
+ │ ├── parameters.txt
396
+ │ └── ...
397
+ └── all-parameters.txt
398
+ ```
399
+
400
+ With `-f json`: each domain gets `<domain>.json` (category → URL list) plus a
401
+ top-level `summary.json` with per-domain and total counts.
402
+ With `-f csv`: a single top-level `urls.csv` (`domain,category,url`), or per-domain
403
+ `urls.csv` files (`category,url`) with `--csv-split per-domain`.
404
+ With `-f jsonl`: a single top-level `urls.jsonl` (one `{"domain","category","url"}`
405
+ record per line). With `-o -` / `--stdout`, those JSONL records go to stdout
406
+ (human output goes to stderr) for piping into other tools.
407
+ `parameters.txt` / `all-parameters.txt` (`-ep`) are always plain-text lists
408
+ (skipped in stdout mode).
409
+
410
+ ## Configuration
411
+ #### - Parameter Categories File
412
+
413
+ The parameter_categories.json file is created and located in directory named ".parasort" in the home directory of the user, it defines which parameters belong to each vulnerability category. You can customize this file to add or remove parameters:
414
+
415
+ ```json
416
+ {
417
+ "sqli": ["id", "user_id", "product_id"],
418
+ "xss": ["q", "search", "query"],
419
+ "ssrf": ["url", "redirect", "image"],
420
+ ...
421
+ }
422
+ ```
423
+
424
+ * The file is automatically created on first run if it doesn't exist.
425
+ * The `parameter_categories.json` in this repo is a reference copy of the built-in
426
+ defaults; PyPI wheels rely on the embedded defaults and create `~/.parasort/parameter_categories.json` at runtime.
427
+
428
+
429
+ #### - Adding New Vulnerability Categories
430
+ * Edit parameter_categories.json
431
+ * Add your new category with relevant parameters
432
+ * The tool will automatically detect the new category
433
+
434
+ #### - Using Custom Parameter Files
435
+
436
+ Create a text file with one parameter per line:
437
+
438
+ ```text
439
+ api_key
440
+ session_token
441
+ user_id
442
+ admin
443
+ debug
444
+ ```
445
+
446
+ ### - License
447
+
448
+ ```text
449
+ This project is licensed under the MIT License - see the LICENSE file for details.
450
+ Author
451
+
452
+ Note: This tool is intended for legitimate security testing and educational purposes only. Always ensure you have proper authorization before testing any systems.
453
+ ```
454
+
455
+ ## Changelog
456
+
457
+ See [CHANGELOG.md](CHANGELOG.md) for release history. Current version: **5.1.0**.
458
+