2019年,洞利某安全团队在扫描公网资产时发现,洞利超过7万台服务器直接暴露了phpinfo()页面。洞利这不是洞利什么冷门漏洞,但它泄露的洞利信息量足以让攻击者笑出声——绝对路径、PHP版本、洞利已加载模块、洞利环境变量、洞利数据库连接串,洞利甚至有些配置里直接写着SMTP密码。洞利
phpinfo()本身是洞利PHP的一个内置函数,开发时用来查看运行环境。洞利问题出在部署环节。洞利很多运维图省事,洞利把<?洞利php phpinfo(); ?>写进一个info.php扔在网站根目录,测完就忘了删。攻击者不需要任何漏洞利用技巧,浏览器访问https://target.com/info.php就能拿到一份服务器体检报告。
我拉过一个暴露的phpinfo页面做分析。最上面是PHP版本:7.2.34。这个版本在2020年已经停止安全支持,意味着已知漏洞不会被修补。往下翻,DOCUMENT_ROOT给出了网站绝对路径/var/www/html,配合任意文件包含漏洞就能精准读取配置文件。
再往下是Loaded Configuration File,指向/etc/php/7.2/apache2/php.ini。攻击者由此知道服务器用的是Apache+mod_php架构,不是PHP-FPM。这个区别决定了后续攻击面——mod_php下.htaccess可能可写,FPM下则要考虑FastCGI协议层面的问题。
环境变量区域经常有意外收获。某次我看到一个页面里MYSQL_PASSWORD赫然在列,因为运维把数据库密码写进了Apache的SetEnv指令。phpinfo()会原样输出所有环境变量,包括这些敏感值。
单独一个phpinfo页面不构成直接入侵。它的价值在于拼图。假设目标跑的是Laravel,phpinfo显示APP_DEBUG=true,那Ignition RCE漏洞(CVE-2021-3129)就可以直接打。如果显示disable_functions为空,webshell提权会顺利很多。
更隐蔽的用法是配合LFI。phpinfo页面会输出$_SERVER['HTTP_USER_AGENT']等请求头内容,攻击者可以构造包含PHP代码的User-Agent,再通过文件包含漏洞去读/proc/self/environ,代码就被执行了。这个技巧在phpinfo暴露的前提下成功率极高,因为攻击者能确认环境变量文件是否可读。
还有一种情况:phpinfo页面暴露了session.save_path。如果这个路径在web目录下且可写,攻击者可以伪造session文件实现代码执行。我见过一个案例,save_path是/tmp,虽然不在web根目录,但配合LFI依然能打通。
根本原因是开发和生产环境没有隔离。开发人员本地调试时随手创建info.php,代码提交到Git,CI/CD流水线直接部署到生产。没人检查根目录多了什么文件。有些CMS的安装向导会生成phpinfo页面用于环境检测,安装完成后不自动删除,管理员也懒得手动清理。
另一个因素是扫描器的普及。Shodan和ZoomEye上搜phpinfo能返回大量结果。自动化工具批量检测,发现一个标记一个,攻击成本几乎为零。防守方却很难察觉——访问info.php不会触发WAF规则,日志里就是一条普通的200响应。
删掉。没有第二种方案。如果确实需要环境检测,把phpinfo()的输出限制在认证后的管理后台里,或者用php -i命令行查看。生产服务器上任何包含phpinfo()调用的文件都应该在部署流程中被拦截。
检查方法很简单:grep -r "phpinfo" /var/www/。更彻底的做法是在php.ini里禁用这个函数,disable_functions = phpinfo。不过要注意,有些老旧应用依赖它做环境检测,禁用前先确认没有副作用。
我个人的判断是,phpinfo暴露本身不算高危漏洞,但它是攻击链上极好的辅助信息源。一个严谨的渗透测试报告里,信息泄露通常只给中低危,可实际利用时它往往是最先被用上的那一步。删掉一个文件的事,没必要留给攻击者当路标。