你的 ColdFusion 服务器上在运行 PHP 吗?如何检查并移除它

Hacker News Top 新闻

摘要

一篇技术博客,介绍如何在 Windows/IIS 上的 ColdFusion 或 Lucee 服务器中检测意外安装的 PHP(可能由控制面板或 phpMyAdmin 残留),并安全移除它以消除安全隐患。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/27 02:06

# PHP 是否正悄悄运行在你的 ColdFusion 服务器上?如何检查,以及如何移除它 来源: https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it 如果你在 Windows 服务器上使用 IIS 运行 ColdFusion 或 Lucee,并且你从未有意安装过 PHP,那么这篇文章就是为你准备的。你的服务器上很可能装着 PHP——它可能是某个控制面板残留下来的,也可能是几年前安装 phpMyAdmin 时留下的,或者是主机商镜像自带的。下面教你如何在几分钟内用 PowerShell 查明情况,以及如果没有任何东西依赖它,如何安全地将其移除。 我记得以前几年都不用打一次安全补丁。现在感觉每隔几周就得追着处理点什么:这边补个漏洞,那边做个缓解,还有机器人在猛敲一个根本不该存在的页面。这就是 AI 时代的日常,唉。 前几天我登录自己的测试博客时,后台页面直接给我甩了一个 IIS 错误:**403 Forbidden**,还提示说 multipart form-data 请求被某个 PHP 缓解规则拦截了。 我的博客是 ColdFusion 站点,一行 PHP 代码都没跑过。那为什么一条 PHP 安全规则会阻止我登录? ## 目录 - [发生了什么](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#what-happened) - [检查一:IIS 是否在把 .php 文件交给 PHP 处理?](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#check-1-is-iis-sending-php-files-to-php) - [检查二:你的站点里有没有 PHP 文件?](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#check-2-are-there-any-php-files-in-your-sites) - [检查三:PHP 是否已安装或正在运行?](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#check-3-is-php-installed-or-running) - [检查四:外网能看到什么?](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#check-4-what-can-the-internet-see) - [安全移除步骤](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#removing-it-safely) - [1. 备份 IIS 配置](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#1-back-up-iis-s-configuration) - [2. 将 phpMyAdmin(及其他 PHP 应用)移出 Web 目录](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#2-move-phpmyadmin-and-any-other-php-app-out-of-the-web-folders) - [3. 在门口拦住 .php 请求](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#3-block-php-at-the-door) - [4. 移除 Handler 和 FastCGI 条目](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#4-remove-the-handler-and-the-fastcgi-entry) - [5. 最后卸载 PHP](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#5-uninstall-php-last) - [如果你需要保留这样的规则](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#if-you-need-to-keep-a-rule-like-this) - [Linux 和 Apache 上的 Lucee](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#lucee-on-linux-and-apache) - [容易踩的坑](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#gotchas) - [延伸阅读](https://www.gregoryalexander.com/blog/2026/10/23/is-php-quietly-running-on-your-coldfusion-server-how-to-check-and-remove-it#further-reading) --- ## 发生了什么 时机绝非巧合。2026 年 10 月 21 日,PHP 紧急发布了两个严重漏洞的补丁,这些漏洞允许未经认证的请求在服务器上执行代码,绰号 **PHP2Shell**。所有处理 Web 请求的 PHP 环境都受影响:PHP-FPM、Apache 的 mod_php、php-cgi、FrankenPHP 和 LiteSpeed。 修复方式是安装新版本的 PHP(8.5.12、8.4.27、8.3.36 或 8.2.35)。 我的主机商在同一周发布了一条 Web 服务器安全规则。该规则写在 IIS 的服务器级别 URL Rewrite 规则中,因此对服务器上所有站点生效,拦截每一个 Content-Type 为 multipart/form-data 的请求——无论访问的是什么地址。这是浏览器在上传文件的表单中使用的编码方式,而且很多不上传文件的表单也在用这种编码。 PHP 官方的建议并不包括拦截这些请求。官方方案是打补丁,在此之前关闭 `session.upload_progress.enabled` 并调低 `post_max_size`。几条官方缓解措施都涉及 PHP 处理上传的方式,所以我能理解主机商为什么选择最粗暴的手段。对于 PHP 站点来说,这是一种虽然粗糙但可以理解的防护。 但对我那些 ColdFusion 站点来说,这意味着所有四个站点的管理员登录表单、图片上传和文件上传同时全部瘫痪了。 这条规则匹配的是*所有*地址,不只是 `.php` 地址。我把规则的匹配范围限定到 `.php` 地址后(详见后文),一切恢复正常了。 然后我问了一个显而易见的问题:这台服务器上为什么会装 PHP? 答案是多年前我让主机商安装的 phpMyAdmin,用来管理一个 MySQL 数据库。它仍然存在,仍然在站点目录里,而且它的登录页对全网开放。 我告诉主机商 PHP 已经不再使用后,他们关闭了那条全局规则,我也开始检查 PHP 还留下了什么其他东西。 --- ## 检查一:IIS 是否在把 .php 文件交给 PHP 处理? IIS 只有在 Handler 映射告诉它的情况下才会运行 PHP。在服务器上**以管理员身份**打开 PowerShell: ``` Import-Module WebAdministration Get-WebHandler -PSPath 'IIS:\Sites' | Where-Object { $_.path -like '*.php' } | Select-Object name, path, scriptProcessor ``` 如果什么都没输出,说明 IIS 不会运行 PHP。如果输出类似这样的内容,那就说明它会运行——而且所有继承服务器设置的站点都会运行: ``` name path scriptProcessor ---- ---- --------------- FastCGI *.php C:\php\php-cgi.exe ``` 记下 Handler 的 `name` 和 `scriptProcessor` 路径。如果要移除它们,这两个信息都用得上。 --- ## 检查二:你的站点里有没有 PHP 文件? PowerShell 的 `Get-ChildItem -Recurse` 虽然能用,但在一个上传了多年图片的服务器上可能要跑好几分钟。Windows 自带的 `dir` 快得多。 下面的命令统计 Web 根目录下的 PHP 文件数量: ``` cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | Measure-Object | Select-Object Count ``` 如果数量不为零,下面的命令会显示它们所在的文件夹,按数量从多到少排列: ``` cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | ForEach-Object { Split-Path $_ -Parent } | Group-Object | Sort-Object Count -Descending | Select-Object -First 25 Count, Name | Format-Table -AutoSize ``` 我的服务器找到了大约 4500 个文件,分在两个文件夹里,都是 phpMyAdmin:一个在站点目录内,另一个是 Web 根目录下的副本,被 IIS 的 Default Web Site 提供给任何直接访问服务器 IP 的访客。 如果你发现了*不认识的* PHP 文件——尤其是散落在图片或上传文件夹中的,或者最近被修改过的——请停下来,按疑似入侵来处理。攻击者非常喜欢往上传文件夹里丢小型 PHP"Web Shell"。 下面的命令列出最近被修改的文件: ``` cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | Get-Item | Sort-Object LastWriteTime -Descending | Select-Object -First 15 LastWriteTime, Length, FullName | Format-Table -AutoSize ``` --- ## 检查三:PHP 是否已安装或正在运行? ``` Get-Process php* -ErrorAction SilentlyContinue | Select-Object Name, Id, StartTime Test-Path C:\php ``` 没有 `php-cgi.exe` 进程只能说明最近没人请求过 PHP 页面。IIS 是按需启动它的。真正重要的是检查一中发现的 Handler。 --- ## 检查四:外网能看到什么? 从任何一台电脑,尝试访问**你自己的**站点上的常见路径: ``` foreach ($path in "phpmyadmin/", "phpMyAdmin/", "pma/", "info.php") { $url = "https://www.mysite.com/$path" try { $r = Invoke-WebRequest $url -UseBasicParsing -TimeoutSec 15; "$($r.StatusCode) $url" } catch { "$($_.Exception.Response.StatusCode.value__) $url" } } ``` 任何返回 200 的结果都值得关注。一个暴露在公网上的 phpMyAdmin 登录页等于一张长期有效的入场券:机器人整天在上面尝试密码,而每一次尝试都会启动 PHP 并连接你的数据库。 --- ## 安全移除步骤 请按顺序操作,并先备份。每一步都是可逆的。 ### 1. 备份 IIS 配置 IIS 可以一条命令完成配置快照和恢复: ``` & "$env:windir\System32\inetsrv\appcmd.exe" add backup "before-php-removal" ``` 要撤销下面的所有操作:`appcmd.exe restore backup "before-php-removal"`。 ### 2. 将 phpMyAdmin(及其他 PHP 应用)移出 Web 目录 移走,不要删除。它的配置文件里可能存有数据库密码,所以先放到一个私密的位置保存几周,以防将来发现还有需要它的地方: ``` New-Item -ItemType Directory -Force C:\Temp\removed-php | Out-Null Move-Item C:\inetpub\wwwroot\mysite\phpmyadmin C:\Temp\removed-php\phpmyadmin-mysite ``` 如果 `Move-Item` 报错说某个文件正在使用,说明 PHP 正打开着它。执行 `iisreset /stop`,移动,然后 `iisreset /start`。(你的站点会中断几秒钟。) 如果报错是 *"Could not find a part of the path"*,那是目标文件夹不存在,而不是源文件夹。这个坑我踩过。 之后如果需要管理 MySQL,通过远程桌面在服务器上使用 HeidiSQL 或 MySQL Workbench 这类桌面工具,就能完全替代 phpMyAdmin 的功能,而且不需要一个公网登录页面。 ### 3. 在门口拦住 .php 请求 IIS 的请求筛选(Request Filtering)可以在任何 Handler 看到请求之前就拒绝某个文件扩展名。在服务器级别添加,覆盖所有站点: ``` Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/security/requestFiltering/fileExtensions' -Name '.' -Value @{ fileExtension = '.php'; allowed = 'false' } ``` 现在任何 `.php` 地址都会得到 *"404 - the request filtering module is configured to deny the file extension"*,无论文件是否存在。 ### 4. 移除 Handler 和 FastCGI 条目 使用检查一中记录的 Handler 名称(我的是 `FastCGI`)和 `php-cgi.exe` 路径: ``` Remove-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/handlers' -Name '.' -AtElement @{ name = 'FastCGI' } Remove-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/fastCgi' -Name '.' -AtElement @{ fullPath = 'C:\php\php-cgi.exe' } ``` 重新运行检查一。它应该什么都不输出。 ### 5. 最后卸载 PHP 如果 PHP 是通过安装程序装的,在"设置 > 应用 > 已安装的应用"中移除。如果只是像 `C:\php` 这样的一个文件夹,先重命名为 `C:\php-removed`,保留几周再删除。如果有什么东西因此报错,你会立刻发现,而且只需改个名就能还原。 如果 PHP 是主机商安装的,请在执行第五步之前先询问他们。他们自己的监控脚本大概率不需要 PHP,但那毕竟是他们的安装。 --- ## 如果你需要保留这样的规则 也许你确实在某些地方运行 PHP,或者主机商希望保留他们的规则。那就把匹配范围限定到 PHP 地址,而不是所有地址。 问题就出在这条规则的匹配范围——原本匹配的是 `(.*)`,即所有地址。下面将其改为只匹配 `.php` 地址,让 ColdFusion 的表单不受影响(请使用你自己规则的名称): ``` Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/rewrite/globalRules/rule[@name='PHP Mitigation']/match" -Name url -Value '\.php($|/)' ``` 注意模式周围的单引号。我最初尝试用 `appcmd.exe` 做同样的修改,PowerShell 悄悄地把引号搞坏了:没有报错,但也没有任何变化。使用单引号的 `Set-WebConfigurationProperty` 第一次就成功了。 用 `Select-String` 检查 `C:\Windows\System32\inetsrv\config\applicationHost.config` 来确认结果。 --- ## Linux 和 Apache 上的 Lucee 同样的问题,不同的命令: ``` php -v ## PHP 命令行工具是否已安装? apachectl -M | grep -i php ## Apache 是否在运行 PHP(php_module、proxy_fcgi 到 php-fpm)? find /var/www /home -name "*.php" 2>/dev/null | head -50 ``` 在 Debian 和 Ubuntu 上,`sudo a2dismod php8.3`(你的版本)加 `sudo systemctl restart apache2` 可以让 Apache 停止运行 PHP。然后在确认没有任何东西需要它们之后,再用包管理器卸载相关软件包。 像 Virtualmin 这类控制面板经常会为自己的工具安装 PHP,所以卸载前请先检查一下。 --- ## 容易踩的坑 - **服务器级别的规则会影响所有站点。** 为 PHP 编写的规则拦截了我的 ColdFusion 登录和上传。如果 403 错误凭空出现,请仔细阅读 IIS 的完整错误页面——我的错误页明确指出了是哪条规则。 - **主机商会重新运行他们的脚本。** 我的主机商每次运行都会重新创建那条规则,所以本地的修改可能被悄悄还原。把你的改动和原因告诉主机商。 - **配置可能改到了错误的 `web.config` 里。** 我第一次的修改写进了某个站点的 `web.config`,结果什么都没变。对 IIS 实际读取的那个文件快速执行一下 `Select-Str` 就能帮我节省十分钟。 - **缓存会掩盖你的修复。** 如果你在诊断问题时手动替换了某个 `.cfm` 文件,ColdFusion 会继续运行旧的编译副本,直到你清除缓存为止。换一个全新的文件名是最快的临时方案。 - **移除 PHP 不能替代打补丁。** 如果你确实运行 PHP,请立即更新到 8.5.12、8.4.27、8.3.36 或 8.2.35(或更新版本),在能够更新之前先在 `php.ini` 中设置 `session.upload_progress.enabled = 0`。PHP 8.1 及更早版本已经不再从 PHP 官方获得更新。只有在没有任何东西使用 PHP 时,移除才是正确的选择。 --- ## 延伸阅读 - PHP 2026 年 10 月的公告,包括 10 月 21 日的安全发布及其缓解措施:[php.net 新闻存档,2026](https://www.php.net/archive/2026.php) - BleepingComputer:[PHP 为严重的 PHP2Shell 漏洞发布紧急补丁](https://bleepingcomputer.com/news/security/php-ships-emergency-patches-for-critical-php2shell-flaws) - Windows 上的 PHP 不是第一次出事了。DEVCORE 关于 2024 年 PHP-CGI 漏洞的警报:[安全警报:CVE-2024-4577,PHP CGI 参数注入漏洞](https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/) - Charlie Arehart:[ColdFusion Lockdown/安全指南汇总](https://www.carehart.org/blog/2014/6/24/ColdFusion_Lockdown_Security_guides)——有好几份指南,有些你可能漏掉了。虽然年代久远,但仍然是锁定指南的最佳地图,并且指向了 IIS 请求筛选。 - Adobe 的锁定指南:[ColdFusion 2025 Lockdown Guide](https://helpx.adobe.com/content/dam/help/en/coldfusion/coldfusion-2025-lockdown-guide-v1.0.pdf) 和 [ColdFusion 2023 Lockdown Guide](https://www.adobe.com/go/cf2023_lockdown_guide)(PDF) - Microsoft 的 IIS 参考文档:[文件扩展名(请求筛选)](https://learn.microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/fileextensions/)、[Handlers](https://learn.microsoft.com/en-us/iis/configuration/system.webserver/handlers/) 和 [FastCGI](https://learn.microsoft.com/en-us/iis/configuration/system.webserver/fastcgi/) 本条目发布于 2026 年 10 月 23 日晚上 11:39,已被浏览 9260 次。目前有 0 条评论。

相似文章

PHP2Shell:AI 揭示 PHP 中的严重 RCE 漏洞

Hacker News Top

Wiz Research 发现了 PHP 核心中一系列严重的内存安全漏洞,包括未经认证的远程代码执行,影响过去十年发布的几乎所有 PHP 版本(占全球 70% 网站),并借助前沿 AI 模型构建了复杂的利用链,促使 PHP 于 2026 年 10 月 21 日发布补丁。

@Fenng: 这么严重了吗?◔‸◔?

X AI KOLs Timeline

转推高市早苗关于 PHP 出现两处严重安全漏洞的紧急呼吁,提醒广泛使用 PHP 的网站运营者今夜立即应对。