Référence
Modules — cible en ligne (cyberlens scan)
| Module | Type | Contrôles |
|---|---|---|
| recon | passif | Enregistrements DNS, IP résolue, bannière serveur |
| headers | passif | Présence CSP/HSTS/Permissions-Policy/COOP/COEP/CORP/X-Content-Type-Options, protection anti-clickjacking, flags de cookies (HttpOnly/Secure/SameSite), Cache-Control: no-store sur les réponses porteuses de session, mauvaise configuration CORS, X-Powered-By, X-XSS-Protection obsolète |
| tls | passif | Version du protocole, suite de chiffrement faible (best-effort), expiration du certificat, détection HTTP en clair |
| discovery | passif | Chemins sensibles courants (/docs, /swagger, /.env, /.git/config, /admin, source maps, lockfiles de dépendances, …), détection de listing de répertoire, analyse de schéma OpenAPI/Swagger, introspection GraphQL, méthode HTTP TRACE, méthodes dangereuses (PUT/DELETE/CONNECT) annoncées via OPTIONS, divulgation de chemins internes dans robots.txt |
| dns_hardening | passif | Présence DNSSEC (enregistrement DNSKEY), exposition au transfert de zone AXFR sur chaque serveur de noms, énumération de sous-domaines courants |
| jwt | passif | Acceptation de JWT alg:none / secret faible, sondage du rate-limit sur les endpoints d'authentification |
| secrets | passif | Motifs de secrets connus (Stripe/AWS/Google/GitHub/Firebase/Slack) fuités dans les réponses, traces de pile, divulgation de routes internes dans les messages d'erreur |
| websocket | passif | Handshake Socket.IO sans authentification, wildcard CORS, divulgation de version du script client |
| storage | passif navigateur | localStorage/sessionStorage contenant des jetons ou secrets, cookies de session lisibles via document.cookie, contenu mixte — nécessite Playwright |
| crawler | navigateur | Restitue chaque page dans un vrai navigateur (Chromium headless), suit les liens de même origine (25 pages max, profondeur 3) pour découvrir pages et formulaires réels, comme un humain qui navigue — voit aussi le contenu rendu en JavaScript (SPA React/Vue) et observe les vraies requêtes GET XHR/fetch (alimente idor) ; re-parcourt automatiquement après une connexion --auth-username réussie |
| clickjacking | navigateur | Intègre activement la cible dans une vraie iframe et confirme si elle s'affiche, plutôt que de vérifier uniquement la présence d'en-têtes — nécessite Playwright |
| xss | actif navigateur | Injecte une charge script dans chaque paramètre GET / champ de formulaire GET découvert et confirme l'exécution réelle dans un vrai navigateur (pas seulement une réflexion de chaîne) — nécessite Playwright |
| sqli | actif | Injection SQL basée sur l'erreur et aveugle booléenne (réponse différentielle) sur les entrées GET toujours, les champs de formulaire POST avec --active-forms |
| ssti | actif | Injection de template côté serveur (SSTI) — charges d'évaluation arithmétique (variantes Jinja2/Twig/Freemarker/ERB) sur les entrées GET toujours, formulaires POST avec --active-forms |
| command_injection | actif | Injection de commande OS via des charges de métacaractères shell avec marqueurs de sortie détectables, entrées GET toujours, formulaires POST avec --active-forms |
| nosql_injection | actif | Injection d'opérateur style MongoDB ($ne, $gt, …) — basée sur l'erreur et aveugle booléenne, entrées GET toujours, formulaires POST avec --active-forms |
| ldap_injection | actif | Injection de filtre LDAP via charges de métacaractères et détection de signature d'erreur, entrées GET toujours, formulaires POST avec --active-forms |
| xxe | actif | Injection d'entité externe XML (XXE) contre les endpoints/formulaires acceptant du XML, via une charge de lecture de fichier local sûre (hors bande) |
| sri | passif | Attribut Subresource Integrity (integrity) manquant sur les balises <script>/<link rel=stylesheet> hébergées en externe, sur les pages découvertes par le crawler |
| csrf | passif | Signale les formulaires POST découverts sans champ ressemblant à un jeton anti-CSRF — passif, ne soumet jamais rien |
| email_security | passif | Enregistrement SPF présent/pas trop permissif (+all), DMARC présent et appliqué (pas p=none), vérification DKIM best-effort sur des noms de sélecteur courants |
| waf | passif | Détecte un WAF/CDN devant la cible via des signatures d'en-têtes/cookies (Cloudflare, Akamai, Sucuri, Imperva, Fastly, …) plus une sonde active — informationnel, pas une vulnérabilité en soi |
| infra_exposure | actif | Services d'infrastructure/admin exposés couramment accessibles depuis l'hôte cible (Elasticsearch, Kibana, Grafana, Prometheus, RabbitMQ, Docker API, Kubernetes Dashboard, MinIO, Jenkins), plus de vraies tentatives d'authentification par identifiants par défaut contre Redis, MySQL et PostgreSQL |
| param_fuzzing | actif | Tests de validation d'entrée aux limites (CWE-20) : valeurs vides, 5000 caractères, négatives, dépassement d'entier, octet nul, unicode/contrôle sur chaque paramètre GET/champ de formulaire découvert |
| account_creation | actif navigateur | Tente une seule vraie inscription via un formulaire d'inscription découvert, en remplissant réellement les champs et en cliquant sur le contrôle de soumission dans un vrai navigateur — nécessite --active-forms ; l'email soumis utilise toujours le domaine example.com (RFC 2606, ne délivre jamais de vrai courrier) |
| idor | actif auth requise | Nouveau. Contrôle d'accès défaillant / IDOR : pour chaque endpoint API observé avec un identifiant numérique (via de vraies requêtes GET XHR/fetch capturées pendant le crawl authentifié — pas les URL de page elles-mêmes, souvent inutiles à tester directement sur une SPA), vérifie si substituer un identifiant voisin retourne une réponse distincte et valide avec la même session authentifiée (CWE-639), et si le même endpoint est accessible sans aucune session (CWE-306) — nécessite --auth-username ; uniquement GET, ne nécessite donc pas --active-forms |
Référence
Modules — projet local (cyberlens scan-local)
| Module | Contrôles |
|---|---|
| local_secrets | Secrets codés en dur dans les fichiers source, avec la même liste de motifs que secrets/storage |
| env_exposure | Un fichier de type .env présent à la racine du projet mais non exclu par .gitignore |
| dangerous_js | eval(), new Function(), affectation directe innerHTML, dangerouslySetInnerHTML, document.write(), et child_process.exec()/execSync() dans le code JS/TS/JSX/TSX/Vue |
| local_sri | Même vérification SRI manquante que sri, mais sur des fichiers HTML locaux — aucun réseau |
| dependencies | Analyse package-lock.json/requirements.txt/Pipfile.lock/composer.lock et vérifie chaque version de paquet contre la base de données publique d'avis OSV.dev — le seul trafic réseau envoyé par un scanner local, et uniquement des métadonnées publiques de paquets, jamais votre code |
Référence
Comportements & limites
Test multi-navigateur
storage/clickjacking/xss exécutent leurs contrôles sur chaque moteur Playwright installé (Chromium/Firefox/WebKit), pas seulement un. Une protection appliquée par un seul moteur — clickjacking bloqué sur Chromium mais pas Firefox, par exemple — est un constat réel et distinct qu'un scan mono-moteur manquerait. Seul Chromium est requis ; les moteurs non installés sont ignorés.
Captures d'écran comme preuve
Quand un contrôle basé navigateur confirme un constat (exécution XSS, embarquement clickjacking réussi), une capture d'écran PNG est intégrée directement dans le rapport PDF/HTML comme preuve visuelle, en plus de la preuve textuelle habituelle.
Listing complet des endpoints/formulaires
La section « Endpoints découverts » du rapport liste chaque chemin/URL confirmé accessible et chaque formulaire trouvé (page, action, méthode, champs) dans son intégralité — pas un résumé tronqué.
Frontière de sécurité — GET toujours testé, POST nécessite --active-forms
Les requêtes GET sont conventionnellement sans effet de bord selon la sémantique HTTP, donc xss, sqli, ssti, command_injection, nosql_injection, ldap_injection, param_fuzzing et idor testent toujours les paramètres/entrées GET. Les formulaires POST découverts par le crawler sont listés (méthode, action, champs) mais jamais soumis sans --active-forms — cela pourrait déclencher de vraies actions (changements de compte, paiements, suppressions) sur une cible réelle. L'activer affiche un avertissement distinct et nécessite sa propre confirmation.
Hors périmètre pour l'instant
Sondage mass-assignment et injection aveugle basée sur le temps (SQLi/commande/LDAP) — volontairement omis car trop bruyants/lents pour un scan automatisé. Candidats naturels pour un futur module.
Référence
Options de la CLI
cyberlens scan TARGET
| Option | Description |
|---|---|
| -o, --output | Chemin du rapport de sortie (défaut : report.pdf) |
| -f, --format | pdf, html ou json |
| -m, --modules | Liste de modules séparés par des virgules (défaut : tous) |
| --full | Tous les modules avec tests actifs sur formulaires activés (équivaut à omettre --modules et passer --active-forms) |
| --timeout | Timeout par requête en secondes (défaut : 10) |
| --confirm-authorized | Confirme l'autorisation sans invite interactive |
| --active-forms | Soumet activement les formulaires POST découverts pour tester les injections |
| --confirm-active-forms | Confirme les soumissions POST réelles sans invite interactive |
| --ai-summary / --no-ai-summary | Active/désactive le résumé exécutif généré par IA (actif par défaut) |
| -l, --language | Langue du rapport : en (défaut) ou fr |
| --auth-username | Se connecte comme cet utilisateur avant le reste du scan (mot de passe via CYBERLENS_AUTH_PASSWORD ou invite masquée) — alimente aussi le module idor |
cyberlens scan-local PATH
| Option | Description |
|---|---|
| -o, --output | Chemin du rapport de sortie |
| -f, --format | pdf, html ou json |
| -m, --modules | Liste de modules locaux séparés par des virgules |
| --ai-summary / --no-ai-summary | Active/désactive le résumé exécutif généré par IA |
| -l, --language | Langue du rapport |
Autres commandes
| Commande | Description |
|---|---|
| cyberlens install-browsers | Télécharge un ou plusieurs moteurs Playwright (Chromium/Firefox/WebKit) |
| cyberlens inspect URL | Restitue une URL comme le crawler et enregistre HTML + capture d'écran — outil de débogage |