Table des matières de l'article :
Quiconque s'intéresse aux systèmes et à la sécurité le sait : une page phpinfo() Oublier des informations sur un serveur de production est l'un des cadeaux les plus précieux que l'on puisse faire à un attaquant. C'est une mine d'informations, servie sur un plateau d'argent, qui nous révèle pratiquement tout sur notre infrastructure. Dans cet article, nous voulons inverser la tendance : au lieu de simplement les dissimuler, que diriez-vous de les utiliser comme… appâtC'est exactement l'idée. FakePHPInfo, un petit wrapper PHP que nous avons développé et que nous souhaitons partager avec vous.
Il peut être téléchargé sur GitHub et se compose d'un seul fichier phpinfo.php : https://github.com/MarcoMarcoaldi/fakephpinfo
Pourquoi phpinfo() est une mine d'or pour les attaquants
Lorsqu'un attaquant exécute la phase de reconnaissance contre une cible, une page phpinfo() L'accès public à ces informations leur fournit une mine d'informations précieuses. Parmi les plus importantes :
- L'adresse IP réelle du serveur (la variable
SERVER_ADDRCeci est particulièrement précieux lorsque le site est protégé par un CDN ou un WAF comme Cloudflare : connaître l’adresse IP d’origine permet de contourner complètement la protection et d’attaquer directement le serveur. - Le nom d'hôte réel de la machine, utile pour les déplacements latéraux et l'énumération DNS de l'infrastructure.
- Les itinéraires absolus du système de fichiers (
DOCUMENT_ROOT,include_path, emplacement du journal), précieux pour la construction de charges utiles ciblées et de LFI. - La liste complète des extensions téléchargées et directives de configuration, à partir desquels déduire les versions vulnérables et les fonctions dangereuses activées.
La règle d'or, évidemment, reste la même : ne jamais exposer phpinfo() en productionEt si, au lieu de simplement la retirer, nous pouvions retourner cette arme contre ceux qui nous attaquent ?
L'idée : la tromperie plutôt que la simple suppression
Le concept de tromperie La tromperie est l'un des piliers de la défense active moderne. Au lieu de simplement fermer une porte, on construit derrière elle une pièce factice, plausible et gardée. Un attaquant qui trouve une page phpinfo() Si elle paraît réelle, le système la considérera comme authentique et agira en conséquence : il enregistrera l’adresse IP, l’utilisera pour ses tentatives de contournement et l’intégrera à ses outils automatiques.
Et si cette adresse IP et ce nom d'hôte pointaient vers un pot de miel ? Nous obtiendrions alors quatre résultats simultanément :
- Dévier l'attaquant loin de l'infrastructure réelle.
- Attirez-le à l'intérieur d'un système de leurres surveillé, où il peut étudier calmement ses techniques et ses outils.
- Faites-le gaspiller du temps et des ressources contre une cible factice.
- Recueillir des renseignements sur les menacesAdresse IP, agent utilisateur, schéma d'attaque.
Comment fonctionne FakePHPInfo
L'opération est élégante dans sa simplicité. Le script génère une page phpinfo() Identique à l'original en tous points.À une différence près : toutes les occurrences du nom d’hôte et de l’adresse IP réels sont remplacées par des valeurs factices pointant vers notre honeypot. Tout le reste (version PHP, modules, chemins, directives) demeure parfaitement authentique, de sorte que la page ne suscite pas le moindre soupçon.
La première étape consiste à capturer la sortie réelle de phpinfo() en utilisant la mise en mémoire tampon de la sortie PHP, vous pouvez la manipuler avant de l'envoyer au navigateur :
ob_start(); phpinfo(); $output = ob_get_clean();
Le script détecte ensuite automatiquement toutes les véritables valeurs d'identification du serveur, en puisant dans de multiples sources afin de ne rien laisser au hasard :
$real_hostname = gethostname();
$real_ip = $_SERVER['SERVER_ADDR'] ?? gethostbyname($real_hostname);
$real_ipv6 = '::ffff:' . $real_ip;
$real_server_name = $_SERVER['SERVER_NAME'] ?? $real_hostname;
$real_http_host = $_SERVER['HTTP_HOST'] ?? $real_hostname;
// Rimuove l'eventuale porta dall'HTTP_HOST prima della sostituzione
$real_http_host_no_port = preg_replace('/:\d+$/', '', $real_http_host);
À ce stade, une carte de substitution est construite sous la forme suivante : valeur réelle → valeur fictiveUn détail technique important : l’ordre compte. Les chaînes les plus longues et les plus spécifiques doivent être remplacées en premier. Pensez à l’adresse IPv6 mappée. ::ffff:1.2.3.4: si nous remplacions d'abord le simple 1.2.3.4, nous corromprions la représentation IPv6. Par conséquent, le script trie les substitutions par longueur décroissante :
// Ordina le chiavi per lunghezza decrescente: prima le stringhe più lunghe
uksort($replacements, function ($a, $b) {
return strlen($b) - strlen($a);
});
$output = str_replace(
array_keys($replacements),
array_values($replacements),
$output
);
echo $output;
La page modifiée est ensuite envoyée au navigateur. Pour l'attaquant, il s'agit d'une escroquerie pure et simple. phpinfo() Réel ; en fait, toute référence à l'infrastructure a été détournée.
Qu'est-ce qui est remplacé et qu'est-ce qui reste authentique ?
La philosophie consiste à se concentrer sur l'essentiel pour préserver une crédibilité maximale. Les éléments suivants sont remplacés :
- La ligne "Système" en haut de la page (le nom d'hôte du noyau).
$_SERVER['SERVER_ADDR']— l'adresse IP du serveur.$_SERVER['SERVER_NAME']— le nom de l'hôte virtuel.$_SERVER['HTTP_HOST']— la valeur de l'en-tête Host.- Toute autre occurrence du nom d'hôte ou de l'adresse IP réelle dans le reste de la sortie, y compris le nom d'hôte FQDN renvoyé par
php_uname('n'), qui peut différer degethostname().
Au contraire, il reste parfaitement réel Tout le reste : version et build de PHP, extensions chargées et leur configuration, directives php.ini (Valeurs locales et maîtres), chemins du système de fichiers, variables d'environnement et en-têtes de requêtes. C'est précisément cette authenticité sous-jacente qui rend la supercherie convaincante.
Configuration et installation
La configuration se résume à quelques lignes en haut du fichier. Il suffit d'entrer les valeurs pour votre honeypot :
// === CONFIGURAZIONE: inserisci qui i valori fittizi (honeypot) === $fake_hostname = 'honeypot.example.com'; $fake_ip = '192.168.100.50'; $fake_ipv6 = '::ffff:192.168.100.50'; // Opzionale: porta fittizia (lascia null per mantenere quella reale) $fake_port = null;
Guide rapide des paramètres :
- $faux_nom_d'hôte: le nom d'hôte (FQDN) de votre pot de miel, qui remplacera le vrai.
- $fausse_ip: l'adresse IPv4 du pot de miel.
- $fausse_ipv6: la représentation mappée IPv6 de l'adresse IP fictive, normalement
::ffff:suivi par$fake_ip. - $faux_port: une porte factice optionnelle. Il est recommandé de la laisser ouverte.
nullChanger le port visible risque souvent de paraître plus suspect qu'utile.
Pour le déploiement, il suffit de télécharger le fichier sur le serveur web en utilisant le nom phpinfo.php (ou tout autre nom) dans un emplacement où un attaquant est susceptible d'espionner : la racine du Web, ou des chemins « appâts » comme /info/ o /debug/.
Une approche encore plus raffinée consiste à afficher la page de manière conditionnelle: par .htaccess ou bien la configuration du serveur web peut être effectuée de manière à ce que les adresses IP non autorisées reçoivent la version factice, tandis que votre équipe — connectée à partir d'adresses IP autorisées — voit la version factice en cas de besoin. phpinfo() réel.
Considérations de sécurité
Il est important d'être honnête quant aux limites de cet outil, car la tromperie est une arme qui doit être maniée avec discernement :
- FakePHPInfo est un aide à la désinformation et renseignement sur les menacesCela ne remplace pas le durcissement. La mesure la plus efficace reste de ne pas exposer du tout.
phpinfo()À utiliser uniquement comme appât intentionnel et surveillé. - Toutes les données non identifiantes (version PHP, extensions, chemins, directives) restent Reali et ces informations sont toujours divulguées. Assurez-vous que cela soit acceptable dans votre modèle de menaces.
- La substitution est une simple opération sur les chaînes de caractères : si votre nom d’hôte réel est une sous-chaîne très courte ou courante, vérifiez le résultat pour vous assurer qu’aucun fragment de texte sans rapport n’est modifié accidentellement.
Conclusions
FakePHPInfo est né d'un principe qui nous est cher : la sécurité exige non seulement de la défense, mais aussi une contre-attaque intelligente . Une page présentant une vulnérabilité peut, en quelques lignes de code seulement, devenir un outil de collecte d'informations et un piège qui fait perdre du temps et des ressources à ceux qui tentent de nous attaquer. C'est une forme de tromperie appliquée de la manière la plus simple et la plus économique qui soit.
Cet outil est distribué sous licence GNU GPL v2 (ou ultérieure) et son utilisation et sa modification sont libres. Nous vous encourageons à l'intégrer à votre stratégie de défense active et, pourquoi pas, à contribuer à son amélioration. Car, parfois, la meilleure façon de protéger une infrastructure est de faire croire à l'adversaire qu'il l'a déjà découverte.