
Filtrer et dédupliquer de grandes listes d'URL en supprimant les extensions statiques, les mots-clés indésirables, les identifiants, les variantes linguistiques et les paramètres, afin de produire des ensembles d'endpoints propres pour la reconnaissance web.
Cet outil sert à désencombrer une liste d'URLs. Comme point de départ, j'ai pris l'incroyable outil uro de Somdev Sangwan. Mais je voulais changer quelques éléments, apporter quelques améliorations (comme gérer les GUID) et le rendre plus personnalisable.
urless prend en charge Python 3.
Installez urless dans l'environnement python par défaut (global).
pip install urless
OU
pip install git+https://github.com/xnl-h4ck3r/urless.git -v
Vous pouvez mettre à jour avec
pip install --upgrade urless
Installation rapide dans un environnement python isolé à l'aide de pipx
pipx install git+https://github.com/xnl-h4ck3r/urless.git
Vous passez en gros une liste d'URLs en entrée (depuis un fichier, ou via un pipe depuis STDIN), et vous obtenez en sortie un fichier ou des URLs désencombrés. Mais de quelle manière sont-ils désencombrés ? Je vais vous expliquer cela ci-dessous, mais d'abord voici quelques termes qui seront utilisés :
-fe, spécifiées avec FILTER_EXTENSIONS dans config.yml, ou si aucune de ces options n'existe, une liste par défaut de .css,.ico,.jpg,.jpeg,.png,.bmp,.svg,.img,.gif,.mp4,.flv,.ogv,.webm,.webp,.mov,.mp3,.m4a,.m4p,.scss,.tif,.tiff,.ttf,.otf,.woff,.woff2,.bmp,.ico,.eot,.htc,.rtf,.swf,.image.-fk, spécifiés avec FILTER_KEYWORDS dans config.yml, ou si aucune de ces options n'existe, une liste par défaut de blog,article,news,bootstrap,jquery,captcha,node_modulesLANGUAGE dans config.yml, ou si elle n'existe pas, une liste par défaut des codes les plus courants en,en-us,en-gb,fr,de,pl,nl,fi,sv,it,es,pt,ru,pt-br,es-mx,zh-tw,js.koVoici ce qui se passe :
-dp/--disregard-params a été passé :
REMOVE_PARAMS (ou remplacés avec l'argument -rp/--remove-params), ils seront supprimés de toutes les URLs avant le traitement.-rcid/--regex-custom-id est passé et que le chemin de l'URL contient un ID personnalisé, une seule correspondance avec la regex d'ID personnalisé sera incluse s'il y a plusieurs URLs où c'est la seule différence.-lang est passé et que l'URL contient un code de langue (par ex. ), un seul des codes de langue sera inclus s'il y a plusieurs URLs où le code de langue est différent.cat target_urls.txt | urless
ou
urless -i target_urls.txt
cat target_urls.txt | urless > output.txt
ou
urless -i target_urls.txt -o output.txt
Le fichier config.yml contient les clés qui peuvent être modifiées selon vos besoins :
FILTER_KEYWORDS - Une liste de mots-clés séparés par des virgules (par ex. blog,article,news, etc.) à laquelle les URLs sont comparées dans certaines circonstances.FILTER_EXTENSIONS - Une liste d'extensions de fichiers séparées par des virgules (par ex. .css,.jpg,.jpeg, etc.) à laquelle toutes les URLs sont comparées. Si une URL inclut l'une de ces chaînes, elle sera exclue de la sortie.LANGUAGE - Une liste de codes de langue séparés par des virgules (par ex. en-gb,fr,nl, etc.) à laquelle toutes les URLs sont comparées lorsque l'argument -lang est passé. S'il y a plusieurs URLs avec des codes de langue différents, une seule version de l'URL sera produite en sortie.REMOVE_PARAMS - Une liste de noms de paramètres sensibles à la casse séparés par des virgules (par ex. cachebuster,cacheBuster) qui seront supprimés de toutes les URLs avant le traitement.Il existe actuellement des vérifications regex automatiques pour détecter un identifiant global unique (GUID) et un ID entier dans une partie du chemin, mais l'argument -rcid / --regex-custom-id vous permet de fournir une expression régulière pour identifier un ID personnalisé. Par exemple, si une cible a un format d'ID spécifique (qui n'est ni un GUID ni un entier), vous pouvez spécifier une expression regex correspondante, et alors un seul d'entre eux sera renvoyé en sortie si le reste de l'URL est identique. Par exemple :
U-65241Xhttps://target.com/blah/U-61723A/settings
https://target.com/blah/U-63352B/settings
https://target.com/blah/U-61351A/profile
https://target.com/blah/U-61723A/settings
https://target.com/blah/U-64135C/profile
urless et passer -rcid 'U-[0-9]{5}[A-Z]', alors la sortie serait :
https://target.com/blah/U-61723A/settings
https://target.com/blah/U-64135C/profile
NOTES IMPORTANTES SUR LES REGEX :
-rcid.[^(\?|\/|#|$)]* à la fin de votre regex, ce qui signifiera TOUS les autres caractères jusqu'à la fin de la partie du chemin.^ au début et $ à la fin de votre regex pour vous assurer qu'elle représente toute la partie d'un chemin entre les barres obliques. Cependant, ces caractères seront ajoutés automatiquement si vous les omettez.cat input.txt | grep -E 'U-[0-9]{5}[A-Z]' par exemple, et vérifier si votre expression semble correcte (elle ne doit mettre en évidence que ce qui vous intéresse, et couvrir toute la partie du chemin qui correspond à l'ID personnalisé).https://target.com/blah/xnl/settings où est un nom d'utilisateur, vous ne pourrez pas créer de regex pour le nom d'utilisateur car ce n'est pas un format suffisamment unique pour le distinguer des autres valeurs de chemin possibles.Si vous rencontrez le moindre problème, ou si vous avez des idées d'amélioration, n'hésitez pas à ouvrir une issue sur Github. S'il y a un problème, il sera utile de fournir la commande exacte que vous avez exécutée ainsi qu'une description détaillée du problème. Si possible, exécutez avec -v pour reproduire le problème et signalez-moi les éventuels messages d'erreur affichés.
Aucun - n'hésitez pas à ouvrir une issue Github pour suggérer des améliorations.
Bonne chance et bonne chasse ! Si vous aimez vraiment l'outil (ou tout autre), ou s'ils vous ont aidé à trouver une superbe prime (bounty), pensez à M'OFFRIR UN CAFÉ ! ☕ (J'ai bien besoin de caféine !)
🤘 /XNL-h4ck3r
| Argument | Long Argument | Description |
|---|
| -i | --input | Un fichier d'URLs à désencombrer. |
| -o | --output | Le fichier de sortie qui contiendra la liste désencombrée d'URLs (par défaut : output.txt). Si la sortie est redirigée vers un autre programme, elle sera écrite sur STDOUT à la place. |
| -fk | --filter-keywords | Une liste de mots-clés séparés par des virgules pour exclure des liens (s'il n'y a pas de paramètres). Cela remplacera la liste FILTER_KEYWORDS spécifiée dans config.yml |
| -fe | --filter-extensions | Une liste d'extensions de fichiers séparées par des virgules à exclure. Cela remplacera la liste FILTER_EXTENSIONS spécifiée dans config.yml |
| -rp | --remove-params | Une liste de paramètres sensibles à la casse séparés par des virgules à supprimer de TOUTES les URLs. Cela remplacera la liste REMOVE_PARAMS spécifiée dans config.yml. Cela peut être utile pour supprimer les paramètres anti-cache (cache buster) par exemple.** |
| -ks | --keep-slash | Une barre oblique finale à la fin d'une URL en entrée ne sera pas supprimée. Par conséquent, des URLs identiques peuvent être produites en sortie, l'une avec et l'autre sans barre oblique finale. |
| -khw | --keep-human-written | Par défaut, toute URL dont une partie du chemin contient plus de 3 tirets (-) est supprimée, car on suppose qu'il s'agit de contenu rédigé par un humain (par ex. un article de blog) et qu'il n'est pas intéressant. Passer cet argument les conservera en sortie. |
| -kym | --keep-yyyymm | Par défaut, toute URL dont le chemin contient /YYYY/MM (où YYYY est une année et MM un mois) est supprimée, car on suppose qu'il s'agit de contenu de blog ou d'actualités, et qu'il n'est pas intéressant. Passer cet argument les conservera en sortie. |
| -rcid | --regex-custom-id | UTILISER AVEC PRUDENCE ! Regex pour un ID personnalisé que votre cible utilise. Assurez-vous que la valeur est passée entre guillemets. Voir la section ci-dessous pour plus de détails à ce sujet. |
| -iq | --ignore-querystring | Supprime la chaîne de requête (y compris les fragments d'URL #) afin que la sortie ne contienne que des chemins uniques. |
| -fnp | --fragment-not-param | Ne traite pas les fragments d'URL # de la même manière que les paramètres, par ex. si un lien contient un mot-clé de filtrage et un fragment (ou paramètre), le lien est généralement conservé, mais si cet argument est passé et qu'un lien contient un mot de filtrage et un fragment, le lien sera supprimé. De plus, si cet argument est passé et que -iq / --ignore-querystring est utilisé, le fragment ne sera PAS supprimé des liens si aucun paramètre de requête n'est présent dans le lien. |
| -lang | --language | Si cet argument est passé et qu'il y a plusieurs URLs avec des codes de langue différents dans le chemin, une seule version de l'URL sera produite en sortie. Les codes sont spécifiés dans la section LANGUAGE de config.yml. |
| -c | --config | Chemin vers le fichier de configuration YML. S'il n'est pas passé, l'outil cherche le fichier config.yml dans le répertoire de configuration par défaut, par ex. ~/.config/urless/. |
| -dp | --disregard-params | Certains filtrages ne sont pas effectués si les URLs ont des paramètres, car par défaut nous voulons voir tous les paramètres possibles. Si cet argument est passé, le filtrage sera effectué, indépendamment de l'existence de paramètres. |
| -nb | --no-banner | Masque la bannière de l'outil (elle est masquée par défaut si vous redirigez l'entrée vers urless) en sortie. |
| --version | Affiche le numéro de version actuel. | |
| -v | --verbose | Sortie détaillée (verbose) |
-), MAIS ce n'est pas un GUID. Cela implique un contenu rédigé par un humain, par ex. how-to-hack-the-planet. Si l'argument -khw est passé, cela ne sera pas supprimé./YYYY/MM/ , par ex. une année, un mois . Il s'agit généralement de contenu statique comme un blog. Si l'argument -kym est passé, cela ne sera pas supprimé.en-gb#) ET l'argument -dp/--disregard-params n'a PAS été passé :
xnl