Indice dei contenuti dell'articolo:
Chiunque si occupi di sistemistica e sicurezza lo sa: una pagina phpinfo() dimenticata su un server di produzione è uno dei regali più graditi che possiamo fare a un attaccante. È informazione pura, servita su un piatto d’argento, che racconta praticamente tutto della nostra infrastruttura. In questo articolo vogliamo ribaltare la prospettiva: invece di limitarci a nasconderla, e se la usassimo come esca? È esattamente l’idea alla base di FakePHPInfo, un piccolo wrapper PHP che abbiamo sviluppato e che vogliamo condividere con voi.
Lo si può scaricare su GitHub ed è composto da un unico file phpinfo.php https://github.com/MarcoMarcoaldi/fakephpinfo
Perché phpinfo() è una miniera d’oro per chi attacca
Quando un attaccante effettua la fase di reconnaissance contro un bersaglio, una pagina phpinfo() raggiungibile pubblicamente gli consegna informazioni di valore enorme. Tra le più critiche:
- L’indirizzo IP reale del server (la variabile
SERVER_ADDR). Questo è particolarmente prezioso quando il sito è protetto da una CDN o da un WAF come Cloudflare: conoscere l’IP di origine permette di scavalcare completamente la protezione e colpire il server in modo diretto. - L’hostname reale della macchina, utile per il movimento laterale e per l’enumerazione DNS dell’infrastruttura.
- I percorsi assoluti del filesystem (
DOCUMENT_ROOT,include_path, posizione dei log), preziosi per costruire payload e LFI mirati. - L’elenco completo delle estensioni caricate e delle direttive di configurazione, da cui dedurre versioni vulnerabili e funzioni pericolose abilitate.
La regola aurea, ovviamente, resta una sola: non esporre mai phpinfo() in produzione. Ma se invece di limitarci a rimuoverla potessimo girare l’arma contro chi ci attacca?
L’idea: deception invece di semplice rimozione
Il concetto di deception (inganno) è uno dei pilastri della difesa attiva moderna. Anziché chiudere semplicemente una porta, gli costruiamo dietro una stanza finta, plausibile e sorvegliata. Un attaccante che trova una pagina phpinfo() apparentemente reale la considererà autentica e agirà di conseguenza: salverà l’IP, lo userà per i suoi tentativi di bypass, lo darà in pasto ai suoi tool automatici.
E se quell’IP e quell’hostname puntassero a un honeypot? A quel punto avremmo ottenuto quattro risultati in un colpo solo:
- Deviare l’attaccante lontano dall’infrastruttura reale.
- Attirarlo dentro un sistema-esca monitorato, dove studiare con calma le sue tecniche e i suoi strumenti.
- Fargli sprecare tempo e risorse contro un bersaglio finto.
- Raccogliere threat intelligence: IP di provenienza, user agent, pattern di attacco.
Come funziona FakePHPInfo
Il funzionamento è elegante nella sua semplicità. Lo script genera una pagina phpinfo() identica all’originale in ogni dettaglio, con un’unica differenza: tutte le occorrenze dell’hostname e degli indirizzi IP reali vengono sostituite con valori fittizi che puntano al nostro honeypot. Tutto il resto — versione di PHP, moduli, percorsi, direttive — rimane assolutamente autentico, così la pagina non desta il minimo sospetto.
Il primo passo è catturare l’output reale di phpinfo() tramite l’output buffering di PHP, per poterlo manipolare prima di inviarlo al browser:
ob_start(); phpinfo(); $output = ob_get_clean();
Successivamente lo script rileva in automatico tutti i valori identificativi reali del server, attingendo a più fonti per non lasciare nulla al caso:
$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);
A questo punto viene costruita una mappa di sostituzioni nella forma valore reale → valore fittizio. Qui c’è un dettaglio tecnico importante: l’ordine conta. Le stringhe più lunghe e specifiche devono essere sostituite per prime. Pensate all’indirizzo IPv6 mappato ::ffff:1.2.3.4: se sostituissimo prima il semplice 1.2.3.4, corromperemmo la rappresentazione IPv6. Per questo lo script ordina le sostituzioni per lunghezza decrescente:
// 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 pagina modificata viene infine inviata al browser. Per l’attaccante è in tutto e per tutto una phpinfo() reale; in realtà ogni riferimento all’infrastruttura è stato dirottato.
Cosa viene sostituito e cosa resta autentico
La filosofia è quella di toccare il minimo indispensabile per mantenere la massima credibilità. Vengono sostituiti:
- La riga “System” in cima alla pagina (l’hostname del kernel).
$_SERVER['SERVER_ADDR']— l’IP del server.$_SERVER['SERVER_NAME']— il nome del virtual host.$_SERVER['HTTP_HOST']— il valore dell’header Host.- Qualsiasi altra occorrenza dell’hostname o dell’IP reale nel resto dell’output, compreso l’hostname FQDN restituito da
php_uname('n'), che può differire dagethostname().
Resta invece perfettamente reale tutto il resto: versione e build di PHP, estensioni caricate e relativa configurazione, direttive del php.ini (valori locali e master), percorsi del filesystem, variabili d’ambiente e header della richiesta. È proprio questa autenticità di contorno a rendere l’inganno convincente.
Configurazione e installazione
La configurazione si riduce a poche righe in cima al file. Basta inserire i valori del proprio 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;
Una breve guida ai parametri:
- $fake_hostname: l’hostname (FQDN) del vostro honeypot, che sostituirà quello reale.
- $fake_ip: l’indirizzo IPv4 dell’honeypot.
- $fake_ipv6: la rappresentazione IPv6-mapped dell’IP fittizio, normalmente
::ffff:seguito da$fake_ip. - $fake_port: una porta fittizia opzionale. Il consiglio è di lasciarla a
null: cambiare la porta visibile rischia spesso di apparire più sospetto che utile.
Per il deployment è sufficiente caricare il file sul web server con il nome phpinfo.php (o qualsiasi altro nome) in una posizione in cui un attaccante probabilmente andrà a curiosare: la web root, oppure percorsi “ghiotti” come /info/ o /debug/.
Un approccio ancora più raffinato consiste nel servire la pagina in modo condizionale: tramite .htaccess o la configurazione del web server si può fare in modo che gli IP non in whitelist ricevano la versione fittizia, mentre il vostro team — connesso dagli IP autorizzati — veda all’occorrenza la phpinfo() reale.
Considerazioni di sicurezza
Vale la pena di essere onesti sui limiti dello strumento, perché la deception è un’arma che va maneggiata con consapevolezza:
- FakePHPInfo è un ausilio di inganno e threat intelligence, non un sostituto dell’hardening. La misura più efficace in assoluto resta non esporre affatto
phpinfo(). Usatelo solo come esca intenzionale e monitorata. - Tutti i dati non identificativi (versione di PHP, estensioni, percorsi, direttive) restano reali e vengono comunque divulgati. Assicuratevi che questo sia accettabile nel vostro modello di minaccia.
- La sostituzione è una semplice operazione su stringhe: se il vostro hostname reale è una sottostringa molto corta o comune, verificate l’output per accertarvi che non vengano alterati per errore frammenti di testo non correlati.
Conclusioni
FakePHPInfo nasce da un principio che ci sta a cuore: in sicurezza non bisogna pensare solo in difesa, ma anche in contrattacco intelligente. Una pagina che normalmente è una vulnerabilità può diventare, con poche righe di codice, uno strumento di raccolta informazioni e una trappola che fa perdere tempo e risorse a chi prova a colpirci. È deception applicata nel modo più semplice ed economico possibile.
Lo strumento è rilasciato sotto licenza GNU GPL v2 (o successiva) ed è liberamente utilizzabile e modificabile. Vi invitiamo a integrarlo nella vostra strategia di difesa attiva e, perché no, a contribuire con miglioramenti. Perché il modo migliore per proteggere un’infrastruttura, a volte, è far credere all’avversario di averla già trovata.