Using phpinfo() in Production Environments for Debugging
Developers call phpinfo() in production applications for quick diagnostics when troubleshooting issues, creating information disclosure vulnerabilities that expose sensitive system details. Common patterns include debug query parameters: if ($_GET['debug']) { phpinfo(); } allowing anyone knowing the parameter name to view system information, conditional debugging based on IP address: if ($_SERVER['REMOTE_ADDR'] === '10.0.0.1') { phpinfo(); } which becomes exposed when IP validation bypassed or internal networks compromised, and error handlers calling phpinfo() on exceptions: catch (Exception $e) { phpinfo(); echo $e; } displaying full configuration during errors. The phpinfo() output reveals extensive sensitive information: PHP version and configuration (php.ini settings including disabled functions, memory limits, file upload settings), server software versions (Apache/Nginx version, OpenSSL version, operating system details), loaded PHP extensions and their versions identifying potential vulnerable dependencies, environment variables containing API keys, database credentials, AWS access keys, file system paths revealing directory structure and application layout useful for path traversal attacks, database connection details (hostnames, usernames, potentially passwords if stored in environment), session configuration (cookie settings, session save paths, session handlers), mail server configuration (SMTP credentials), and security settings (allow_url_fopen, allow_url_include, disable_functions, open_basedir). Attackers exploit this information: identifying PHP version-specific vulnerabilities (CVEs for specific PHP versions), discovering disabled_functions lists to determine available functions for exploitation, finding upload_tmp_dir or session.save_path for temporary file attacks, extracting credentials from environment variables, mapping internal network topology from server details, and identifying security weaknesses like missing security extensions (Suhosin) or weak configurations (register_globals enabled in legacy systems).